import { createFileRoute, Link, useNavigate } from "@tanstack/react-router"; import { useForm } from "@tanstack/react-form"; import { useMutation } from "@tanstack/react-query"; import { toast } from "sonner"; import { ArrowRight } from "lucide-react"; import { usePostHog } from "@posthog/react"; import { registerSchema, type AuthSession, type RegisterInput, } from "@rubis/shared"; import { api, ApiError } from "@/lib/api"; import { authStore } from "@/lib/auth"; import { Button } from "@rubis/ui"; import { Input } from "@/components/ui/Input"; import { Field } from "@/components/ui/Field"; import { Card } from "@rubis/ui"; import { Eyebrow } from "@rubis/ui"; import { Brand } from "@rubis/ui"; import { Gem } from "@rubis/ui"; import { SsoButton, AuthDivider } from "@/components/auth/SsoButton"; export const Route = createFileRoute("/signup")({ component: SignupPage, }); function SignupPage() { const navigate = useNavigate(); const posthog = usePostHog(); const signupMutation = useMutation({ mutationFn: async (input: RegisterInput) => api.post("/api/v1/auth/signup", input, { anonymous: true }), onSuccess: (session) => { posthog.identify(session.user.id, { email: session.user.email, name: session.user.fullName, }); posthog.capture("user_signed_up", { email: session.user.email }); authStore.setSession(session.accessToken, session.user); toast.success("Compte créé. On finalise votre installation."); void navigate({ to: "/onboarding/compte" }); }, onError: (error: unknown) => { if (error instanceof ApiError && error.status === 422) { const emailErrs = error.fieldErrors?.["email"]; if (emailErrs?.[0]) { toast.error(emailErrs[0]); return; } } toast.error("Inscription impossible. Réessayez dans un instant."); }, }); const form = useForm({ defaultValues: { fullName: "", email: "", password: "" } satisfies RegisterInput, validators: { onChange: registerSchema }, onSubmit: async ({ value }) => { await signupMutation.mutateAsync(value); }, }); return (
{/* Glow rubis discret en haut-droite — signature visuelle. */}
); }