Backend is here. Default admin is created if needed.
This commit is contained in:
113
App.tsx
113
App.tsx
@@ -17,7 +17,7 @@ function App() {
|
||||
const [currentUser, setCurrentUser] = useState<User | null>(null);
|
||||
const [currentTab, setCurrentTab] = useState<TabView>('TRACK');
|
||||
const [language, setLanguage] = useState<Language>('en');
|
||||
|
||||
|
||||
const [sessions, setSessions] = useState<WorkoutSession[]>([]);
|
||||
const [activeSession, setActiveSession] = useState<WorkoutSession | null>(null);
|
||||
const [activePlan, setActivePlan] = useState<WorkoutPlan | null>(null);
|
||||
@@ -28,30 +28,31 @@ function App() {
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (currentUser) {
|
||||
setSessions(getSessions(currentUser.id));
|
||||
const profile = getCurrentUserProfile(currentUser.id);
|
||||
if (profile?.language) {
|
||||
setLanguage(profile.language);
|
||||
}
|
||||
} else {
|
||||
const loadSessions = async () => {
|
||||
if (currentUser) {
|
||||
const s = await getSessions(currentUser.id);
|
||||
setSessions(s);
|
||||
// Profile fetch is skipped for now as it returns undefined
|
||||
} else {
|
||||
setSessions([]);
|
||||
}
|
||||
}
|
||||
};
|
||||
loadSessions();
|
||||
}, [currentUser]);
|
||||
|
||||
const handleLogin = (user: User) => {
|
||||
setCurrentUser(user);
|
||||
setCurrentTab('TRACK');
|
||||
setCurrentUser(user);
|
||||
setCurrentTab('TRACK');
|
||||
};
|
||||
|
||||
const handleLogout = () => {
|
||||
setCurrentUser(null);
|
||||
setActiveSession(null);
|
||||
setActivePlan(null);
|
||||
setCurrentUser(null);
|
||||
setActiveSession(null);
|
||||
setActivePlan(null);
|
||||
};
|
||||
|
||||
const handleLanguageChange = (lang: Language) => {
|
||||
setLanguage(lang);
|
||||
setLanguage(lang);
|
||||
};
|
||||
|
||||
const handleStartSession = (plan?: WorkoutPlan) => {
|
||||
@@ -71,14 +72,14 @@ function App() {
|
||||
};
|
||||
setActivePlan(plan || null);
|
||||
setActiveSession(newSession);
|
||||
setCurrentTab('TRACK');
|
||||
setCurrentTab('TRACK');
|
||||
};
|
||||
|
||||
const handleEndSession = () => {
|
||||
if (activeSession && currentUser) {
|
||||
const finishedSession = { ...activeSession, endTime: Date.now() };
|
||||
saveSession(currentUser.id, finishedSession);
|
||||
setSessions(prev => [finishedSession, ...prev]);
|
||||
setSessions(prev => [finishedSession, ...prev]);
|
||||
setActiveSession(null);
|
||||
setActivePlan(null);
|
||||
}
|
||||
@@ -109,63 +110,63 @@ function App() {
|
||||
};
|
||||
|
||||
const handleUpdateSession = (updatedSession: WorkoutSession) => {
|
||||
if (!currentUser) return;
|
||||
saveSession(currentUser.id, updatedSession);
|
||||
setSessions(prev => prev.map(s => s.id === updatedSession.id ? updatedSession : s));
|
||||
if (!currentUser) return;
|
||||
saveSession(currentUser.id, updatedSession);
|
||||
setSessions(prev => prev.map(s => s.id === updatedSession.id ? updatedSession : s));
|
||||
};
|
||||
|
||||
const handleDeleteSession = (sessionId: string) => {
|
||||
if (!currentUser) return;
|
||||
deleteSession(currentUser.id, sessionId);
|
||||
setSessions(prev => prev.filter(s => s.id !== sessionId));
|
||||
if (!currentUser) return;
|
||||
deleteSession(currentUser.id, sessionId);
|
||||
setSessions(prev => prev.filter(s => s.id !== sessionId));
|
||||
};
|
||||
|
||||
if (!currentUser) {
|
||||
return <Login onLogin={handleLogin} language={language} onLanguageChange={handleLanguageChange} />;
|
||||
return <Login onLogin={handleLogin} language={language} onLanguageChange={handleLanguageChange} />;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="h-screen w-screen bg-surface text-on-surface font-sans flex flex-col md:flex-row overflow-hidden">
|
||||
|
||||
|
||||
{/* Desktop Navigation Rail (Left) */}
|
||||
<Navbar currentTab={currentTab} onTabChange={setCurrentTab} lang={language} />
|
||||
|
||||
{/* Main Content Area */}
|
||||
<main className="flex-1 h-full relative w-full max-w-5xl mx-auto md:px-4">
|
||||
<div className="h-full w-full pb-20 md:pb-0 bg-surface">
|
||||
{currentTab === 'TRACK' && (
|
||||
<Tracker
|
||||
userId={currentUser.id}
|
||||
activeSession={activeSession}
|
||||
activePlan={activePlan}
|
||||
onSessionStart={handleStartSession}
|
||||
onSessionEnd={handleEndSession}
|
||||
onSetAdded={handleAddSet}
|
||||
onRemoveSet={handleRemoveSetFromActive}
|
||||
lang={language}
|
||||
{currentTab === 'TRACK' && (
|
||||
<Tracker
|
||||
userId={currentUser.id}
|
||||
activeSession={activeSession}
|
||||
activePlan={activePlan}
|
||||
onSessionStart={handleStartSession}
|
||||
onSessionEnd={handleEndSession}
|
||||
onSetAdded={handleAddSet}
|
||||
onRemoveSet={handleRemoveSetFromActive}
|
||||
lang={language}
|
||||
/>
|
||||
)}
|
||||
{currentTab === 'PLANS' && (
|
||||
)}
|
||||
{currentTab === 'PLANS' && (
|
||||
<Plans userId={currentUser.id} onStartPlan={handleStartSession} lang={language} />
|
||||
)}
|
||||
{currentTab === 'HISTORY' && (
|
||||
<History
|
||||
sessions={sessions}
|
||||
onUpdateSession={handleUpdateSession}
|
||||
onDeleteSession={handleDeleteSession}
|
||||
lang={language}
|
||||
/>
|
||||
)}
|
||||
{currentTab === 'STATS' && <Stats sessions={sessions} lang={language} />}
|
||||
{currentTab === 'AI_COACH' && <AICoach history={sessions} lang={language} />}
|
||||
{currentTab === 'PROFILE' && (
|
||||
<Profile
|
||||
user={currentUser}
|
||||
onLogout={handleLogout}
|
||||
lang={language}
|
||||
onLanguageChange={handleLanguageChange}
|
||||
/>
|
||||
)}
|
||||
)}
|
||||
{currentTab === 'HISTORY' && (
|
||||
<History
|
||||
sessions={sessions}
|
||||
onUpdateSession={handleUpdateSession}
|
||||
onDeleteSession={handleDeleteSession}
|
||||
lang={language}
|
||||
/>
|
||||
)}
|
||||
{currentTab === 'STATS' && <Stats sessions={sessions} lang={language} />}
|
||||
{currentTab === 'AI_COACH' && <AICoach history={sessions} lang={language} />}
|
||||
{currentTab === 'PROFILE' && (
|
||||
<Profile
|
||||
user={currentUser}
|
||||
onLogout={handleLogout}
|
||||
lang={language}
|
||||
onLanguageChange={handleLanguageChange}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user