diff --git a/site/src/components/CreateUserForm/CreateUserForm.stories.tsx b/site/src/components/CreateUserForm/CreateUserForm.stories.tsx index 4d9b27980f..271e9e7bc4 100644 --- a/site/src/components/CreateUserForm/CreateUserForm.stories.tsx +++ b/site/src/components/CreateUserForm/CreateUserForm.stories.tsx @@ -1,3 +1,4 @@ +import { action } from "@storybook/addon-actions" import { Story } from "@storybook/react" import React from "react" import { CreateUserForm, CreateUserFormProps } from "./CreateUserForm" @@ -5,18 +6,38 @@ import { CreateUserForm, CreateUserFormProps } from "./CreateUserForm" export default { title: "components/CreateUserForm", component: CreateUserForm, - argTypes: { - isLoading: "boolean", - authErrorMessage: "string", - onSubmit: { action: "Submit" }, - }, } const Template: Story = (args: CreateUserFormProps) => -export const Example = Template.bind({}) -Example.args = { - onSubmit: () => { - return Promise.resolve() - }, +export const Ready = Template.bind({}) +Ready.args = { + onCancel: action('cancel'), + onSubmit: action('submit'), + isLoading: false, +} + +export const UnknownError = Template.bind({}) +UnknownError.args = { + onCancel: action('cancel'), + onSubmit: action('submit'), + isLoading: false, + error: "Something went wrong" +} + +export const FormError = Template.bind({}) +FormError.args = { + onCancel: action('cancel'), + onSubmit: action('submit'), + isLoading: false, + formErrors: { + email: "Bad email address" + } +} + +export const Loading = Template.bind({}) +Loading.args = { + onCancel: action('cancel'), + onSubmit: action('submit'), + isLoading: true, } diff --git a/site/src/components/CreateUserForm/CreateUserForm.tsx b/site/src/components/CreateUserForm/CreateUserForm.tsx index 5e7d422fe2..10efd8114b 100644 --- a/site/src/components/CreateUserForm/CreateUserForm.tsx +++ b/site/src/components/CreateUserForm/CreateUserForm.tsx @@ -1,11 +1,12 @@ -import Button from "@material-ui/core/Button" +import FormHelperText from "@material-ui/core/FormHelperText" import TextField from "@material-ui/core/TextField" import { FormikContextType, FormikErrors, useFormik } from "formik" import React from "react" import * as Yup from "yup" import { CreateUserRequest } from "../../api/typesGenerated" import { getFormHelpers, onChangeTrimmed } from "../../util/formUtils" -import { LoadingButton } from "../LoadingButton/LoadingButton" +import { FormFooter } from "../FormFooter/FormFooter" +import { FullPageForm } from "../FullPageForm/FullPageForm" const Language = { emailLabel: "Email", @@ -23,6 +24,8 @@ export interface CreateUserFormProps { onSubmit: (user: CreateUserRequest) => void onCancel: () => void formErrors?: FormikErrors + isLoading: boolean + error?: string } const validationSchema = Yup.object({ @@ -31,7 +34,7 @@ const validationSchema = Yup.object({ username: Yup.string().required(), }) -export const CreateUserForm: React.FC = ({ onSubmit, onCancel, formErrors }) => { +export const CreateUserForm: React.FC = ({ onSubmit, onCancel, formErrors, isLoading, error }) => { const form: FormikContextType = useFormik({ initialValues: { email: "", @@ -42,42 +45,39 @@ export const CreateUserForm: React.FC = ({ onSubmit, onCanc onSubmit, }) const getFieldHelpers = getFormHelpers(form, formErrors) + console.log(getFieldHelpers("email")) return ( -
- - - -
- - - {Language.createUser} - -
- + +
+ + + + {error && {error}} + + +
) } diff --git a/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.tsx b/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.tsx index db376bb30d..0caa365b64 100644 --- a/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.tsx +++ b/site/src/pages/UsersPage/CreateUserPage/CreateUserPage.tsx @@ -6,12 +6,17 @@ import { CreateUserRequest } from "../../../api/typesGenerated" import { CreateUserForm } from "../../../components/CreateUserForm/CreateUserForm" import { XServiceContext } from "../../../xServices/StateContext" +const Language = { + unknownError: "Oops, an unknown error occurred.", +} + export const CreateUserPage = () => { const xServices = useContext(XServiceContext) const [usersState, usersSend] = useActor(xServices.usersXService) const { createUserError } = usersState.context - const formErrors = - createUserError && isApiError(createUserError) ? mapApiErrorToFieldErrors(createUserError.response.data) : undefined + const apiError = isApiError(createUserError) + const formErrors = apiError ? mapApiErrorToFieldErrors(createUserError.response.data) : undefined + const hasUnknownError = createUserError && !apiError const navigate = useNavigate() return ( @@ -19,6 +24,8 @@ export const CreateUserPage = () => { formErrors={formErrors} onSubmit={(user: CreateUserRequest) => usersSend({ type: "CREATE", user })} onCancel={() => navigate("/users")} + isLoading={usersState.hasTag("loading")} + error={hasUnknownError ? Language.unknownError : undefined} /> ) }