import { ChevronDown, Loader2 } from 'lucide-react' import { CategoryIcon } from '@/app/groups/[groupId]/expenses/category-icon' import { Button, ButtonProps } from '@/components/ui/button' import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, } from '@/components/ui/command' import { Drawer, DrawerContent, DrawerTrigger } from '@/components/ui/drawer' import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover' import { useMediaQuery } from '@/lib/hooks' import { Category } from '@prisma/client' import { forwardRef, useEffect, useState } from 'react' type Props = { categories: Category[] onValueChange: (categoryId: Category['id']) => void /** Category ID to be selected by default. Overwriting this value will update current selection, too. */ defaultValue: Category['id'] isLoading: boolean } export function CategorySelector({ categories, onValueChange, defaultValue, isLoading, }: Props) { const [open, setOpen] = useState(false) const [value, setValue] = useState(defaultValue) const isDesktop = useMediaQuery('(min-width: 768px)') // allow overwriting currently selected category from outside useEffect(() => { setValue(defaultValue) onValueChange(defaultValue) }, [defaultValue]) const selectedCategory = categories.find((category) => category.id === value) ?? categories[0] if (isDesktop) { return ( { setValue(id) onValueChange(id) setOpen(false) }} /> ) } return ( { setValue(id) onValueChange(id) setOpen(false) }} /> ) } function CategoryCommand({ categories, onValueChange, }: { categories: Category[] onValueChange: (categoryId: Category['id']) => void }) { const categoriesByGroup = categories.reduce>( (acc, category) => ({ ...acc, [category.grouping]: [...(acc[category.grouping] ?? []), category], }), {}, ) return ( No category found.
{Object.entries(categoriesByGroup).map( ([group, groupCategories], index) => ( {groupCategories.map((category) => ( { const id = Number(currentValue.split(' ')[0]) onValueChange(id) }} > ))} ), )}
) } type CategoryButtonProps = { category: Category open: boolean isLoading: boolean } const CategoryButton = forwardRef( ( { category, open, isLoading, ...props }: ButtonProps & CategoryButtonProps, ref, ) => { const iconClassName = 'ml-2 h-4 w-4 shrink-0 opacity-50' return ( ) }, ) CategoryButton.displayName = 'CategoryButton' function CategoryLabel({ category }: { category: Category }) { return (
{category.name}
) }