import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { Loader2, Eye, EyeOff } from "lucide-react"; import { useDataProvider, useLogin, useNotify, useTranslate } from "ra-core"; import { useForm, type SubmitHandler } from "react-hook-form"; import { useState } from "react"; import { Navigate } from "react-router"; import { Button } from "@/components/ds/ui/button"; import { Input } from "@/components/ds/ui/input"; import { Label } from "@/components/ds/ui/label"; import { ThemeModeToggle } from "@/components/ds/admin/theme-mode-toggle"; import { LocalesMenuButton } from "@/components/ds/admin/locales-menu-button"; import type { CrmDataProvider } from "../providers/types"; import { useConfigurationContext } from "../root/ConfigurationContext"; import type { SignUpData } from "../types"; import { LoginSkeleton } from "./LoginSkeleton"; export const SignupPage = () => { const queryClient = useQueryClient(); const dataProvider = useDataProvider(); const { darkModeLogo, lightModeLogo, title } = useConfigurationContext(); const translate = useTranslate(); const { data: isInitialized, isPending } = useQuery({ queryKey: ["init"], queryFn: async () => { return dataProvider.isInitialized(); }, }); const { isPending: isSignUpPending, mutate } = useMutation({ mutationKey: ["signup"], mutationFn: async (data: SignUpData) => { return dataProvider.signUp(data); }, onSuccess: (data) => { login({ email: data.email, password: data.password, redirectTo: "/contacts", }).then(() => { notify(translate("crm.signup.notification.success")); // FIXME: We should probably provide a hook for that in the ra-core package queryClient.invalidateQueries({ queryKey: ["auth", "canAccess"], }); }); }, onError: () => { notify(translate("crm.signup.notification.error")); }, }); const login = useLogin(); const notify = useNotify(); const [showPassword, setShowPassword] = useState(false); const { register, handleSubmit, formState: { isValid }, } = useForm({ mode: "onChange", }); if (isPending) { return ; } // For the moment, we only allow one user to sign up. Other users must be created by the administrator. if (isInitialized) { return ; } const onSubmit: SubmitHandler = async (data) => { mutate(data); }; return (
{title} {title}

{title}

{translate("crm.signup.title", { title })}

{translate("crm.signup.subtitle")}

); }; SignupPage.path = "/sign-up";