"use client"
import { zodResolver } from "@hookform/resolvers/zod"
import { Check, ChevronsUpDown } from "lucide-react"
import { Controller, useForm } from "react-hook-form"
import { toast } from "sonner"
import { z } from "zod"
import { cn } from "@/lib/utils"
import { Button } from "@/registry/new-york/ui/button"
import {
Command,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList,
} from "@/registry/new-york/ui/command"
import { DialogTrigger } from "@/registry/new-york/ui/dialog"
import {
Field,
FieldDescription,
FieldError,
FieldLabel,
} from "@/registry/new-york/ui/field"
import { Popover } from "@/registry/new-york/ui/popover"
const languages = [
{ label: "English", value: "en" },
{ label: "French", value: "fr" },
{ label: "German", value: "de" },
{ label: "Spanish", value: "es" },
{ label: "Portuguese", value: "pt" },
{ label: "Russian", value: "ru" },
{ label: "Japanese", value: "ja" },
{ label: "Korean", value: "ko" },
{ label: "Chinese", value: "zh" },
] as const
const FormSchema = z.object({
language: z.string({
required_error: "Please select a language.",
}),
})
export default function ComboboxForm() {
const form = useForm<z.infer<typeof FormSchema>>({
resolver: zodResolver(FormSchema),
})
function onSubmit(data: z.infer<typeof FormSchema>) {
toast("You submitted the following values", {
description: (
<pre className="mt-2 w-[320px] rounded-md bg-neutral-950 p-4">
<code className="text-white">{JSON.stringify(data, null, 2)}</code>
</pre>
),
})
}
return (
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
<Controller
control={form.control}
name="language"
render={({ field, fieldState }) => (
<Field data-invalid={fieldState.invalid} className="flex flex-col">
<FieldLabel>Language</FieldLabel>
<DialogTrigger>
<Button
variant="outline"
className={cn(
"w-[200px] justify-between",
!field.value && "text-muted-foreground"
)}
aria-invalid={fieldState.invalid}
>
{field.value
? languages.find((language) => language.value === field.value)
?.label
: "Select language"}
<ChevronsUpDown className="opacity-50" />
</Button>
<Popover className="w-[200px] p-0">
<Command>
<CommandInput
placeholder="Search language..."
className="h-9"
/>
<CommandList>
<CommandEmpty>No language found.</CommandEmpty>
<CommandGroup>
{languages.map((language) => (
<CommandItem
value={language.label}
key={language.value}
onSelect={() => {
field.onChange(language.value)
field.onBlur()
}}
>
{language.label}
<Check
className={cn(
"ml-auto",
language.value === field.value
? "opacity-100"
: "opacity-0"
)}
/>
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</Popover>
</DialogTrigger>
<FieldDescription>
This is the language that will be used in the dashboard.
</FieldDescription>
{fieldState.invalid && <FieldError errors={[fieldState.error]} />}
</Field>
)}
/>
<Button type="submit">Submit</Button>
</form>
)
}