{"version":3,"file":"useKeydown.mjs","sources":["../../../../../../../packages/components/tree/src/model/useKeydown.ts"],"sourcesContent":["// @ts-nocheck\nimport { onMounted, onUpdated, shallowRef, watch } from 'vue'\nimport { useEventListener } from '@vueuse/core'\nimport { EVENT_CODE } from '@bigin/constants'\nimport { useNamespace } from '@bigin/hooks'\nimport type TreeStore from './tree-store'\n\nimport type { Ref } from 'vue'\nimport type { Nullable } from '@bigin/utils'\n\ninterface UseKeydownOption {\n  el$: Ref<HTMLElement>\n}\nexport function useKeydown({ el$ }: UseKeydownOption, store: Ref<TreeStore>) {\n  const ns = useNamespace('tree')\n\n  const treeItems = shallowRef<Nullable<HTMLElement>[]>([])\n  const checkboxItems = shallowRef<Nullable<HTMLElement>[]>([])\n\n  onMounted(() => {\n    initTabIndex()\n  })\n\n  onUpdated(() => {\n    treeItems.value = Array.from(el$.value.querySelectorAll('[role=treeitem]'))\n    checkboxItems.value = Array.from(\n      el$.value.querySelectorAll('input[type=checkbox]')\n    )\n  })\n\n  watch(checkboxItems, (val) => {\n    val.forEach((checkbox) => {\n      checkbox.setAttribute('tabindex', '-1')\n    })\n  })\n\n  const handleKeydown = (ev: KeyboardEvent): void => {\n    const currentItem = ev.target as HTMLElement\n    if (!currentItem.className.includes(ns.b('node'))) return\n    const code = ev.code\n    treeItems.value = Array.from(\n      el$.value.querySelectorAll(`.${ns.is('focusable')}[role=treeitem]`)\n    )\n    const currentIndex = treeItems.value.indexOf(currentItem)\n    let nextIndex\n    if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) {\n      ev.preventDefault()\n      if (code === EVENT_CODE.up) {\n        nextIndex =\n          currentIndex === -1\n            ? 0\n            : currentIndex !== 0\n            ? currentIndex - 1\n            : treeItems.value.length - 1\n        const startIndex = nextIndex\n        while (true) {\n          if (\n            store.value.getNode(treeItems.value[nextIndex].dataset.key).canFocus\n          )\n            break\n          nextIndex--\n          if (nextIndex === startIndex) {\n            nextIndex = -1\n            break\n          }\n          if (nextIndex < 0) {\n            nextIndex = treeItems.value.length - 1\n          }\n        }\n      } else {\n        nextIndex =\n          currentIndex === -1\n            ? 0\n            : currentIndex < treeItems.value.length - 1\n            ? currentIndex + 1\n            : 0\n        const startIndex = nextIndex\n        while (true) {\n          if (\n            store.value.getNode(treeItems.value[nextIndex].dataset.key).canFocus\n          )\n            break\n          nextIndex++\n          if (nextIndex === startIndex) {\n            nextIndex = -1\n            break\n          }\n          if (nextIndex >= treeItems.value.length) {\n            nextIndex = 0\n          }\n        }\n      }\n      nextIndex !== -1 && treeItems.value[nextIndex].focus()\n    }\n    if ([EVENT_CODE.left, EVENT_CODE.right].includes(code)) {\n      ev.preventDefault()\n      currentItem.click()\n    }\n    const hasInput = currentItem.querySelector(\n      '[type=\"checkbox\"]'\n    ) as Nullable<HTMLInputElement>\n    if ([EVENT_CODE.enter, EVENT_CODE.space].includes(code) && hasInput) {\n      ev.preventDefault()\n      hasInput.click()\n    }\n  }\n\n  useEventListener(el$, 'keydown', handleKeydown)\n\n  const initTabIndex = (): void => {\n    treeItems.value = Array.from(\n      el$.value.querySelectorAll(`.${ns.is('focusable')}[role=treeitem]`)\n    )\n    checkboxItems.value = Array.from(\n      el$.value.querySelectorAll('input[type=checkbox]')\n    )\n    const checkedItem = el$.value.querySelectorAll(\n      `.${ns.is('checked')}[role=treeitem]`\n    )\n    if (checkedItem.length) {\n      checkedItem[0].setAttribute('tabindex', '0')\n      return\n    }\n    treeItems.value[0]?.setAttribute('tabindex', '0')\n  }\n}\n"],"names":[],"mappings":"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"}