{"version":3,"file":"useAccordion.mjs","sources":["../../../../../../src/components/va-accordion/hooks/useAccordion.ts"],"sourcesContent":["import { computed, inject, nextTick, onBeforeUnmount, onMounted, provide, Ref, ref, watch, WritableComputedRef } from 'vue'\nimport { warn } from '../../../utils/console'\n\nexport const AccordionServiceKey = Symbol('AccordionService')\n\nexport interface AccordionItemProps {\n  inset?: boolean,\n  popout?: boolean\n}\n\nexport interface AccordionProps extends AccordionItemProps {\n  modelValue: boolean[],\n  multiple: boolean,\n}\n\nexport type AccordionItem = {}\n\nexport interface AccordionInject {\n  registerItem: (item: AccordionItem) => void,\n  unregisterItem: (item: AccordionItem) => void,\n  getItemValue: (item: AccordionItem) => boolean,\n  setItemValue: (item: AccordionItem, value: boolean) => void,\n  props: Ref<AccordionItemProps>,\n}\n\n/**\n * @param props\n * @param state array of states of all accordion items */\nexport const useAccordion = (props: AccordionProps, state: WritableComputedRef<boolean[]>) => {\n  const items = ref<AccordionItem[]>([])\n\n  /**\n   * In case if items count is bigger than state count, we need to fill state with false values\n   * In case if items count is smaller than state count, we assume that some items were not rendered yet\n   */\n  const makeState = () => {\n    const correctItemsCount = Math.max(items.value.length, state.value.length)\n\n    return Array.from({ length: correctItemsCount }, (_, index) => {\n      return state.value[index] ?? false\n    })\n  }\n\n  const getItemValue = (item: AccordionItem) => {\n    return state.value[items.value.indexOf(item)] ?? false\n  }\n\n  const onItemsChanged = () => {\n    state.value = makeState()\n  }\n\n  const registerItem = (item: AccordionItem) => {\n    items.value.push(item)\n    onItemsChanged()\n  }\n  const unregisterItem = (item: AccordionItem) => {\n    items.value = items.value.filter((i) => i !== item)\n    // Prevent recursive dom update on unmount (HRM)\n    nextTick(onItemsChanged)\n  }\n\n  const setItemValue = (item: AccordionItem, value: boolean) => {\n    const index = items.value.indexOf(item)\n    if (index === -1) {\n      warn('Accordion item is not registered yet')\n      return\n    }\n\n    if (!props.multiple) {\n      state.value = makeState().map((el, i) => {\n        if (i === index) { return value }\n        return false\n      })\n    } else {\n      state.value[index] = value\n    }\n  }\n\n  provide(AccordionServiceKey, {\n    registerItem,\n    unregisterItem,\n    getItemValue,\n    setItemValue,\n    props: computed(() => props),\n  })\n\n  return { items }\n}\n\n/**\n * Hook used in items that should react on VaAccordion changes\n * @param state shows if accordion item is open\n */\nexport const useAccordionItem = () => {\n  const accordion = inject<AccordionInject | undefined>(AccordionServiceKey, undefined)\n\n  if (!accordion) {\n    return { accordionProps: ref({} as AccordionProps) }\n  }\n\n  const item = {}\n\n  // Register in setup function, before item is mounted,\n  // otherwise item will be rendered with own value\n  // and re-rendered with accordion value after mounted\n  accordion.registerItem(item)\n  onBeforeUnmount(() => accordion.unregisterItem(item))\n\n  const accordionItemValue = computed({\n    get: () => accordion.getItemValue(item),\n    set: (value) => accordion.setItemValue(item, value),\n  })\n\n  return {\n    accordionItemValue,\n    accordionProps: accordion.props,\n  }\n}\n"],"names":[],"mappings":";;AAGa,MAAA,sBAAsB,OAAO,kBAAkB;AAyB/C,MAAA,eAAe,CAAC,OAAuB,UAA0C;AACtF,QAAA,QAAQ,IAAqB,CAAA,CAAE;AAMrC,QAAM,YAAY,MAAM;AAChB,UAAA,oBAAoB,KAAK,IAAI,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM;AAElE,WAAA,MAAM,KAAK,EAAE,QAAQ,qBAAqB,CAAC,GAAG,UAAU;AACtD,aAAA,MAAM,MAAM,KAAK,KAAK;AAAA,IAAA,CAC9B;AAAA,EAAA;AAGG,QAAA,eAAe,CAAC,SAAwB;AAC5C,WAAO,MAAM,MAAM,MAAM,MAAM,QAAQ,IAAI,CAAC,KAAK;AAAA,EAAA;AAGnD,QAAM,iBAAiB,MAAM;AAC3B,UAAM,QAAQ;EAAU;AAGpB,QAAA,eAAe,CAAC,SAAwB;AACtC,UAAA,MAAM,KAAK,IAAI;AACN;EAAA;AAEX,QAAA,iBAAiB,CAAC,SAAwB;AAC9C,UAAM,QAAQ,MAAM,MAAM,OAAO,CAAC,MAAM,MAAM,IAAI;AAElD,aAAS,cAAc;AAAA,EAAA;AAGnB,QAAA,eAAe,CAAC,MAAqB,UAAmB;AAC5D,UAAM,QAAQ,MAAM,MAAM,QAAQ,IAAI;AACtC,QAAI,UAAU,IAAI;AAChB,WAAK,sCAAsC;AAC3C;AAAA,IACF;AAEI,QAAA,CAAC,MAAM,UAAU;AACnB,YAAM,QAAQ,UAAU,EAAE,IAAI,CAAC,IAAI,MAAM;AACvC,YAAI,MAAM,OAAO;AAAS,iBAAA;AAAA,QAAM;AACzB,eAAA;AAAA,MAAA,CACR;AAAA,IAAA,OACI;AACC,YAAA,MAAM,KAAK,IAAI;AAAA,IACvB;AAAA,EAAA;AAGF,UAAQ,qBAAqB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,MAAM,KAAK;AAAA,EAAA,CAC5B;AAED,SAAO,EAAE,MAAM;AACjB;AAMO,MAAM,mBAAmB,MAAM;AAC9B,QAAA,YAAY,OAAoC,qBAAqB,MAAS;AAEpF,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,gBAAgB,IAAI,CAAA,CAAoB,EAAE;AAAA,EACrD;AAEA,QAAM,OAAO,CAAA;AAKb,YAAU,aAAa,IAAI;AAC3B,kBAAgB,MAAM,UAAU,eAAe,IAAI,CAAC;AAEpD,QAAM,qBAAqB,SAAS;AAAA,IAClC,KAAK,MAAM,UAAU,aAAa,IAAI;AAAA,IACtC,KAAK,CAAC,UAAU,UAAU,aAAa,MAAM,KAAK;AAAA,EAAA,CACnD;AAEM,SAAA;AAAA,IACL;AAAA,IACA,gBAAgB,UAAU;AAAA,EAAA;AAE9B;"}