{"version":3,"file":"D9pLj4gA.js","sources":["../../../../node_modules/@smenaspace/ui-layer/components/counter/Counter.vue","../../../../types/plugins/yandex-metrika.ts","../../../../composables/useProductMetrics.ts","../../../../composables/useProductCounter.ts"],"sourcesContent":["\n\n\n\n\n","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","/* 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 { Product, 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 product?: Product,\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 // Получаем общее количество модификаций в корзине в рамках одного товара\n const totalSelectedProductsQuantity = computed(() => {\n if (!product) return 0\n\n let totalCount = 0\n\n for (const { id } of product.modifications) {\n totalCount += basketChangeStore.getQuantitySelectedProducts(id)\n }\n\n return totalCount\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 // Устанавливаем общее количество модификаций добавленных в корзину в рамках одного товара\n const setTotalProductsQuantity = () => {\n if (!product) return\n\n for (const { id } of product.modifications) {\n const value = basketStore.basketSelectedProducts[id]\n\n if (value === undefined) continue\n\n basketChangeStore.setQuantitySelectedProducts({\n index: id,\n value,\n })\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 totalSelectedProductsQuantity,\n setProductQuantity,\n setTotalProductsQuantity,\n decreaseQuantity,\n increaseQuantity,\n }\n}\n"],"names":["props","__props","emit","__emit","componentClasses","computed","isHidden","EcommerceEventName","useSendMetricsOfProduct","currentProduct","$metrics","useNuxtApp","route","useRoute","cityStore","useCityStore","currencyCode","typeEvent","quantity","ecommerceData","mapEcommerceData","_a","useProductCounter","productId","product","previousQuantity","ref","countClickedQuantity","appStore","useAppStore","basketStore","useBasketStore","basketChangeStore","useBasketChangeStore","basketError","quantitySelectedProducts","totalSelectedProductsQuantity","totalCount","id","pushMetrics","setProductQuantity","setTotalProductsQuantity","value","changeQuantity","debounce","eventType","SnackbarType","newQuantity"],"mappings":"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","debug_id":"3db2c4b1-29a2-5616-986e-de04f442ed46"}