import * as React from "react"; import { useState } from "react"; import { Button } from "../ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "../ui/card"; import { cn } from "../../lib/utils"; interface SignInPageProps { className?: string; onSignIn?: (email: string, password: string) => void; onSignUpClick?: () => void; onBack?: () => void; } /** * 로그인 화면 컴포넌트 * Vooster.ai 스타일의 세련된 디자인 * 실제 API 연동은 나중에 구현 */ const SignInPage = React.forwardRef( ({ className, onSignIn, onSignUpClick, onBack, ...props }, ref) => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [isLoading, setIsLoading] = useState(false); const [errors, setErrors] = useState<{ email?: string; password?: string; general?: string; }>({}); // 이메일 유효성 검사 const validateEmail = (email: string) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; // 폼 제출 핸들러 const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // 유효성 검사 const newErrors: typeof errors = {}; if (!email) { newErrors.email = "이메일을 입력해주세요."; } else if (!validateEmail(email)) { newErrors.email = "올바른 이메일 형식을 입력해주세요."; } if (!password) { newErrors.password = "비밀번호를 입력해주세요."; } setErrors(newErrors); if (Object.keys(newErrors).length > 0) { return; } setIsLoading(true); try { // 로그인 처리 (실제 API 호출은 나중에) await new Promise((resolve) => setTimeout(resolve, 1500)); // 시뮬레이션 onSignIn?.(email, password); } catch (error) { console.error("로그인 실패:", error); setErrors({ general: "로그인에 실패했습니다. 이메일과 비밀번호를 확인해주세요.", }); } finally { setIsLoading(false); } }; return (
{/* Background decoration */}
{/* 로고 및 헤더 */}

sheetEasy AI

계정에 로그인하여 AI 편집을 계속하세요

{/* 로그인 폼 */} 로그인

계정에 다시 오신 것을 환영합니다

{/* 일반 오류 메시지 */} {errors.general && (

{errors.general}

)}
{/* 이메일 입력 */}
setEmail(e.target.value)} className={cn( "w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors", errors.email ? "border-red-500" : "border-gray-300", )} placeholder="your@email.com" disabled={isLoading} /> {errors.email && (

{errors.email}

)}
{/* 비밀번호 입력 */}
setPassword(e.target.value)} className={cn( "w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors", errors.password ? "border-red-500" : "border-gray-300", )} placeholder="비밀번호를 입력해주세요" disabled={isLoading} /> {errors.password && (

{errors.password}

)}
{/* 비밀번호 찾기 링크 */}
{/* 로그인 버튼 */}
{/* 소셜 로그인 (나중에 구현) */}
또는
{/* 가입 링크 */}

아직 계정이 없으신가요?{" "}

{/* 뒤로가기 버튼 */}
); }, ); SignInPage.displayName = "SignInPage"; export { SignInPage };