import { useRef } from 'react'; import { useTheme } from '@emotion/react'; import { Key } from 'ts-key-enum'; import { DropdownMenuItem } from '@/ui/dropdown/components/DropdownMenuItem'; import { DropdownMenuSelectableItem } from '@/ui/dropdown/components/DropdownMenuSelectableItem'; import { IconBuildingSkyscraper, IconUserCircle } from '@/ui/icon'; import { StyledDropdownMenuItemsContainer } from '@/ui/dropdown/components/StyledDropdownMenuItemsContainer'; import { OverflowingTextWithTooltip } from '@/ui/tooltip/OverflowingTextWithTooltip'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { Avatar } from '@/users/components/Avatar'; import { isDefined } from '~/utils/isDefined'; import { isNonEmptyString } from '~/utils/isNonEmptyString'; import { useEntitySelectScroll } from '../hooks/useEntitySelectScroll'; import { EntityForSelect } from '../types/EntityForSelect'; import { Entity } from '../types/EntityTypeForSelect'; 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, noUser, }: { entities: EntitiesForSingleEntitySelect; onEntitySelected: (entity: CustomEntityForSelect | null | undefined) => void; onCancel?: () => void; noUser?: CustomEntityForSelect; }) { 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()), ); const theme = useTheme(); return ( {noUser && ( onEntitySelected(noUser)}> {noUser.entityType === Entity.User ? ( ) : ( )} {noUser.name} )} {entities.loading ? ( ) : entitiesInDropdown.length === 0 ? ( No result ) : ( entitiesInDropdown?.map((entity, index) => ( onEntitySelected(entity)} > )) )} ); }