{"version":3,"file":"7ZJjY2j3.js","sources":["../../../../types/plugins/yandex-metrika.ts","../../../../store/basket/basket-change.ts","../../../../composables/useProductMetrics.ts","../../../../composables/useProductCounter.ts","../../../../components/Icons/IconIncrease.vue","../../../../components/Icons/IconDecrease.vue","../../../../components/App/AppCounter.vue"],"sourcesContent":["export type Products = Product[]\n\nexport interface Product {\n id: string\n name: string\n price?: number | null\n brand?: string\n category: string\n variant: string\n quantity?: number | null\n}\n\nexport enum EcommerceEventName {\n ADD = 'add',\n PURCHASE = 'purchase',\n REMOVE = 'remove',\n DETAIL = 'detail',\n}\n\nexport interface YmPropTypes {\n main: () => void\n city: () => void\n}\n","import { defineStore } from 'pinia'\nimport { StoreId } from '@/store'\nimport { ChangeState } from '@/store/basket/basket.types'\nimport { Success } from '@/api/results'\nimport { ChangeChoices } from '@/types/api/api-v3/basket'\n\nexport const useBasketChangeStore = defineStore({\n id: StoreId.BASKET_CHANGE,\n state: (): ChangeState => {\n return {\n choices: [],\n quantitySelectedProducts: {},\n }\n },\n getters: {\n getquantitySelectedProducts:\n ({ quantitySelectedProducts }) =>\n (productId: number) => {\n return +quantitySelectedProducts[productId] || 0\n },\n },\n actions: {\n setQuantitySelectedProducts(data: { index: number; value: number }) {\n if (data.value === 0) {\n delete this.quantitySelectedProducts[data.index]\n return\n }\n\n this.quantitySelectedProducts[data.index] = data.value\n },\n\n async fetchChange(amount: number) {\n const { $apiService } = useNuxtApp()\n const result = await $apiService.basket.fetchChange(amount)\n\n if (result instanceof Success) {\n this.setChange(result.data || [])\n\n return result\n }\n },\n\n setChange(changeList: ChangeChoices[]) {\n this.choices = changeList\n },\n },\n})\n","/* Types */\nimport { Modification } from '@/types/api/api-v3/product'\nimport { EcommerceEventName } from '@/types/plugins/yandex-metrika'\n\n/* Utils */\nimport { mapEcommerceData } from '@/services/metrics/utils/ecommerce'\n\n/* Stores */\nimport { useCityStore } from '@/store/city/city'\n\n/* Комплексная отправка метрики добавления/удаления единиц продукта */\nexport const useSendMetricsOfProduct = (\n currentProduct?: Partial | null,\n) => {\n const { $metrics } = useNuxtApp()\n\n const route = useRoute()\n\n const cityStore = useCityStore()\n\n const currencyCode = computed(() => cityStore.currencyCode)\n\n const pushMetrics = (typeEvent: EcommerceEventName, quantity: number) => {\n if (!currentProduct) return\n\n const ecommerceData = mapEcommerceData(\n currentProduct,\n typeEvent,\n currencyCode.value || '',\n quantity,\n )\n\n $metrics?.eventAddProduct({ ym: ecommerceData })\n $metrics?.eventSendGoal({ mt: 'Basketcomplete' })\n\n window.carrotquest?.track('cart_added', {\n name: currentProduct.full_name,\n url: route.path + currentProduct.slug,\n amount: currentProduct.price,\n img: currentProduct.image,\n })\n }\n\n return { pushMetrics }\n}\n","import { computed, ref } from 'vue'\nimport { debounce } from 'throttle-debounce'\n\n/* Types */\nimport { Modification } from '@/types/api/api-v3/product'\nimport { EcommerceEventName } from '@/types/plugins/yandex-metrika'\n\n/* Stores */\nimport { useBasketStore } from '@/store/basket/basket'\nimport { useBasketChangeStore } from '@/store/basket/basket-change'\nimport { useAppStore } from '~/store/app/app'\nimport { SnackbarType } from '~/store/app/app.types'\n\n/* Composables */\nimport { useSendMetricsOfProduct } from '@/composables/useProductMetrics'\n\nexport const useProductCounter = (\n productId: ComputedRef,\n currentProduct?: Partial | null,\n) => {\n const previousQuantity = ref(0)\n // Счетчик кликов без учета единиц продуктов в корзине\n const countClickedQuantity = ref(0)\n\n const appStore = useAppStore()\n const basketStore = useBasketStore()\n const basketChangeStore = useBasketChangeStore()\n\n const basketError = computed(() => basketStore.error)\n\n const quantitySelectedProducts = computed(() => {\n return basketChangeStore.getquantitySelectedProducts(productId.value)\n })\n\n const { pushMetrics } = useSendMetricsOfProduct(currentProduct)\n\n const setProductQuantity = (quantity: number) => {\n basketChangeStore.setQuantitySelectedProducts({\n index: productId.value,\n value: quantity,\n })\n }\n\n const changeQuantity = debounce(\n 300,\n async (quantity: number, eventType: EcommerceEventName) => {\n await basketStore.setProduct({\n product_id: productId.value,\n quantity,\n })\n\n // Отправляем метрику добавления/удаляения единиц продукта\n if (countClickedQuantity.value)\n pushMetrics(eventType, countClickedQuantity.value)\n\n // Сбрасываем счетчик кликов\n countClickedQuantity.value = 0\n\n // Если произошла ошибка, приводим кол- во товара к изначальному и выводим снекбар\n if (basketError.value) {\n setProductQuantity(previousQuantity.value)\n\n // Показываем снекбар с ошибкой\n appStore.showSnackbar({\n message: 'Что-то пошло не так',\n type: SnackbarType.MESSAGE,\n })\n }\n },\n )\n\n const decreaseQuantity = () => {\n if (quantitySelectedProducts.value === 0) return\n\n previousQuantity.value = quantitySelectedProducts.value\n\n const newQuantity = quantitySelectedProducts.value - 1\n\n countClickedQuantity.value += 1\n\n setProductQuantity(newQuantity)\n changeQuantity(newQuantity, EcommerceEventName.REMOVE)\n }\n\n const increaseQuantity = () => {\n previousQuantity.value = quantitySelectedProducts.value\n\n const newQuantity = quantitySelectedProducts.value + 1\n\n // Фиксируем кол-во кликов\n countClickedQuantity.value += 1\n\n setProductQuantity(newQuantity)\n changeQuantity(newQuantity, EcommerceEventName.ADD)\n }\n\n return {\n basketError,\n quantitySelectedProducts,\n setProductQuantity,\n decreaseQuantity,\n increaseQuantity,\n }\n}\n","\n\n\n","\n\n\n","\n\n\n\n\n"],"names":["EcommerceEventName","useBasketChangeStore","defineStore","StoreId","quantitySelectedProducts","productId","data","amount","$apiService","useNuxtApp","result","Success","changeList","useSendMetricsOfProduct","currentProduct","$metrics","route","useRoute","cityStore","useCityStore","currencyCode","computed","typeEvent","quantity","ecommerceData","mapEcommerceData","_a","useProductCounter","previousQuantity","ref","countClickedQuantity","appStore","useAppStore","basketStore","useBasketStore","basketChangeStore","basketError","pushMetrics","setProductQuantity","changeQuantity","debounce","eventType","SnackbarType","newQuantity","props","__props","emit","__emit"],"mappings":"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","debug_id":"89dbad39-80ba-5270-8dcf-d8d6a928f00f"}