source: frontend/src/App.jsx@ 2e0035f

Last change on this file since 2e0035f was 2e0035f, checked in by Acko <lavurovski.a65@…>, 8 days ago

Initial Commit

  • Property mode set to 100644
File size: 1.7 KB
Line 
1import { useState } from 'react'
2import { auth } from './lib/api.js'
3import Login from './pages/Login.jsx'
4import Feed from './pages/Feed.jsx'
5import Recipes from './pages/Recipes.jsx'
6import Planner from './pages/Planner.jsx'
7import Grocery from './pages/Grocery.jsx'
8import Biometrics from './pages/Biometrics.jsx'
9import Trainer from './pages/Trainer.jsx'
10
11const TABS = [
12 { key: 'feed', label: 'Feed', component: Feed },
13 { key: 'recipes', label: 'Recipes', component: Recipes },
14 { key: 'planner', label: 'Planner', component: Planner },
15 { key: 'grocery', label: 'Grocery', component: Grocery },
16 { key: 'biometrics', label: 'Biometrics', component: Biometrics },
17 { key: 'trainer', label: 'Trainer', component: Trainer, roles: ['trainer', 'administrator'] }
18]
19
20export default function App() {
21 const [user, setUser] = useState(auth.user())
22 const [tab, setTab] = useState('feed')
23
24 if (!user) return <Login onSignedIn={setUser} />
25
26 const visible = TABS.filter(t => !t.roles || t.roles.includes(user.role))
27 const Active = (visible.find(t => t.key === tab) || visible[0]).component
28
29 const signOut = () => {
30 auth.clear()
31 setUser(null)
32 }
33
34 return (
35 <div className="app">
36 <header className="top">
37 <h1>Nutritioneer</h1>
38 <span className="muted">prototype</span>
39 <span className="who">
40 {user.username} ({user.role}) <button className="small" onClick={signOut}>sign out</button>
41 </span>
42 </header>
43
44 <nav>
45 {visible.map(t => (
46 <button key={t.key}
47 className={t.key === tab ? 'active' : ''}
48 onClick={() => setTab(t.key)}>
49 {t.label}
50 </button>
51 ))}
52 </nav>
53
54 <Active user={user} />
55 </div>
56 )
57}
Note: See TracBrowser for help on using the repository browser.