| import { Button } from '@/components/ui/button'; | |
| import { Label } from '@/components/ui/label'; | |
| import { Switch } from '@/components/ui/switch'; | |
| import { ProfileSettingRouteKey } from '@/constants/setting'; | |
| import { useSecondPathName } from '@/hooks/route-hook'; | |
| import { cn } from '@/lib/utils'; | |
| import { | |
| AlignEndVertical, | |
| Banknote, | |
| Box, | |
| FileCog, | |
| LayoutGrid, | |
| LogOut, | |
| User, | |
| } from 'lucide-react'; | |
| import { useHandleMenuClick } from './hooks'; | |
| const menuItems = [ | |
| { | |
| section: 'Account & collaboration', | |
| items: [ | |
| { icon: User, label: 'Profile', key: ProfileSettingRouteKey.Profile }, | |
| { icon: LayoutGrid, label: 'Team', key: ProfileSettingRouteKey.Team }, | |
| { icon: Banknote, label: 'Plan', key: ProfileSettingRouteKey.Plan }, | |
| ], | |
| }, | |
| { | |
| section: 'System configurations', | |
| items: [ | |
| { | |
| icon: Box, | |
| label: 'Model management', | |
| key: ProfileSettingRouteKey.Model, | |
| }, | |
| { | |
| icon: FileCog, | |
| label: 'Prompt management', | |
| key: ProfileSettingRouteKey.Prompt, | |
| }, | |
| { | |
| icon: AlignEndVertical, | |
| label: 'Chunking method', | |
| key: ProfileSettingRouteKey.Chunk, | |
| }, | |
| ], | |
| }, | |
| ]; | |
| export function SideBar() { | |
| const pathName = useSecondPathName(); | |
| const { handleMenuClick } = useHandleMenuClick(); | |
| return ( | |
| <aside className="w-[303px] bg-background border-r"> | |
| {menuItems.map((section, idx) => ( | |
| <div key={idx}> | |
| <h2 className="p-6 text-sm font-semibold">{section.section}</h2> | |
| {section.items.map((item, itemIdx) => { | |
| const active = pathName === item.key; | |
| return ( | |
| <Button | |
| key={itemIdx} | |
| variant={active ? 'secondary' : 'ghost'} | |
| className={cn('w-full justify-start gap-2.5 p-6 relative')} | |
| onClick={handleMenuClick(item.key)} | |
| > | |
| <item.icon className="w-6 h-6" /> | |
| <span>{item.label}</span> | |
| {active && ( | |
| <div className="absolute right-0 w-[5px] h-[66px] bg-primary rounded-l-xl shadow-[0_0_5.94px_#7561ff,0_0_11.88px_#7561ff,0_0_41.58px_#7561ff,0_0_83.16px_#7561ff,0_0_142.56px_#7561ff,0_0_249.48px_#7561ff]" /> | |
| )} | |
| </Button> | |
| ); | |
| })} | |
| </div> | |
| ))} | |
| <div className="p-6 mt-auto border-t"> | |
| <div className="flex items-center gap-2 mb-6"> | |
| <Switch id="dark-mode" /> | |
| <Label htmlFor="dark-mode" className="text-sm"> | |
| Dark | |
| </Label> | |
| </div> | |
| <Button variant="outline" className="w-full gap-3"> | |
| <LogOut className="w-6 h-6" /> | |
| Logout | |
| </Button> | |
| </div> | |
| </aside> | |
| ); | |
| } | |