import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; /** * 회원 인증 상태 관리 훅. * - isLoggedIn: 로그인 여부 * - member: 회원 정보 * - requireLogin(redirectPath): 비회원이면 로그인 페이지로 이동 */ export function useMemberAuth() { const navigate = useNavigate(); const [member, setMember] = useState(null); const [loaded, setLoaded] = useState(false); useEffect(() => { const token = localStorage.getItem('member_token'); const user = localStorage.getItem('member_user'); if (token && user) { try { setMember(JSON.parse(user)); } catch { /* 손상된 데이터 무시 */ } } setLoaded(true); }, []); const logout = () => { localStorage.removeItem('member_token'); localStorage.removeItem('member_user'); setMember(null); navigate('/'); }; const requireLogin = (redirectPath = window.location.pathname) => { if (!member) { navigate(`/login?redirect=${encodeURIComponent(redirectPath)}`); return false; } return true; }; return { member, isLoggedIn: !!member, loaded, logout, requireLogin, }; } /** * 회원 전용 접근 보호 컴포넌트. * 비로그인 시 잠금 오버레이 표시. * * 사용: * * * */ export function MemberOnly({ children, feature = '이 기능' }) { const { isLoggedIn, loaded } = useMemberAuth(); const navigate = useNavigate(); if (!loaded) return null; if (!isLoggedIn) { return (
{children}
🔒
{feature}은 회원 전용입니다
로그인 후 이용하실 수 있습니다
); } return children; }