pankod/refine

View on GitHub
packages/core/src/components/pages/auth/components/register/index.tsx

Summary

Maintainability
A
2 hrs
Test Coverage
import React, { useState } from "react";

import {
  useLink,
  useRegister,
  useRouterContext,
  useRouterType,
  useTranslate,
} from "@hooks";

import { useActiveAuthProvider } from "@definitions/helpers";

import { DivPropsType, FormPropsType } from "../..";
import { RegisterPageProps } from "../../types";

type RegisterProps = RegisterPageProps<
  DivPropsType,
  DivPropsType,
  FormPropsType
>;

export const RegisterPage: React.FC<RegisterProps> = ({
  providers,
  loginLink,
  wrapperProps,
  contentProps,
  renderContent,
  formProps,
  title = undefined,
  hideForm,
}) => {
  const routerType = useRouterType();
  const Link = useLink();
  const { Link: LegacyLink } = useRouterContext();

  const ActiveLink = routerType === "legacy" ? LegacyLink : Link;

  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  const translate = useTranslate();

  const authProvider = useActiveAuthProvider();
  const { mutate: register, isLoading } = useRegister({
    v3LegacyAuthProviderCompatible: Boolean(authProvider?.isLegacy),
  });

  const renderLink = (link: string, text?: string) => {
    return <ActiveLink to={link}>{text}</ActiveLink>;
  };

  const renderProviders = () => {
    if (providers) {
      return providers.map((provider) => (
        <div
          key={provider.name}
          style={{
            display: "flex",
            alignItems: "center",
            justifyContent: "center",
            marginBottom: "1rem",
          }}
        >
          <button
            onClick={() =>
              register({
                providerName: provider.name,
              })
            }
            style={{
              display: "flex",
              alignItems: "center",
            }}
          >
            {provider?.icon}
            {provider.label ?? <label>{provider.label}</label>}
          </button>
        </div>
      ));
    }
    return null;
  };

  const content = (
    <div {...contentProps}>
      <h1 style={{ textAlign: "center" }}>
        {translate("pages.register.title", "Sign up for your account")}
      </h1>
      {renderProviders()}
      {!hideForm && (
        <>
          <hr />
          <form
            onSubmit={(e) => {
              e.preventDefault();
              register({ email, password });
            }}
            {...formProps}
          >
            <div
              style={{
                display: "flex",
                flexDirection: "column",
                padding: 25,
              }}
            >
              <label htmlFor="email-input">
                {translate("pages.register.fields.email", "Email")}
              </label>
              <input
                id="email-input"
                name="email"
                type="email"
                size={20}
                autoCorrect="off"
                spellCheck={false}
                autoCapitalize="off"
                required
                value={email}
                onChange={(e) => setEmail(e.target.value)}
              />
              <label htmlFor="password-input">
                {translate("pages.register.fields.password", "Password")}
              </label>
              <input
                id="password-input"
                name="password"
                type="password"
                required
                size={20}
                value={password}
                onChange={(e) => setPassword(e.target.value)}
              />
              <input
                type="submit"
                value={translate("pages.register.buttons.submit", "Sign up")}
                disabled={isLoading}
              />
              {loginLink ?? (
                <>
                  <span>
                    {translate(
                      "pages.login.buttons.haveAccount",
                      "Have an account?",
                    )}{" "}
                    {renderLink(
                      "/login",
                      translate("pages.login.signin", "Sign in"),
                    )}
                  </span>
                </>
              )}
            </div>
          </form>
        </>
      )}
      {loginLink !== false && hideForm && (
        <div style={{ textAlign: "center" }}>
          {translate("pages.login.buttons.haveAccount", "Have an account?")}{" "}
          {renderLink("/login", translate("pages.login.signin", "Sign in"))}
        </div>
      )}
    </div>
  );

  return (
    <div {...wrapperProps}>
      {renderContent ? renderContent(content, title) : content}
    </div>
  );
};