{"version":3,"file":"use-virtualized-combobox.mjs","sources":["../../../../src/components/Combobox/use-combobox/use-virtualized-combobox.ts"],"sourcesContent":["// WIP, not planned to be released in 7.0, maybe in 7.x\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useUncontrolled } from '@raikou/hooks';\nimport { getFirstIndex, getNextIndex, getPreviousIndex } from './get-index/get-virtualized-index';\nimport { ComboboxStore } from './use-combobox';\n\ninterface UseComboboxOptions {\n  /** Default value for `dropdownOpened`, `false` by default */\n  defaultOpened?: boolean;\n\n  /** Controlled `dropdownOpened` state */\n  opened?: boolean;\n\n  /** Called when `dropdownOpened` state changes */\n  onOpenedChange?: (opened: boolean) => void;\n\n  /** Called when dropdown closes */\n  onDropdownClose?: () => void;\n\n  /** Called when dropdown opens */\n  onDropdownOpen?: () => void;\n\n  /** Determines whether arrow key presses should loop though items (first to last and last to first), `true` by default */\n  loop?: boolean;\n\n  /** Function to determine whether the option is disabled */\n  isOptionDisabled?: (optionIndex: number) => boolean;\n\n  totalOptionsCount: number;\n\n  getOptionId: (index: number) => string | null;\n\n  selectedOptionIndex: number;\n\n  setSelectedOptionIndex: (index: number) => void;\n\n  activeOptionIndex?: number;\n\n  onSelectedOptionSubmit: (index: number) => void;\n}\n\nexport function useVirtualizedCombobox(\n  {\n    defaultOpened,\n    opened,\n    onOpenedChange,\n    onDropdownClose,\n    onDropdownOpen,\n    loop = true,\n    totalOptionsCount,\n    isOptionDisabled = () => false,\n    getOptionId,\n    selectedOptionIndex,\n    setSelectedOptionIndex,\n    activeOptionIndex,\n    onSelectedOptionSubmit,\n  }: UseComboboxOptions = {\n    totalOptionsCount: 0,\n    getOptionId: () => null,\n    selectedOptionIndex: 1,\n    setSelectedOptionIndex: () => {},\n    onSelectedOptionSubmit: () => {},\n  }\n): ComboboxStore {\n  const [dropdownOpened, setDropdownOpened] = useUncontrolled({\n    value: opened,\n    defaultValue: defaultOpened,\n    finalValue: false,\n    onChange: onOpenedChange,\n  });\n\n  const listId = useRef<string | null>(null);\n  const searchRef = useRef<HTMLInputElement | null>(null);\n  const targetRef = useRef<HTMLElement | null>(null);\n  const focusSearchTimeout = useRef<number>(-1);\n  const focusTargetTimeout = useRef<number>(-1);\n\n  const openDropdown = () => {\n    if (!dropdownOpened) {\n      setDropdownOpened(true);\n      onDropdownOpen?.();\n    }\n  };\n\n  const closeDropdown = () => {\n    if (dropdownOpened) {\n      setDropdownOpened(false);\n      onDropdownClose?.();\n    }\n  };\n\n  const toggleDropdown = () => {\n    if (dropdownOpened) {\n      closeDropdown();\n    } else {\n      openDropdown();\n    }\n  };\n\n  const selectOption = (index: number) => {\n    const nextIndex = index >= totalOptionsCount ? 0 : index < 0 ? totalOptionsCount - 1 : index;\n    setSelectedOptionIndex(nextIndex);\n    return getOptionId(nextIndex);\n  };\n\n  const selectActiveOption = () => selectOption(activeOptionIndex ?? 0);\n\n  const selectNextOption = () =>\n    selectOption(\n      getNextIndex({ currentIndex: selectedOptionIndex, isOptionDisabled, totalOptionsCount, loop })\n    );\n\n  const selectPreviousOption = () =>\n    selectOption(\n      getPreviousIndex({\n        currentIndex: selectedOptionIndex,\n        isOptionDisabled,\n        totalOptionsCount,\n        loop,\n      })\n    );\n\n  const selectFirstOption = () =>\n    selectOption(getFirstIndex({ isOptionDisabled, totalOptionsCount }));\n\n  const resetSelectedOption = () => {\n    setSelectedOptionIndex(-1);\n  };\n\n  const clickSelectedOption = () => {\n    onSelectedOptionSubmit?.(selectedOptionIndex);\n  };\n\n  const setListId = (id: string) => {\n    listId.current = id;\n  };\n\n  const focusSearchInput = () => {\n    focusSearchTimeout.current = window.setTimeout(() => searchRef.current!.focus(), 0);\n  };\n\n  const focusTarget = () => {\n    focusTargetTimeout.current = window.setTimeout(() => targetRef.current!.focus(), 0);\n  };\n\n  useEffect(\n    () => () => {\n      window.clearTimeout(focusSearchTimeout.current);\n      window.clearTimeout(focusTargetTimeout.current);\n    },\n    []\n  );\n\n  const getSelectedOptionIndex = useCallback(() => selectedOptionIndex, []);\n\n  return {\n    dropdownOpened,\n    openDropdown,\n    closeDropdown,\n    toggleDropdown,\n\n    selectedOptionIndex,\n    getSelectedOptionIndex,\n    selectOption,\n    selectFirstOption,\n    selectActiveOption,\n    selectNextOption,\n    selectPreviousOption,\n    resetSelectedOption,\n    updateSelectedOptionIndex: () => {},\n\n    listId: listId.current,\n    setListId,\n    clickSelectedOption,\n\n    searchRef,\n    focusSearchInput,\n\n    targetRef,\n    focusTarget,\n  };\n}\n"],"names":[],"mappings":"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"}