frontend-app / client /src /App.jsx
Keys
fixes
2ecbb66
import { useEffect, useState } from "react";
import {
BrowserRouter as Router,
Routes,
Route,
Navigate,
} from "react-router-dom";
import Profile from "@/pages/profile";
import Chat from "@/pages/chat";
import Auth from "@/pages/auth";
import PracticeZone from "@/pages/practice-zone"; // Add this import
import apiClient from "@/lib/api-client";
import { GET_USERINFO_ROUTE } from "@/lib/constants";
import { useAppStore } from "@/store";
const PrivateRoute = ({ children }) => {
const { userInfo } = useAppStore();
const isAuthenticated = !!userInfo;
return isAuthenticated ? children : <Navigate to="/auth" />;
};
const AuthRoute = ({ children }) => {
const { userInfo } = useAppStore();
const isAuthenticated = !!userInfo;
return isAuthenticated ? <Navigate to="/chat" /> : children;
};
function App() {
const { userInfo, setUserInfo } = useAppStore();
const [loading, setLoading] = useState(true);
useEffect(() => {
const getUserData = async () => {
try {
const response = await apiClient.get(GET_USERINFO_ROUTE, {
withCredentials: true,
});
if (response.status === 200 && response.data.id) {
setUserInfo(response.data);
} else {
setUserInfo(undefined);
}
} catch (error) {
setUserInfo(undefined);
} finally {
setLoading(false);
}
};
if (!userInfo) {
getUserData();
} else {
setLoading(false);
}
}, [userInfo, setUserInfo]);
if (loading) {
return <div>Loading...</div>;
}
return (
<Router>
<Routes>
<Route
path="/auth"
element={
<AuthRoute>
<Auth />
</AuthRoute>
}
/>
<Route
path="/chat"
element={
<PrivateRoute>
<Chat />
</PrivateRoute>
}
/>
<Route
path="/profile"
element={
<PrivateRoute>
<Profile />
</PrivateRoute>
}
/>
<Route
path="/practice-zone"
element={
<PrivateRoute>
<PracticeZone />
</PrivateRoute>
}
/>
<Route path="*" element={<Navigate to="/auth" />} />
</Routes>
</Router>
);
}
export default App;