(props: SecretFormProviderProps)
| 104 | } |
| 105 | |
| 106 | function SecretFormProvider(props: SecretFormProviderProps) { |
| 107 | const { |
| 108 | existingSecretIds, |
| 109 | suggestedName = "", |
| 110 | fallbackId = "credential", |
| 111 | initialIdOverride, |
| 112 | initialProvider = "auto", |
| 113 | owner, |
| 114 | integration, |
| 115 | template, |
| 116 | onCreated, |
| 117 | children, |
| 118 | } = props; |
| 119 | |
| 120 | const doCreate = useAtomSet(createConnection, { mode: "promiseExit" }); |
| 121 | |
| 122 | const [state, setState] = useState<SecretFormState>(() => ({ |
| 123 | name: suggestedName, |
| 124 | value: "", |
| 125 | idOverride: initialIdOverride ?? null, |
| 126 | provider: initialProvider, |
| 127 | revealed: false, |
| 128 | status: { kind: "idle" }, |
| 129 | })); |
| 130 | |
| 131 | const baseName = state.name || suggestedName; |
| 132 | const autoId = useMemo( |
| 133 | () => getUniqueSecretId(baseName, existingSecretIds, fallbackId), |
| 134 | [baseName, existingSecretIds, fallbackId], |
| 135 | ); |
| 136 | const id = state.idOverride ?? autoId; |
| 137 | const duplicateError = |
| 138 | state.idOverride !== null && isSecretIdTaken(state.idOverride, existingSecretIds) |
| 139 | ? "Name already exists" |
| 140 | : null; |
| 141 | |
| 142 | const displayName = state.name.trim() || suggestedName.trim(); |
| 143 | const canSubmit = |
| 144 | id.trim() !== "" && |
| 145 | state.value.trim() !== "" && |
| 146 | duplicateError === null && |
| 147 | state.status.kind !== "submitting"; |
| 148 | |
| 149 | const submit = async () => { |
| 150 | if (!canSubmit) return; |
| 151 | setState((s) => ({ ...s, status: { kind: "submitting" } })); |
| 152 | const exit = await doCreate({ |
| 153 | payload: { |
| 154 | owner, |
| 155 | name: ConnectionName.make(id.trim()), |
| 156 | integration, |
| 157 | template, |
| 158 | identityLabel: displayName || id.trim(), |
| 159 | value: state.value.trim(), |
| 160 | }, |
| 161 | reactivityKeys: connectionWriteKeys, |
| 162 | }); |
| 163 | if (Exit.isFailure(exit)) { |
nothing calls this directly
no test coverage detected