"use client"; import { Box, Heading, Input, Text, VStack, HStack } from "@chakra-ui/react"; import { Button } from "@/components/ui/buttons/button"; import { Field } from "@/components/ui/forms/field"; import { InputGroup } from "@/components/ui/forms/input-group"; import { PasswordInput } from "@/components/ui/forms/password-input"; import { DialogBody, DialogCloseTrigger, DialogContent, DialogHeader, DialogRoot, DialogTitle, } from "@/components/ui/overlays/dialog"; import { useTranslations } from "next-intl"; import { useForm } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import * as yup from "yup"; import { signIn } from "next-auth/react"; import { toaster } from "@/components/ui/feedback/toaster"; import { useState, useEffect } from "react"; import { MdMail } from "react-icons/md"; import { BiUser } from "react-icons/bi"; import { authService } from "@/lib/api/auth/service"; /* ────────────────────────── Schemas ────────────────────────── */ const loginSchema = yup.object({ email: yup.string().email().required(), password: yup.string().min(6).required(), }); const registerSchema = yup.object({ name: yup.string().required(), email: yup.string().email().required(), password: yup.string().min(8).required(), }); type LoginForm = yup.InferType; type RegisterForm = yup.InferType; /* ────────────────────────── Props ────────────────────────── */ interface LoginModalProps { open: boolean; onOpenChange: (open: boolean) => void; initialMode?: "login" | "register"; } /* ────────────────────────── Component ────────────────────────── */ export function LoginModal({ open, onOpenChange, initialMode = "login" }: LoginModalProps) { const t = useTranslations(); const [mode, setMode] = useState<"login" | "register">(initialMode); const [loading, setLoading] = useState(false); // Update mode when modal opens useEffect(() => { if (open) { setMode(initialMode); } }, [open, initialMode]); /* ── Login form ── */ const loginForm = useForm({ resolver: yupResolver(loginSchema), mode: "onChange", }); /* ── Register form ── */ const registerForm = useForm({ resolver: yupResolver(registerSchema), mode: "onChange", }); /* ── Switch mode ── */ const switchMode = (newMode: "login" | "register") => { setMode(newMode); loginForm.reset(); registerForm.reset(); }; /* ── Handle login ── */ const onLogin = async (formData: LoginForm) => { try { setLoading(true); const res = await signIn("credentials", { redirect: false, email: formData.email, password: formData.password, }); if (res?.error) { throw new Error(res.error); } onOpenChange(false); toaster.success({ title: t("auth.login-success") || "Giriş başarılı!", type: "success", }); } catch (error) { toaster.error({ title: (error as Error).message || "Giriş yapılamadı!", type: "error", }); } finally { setLoading(false); } }; /* ── Handle register ── */ const onRegister = async (formData: RegisterForm) => { try { setLoading(true); await authService.register({ email: formData.email, password: formData.password, firstName: formData.name, lastName: "", }); // Auto-login after successful registration const res = await signIn("credentials", { redirect: false, email: formData.email, password: formData.password, }); if (res?.error) { throw new Error(res.error); } onOpenChange(false); toaster.success({ title: t("auth.register-success") || "Kayıt başarılı!", type: "success", }); } catch (error) { toaster.error({ title: (error as Error).message || "Kayıt yapılamadı!", type: "error", }); } finally { setLoading(false); } }; return ( { onOpenChange(e.open); if (!e.open) { // Reset to login when closing setMode("login"); loginForm.reset(); registerForm.reset(); } }} > {mode === "login" ? t("auth.sign-in") : t("auth.sign-up")} {/* ────── Tab Switcher ────── */} {/* ────── LOGIN FORM ────── */} {mode === "login" && ( }> {t("auth.dont-have-account")}{" "} switchMode("register")} > {t("auth.sign-up")} )} {/* ────── REGISTER FORM ────── */} {mode === "register" && ( }> }> {t("auth.already-have-an-account")}{" "} switchMode("login")} > {t("auth.sign-in")} )} ); }