import { useRef } from 'react'; import { Key } from 'ts-key-enum'; import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem'; import { DropdownMenuItemsContainer } from '@/ui/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuSelectableItem } from '@/ui/dropdown/components/DropdownMenuSelectableItem'; import { useScopedHotkeys } from '@/ui/hotkey/hooks/useScopedHotkeys'; import { Avatar } from '@/users/components/Avatar'; import { isDefined } from '~/utils/isDefined'; import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { OverflowingTextWithTooltip } from '../../tooltip/OverflowingTextWithTooltip'; import { useEntitySelectScroll } from '../hooks/useEntitySelectScroll'; import { EntityForSelect } from '../types/EntityForSelect'; import { RelationPickerHotkeyScope } from '../types/RelationPickerHotkeyScope'; import { DropdownMenuSkeletonItem } from './skeletons/DropdownMenuSkeletonItem'; export type EntitiesForSingleEntitySelect< CustomEntityForSelect extends EntityForSelect, > = { selectedEntity: CustomEntityForSelect; entitiesToSelect: CustomEntityForSelect[]; loading: boolean; }; export function SingleEntitySelectBase< CustomEntityForSelect extends EntityForSelect, >({ entities, onEntitySelected, onCancel, }: { entities: EntitiesForSingleEntitySelect; onEntitySelected: (entity: CustomEntityForSelect | null | undefined) => void; onCancel?: () => void; }) { const containerRef = useRef(null); let entitiesInDropdown = isDefined(entities.selectedEntity) ? [entities.selectedEntity, ...(entities.entitiesToSelect ?? [])] : entities.entitiesToSelect ?? []; entitiesInDropdown = entitiesInDropdown.filter((entity) => isNonEmptyString(entity.name), ); const { hoveredIndex, resetScroll } = useEntitySelectScroll({ entities: entitiesInDropdown, containerRef, }); useScopedHotkeys( Key.Enter, () => { onEntitySelected(entitiesInDropdown[hoveredIndex]); resetScroll(); }, RelationPickerHotkeyScope.RelationPicker, [entitiesInDropdown, hoveredIndex, onEntitySelected], ); useScopedHotkeys( Key.Escape, () => { onCancel?.(); }, RelationPickerHotkeyScope.RelationPicker, [onCancel], ); entitiesInDropdown = entitiesInDropdown.filter((entity) => isNonEmptyString(entity.name.trim()), ); return ( {entities.loading ? ( ) : entitiesInDropdown.length === 0 ? ( No result ) : ( entitiesInDropdown?.map((entity, index) => ( onEntitySelected(entity)} > )) )} ); }