import { Logo } from "@/components/shared/logo"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardTitle, } from "@/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { getUserByToken } from "@/server/api/services/admin"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { AlertTriangle } from "lucide-react"; import type { GetServerSidePropsContext } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; const registerSchema = z .object({ email: z .string() .min(1, { message: "Email is required", }) .email({ message: "Email must be a valid email", }), password: z .string() .min(1, { message: "Password is required", }) .refine((password) => password === "" || password.length >= 8, { message: "Password must be at least 8 characters", }), confirmPassword: z .string() .min(1, { message: "Password is required", }) .refine( (confirmPassword) => confirmPassword === "" || confirmPassword.length >= 8, { message: "Password must be at least 8 characters", }, ), }) .refine((data) => data.password === data.confirmPassword, { message: "Passwords do not match", path: ["confirmPassword"], }); type Register = z.infer; interface Props { token: string; invitation: Awaited>; } const Invitation = ({ token, invitation }: Props) => { const router = useRouter(); const { data } = api.admin.getUserByToken.useQuery( { token, }, { enabled: !!token, initialData: invitation, }, ); const { mutateAsync, error, isError } = api.auth.createUser.useMutation(); const form = useForm({ defaultValues: { email: "", password: "", confirmPassword: "", }, resolver: zodResolver(registerSchema), }); useEffect(() => { if (data?.auth?.email) { form.reset({ email: data?.auth?.email || "", password: "", confirmPassword: "", }); } }, [form, form.reset, form.formState.isSubmitSuccessful, data]); const onSubmit = async (values: Register) => { await mutateAsync({ id: data?.authId, password: values.password, token: token, }) .then(() => { toast.success("User registration succesfuly", { duration: 2000, }); router.push("/dashboard/projects"); }) .catch((e) => e); }; return (
Dokploy Invitation Fill the form below to create your account
{isError && (
{error?.message}
)}
( Email )} /> ( Password )} /> ( Confirm Password )} />
); }; export default Invitation; export async function getServerSideProps(ctx: GetServerSidePropsContext) { const { query } = ctx; const token = query.token; if (typeof token !== "string") { return { redirect: { permanent: true, destination: "/", }, }; } try { const invitation = await getUserByToken(token); if (invitation.isExpired) { return { redirect: { permanent: true, destination: "/", }, }; } return { props: { token: token, invitation: invitation, }, }; } catch (error) { return { redirect: { permanent: true, destination: "/", }, }; } }