'use client'; import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react'; import { useRouter } from 'next/navigation'; import type { User } from './types'; interface AuthContextType { user: User | null; token: string | null; isLoading: boolean; login: (email: string, password: string) => Promise<{ success: boolean; error?: string }>; logout: () => void; isAuthenticated: boolean; } const AuthContext = createContext(undefined); const AUTH_TOKEN_KEY = 'factoryops_token'; const AUTH_USER_KEY = 'factoryops_user'; export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [token, setToken] = useState(null); const [isLoading, setIsLoading] = useState(true); const router = useRouter(); useEffect(() => { const storedToken = localStorage.getItem(AUTH_TOKEN_KEY); const storedUser = localStorage.getItem(AUTH_USER_KEY); if (storedToken && storedUser) { setToken(storedToken); setUser(JSON.parse(storedUser)); } setIsLoading(false); }, []); const login = useCallback(async (email: string, password: string) => { try { const apiUrl = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'; const res = await fetch(`${apiUrl}/api/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password }), }); if (!res.ok) { const error = await res.json().catch(() => ({ detail: '로그인에 실패했습니다.' })); return { success: false, error: error.detail || '로그인에 실패했습니다.' }; } const data = await res.json(); const { access_token, user: userData } = data; localStorage.setItem(AUTH_TOKEN_KEY, access_token); localStorage.setItem(AUTH_USER_KEY, JSON.stringify(userData)); setToken(access_token); setUser(userData); return { success: true }; } catch { return { success: false, error: '서버 연결에 실패했습니다.' }; } }, []); const logout = useCallback(() => { localStorage.removeItem(AUTH_TOKEN_KEY); localStorage.removeItem(AUTH_USER_KEY); setToken(null); setUser(null); router.push('/login'); }, [router]); return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; } export function getStoredToken(): string | null { if (typeof window === 'undefined') return null; return localStorage.getItem(AUTH_TOKEN_KEY); }