{"version":3,"file":"SelectInputOptions.mjs","sources":["../../../../src/inputs/SelectInput/Options/SelectInputOptions.tsx"],"sourcesContent":["import { CrossCircle } from '@transferwise/icons';\nimport { ListboxOptions } from '@headlessui/react';\nimport { clsx } from 'clsx';\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Virtualizer, type VirtualizerHandle } from 'virtua';\n\nimport { SearchInput } from '../../SearchInput';\nimport {\n  SelectInputItemsCountContext,\n  SelectInputItemPositionContext,\n} from '../SelectInput.contexts';\nimport {\n  dedupeSelectInputItems,\n  filterSelectInputItems,\n  MAX_ITEMS_WITHOUT_VIRTUALIZATION,\n  searchableString,\n  selectInputOptionItemIncludesNeedle,\n  sortSelectInputItems,\n} from '../SelectInput.utils';\nimport { SelectInputOptionItem, SelectInputProps, SelectInputItem } from '../SelectInput.types';\nimport messages from '../SelectInput.messages';\n\nimport { SelectInputItemView } from '../ItemView';\nimport { SelectInputOptionsContainer } from './OptionsContainer';\n\n/**\n * Props for the SelectInputOptions component.\n */\nexport interface SelectInputOptionsProps<T = string> extends Pick<\n  SelectInputProps<T>,\n  | 'items'\n  | 'renderValue'\n  | 'renderFooter'\n  | 'filterable'\n  | 'filterPlaceholder'\n  | 'id'\n  | 'parentId'\n  | 'compareValues'\n  | 'sortFilteredOptions'\n> {\n  searchInputRef: React.MutableRefObject<HTMLInputElement | null>;\n  listboxRef: React.MutableRefObject<HTMLDivElement | null>;\n  filterQuery: string;\n  onFilterChange: (query: string) => void;\n  listBoxLabel?: string;\n  listBoxLabelledBy?: string;\n  autocomplete?: string;\n  name?: string;\n  onAutocompleteSelect?: (value: T) => void;\n}\n\n/**\n * The main options container component for SelectInput.\n * Manages filtering, virtualisation, and rendering of options.\n */\nexport function SelectInputOptions<T = string>({\n  id,\n  parentId,\n  items,\n  compareValues: compareValuesProp,\n  renderValue = String,\n  renderFooter,\n  filterable = false,\n  filterPlaceholder,\n  sortFilteredOptions,\n  searchInputRef,\n  listboxRef,\n  filterQuery,\n  onFilterChange,\n  listBoxLabel,\n  listBoxLabelledBy,\n  autocomplete,\n  name,\n  onAutocompleteSelect,\n}: SelectInputOptionsProps<T>) {\n  const intl = useIntl();\n  const virtualiserHandlerRef = useRef<VirtualizerHandle>(null);\n  const controllerRef = filterable ? searchInputRef : listboxRef;\n  const [initialRender, setInitialRender] = useState(true);\n\n  const needle = useMemo(() => {\n    if (filterable) {\n      return filterQuery ? searchableString(filterQuery) : null;\n    }\n    return undefined;\n  }, [filterQuery, filterable]);\n  useEffect(() => {\n    if (needle) {\n      // Ensure having an active option while filtering.\n      // Without `requestAnimationFrame` upon which React depends for scheduling\n      // updates, the active status would only show for a split second and then\n      // disappear inadvertently.\n      requestAnimationFrame(() => {\n        if (\n          controllerRef.current != null &&\n          !controllerRef.current.hasAttribute('aria-activedescendant')\n        ) {\n          // Activate first option via synthetic key press\n          controllerRef.current.dispatchEvent(\n            new KeyboardEvent('keydown', { key: 'Home', bubbles: true }),\n          );\n        }\n      });\n    }\n  }, [controllerRef, needle]);\n\n  const compareValues = useMemo(() => {\n    if (!compareValuesProp) {\n      return undefined;\n    }\n\n    if (typeof compareValuesProp === 'function') {\n      return (a: NonNullable<T>, b: NonNullable<T>) => compareValuesProp(a, b);\n    }\n\n    const key = compareValuesProp;\n    return (a: NonNullable<T>, b: NonNullable<T>) => {\n      if (typeof a === 'object' && a != null && typeof b === 'object' && b != null) {\n        return (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key];\n      }\n      return a === b;\n    };\n  }, [compareValuesProp]);\n\n  const filteredItems: readonly SelectInputItem<NonNullable<T> | undefined>[] = useMemo(() => {\n    if (needle == null) {\n      return items;\n    }\n\n    const dedupedItems = dedupeSelectInputItems(items, compareValues);\n\n    if (sortFilteredOptions) {\n      // When sorting, filter out non-matching items completely to avoid ghost items\n      const filtered = dedupedItems.map((item) => {\n        if (item.type === 'option') {\n          return selectInputOptionItemIncludesNeedle(item, needle)\n            ? item\n            : { ...item, value: undefined };\n        }\n        if (item.type === 'group') {\n          return {\n            ...item,\n            options: item.options.map((option) =>\n              selectInputOptionItemIncludesNeedle(option, needle)\n                ? option\n                : { ...option, value: undefined },\n            ),\n          };\n        }\n        return item;\n      });\n\n      return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);\n    }\n\n    return filterSelectInputItems(dedupedItems, (item) =>\n      selectInputOptionItemIncludesNeedle(item, needle),\n    );\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [needle, items, compareValues]);\n  const resultsEmpty = needle != null && filteredItems.length === 0;\n\n  const virtualized = filteredItems.length > MAX_ITEMS_WITHOUT_VIRTUALIZATION;\n\n  // Items shown once shall be kept mounted until the needle changes, otherwise\n  // the scroll position may jump around inadvertently. Pattern adopted from:\n  // https://inokawa.github.io/virtua/?path=/story/advanced-keep-offscreen-items--append-only\n  const [mountedIndexes, setMountedIndexes] = useState<number[]>([]);\n  const prevNeedleRef = useRef(needle);\n\n  useEffect(() => {\n    const needleChanged = prevNeedleRef.current !== needle;\n    prevNeedleRef.current = needle;\n\n    if (needleChanged) {\n      // Reset mounted indexes when search changes to avoid stale scroll positions\n      setMountedIndexes([]);\n      return;\n    }\n\n    // Ensure the 'End' key works as intended by keeping the last item mounted.\n    // Skipped on needle change to prevent auto-scrolling on search.\n    if (filteredItems.length > 0) {\n      setMountedIndexes((prevMountedIndexes) => {\n        // Create a new array with existing indexes plus the last item index\n        return [...new Set([...prevMountedIndexes, filteredItems.length - 1])]; // Sorting is redundant by nature here\n      });\n    }\n  }, [needle, filteredItems.length]);\n\n  const listboxContainerRef = useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    if (listboxContainerRef.current != null) {\n      listboxContainerRef.current.style.setProperty(\n        '--initial-height',\n        `${listboxContainerRef.current.offsetHeight}px`,\n      );\n    }\n  }, []);\n\n  useEffect(() => {\n    setInitialRender(false);\n  }, []);\n\n  const showStatus = resultsEmpty;\n  const statusId = useId();\n  const listboxId = useId();\n\n  const getItemNode = (index: number) => {\n    const item = filteredItems[index];\n    return (\n      <SelectInputItemView key={index} item={item} renderValue={renderValue} needle={needle} />\n    );\n  };\n\n  const findMatchingItem = (autocompleteValue: string): T | null => {\n    const flatOptions = items\n      .flatMap((item) =>\n        item.type === 'group' ? item.options : item.type === 'option' ? [item] : [],\n      )\n      .filter(\n        (item): item is SelectInputOptionItem<NonNullable<T>> =>\n          item.type === 'option' && item.value != null,\n      );\n\n    const exactMatch = flatOptions.find(\n      (option) =>\n        String(option.value) === autocompleteValue ||\n        option.filterMatchers?.some((matcher) => matcher === autocompleteValue),\n    );\n\n    if (exactMatch) {\n      return exactMatch.value;\n    }\n\n    const fuzzyMatch = flatOptions.find((option) =>\n      option.filterMatchers?.some((matcher) =>\n        matcher.toLowerCase().includes(autocompleteValue.toLowerCase()),\n      ),\n    );\n\n    return fuzzyMatch ? fuzzyMatch.value : null;\n  };\n\n  return (\n    <ListboxOptions\n      modal\n      as={SelectInputOptionsContainer}\n      static\n      className=\"np-select-input-options-container\"\n      onAriaActiveDescendantChange={(value: React.AriaAttributes['aria-activedescendant']) => {\n        if (controllerRef.current != null) {\n          if (!initialRender && value != null) {\n            controllerRef.current.setAttribute('aria-activedescendant', value);\n          } else {\n            controllerRef.current.removeAttribute('aria-activedescendant');\n          }\n        }\n      }}\n    >\n      {filterable ? (\n        <div className=\"np-select-input-query-container\">\n          <SearchInput\n            ref={searchInputRef}\n            id={id}\n            name={name}\n            autoComplete={autocomplete}\n            role=\"combobox\"\n            shape=\"rectangle\"\n            placeholder={filterPlaceholder}\n            aria-label={filterPlaceholder}\n            defaultValue={filterQuery}\n            aria-autocomplete=\"list\"\n            aria-expanded\n            aria-controls={listboxId}\n            aria-describedby={showStatus ? statusId : undefined}\n            onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {\n              // Prevent interfering with the matcher of Headless UI\n              // https://mathiasbynens.be/notes/javascript-unicode#regex\n              if (/^.$/u.test(event.key)) {\n                event.stopPropagation();\n              }\n            }}\n            onChange={(event) => {\n              // Free up resources and ensure not to go out of bounds when the\n              // resulting item count is less than before\n              const inputValue = event.currentTarget.value;\n\n              // Free up resources and ensure not to go out of bounds\n              setMountedIndexes([]);\n              onFilterChange(inputValue);\n            }}\n            onInput={(event) => {\n              const inputValue = event.currentTarget.value;\n              const inputElement = event.currentTarget;\n\n              if (autocomplete && onAutocompleteSelect && inputValue) {\n                setTimeout(() => {\n                  if (inputElement.value === inputValue && inputValue.length > 2) {\n                    const matchedValue = findMatchingItem(inputValue);\n                    if (matchedValue !== null) {\n                      onAutocompleteSelect(matchedValue);\n                    }\n                  }\n                }, 50);\n              }\n            }}\n          />\n        </div>\n      ) : null}\n\n      <section\n        ref={listboxContainerRef}\n        tabIndex={-1}\n        className={clsx(\n          'np-select-input-listbox-container',\n          virtualized && 'np-select-input-listbox-container--virtualized',\n          needle == null && // Groups aren't shown when filtering\n            items.some((item) => item.type === 'group') &&\n            'np-select-input-listbox-container--has-group',\n        )}\n        data-wds-parent={parentId ?? undefined}\n      >\n        {resultsEmpty ? (\n          <div id={statusId} className=\"np-select-input-options-status\">\n            <CrossCircle size={16} className=\"np-select-input-options-status-icon\" />\n            {intl.formatMessage(messages.noResultsFound)}\n          </div>\n        ) : null}\n\n        <div\n          ref={listboxRef}\n          id={listboxId}\n          role=\"listbox\"\n          aria-orientation=\"vertical\"\n          aria-label={listBoxLabel}\n          aria-labelledby={listBoxLabelledBy}\n          tabIndex={0}\n          className=\"np-select-input-listbox\"\n        >\n          {!virtualized ? (\n            filteredItems.map((_, index) => getItemNode(index))\n          ) : (\n            <Virtualizer\n              ref={virtualiserHandlerRef}\n              data={filteredItems}\n              keepMounted={mountedIndexes}\n              scrollRef={listboxRef} // `VList` doesn't expose this\n              onScroll={async () => {\n                if (!virtualiserHandlerRef.current) return;\n\n                const startIndex = virtualiserHandlerRef.current.findItemIndex(\n                  virtualiserHandlerRef.current.scrollOffset,\n                );\n                const endIndex = virtualiserHandlerRef.current.findItemIndex(\n                  virtualiserHandlerRef.current.scrollOffset +\n                    virtualiserHandlerRef.current.viewportSize,\n                );\n\n                setMountedIndexes((prevMountedIndexes) => {\n                  // Create an array of all indexes that should be visible\n\n                  const visibleIndexes = [];\n                  for (let index = startIndex; index <= endIndex; index += 1) {\n                    // eslint-disable-next-line functional/immutable-data\n                    visibleIndexes.push(index);\n                  }\n\n                  // Combine with previous indexes and sort\n                  return [...new Set([...prevMountedIndexes, ...visibleIndexes])].sort(\n                    (a, b) => a - b,\n                  );\n                });\n              }}\n            >\n              {(item, index) => (\n                // The position of each item can't be inferred by browsers when\n                // virtualizing, as some of the items may not be in the DOM\n                <SelectInputItemsCountContext.Provider value={filteredItems.length}>\n                  <SelectInputItemPositionContext.Provider value={index + 1}>\n                    {getItemNode(index)}\n                  </SelectInputItemPositionContext.Provider>\n                </SelectInputItemsCountContext.Provider>\n              )}\n            </Virtualizer>\n          )}\n        </div>\n\n        {renderFooter != null ? (\n          <footer className=\"np-select-input-footer\">\n            <div\n              role=\"none\"\n              onKeyDown={(event) => {\n                // Prevent interfering with Headless UI\n                if (event.key !== 'Escape') {\n                  event.stopPropagation();\n                }\n              }}\n            >\n              {renderFooter({\n                resultsEmpty,\n                queryNormalized: needle,\n              })}\n            </div>\n          </footer>\n        ) : null}\n      </section>\n    </ListboxOptions>\n  );\n}\n"],"names":["SelectInputOptions","id","parentId","items","compareValues","compareValuesProp","renderValue","String","renderFooter","filterable","filterPlaceholder","sortFilteredOptions","searchInputRef","listboxRef","filterQuery","onFilterChange","listBoxLabel","listBoxLabelledBy","autocomplete","name","onAutocompleteSelect","intl","useIntl","virtualiserHandlerRef","useRef","controllerRef","initialRender","setInitialRender","useState","needle","useMemo","searchableString","undefined","useEffect","requestAnimationFrame","current","hasAttribute","dispatchEvent","KeyboardEvent","key","bubbles","a","b","filteredItems","dedupedItems","dedupeSelectInputItems","filtered","map","item","type","selectInputOptionItemIncludesNeedle","value","options","option","sortSelectInputItems","filterSelectInputItems","resultsEmpty","length","virtualized","MAX_ITEMS_WITHOUT_VIRTUALIZATION","mountedIndexes","setMountedIndexes","prevNeedleRef","needleChanged","prevMountedIndexes","Set","listboxContainerRef","style","setProperty","offsetHeight","showStatus","statusId","useId","listboxId","getItemNode","index","_jsx","SelectInputItemView","findMatchingItem","autocompleteValue","flatOptions","flatMap","filter","exactMatch","find","filterMatchers","some","matcher","fuzzyMatch","toLowerCase","includes","_jsxs","ListboxOptions","modal","as","SelectInputOptionsContainer","static","className","onAriaActiveDescendantChange","setAttribute","removeAttribute","children","SearchInput","ref","autoComplete","role","shape","placeholder","defaultValue","onKeyDown","event","test","stopPropagation","onChange","inputValue","currentTarget","onInput","inputElement","setTimeout","matchedValue","tabIndex","clsx","CrossCircle","size","formatMessage","messages","noResultsFound","_","Virtualizer","data","keepMounted","scrollRef","onScroll","startIndex","findItemIndex","scrollOffset","endIndex","viewportSize","visibleIndexes","push","sort","SelectInputItemsCountContext","Provider","SelectInputItemPositionContext","queryNormalized"],"mappings":"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"}