import React, { useEffect, useState } from 'react'; import Sidebar from './components/Sidebar'; import ChatPage from './pages/ChatPage'; import ToolsPage from './pages/ToolsPage'; import LecturePage from './pages/LecturePage'; import AiNewsPage from './pages/AiNewsPage'; import QnaPage from './pages/QnaPage'; import { ToolProvider } from './context/ToolContext'; import { AuthProvider, useAuth } from './context/AuthContext'; import LoginPage from './pages/LoginPage'; import { useTool } from './context/ToolContext'; function TopbarTitle({ currentPage, onNavigate }) { const { selectedTool } = useTool(); const { user, logout } = useAuth(); const titleMap = { tools: '도구', lecture: '강의', ai_news: 'AI뉴스', qna: '질의응답' }; const title = currentPage === 'chat' ? (selectedTool?.name || '채팅') : (titleMap[currentPage] || ''); return (
{title}
); } function UserBadge({ user, onLogout, onNavigate }) { const [open, setOpen] = React.useState(false); if (!user) return { e.preventDefault(); onNavigate('login'); }}>로그인; return (
{open && (
{user.email}
)}
); } export default function App() { const [currentPage, setCurrentPage] = useState('chat'); const PAGES = { chat: , tools: , lecture: , // community 제거 login: { handleNavigate('chat'); }} />, ai_news: , qna: , }; // URL → 상태 동기화 (초기 진입 및 뒤로가기 대응) useEffect(() => { const path = window.location.pathname.replace(/^\/+/, ''); const menuPaths = { chatting: 'chat', tools: 'tools', lecture: 'lecture', ai_news: 'ai_news', qna: 'qna', login: 'login' }; const maybeMenu = menuPaths[path]; if (maybeMenu) { setCurrentPage(maybeMenu); } else if (path === '') { setCurrentPage('chat'); } else { // 카드 경로일 때는 채팅 페이지로 전환 setCurrentPage('chat'); } }, []); // 브라우저 뒤/앞으로가기(popstate) 시 URL에 맞게 화면 전환 useEffect(() => { const onPopState = () => { const path = window.location.pathname.replace(/^\/+/, ''); const menuPaths = { chatting: 'chat', tools: 'tools', lecture: 'lecture', ai_news: 'ai_news', qna: 'qna', login: 'login' }; const maybeMenu = menuPaths[path]; if (maybeMenu) { setCurrentPage(maybeMenu); } else if (path === '') { setCurrentPage('chat'); } else { // 카드 경로는 채팅 화면으로 setCurrentPage('chat'); } }; window.addEventListener('popstate', onPopState); return () => window.removeEventListener('popstate', onPopState); }, []); // 메뉴 전환 시 URL 경로 갱신 function handleNavigate(page) { setCurrentPage(page); const menuToPath = { chat: 'chatting', tools: 'tools', lecture: 'lecture', ai_news: 'ai_news', qna: 'qna', login: 'login' }; const p = menuToPath[page] || ''; const newPath = `/${p}`; if (window.location.pathname !== newPath) { window.history.pushState({}, '', newPath); } } return (
{PAGES[currentPage]}
); }