commerce/components/ui/combox.tsx
2024-04-23 20:37:35 +01:00

82 lines
2.0 KiB
TypeScript

"use client"
import { Check, ChevronsUpDown } from "lucide-react"
import { Button } from "@/components/ui/button"
import {
Command,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem
} from "@/components/ui/command"
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover"
import { cn } from "@/lib/utils"
import { useState } from "react"
type Option = {
key: string,
label: string,
}
export function Combox(
{
options,
currentKey,
onShow,
}: {
options: Option[],
currentKey: string | null,
onShow: ((key: string) => void),
}) {
const [open, setOpen] = useState(false)
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
role="combobox"
aria-expanded={open}
className="w-[200px] justify-between truncate text-ellipsis"
>
{currentKey
? options.find((option) => option.key === currentKey)?.label
: "Select option..."}
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
</Button>
</PopoverTrigger> <br /><br />
<PopoverContent className="w-[200px] p-0 bg-popover">
<Command>
<CommandInput placeholder="Search option..." />
<CommandEmpty>No option found.</CommandEmpty>
<CommandGroup>
{options.map((option) => (
<CommandItem
key={option.key}
onSelect={() => {
// setCurrentKey(option.key)
setOpen(false)
onShow(option.key)
}}
>
<Check
className={cn(
"mr-2 h-4 w-4",
currentKey === option.key ? "opacity-100" : "opacity-0"
)}
/>
{option.label}
</CommandItem>
))}
</CommandGroup>
</Command>
</PopoverContent>
</Popover>
)
}