import { orgQueries } from "@app/lib/queries"; import { getUserDisplayName } from "@app/lib/getUserDisplayName"; import { useQuery } from "@tanstack/react-query"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "./ui/command"; import { useMemo, useState } from "react"; import { useTranslations } from "next-intl"; import { CheckIcon } from "lucide-react"; import { cn } from "@app/lib/cn"; import { useDebounce } from "use-debounce"; import type { SelectedUser } from "./users-selector"; export type { SelectedUser }; export type UserSelectorProps = { orgId: string; selectedUser?: SelectedUser | null; onSelectUser: (user: SelectedUser | null) => void; allowClear?: boolean; }; export function UserSelector({ orgId, selectedUser, onSelectUser, allowClear = true }: UserSelectorProps) { const t = useTranslations(); const [userSearchQuery, setUserSearchQuery] = useState(""); const [debouncedValue] = useDebounce(userSearchQuery, 150); const { data: users = [] } = useQuery( orgQueries.users({ orgId, perPage: 10, query: debouncedValue }) ); const usersShown = useMemo(() => { const allUsers: Array = users.map((u) => ({ id: u.id, text: getUserDisplayName(u) })); if ( debouncedValue.trim().length === 0 && selectedUser && !allUsers.find((user) => user.id === selectedUser.id) ) { allUsers.unshift(selectedUser); } return allUsers; }, [users, selectedUser, debouncedValue]); return ( {t("usersNotFound")} {allowClear && ( { onSelectUser(null); }} > {t("none")} )} {usersShown.map((user) => ( { onSelectUser(user); }} > {user.text} ))} ); }