import type { BaseFormInputProps, WithPlaceholderProps } from '@/components/blocks/asset-form/asset-form-types'; import { Button } from '@/components/ui/button'; import { Command, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { useDebounce } from '@/hooks/use-debounce'; import { queryKeys, sanitizeSearchTerm } from '@/lib/react-query'; import { hasuraClient } from '@/lib/settlemint/hasura'; import { cn } from '@/lib/utils'; import type { ResultOf } from '@settlemint/sdk-hasura'; import { useQuery } from '@tanstack/react-query'; import { CommandEmpty, CommandLoading, useCommandState } from 'cmdk'; import { Check, ChevronsUpDown } from 'lucide-react'; import { useState } from 'react'; import type { FieldValues } from 'react-hook-form'; import type { Address } from 'viem'; import { EvmAddress } from '../../evm-address/evm-address'; import { SearchUsers } from '../../search/search-query'; type AssetFormSearchSelectProps = BaseFormInputProps & WithPlaceholderProps & { /** The default selected value */ defaultValue?: string; }; export function AssetFormUsers({ label, description, required, placeholder = 'Select an option', className, defaultValue, ...props }: AssetFormSearchSelectProps) { const [open, setOpen] = useState(false); return ( { return ( {label && ( {label} {required && *} )} {description && {description}} ); }} /> ); } function AssetFormUsersList({ onValueChange, setOpen, value, }: { onValueChange: (value: string) => void; setOpen: (open: boolean) => void; value: string }) { const search = useCommandState((state) => state.search); const debounced = useDebounce(search, 250); const { data, isLoading } = useQuery({ queryKey: queryKeys.search(debounced), enabled: debounced.trim() !== '', queryFn: async () => { const sanitizedSearch = sanitizeSearchTerm(debounced); const users: ResultOf['user'] = []; const searchUsers = await hasuraClient.request(SearchUsers, { search: `%${sanitizedSearch}%`, }); users.push(...searchUsers.user); return users; }, }); return ( {isLoading && Searching...} No user found. {data?.map((user) => ( { onValueChange(currentValue); setOpen(false); }} > ))} ); }