diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx index 23b39eb233..59d3d8eaf5 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx @@ -1,5 +1,3 @@ -import { useTheme } from "@emotion/react"; -import Divider from "@mui/material/Divider"; import { ChevronLeftIcon, CopyIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Link as RouterLink, useSearchParams } from "react-router"; @@ -12,6 +10,7 @@ import { CopyableValue } from "#/components/CopyableValue/CopyableValue"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import { DeleteDialog } from "#/components/Dialogs/DeleteDialog/DeleteDialog"; import { Loader } from "#/components/Loader/Loader"; +import { Separator } from "#/components/Separator/Separator"; import { SettingsHeader, SettingsHeaderDescription, @@ -74,7 +73,6 @@ export const EditOAuth2AppPageView: FC = ({ ackFullNewSecret, error, }) => { - const theme = useTheme(); const [searchParams] = useSearchParams(); const [showDelete, setShowDelete] = useState(false); @@ -165,7 +163,7 @@ export const EditOAuth2AppPageView: FC = ({ - + = ({ {canViewAppSecrets && ( <> - + void; + onSubmit: (data: TypesGen.PostOAuth2ProviderAppRequest) => void; error?: unknown; isUpdating: boolean; actions?: ReactNode; - defaultValues?: { - name: string; - callback_url: string; - icon: string; - }; + defaultValues?: TypesGen.PostOAuth2ProviderAppRequest; disabled: boolean; }; @@ -32,58 +25,45 @@ export const OAuth2AppForm: FC = ({ defaultValues, disabled, }) => { - const apiValidationErrors = isApiValidationError(error) - ? mapApiErrorToFieldErrors(error.response.data) - : undefined; + const form = useFormik({ + initialValues: { + name: app?.name ?? defaultValues?.name ?? "", + callback_url: app?.callback_url ?? defaultValues?.callback_url ?? "", + icon: app?.icon ?? defaultValues?.icon ?? "", + }, + // Mark fields touched from the start so server-side validation errors + // surface as soon as they arrive instead of waiting for the user to + // interact with each field. + initialTouched: { name: true, callback_url: true, icon: true }, + onSubmit, + }); + const getFieldHelpers = getFormHelpers(form, error); return ( -
{ - event.preventDefault(); - const formData = new FormData(event.target as HTMLFormElement); - onSubmit({ - name: formData.get("name") as string, - callback_url: formData.get("callback_url") as string, - icon: formData.get("icon") as string, - }); - }} - > +
- - -