{"version":3,"file":"BH1Lj1it.js","sources":["../../../../composables/useProductFilters.ts","../../../../components/Category/CategoryFilter.vue","../../../../components/Category/CategoryFilterDialog.vue","../../../../components/Category/CategoryFilterWidget.vue","../../../../components/Category/CategoryFilters.vue","../../../../components/Product/ProductList.vue"],"sourcesContent":["import { useToggleStore } from '@/store/toggle/toggle'\n\nimport { Product, Tag } from '@/types/api/api-v3/product'\n\ntype Filters = Record\n\ntype Props = {\n products: Product[]\n}\n\nexport const useProductFilters = ({ products }: Props) => {\n const { $metrics } = useNuxtApp()\n const { newProductCardEnabled } = useToggleStore()\n\n // Флаг, для понимания, включен ли какой- либо фильтр\n const isFiltersActivated = ref(false)\n // Список примененных фильтров\n const selectedFilters = ref({})\n // Список возможных фильтров на основе отфильтрованных товаров и примененных фильтров\n const possibleFilters = ref({})\n\n const allProducts = computed(() => {\n return !isFiltersActivated.value ? products : filteredProducts.value\n })\n\n const setActiveFilter = (filter: Tag | Partial) => {\n // Если нет slug-а у фильтра - выходим\n if (!filter.slug) return\n\n // Ставим флаг активированых фильтров\n isFiltersActivated.value = true\n\n // Складываем в объект ключом slug фильтра\n selectedFilters.value[filter.slug] = 1\n\n setPossibleFilters()\n\n $metrics?.eventSendGoal({ ym: 'add_filter' })\n }\n\n const deactivateFilter = (filter: Tag) => {\n // Если нет slug-а у фильтра - выходим\n if (!filter.slug) return\n\n // Удаляем ключ у активных фильтров\n delete selectedFilters.value[filter.slug]\n\n // Если текущее состояние фильтров пустое - очищаем возможные фильтры\n if (Object.keys(selectedFilters.value).length === 0) {\n resetAllFilters()\n\n return\n }\n\n setPossibleFilters()\n }\n\n const filteredProducts = computed(() => {\n if (!isFiltersActivated.value) return\n\n return getFilteredProducts(products, selectedFilters.value)\n })\n\n // Получение продуктов по примененным фильтрам\n const getFilteredProducts = (products: Product[], filters: Filters) => {\n const filtersLength = Object.keys(filters).length\n\n // если нет активных фильтров возвращаем все продукты\n if (!filtersLength) return products\n\n return products.filter((product: Product) => {\n const tags = getProductTags(product)\n\n // если тегов нет, отбрасываем продукт\n if (!tags.length) return false\n // счетчик пересечений\n let intersections = 0\n // ищем пересечения\n for (const tag of tags) {\n if (filters[tag.slug]) intersections++\n }\n\n // Проверяем кол-во пересечений с кол-во активных фильтров\n return intersections === filtersLength\n })\n }\n\n const getPossibleFilters = (\n filteredProducts: Product[] | undefined,\n selectedFilters: Filters,\n ): Filters => {\n if (!filteredProducts) return {}\n\n const possibleFilters: Filters = {}\n // Получаем массив всех тегов (включая дубликаты)\n const productTags = filteredProducts.flatMap((product) => {\n return getProductTags(product)\n })\n\n // Проходимся по тегам и сохраняем возможные фильтры, исключая дубликаты и текущие примененные фильтры\n for (const tag of productTags) {\n if (tag.slug in selectedFilters || tag.slug in possibleFilters) continue\n\n possibleFilters[tag.slug] = 1\n }\n\n return possibleFilters\n }\n\n /*\n Расчитываем возможные фильтры (Возможными фильтрами называем те фильтры,\n которые не являются активными, но все еще могут быть активированы, т.к попадают под пересечения фильтров продуктов)\n*/\n const setPossibleFilters = () => {\n possibleFilters.value = getPossibleFilters(\n filteredProducts.value,\n selectedFilters.value,\n )\n }\n\n const resetAllFilters = () => {\n isFiltersActivated.value = false\n selectedFilters.value = {}\n possibleFilters.value = {}\n }\n\n // В зависимости от версии API выбираем поле тегов для фильтрации\n const getProductTags = (product: Product) => {\n const tags = newProductCardEnabled\n ? // @ts-ignore\n [...product.main_tags, ...product.additional_tags]\n : product.tags\n\n if (!tags?.length) return []\n\n return tags\n }\n\n return {\n isFiltersActivated,\n selectedFilters,\n possibleFilters,\n allProducts,\n filteredProducts,\n setActiveFilter,\n resetAllFilters,\n setPossibleFilters,\n deactivateFilter,\n }\n}\n","\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n"],"names":["useProductFilters","products","$metrics","useNuxtApp","newProductCardEnabled","useToggleStore","isFiltersActivated","ref","selectedFilters","possibleFilters","allProducts","computed","filteredProducts","setActiveFilter","filter","setPossibleFilters","deactivateFilter","resetAllFilters","getFilteredProducts","filters","filtersLength","product","tags","getProductTags","intersections","tag","getPossibleFilters","productTags","props","__props","emit","__emit","isDesktop","useDevice","isFilterDisabled","filterFontWeight","filterSize","toggleFilterState","setFiltersDialogState","value","openFiltersDialog","isMobile","isActiveDialog","onToggleDialog","state","onResetAllFilters","onSetFilter","onResetFilter","productDialog","openDialogProduct","closeDialogProduct","useProductModal","onOpenDialogProduct"],"mappings":"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","debug_id":"9392795d-0613-5a6d-849f-9309e3b37420"}