| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import { useState, type JSX } from 'react'
- import { useLocation, useNavigate } from '@tanstack/react-router'
- import { Link } from '@tanstack/react-router'
- import { cn } from '@/lib/utils'
- import { ScrollArea } from '@/components/ui/scroll-area'
- import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
- } from '@/components/ui/select'
- import { buttonVariants } from '@/components/button'
- interface SidebarNavProps extends React.HTMLAttributes<HTMLElement> {
- items: {
- href: string
- title: string
- icon: JSX.Element
- }[]
- }
- export default function SidebarNav({
- className,
- items,
- ...props
- }: SidebarNavProps) {
- const { pathname } = useLocation()
- const navigate = useNavigate()
- const [val, setVal] = useState(pathname ?? '/settings')
- const handleSelect = (e: string) => {
- setVal(e)
- navigate({ to: e })
- }
- return (
- <>
- <div className='p-1 md:hidden'>
- <Select value={val} onValueChange={handleSelect}>
- <SelectTrigger className='h-12 sm:w-48'>
- <SelectValue placeholder='Theme' />
- </SelectTrigger>
- <SelectContent>
- {items.map((item) => (
- <SelectItem key={item.href} value={item.href}>
- <div className='flex gap-x-4 px-2 py-1'>
- <span className='scale-125'>{item.icon}</span>
- <span className='text-md'>{item.title}</span>
- </div>
- </SelectItem>
- ))}
- </SelectContent>
- </Select>
- </div>
- <ScrollArea
- orientation='horizontal'
- type='always'
- className='hidden w-full bg-background px-1 py-2 md:block min-w-40'
- >
- <nav
- className={cn(
- 'flex py-1 space-x-2 lg:flex-col lg:space-x-0 lg:space-y-1',
- className
- )}
- {...props}
- >
- {items.map((item) => (
- <Link
- key={item.href}
- to={item.href}
- className={cn(
- buttonVariants({ variant: 'ghost' }),
- pathname === item.href
- ? 'bg-muted hover:bg-muted'
- : 'hover:bg-transparent hover:underline',
- 'justify-start'
- )}
- >
- <span className='mr-2'>{item.icon}</span>
- {item.title}
- </Link>
- ))}
- </nav>
- </ScrollArea>
- </>
- )
- }
|