"use client"; import { useState } from "react"; import { useTranslations } from "next-intl"; import { useRouter, Link } from "@/i18n/routing"; import { useSearchParams } from "next/navigation"; import { Suspense } from "react"; import { apiPost, ApiClientError } from "@/lib/api/client"; import type { AuthTokenResponse } from "@/lib/api/types"; import { useAuthStore } from "@/lib/stores/auth.store"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { LabeledField } from "@/components/ui/labeled-field"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; function RegisterForm() { const t = useTranslations("auth"); const router = useRouter(); const setAuth = useAuthStore((s) => s.setAuth); const searchParams = useSearchParams(); const [phone, setPhone] = useState(searchParams.get("phone") ?? ""); const [cafeName, setCafeName] = useState(""); const [code, setCode] = useState(""); const [step, setStep] = useState<"info" | "otp">("info"); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const errorMessage = (err: unknown) => { if (err instanceof ApiClientError) { switch (err.code) { case "RATE_LIMITED": return t("rateLimited"); case "ALREADY_REGISTERED": return t("alreadyRegistered"); case "SMS_FAILED": return t("smsFailed"); case "INVALID_OTP": return t("invalidOtp"); case "REGISTRATION_EXPIRED": return t("registrationExpired"); default: return err.message; } } return err instanceof Error ? err.message : String(err); }; const sendOtp = async () => { setLoading(true); setError(null); try { await apiPost("/api/auth/register", { phone, cafeName }); setStep("otp"); } catch (e) { setError(errorMessage(e)); } finally { setLoading(false); } }; const verifyOtp = async () => { setLoading(true); setError(null); try { const data = await apiPost("/api/auth/verify-register", { phone, code }); setAuth(data); router.push("/"); } catch (e) { setError(errorMessage(e)); } finally { setLoading(false); } }; return (
{t("register")}

{t("registerSubtitle")}

{step === "info" ? (
{ e.preventDefault(); if (!loading) void sendOtp(); }} > setCafeName(e.target.value)} placeholder={t("cafeNamePlaceholder")} autoComplete="organization" required /> setPhone(e.target.value)} placeholder={t("phonePlaceholder")} dir="ltr" className="text-end" autoComplete="tel" required />
) : (
{ e.preventDefault(); if (!loading) void verifyOtp(); }} > setCode(e.target.value)} placeholder={t("otpPlaceholder")} maxLength={6} dir="ltr" className="text-center tracking-widest" autoComplete="one-time-code" />
)} {error && (

{error}

)}

{t("alreadyHaveAccount")}{" "} {t("loginLink")}

); } export default function RegisterPage() { return ( ); }