96 lines
2.7 KiB
TypeScript
96 lines
2.7 KiB
TypeScript
"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<AuthContextType | undefined>(undefined);
|
|
|
|
interface AuthProviderProps {
|
|
children: React.ReactNode;
|
|
}
|
|
|
|
/**
|
|
* 인증 컨텍스트 프로바이더
|
|
* 전역 세션 관리 및 세션 만료 경고 처리
|
|
*/
|
|
export function AuthProvider({ children }: AuthProviderProps) {
|
|
const { isLoggedIn, logout } = useAuth();
|
|
const [sessionManager, setSessionManager] = useState<SessionManager | null>(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 <AuthContext.Provider value={contextValue}>{children}</AuthContext.Provider>;
|
|
}
|
|
|
|
/**
|
|
* 인증 컨텍스트 사용 훅
|
|
*/
|
|
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;
|