"use client"; import React, { createContext, useContext, useEffect, useState } from "react"; import { useAuth } from "@/hooks/useAuth"; import { SessionManager, initSessionManager, cleanupSessionManager, formatTime } from "@/lib/sessionManager"; interface AuthContextType { sessionManager: SessionManager | null; showSessionWarning: boolean; warningTime: number; } const AuthContext = createContext(undefined); interface AuthProviderProps { children: React.ReactNode; } /** * 인증 컨텍스트 프로바이더 * 전역 세션 관리 및 세션 만료 경고 처리 */ export function AuthProvider({ children }: AuthProviderProps) { const { isLoggedIn, logout } = useAuth(); const [sessionManager, setSessionManager] = useState(null); const [showSessionWarning, setShowSessionWarning] = useState(false); const [warningTime, setWarningTime] = useState(0); // 세션 매니저 초기화 및 정리 useEffect(() => { if (isLoggedIn) { // 세션 매니저 초기화 const manager = initSessionManager( { checkInterval: 60000, // 1분마다 체크 warningTime: 300000, // 5분 전 경고 maxInactiveTime: 1800000, // 30분 비활성 시 만료 }, { onWarning: (remainingTime: number) => { console.log(`세션 만료 경고: ${formatTime(remainingTime)} 남음`); setWarningTime(remainingTime); setShowSessionWarning(true); }, onExpiry: () => { console.log("세션이 만료되어 자동 로그아웃됩니다"); setShowSessionWarning(false); logout(); }, onActivity: () => { // 활동 감지 시 경고 숨김 if (showSessionWarning) { setShowSessionWarning(false); } }, }, ); setSessionManager(manager); manager.start(); return () => { manager.stop(); cleanupSessionManager(); setSessionManager(null); }; } else { // 로그인되지 않은 경우 세션 매니저 정리 cleanupSessionManager(); setSessionManager(null); setShowSessionWarning(false); } }, [isLoggedIn, logout, showSessionWarning]); const contextValue: AuthContextType = { sessionManager, showSessionWarning, warningTime, }; return {children}; } /** * 인증 컨텍스트 사용 훅 */ export function useAuthContext() { const context = useContext(AuthContext); if (context === undefined) { throw new Error("useAuthContext must be used within an AuthProvider"); } return context; } export default AuthProvider;