UNPKG

vuestic-ui

Version:
1 lines 4.99 kB
{"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;"}