Tạo Form

Base sẽ sử dụng formik cho việc quản lý state của form, về việc validate dữ liệu thì sẽ sử dụng yup

import FormItem from "@app/components/FormItem" //Sử dụng FormItem trong components
import { Input } from "antd"
import { getValidationSchema, ILoginForm } from "@app/module/login/NewPassword/form-config" // Import interface và validation
 
interface ILoginForm {
  email?: string
  password?: string
}
 
export function LoginForm() {
  const loginMutation = useMutation(ApiUser.login)
 
  const handleLogin =
    ((
      loginBody: ILoginForm,
      { setSubmitting }: { setSubmitting: (isSubmitting: boolean) => void },
    ): void => {
      // Gọi API
      // ...
      setSubmitting(false) //Set lại biến isSubmitting của form về false để không show loading sau khi gọi API xong
    },
    [])
 
  return (
    <Formik
      initialValues={{ email: "", password: "" }}
      validateOnChange={false}
      validateOnBlur
      validationSchema={getValidationSchema()}
      onSubmit={handleLogin}
    >
      {({ isSubmitting, handleSubmit, handleChange, handleBlur }): JSX.Element => (
        <div className="container-sign-in">
          <Form onFinish={handleSubmit} className="container-sign-in">
            <div className="header-wrapper">
              <Image className="login-image" src="img/logo.png" preview={false} />
              <div className="login-text">Đăng nhập</div>
            </div>
            <FormItem name="email" label="Tài khoản" required>
              <Input
                name="email"
                placeholder="Nhập tài khoản"
                onChange={handleChange}
                onBlur={handleBlur}
              />
            </FormItem>
            <FormItem className="pt-20" name="password" label="Mật khẩu" required>
              <Input.Password
                name="password"
                placeholder="Nhập mật khẩu"
                onChange={handleChange}
                onBlur={handleBlur}
              />
            </FormItem>
            <Row
              role="button"
              tabIndex={0}
              className="forgot-pass pt-20"
              onClick={(): void => changeTab("forgotPassword")}
            >
              Quên mật khẩu?
            </Row>
 
            <ButtonSubmit label="Đăng nhập" isSubmitting={isSubmitting} classRow="pt-20" />
          </Form>
        </div>
      )}
    </Formik>
  )
}