"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { FormField } from "@/components/shared/form-field"; import { useJoinResidence } from "@/lib/hooks/use-sharing"; import { useOnboardingStore } from "@/stores/onboarding"; // --------------------------------------------------------------------------- // Schema // --------------------------------------------------------------------------- const joinResidenceSchema = z.object({ code: z .string() .length(6, "Share code must be 6 characters") .regex(/^[A-Za-z0-9]+$/, "Share code must be alphanumeric"), }); type JoinResidenceFormData = z.infer; // --------------------------------------------------------------------------- // Component // --------------------------------------------------------------------------- export function JoinResidenceStep() { const { nextStep, prevStep, setResidenceId } = useOnboardingStore(); const joinResidence = useJoinResidence(); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(joinResidenceSchema), defaultValues: { code: "", }, }); const onSubmit = (data: JoinResidenceFormData) => { joinResidence.mutate(data.code, { onSuccess: (residence) => { setResidenceId(residence.id); nextStep(); }, }); }; return (

Join a residence

Enter the 6-character share code you received from the property owner.

{joinResidence.error && (

{joinResidence.error instanceof Error ? joinResidence.error.message : "Invalid or expired share code. Please check and try again."}

)}
); }