← full-stack-fastapi-template / frontend/src/routes/_layout/settings.tsx
| 1 | import { createFileRoute } from "@tanstack/react-router" |
| 2 | |
| 3 | import ChangePassword from "@/components/UserSettings/ChangePassword" |
| 4 | import DeleteAccount from "@/components/UserSettings/DeleteAccount" |
| 5 | import UserInformation from "@/components/UserSettings/UserInformation" |
| 6 | import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" |
| 7 | import useAuth from "@/hooks/useAuth" |
| 8 | |
| 9 | const tabsConfig = [ |
| 10 | { value: "my-profile", title: "My profile", component: UserInformation }, |
| 11 | { value: "password", title: "Password", component: ChangePassword }, |
| 12 | { value: "danger-zone", title: "Danger zone", component: DeleteAccount }, |
| 13 | ] |
| 14 | |
| 15 | export const Route = createFileRoute("/_layout/settings")({ |
| 16 | component: UserSettings, |
| 17 | head: () => ({ |
| 18 | meta: [ |
| 19 | { |
| 20 | title: "Settings - FastAPI Template", |
| 21 | }, |
| 22 | ], |
| 23 | }), |
| 24 | }) |
| 25 | |
| 26 | function UserSettings() { |
| 27 | const { user: currentUser } = useAuth() |
| 28 | const finalTabs = currentUser?.is_superuser |
| 29 | ? tabsConfig.slice(0, 3) |
| 30 | : tabsConfig |
| 31 | |
| 32 | if (!currentUser) { |
| 33 | return null |
| 34 | } |
| 35 | |
| 36 | return ( |
| 37 | <div className="flex flex-col gap-6"> |
| 38 | <div> |
| 39 | <h1 className="text-2xl font-bold tracking-tight">User Settings</h1> |
| 40 | <p className="text-muted-foreground"> |
| 41 | Manage your account settings and preferences |
| 42 | </p> |
| 43 | </div> |
| 44 | |
| 45 | <Tabs defaultValue="my-profile"> |
| 46 | <TabsList> |
| 47 | {finalTabs.map((tab) => ( |
| 48 | <TabsTrigger key={tab.value} value={tab.value}> |
| 49 | {tab.title} |
| 50 | </TabsTrigger> |
| 51 | ))} |
| 52 | </TabsList> |
| 53 | {finalTabs.map((tab) => ( |
| 54 | <TabsContent key={tab.value} value={tab.value}> |
| 55 | <tab.component /> |
| 56 | </TabsContent> |
| 57 | ))} |
| 58 | </Tabs> |
| 59 | </div> |
| 60 | ) |
| 61 | } |
| 62 |