// App.js
import React, { useState, useEffect } from "react";
import Navbar from "./components/Navbar";
import HomePage from "./pages/HomePage";
import VoiceChatPage from "./pages/VoiceChatPage";
import CodingAssistantPage from "./pages/CodingAssistantPage";
import LoginPage from "./pages/LoginPage";
import { getUserStatus, logout } from "./services/apiService";
const Icon = ({ path, onClick, className }) => (
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
className={`w-6 h-6 cursor-pointer transition-colors duration-200 ${className}`}
onClick={onClick}
>
<path d={path} />
</svg>
);
export default function App() {
const [currentPage, setCurrentPage] = useState("home");
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [userId, setUserId] = useState(null);
const authenticatedPages = ["voice-chat", "coding-assistant"];
useEffect(() => {
const urlParams = new URLSearchParams(window.location.search);
const userIdFromUrl = urlParams.get('user_id');
if (userIdFromUrl && !localStorage.getItem('userId')) {
localStorage.setItem('userId', userIdFromUrl);
console.log('User ID from URL saved to localStorage:', userIdFromUrl);
window.history.replaceState({}, document.title, window.location.pathname);
}
}, []);
useEffect(() => {
const checkLoginStatus = async () => {
const storedUserId = localStorage.getItem("userId");
if (storedUserId) {
try {
const status = await getUserStatus(storedUserId);
if (status.is_logged_in) {
setIsLoggedIn(true);
setUserId(storedUserId);
if (currentPage === "login") {
setCurrentPage("home");
}
} else {
setIsLoggedIn(false);
setUserId(null);
localStorage.removeItem("userId");
if (authenticatedPages.includes(currentPage)) {
setCurrentPage("login");
}
}
} catch (error) {
console.error("Failed to check user status:", error);
setIsLoggedIn(false);
setUserId(null);
localStorage.removeItem("userId");
if (authenticatedPages.includes(currentPage)) {
setCurrentPage("login");
}
}
} else {
setIsLoggedIn(false);
setUserId(null);
if (authenticatedPages.includes(currentPage)) {
setCurrentPage("login");
}
}
};
checkLoginStatus();
}, [currentPage]);
const handleLogout = async () => {
try {
await logout();
setIsLoggedIn(false);
setUserId(null);
localStorage.removeItem("userId");
setCurrentPage("home");
} catch (error) {
console.error("Logout failed:", error);
}
};
const handleNavigate = (page) => {
if (authenticatedPages.includes(page) && !isLoggedIn) {
setCurrentPage("login");
} else {
setCurrentPage(page);
}
};
const toggleSidebar = () => {
setIsSidebarOpen(!isSidebarOpen);
};
const renderPage = () => {
switch (currentPage) {
case "home":
// Pass both isLoggedIn and handleLogout to HomePage
return <HomePage onNavigate={handleNavigate} isLoggedIn={isLoggedIn} onLogout={handleLogout} />;
case "voice-chat":
return <VoiceChatPage Icon={Icon} />;
case "coding-assistant":
return <CodingAssistantPage onNavigate={handleNavigate} Icon={Icon} />;
case "login":
return <LoginPage />;
default:
return <HomePage onNavigate={handleNavigate} isLoggedIn={isLoggedIn} onLogout={handleLogout} />;
}
};
return (
<div className="flex min-h-screen bg-gray-100 dark:bg-gray-900 font-sans">
{currentPage !== "login" && (
<Navbar
isOpen={isSidebarOpen}
onToggle={toggleSidebar}
onNavigate={handleNavigate}
onLogout={handleLogout}
isLoggedIn={isLoggedIn}
Icon={Icon}
/>
)}
<div className="flex-grow">
{renderPage()}
</div>
</div>
);
}