{"version":3,"file":"useFiltersProvider-JpFet_at.js","sources":["../../../app/javascript/shared/composables/filters/useFiltersInjector.js","../../../app/javascript/shared/composables/filters/useFiltersProvider.js"],"sourcesContent":["import { computed, inject, ref, watch } from 'vue'\nimport { matchSorter } from 'match-sorter'\nimport _chunk from 'lodash/chunk.js'\n\nconst filterOutZeroCount = (filter) =>\n Object.keys(filter).includes('count') ? filter.count > 0 : true\n\nexport const useFiltersInjector = ({ stateKey }) => {\n const searchInput = ref('')\n const filtersState = inject('filtersState')\n const availableFilters = inject('availableFilters')\n const tracking = inject('tracking')\n\n const availableFiltersForStateKey = computed(() => {\n return availableFilters.value[stateKey]\n })\n const trackingForStateKey = computed(() => {\n return tracking[stateKey]\n })\n const filtersStateValue = computed({\n get: () => filtersState.value[stateKey].value,\n set(newValue) {\n filtersState.value[stateKey].value = newValue\n },\n })\n\n const resultsFromGroups = computed(() => {\n return availableFiltersForStateKey.value.reduce(\n (filters, currentFilter) => {\n const results = matchSorter(currentFilter.elements, searchInput.value, {\n keys: ['label'],\n baseSort: (a, b) => b.item.count - a.item.count,\n }).filter(filterOutZeroCount)\n if (results.length) {\n return [\n ...filters,\n {\n name: currentFilter.name,\n elements: results,\n selectedInGroupCount: filtersStateValue.value.reduce(\n (accumulator, selectedValue) => {\n if (\n results.some((result) => result.value === selectedValue)\n ) {\n return accumulator + 1\n } else {\n return accumulator\n }\n },\n 0,\n ),\n },\n ]\n }\n return filters\n },\n [],\n )\n })\n\n const results = computed(() => {\n return matchSorter(availableFiltersForStateKey.value, searchInput.value, {\n keys: ['label'],\n baseSort: (a, b) => b.item.count - a.item.count,\n threshold: matchSorter.rankings.STARTS_WITH,\n }).filter(filterOutZeroCount)\n })\n const infiniteScrollId = ref(+new Date())\n const PER_PAGE = 50\n const page = ref(1)\n const totalPages = computed(() => {\n return Math.ceil(results.value.length / PER_PAGE)\n })\n const visibleResults = computed(() => {\n if (isSearching.value) return results.value\n const chunks = _chunk(results.value, PER_PAGE)\n return Array.from({ length: page.value }, (_, i) => chunks[i]).flat()\n })\n const loadMore = ($state) => {\n const nextPage = page.value + 1\n if (nextPage >= totalPages.value) return $state.complete()\n page.value = nextPage\n return $state.loaded()\n }\n const resetPageData = () => {\n page.value = 1\n infiniteScrollId.value = +new Date()\n }\n watch(searchInput, resetPageData)\n\n const hasSelectedValues = computed(() => {\n if (Array.isArray(filtersStateValue.value))\n return filtersStateValue.value.length\n return filtersStateValue.value\n })\n\n const clearAll = () => {\n filtersStateValue.value = Array.isArray(filtersStateValue.value) ? [] : null\n }\n\n const sendSegmentAnalytics = (value) => {\n if (!tracking) return\n if (!Object.keys(tracking).includes(stateKey)) return\n\n window.segmentAnalytics.track(trackingForStateKey.value.name, {\n user_type: window.segmentAnalytics.userType(),\n [trackingForStateKey.value.valueKey]: value,\n })\n }\n\n const isSearching = computed(() => searchInput.value.length > 0)\n\n return {\n filtersStateValue,\n searchInput,\n resultsFromGroups,\n results,\n hasSelectedValues,\n clearAll,\n sendSegmentAnalytics,\n isSearching,\n visibleResults,\n loadMore,\n resetPageData,\n page,\n }\n}\n","import { computed, provide, ref } from 'vue'\n\nexport const useFiltersProvider = ({\n initialState,\n availableFilters,\n tracking,\n}) => {\n const filtersState = ref({ ...initialState })\n\n const activeFilters = computed(() => {\n const filters = Object.entries({\n ...filtersState.value,\n })\n .map(([key, value]) => {\n if (typeof value === 'object') return [key, value.value]\n else return [key, value]\n })\n .filter(([, value]) => {\n const isNotEmptyString = typeof value === 'string' && value\n const isNotEmptyArray = Array.isArray(value) && value.length\n return isNotEmptyString || isNotEmptyArray\n })\n\n return Object.fromEntries(filters)\n })\n\n const isAnyFilterActive = computed(() => {\n return Object.keys(filtersState.value).some((key) => {\n const filterValue = filtersState.value[key].value\n return Array.isArray(filterValue)\n ? filterValue.length\n : Boolean(filterValue)\n })\n })\n\n const activeFiltersCount = computed(() => {\n return Object.values(activeFilters.value).reduce((acc, value) => {\n return Array.isArray(value) ? acc + value.length : acc + 1\n }, 0)\n })\n\n const loadPreselectedFilters = (params) => {\n Object.keys(params).forEach((key) => {\n const isFiltersOption = Object.keys(filtersState.value).includes(key)\n if (!isFiltersOption) return\n filtersState.value[key].value = params[key]\n })\n }\n\n const clearFilters = () => {\n Object.keys(filtersState.value).forEach((key) => {\n filtersState.value[key].value = Array.isArray(\n filtersState.value[key].value,\n )\n ? []\n : null\n })\n }\n\n provide('filtersState', filtersState)\n provide('availableFilters', availableFilters)\n provide('tracking', tracking)\n\n return {\n filtersState,\n activeFilters,\n isAnyFilterActive,\n activeFiltersCount,\n loadPreselectedFilters,\n clearFilters,\n }\n}\n"],"names":["filterOutZeroCount","filter","useFiltersInjector","stateKey","searchInput","ref","filtersState","inject","availableFilters","tracking","availableFiltersForStateKey","computed","trackingForStateKey","filtersStateValue","newValue","resultsFromGroups","filters","currentFilter","results","matchSorter","a","accumulator","selectedValue","result","b","infiniteScrollId","PER_PAGE","page","totalPages","visibleResults","isSearching","chunks","_chunk","_","i","loadMore","$state","nextPage","resetPageData","watch","hasSelectedValues","clearAll","sendSegmentAnalytics","value","useFiltersProvider","initialState","activeFilters","key","isNotEmptyString","isNotEmptyArray","isAnyFilterActive","filterValue","activeFiltersCount","acc","loadPreselectedFilters","params","clearFilters","provide"],"mappings":"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"}