import { useRef } from 'react'; import { Key } from 'ts-key-enum'; import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer'; import type { IconComponent } from '@/ui/icon/types/IconComponent'; import { MenuItem } from '@/ui/menu-item/components/MenuItem'; import { MenuItemSelectAvatar } from '@/ui/menu-item/components/MenuItemSelectAvatar'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { Avatar } from '@/users/components/Avatar'; import { assertNotNull } from '~/utils/assert'; import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { useEntitySelectScroll } from '../hooks/useEntitySelectScroll'; import { EntityForSelect } from '../types/EntityForSelect'; import { RelationPickerHotkeyScope } from '../types/RelationPickerHotkeyScope'; import { DropdownMenuSkeletonItem } from './skeletons/DropdownMenuSkeletonItem'; export type SingleEntitySelectBaseProps< CustomEntityForSelect extends EntityForSelect, > = { EmptyIcon?: IconComponent; emptyLabel?: string; entitiesToSelect: CustomEntityForSelect[]; loading?: boolean; onCancel?: () => void; onEntitySelected: (entity?: CustomEntityForSelect) => void; selectedEntity?: CustomEntityForSelect; }; export const SingleEntitySelectBase = < CustomEntityForSelect extends EntityForSelect, >({ EmptyIcon, emptyLabel, entitiesToSelect, loading, onCancel, onEntitySelected, selectedEntity, }: SingleEntitySelectBaseProps) => { const containerRef = useRef(null); const entitiesInDropdown = [selectedEntity, ...entitiesToSelect].filter( (entity): entity is CustomEntityForSelect => assertNotNull(entity) && isNonEmptyString(entity.name.trim()), ); 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], ); return ( {emptyLabel && ( onEntitySelected()} LeftIcon={EmptyIcon} text={emptyLabel} /> )} {loading ? ( ) : entitiesInDropdown.length === 0 ? ( ) : ( entitiesInDropdown?.map((entity) => ( onEntitySelected(entity)} text={entity.name} hovered={hoveredIndex === entitiesInDropdown.indexOf(entity)} avatar={ } /> )) )} ); };