"use client"; import { useState } from "react"; import Link from "next/link"; import { AUTH_ROUTES } from "@/features/auth/constants"; import { login, signInWithGoogle, signInWithKakao, } from "@/features/auth/actions"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { Separator } from "@/components/ui/separator"; import { InlineSpinner } from "@/components/ui/loading-spinner"; /** * [로그인 폼 클라이언트 컴포넌트] * * 이메일 기억하기 기능을 제공하는 로그인 폼입니다. * - localStorage를 사용하여 이메일 저장/불러오기 * - 체크박스 선택 시 이메일 자동 저장 * - 서버 액션(login)과 연동 * - 하이드레이션 이슈 해결을 위해 useEffect 사용 */ export default function LoginForm() { // ========== 상태 관리 ========== const [email, setEmail] = useState(() => { if (typeof window === "undefined") return ""; return localStorage.getItem("auto-trade-saved-email") || ""; }); const [rememberMe, setRememberMe] = useState(() => { if (typeof window === "undefined") return false; return !!localStorage.getItem("auto-trade-saved-email"); }); const [isLoading, setIsLoading] = useState(false); // ========== 폼 제출 핸들러 ========== const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); const formData = new FormData(e.currentTarget); // localStorage 처리 (동기) if (rememberMe) { localStorage.setItem("auto-trade-saved-email", email); } else { localStorage.removeItem("auto-trade-saved-email"); } // 서버 액션 호출 (리다이렉트 발생) try { await login(formData); } catch (error) { console.error("Login error:", error); setIsLoading(false); } }; return (
{/* ========== 로그인 폼 ========== */}
{/* ========== 이메일 입력 필드 ========== */}
setEmail(e.target.value)} className="h-11 transition-all duration-200 focus-visible:ring-brand-500" />
{/* ========== 비밀번호 입력 필드 ========== */}
{/* ========== 이메일 기억하기 & 비밀번호 찾기 ========== */}
setRememberMe(checked === true)} />
비밀번호 찾기
{/* ========== 로그인 버튼 ========== */} {/* ========== 회원가입 링크 ========== */}

계정이 없으신가요?{" "} 회원가입 하기

{/* ========== 소셜 로그인 구분선 ========== */}
또는 소셜 로그인
{/* ========== 소셜 로그인 버튼들 ========== */}
{/* ========== Google 로그인 버튼 ========== */}
{/* ========== Kakao 로그인 버튼 ========== */}
); }