@zenky/storefront-vue 0.10.0 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +52 -2
  3. package/dist/cart/index.d.ts +31 -2
  4. package/dist/cart/index.js +5 -6
  5. package/dist/catalog/index.js +2 -2
  6. package/dist/{chunk-BIGTKVC6.js → chunk-57IOMDAM.js} +3 -3
  7. package/dist/{chunk-BIGTKVC6.js.map → chunk-57IOMDAM.js.map} +1 -1
  8. package/dist/{chunk-DKWDKVXQ.js → chunk-7FRMMCR5.js} +12 -10
  9. package/dist/chunk-7FRMMCR5.js.map +1 -0
  10. package/dist/{chunk-EYRCAUUP.js → chunk-E3G7NGCH.js} +2 -2
  11. package/dist/chunk-E3G7NGCH.js.map +1 -0
  12. package/dist/{chunk-VL3T36VM.js → chunk-FFBZKQRV.js} +14 -7
  13. package/dist/chunk-FFBZKQRV.js.map +1 -0
  14. package/dist/{chunk-OQLU7FSR.js → chunk-G2X4SBCO.js} +199 -29
  15. package/dist/chunk-G2X4SBCO.js.map +1 -0
  16. package/dist/{chunk-AL5W5JSD.js → chunk-GLTOJTZO.js} +2 -2
  17. package/dist/{chunk-AL5W5JSD.js.map → chunk-GLTOJTZO.js.map} +1 -1
  18. package/dist/{chunk-IGDDWGS4.js → chunk-JLFBAAFT.js} +20 -11
  19. package/dist/chunk-JLFBAAFT.js.map +1 -0
  20. package/dist/{chunk-PJ2LEKW6.js → chunk-MZ66ARDL.js} +18 -3
  21. package/dist/chunk-MZ66ARDL.js.map +1 -0
  22. package/dist/{chunk-4MJKN7PL.js → chunk-N3NOTJUC.js} +4 -4
  23. package/dist/{chunk-4MJKN7PL.js.map → chunk-N3NOTJUC.js.map} +1 -1
  24. package/dist/{chunk-2OD7CLKD.js → chunk-RYYY7MVP.js} +2 -2
  25. package/dist/chunk-RYYY7MVP.js.map +1 -0
  26. package/dist/{chunk-PWHIDGKW.js → chunk-TEG7EL4N.js} +12 -3
  27. package/dist/chunk-TEG7EL4N.js.map +1 -0
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +11 -11
  30. package/dist/layout/index.js +8 -4
  31. package/dist/layout/index.js.map +1 -1
  32. package/dist/order/index.js.map +1 -1
  33. package/dist/pagination/index.js.map +1 -1
  34. package/dist/ports/index.js +1 -1
  35. package/dist/products/index.js +2 -2
  36. package/dist/promotions/index.js +3 -3
  37. package/dist/seo/index.js +5 -5
  38. package/dist/seo/index.js.map +1 -1
  39. package/dist/snippets/index.js +1 -1
  40. package/dist/stores/index.js +3 -3
  41. package/dist/utils/index.d.ts +2 -2
  42. package/dist/utils/index.js +1 -1
  43. package/docs/consumer-setup.md +275 -0
  44. package/docs/ports.md +144 -0
  45. package/docs/releasing.md +46 -0
  46. package/package.json +26 -4
  47. package/dist/chunk-2OD7CLKD.js.map +0 -1
  48. package/dist/chunk-DKWDKVXQ.js.map +0 -1
  49. package/dist/chunk-EYRCAUUP.js.map +0 -1
  50. package/dist/chunk-IGDDWGS4.js.map +0 -1
  51. package/dist/chunk-OQLU7FSR.js.map +0 -1
  52. package/dist/chunk-PJ2LEKW6.js.map +0 -1
  53. package/dist/chunk-PWHIDGKW.js.map +0 -1
  54. package/dist/chunk-VL3T36VM.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/products/formatWeight.ts","../src/products/useProductsByCategory.ts","../src/products/useProductVariantModifiers.ts","../src/products/useProductPricing.ts","../src/products/useProductVariant.ts","../src/products/usePriceRecalculation.ts","../src/products/useProductVariantSelector.ts","../src/products/useRelatedProducts.ts","../src/products/findProductInCatalog.ts"],"names":["computed","ref","watch"],"mappings":"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","file":"chunk-IGDDWGS4.js","sourcesContent":["import { UnitType } from '@zenky/storefront-api'\n\nimport type { Product, ProductVariant } from '@zenky/storefront-api'\n\nconst UNIT_LABELS: Record<UnitType, string> = {\n [UnitType.Gram]: 'г',\n [UnitType.Kilogram]: 'кг',\n [UnitType.Meter]: 'м',\n [UnitType.Piece]: 'г',\n} as const\n\nfunction getWeightFromDimensions(variants: ProductVariant[] | undefined): number | null {\n if (!variants?.length) return null\n\n const dimension = variants[0]?.dimensions?.find((d) => d.dimension === 'weight')\n\n return dimension?.value ?? null\n}\n\nexport function getVariantWeight(variant: ProductVariant | null | undefined): number | null {\n if (!variant) return null\n\n return variant.dimensions?.find((d) => d.dimension === 'weight')?.value ?? null\n}\n\nexport function getProductWeight(product: Product): number | null {\n return product.weight ?? getWeightFromDimensions(product.variants) ?? null\n}\n\nexport function toGrams(weight: number | null, unitType: UnitType): number | null {\n if (!weight) {\n return null\n }\n\n if (unitType === UnitType.Kilogram) {\n return weight * 1000\n }\n\n if (unitType === UnitType.Meter) {\n return null\n }\n\n return weight\n}\n\nexport function formatWeight(weight: number | null, unitType: UnitType): string | null {\n if (!weight) {\n return null\n }\n\n const label = UNIT_LABELS[unitType]\n\n return `${weight} ${label}`\n}\n","import { computed, type ComputedRef } from 'vue'\n\nimport type { NestedCategory, Product } from '@zenky/storefront-api'\n\nexport interface CategoryWithProducts {\n id: string\n shortId: string\n slug: string | null\n name: string | null\n products: Product[]\n}\n\nexport function useProductsByCategory(\n products: ComputedRef<Product[]>,\n categories: ComputedRef<NestedCategory[]>\n): {\n grouped: ComputedRef<CategoryWithProducts[]>\n} {\n const grouped = computed<CategoryWithProducts[]>(() => {\n if (!categories.value.length || !products.value.length) {\n return []\n }\n\n const productsByCategory = new Map<string, Product[]>()\n\n for (const product of products.value) {\n for (const category of product.categories) {\n const existing = productsByCategory.get(category.id) ?? []\n existing.push(product)\n productsByCategory.set(category.id, existing)\n }\n }\n\n return flattenCategories(categories.value)\n .filter((category) => productsByCategory.has(category.id))\n .map((category) => ({\n id: category.id,\n shortId: category.short_id,\n slug: category.slug,\n name: category.name,\n products: productsByCategory.get(category.id) ?? [],\n }))\n })\n\n return { grouped }\n}\n\nfunction flattenCategories(categories: NestedCategory[]): NestedCategory[] {\n const result: NestedCategory[] = []\n\n for (const category of categories) {\n result.push(category)\n\n if (category.children?.length) {\n result.push(...flattenCategories(category.children))\n }\n }\n\n return result\n}\n","import { computed, ref, watch, type ComputedRef, type Ref } from 'vue'\n\nimport type { ProductModifiersRequest, ProductVariant } from '@zenky/storefront-api'\n\nfunction getInitialModifiersModel(variant: ProductVariant | null): ProductModifiersRequest[] {\n if (!variant?.default_modifiers?.modifiers.length) {\n return []\n }\n\n return variant.default_modifiers.modifiers.map((modifier) => ({\n modifier_id: modifier.modifier_id,\n modifiers_group_id: modifier.modifiers_group_id,\n quantity: modifier.quantity,\n }))\n}\n\nexport function useProductVariantModifiers(variant: ComputedRef<ProductVariant | null>): {\n modifiersModel: Ref<ProductModifiersRequest[]>\n selectedModifiersHash: Ref<string | null>\n hasAnyModifier: ComputedRef<boolean>\n} {\n const modifiersModel: Ref<ProductModifiersRequest[]> = ref([\n ...getInitialModifiersModel(variant.value),\n ])\n const selectedModifiersHash: Ref<string | null> = ref(null)\n const hasAnyModifier = computed<boolean>(() => modifiersModel.value.length > 0)\n\n watch(variant, () => {\n const newDefaults = getInitialModifiersModel(variant.value)\n\n // Сохраняем standalone модификаторы (без группы) — они продуктовые, не зависят от варианта.\n // Групповые модификаторы сбрасываются до дефолтов нового варианта.\n const userStandalone = modifiersModel.value.filter((m) => !m.modifiers_group_id)\n const defaultStandaloneIds = new Set(\n newDefaults.filter((d) => !d.modifiers_group_id).map((d) => d.modifier_id)\n )\n const preservedStandalone = userStandalone.filter(\n (m) => !defaultStandaloneIds.has(m.modifier_id)\n )\n\n modifiersModel.value = [...preservedStandalone, ...newDefaults]\n })\n\n return { modifiersModel, selectedModifiersHash, hasAnyModifier }\n}\n","import { computed, type ComputedRef } from 'vue'\n\nimport type { Discount, Product, ProductVariant } from '@zenky/storefront-api'\n\nexport interface ResolvedPrice {\n price: number\n originalPrice: number | null\n discount: Discount | null\n}\n\n/**\n * Определяет цену варианта с учётом склада.\n * Приоритет: prices[stockId] → prices[null] → top-level price.\n */\nexport function resolveVariantPrice(variant: ProductVariant, stockId?: string | null): ResolvedPrice {\n if (variant.prices?.length) {\n // 1. Точное совпадение по складу\n if (stockId) {\n const stockEntry = variant.prices.find((p) => p.stock_id === stockId)\n\n if (stockEntry) {\n return {\n price: stockEntry.price,\n originalPrice: stockEntry.original_price,\n discount: stockEntry.discount,\n }\n }\n }\n\n // 2. Глобальная цена (stock_id = null)\n const globalEntry = variant.prices.find((p) => p.stock_id === null)\n\n if (globalEntry) {\n return {\n price: globalEntry.price,\n originalPrice: globalEntry.original_price,\n discount: globalEntry.discount,\n }\n }\n }\n\n // 3. Fallback — top-level поля варианта\n return {\n price: variant.price,\n originalPrice: variant.original_price ?? null,\n discount: variant.discount ?? null,\n }\n}\n\nexport function useProductPricing(\n product: ComputedRef<Product>,\n stockId?: ComputedRef<string | null | undefined>\n): {\n displayPrice: ComputedRef<number>\n originalDisplayPrice: ComputedRef<number | null>\n hasDifferentPrices: ComputedRef<boolean>\n needsSelection: ComputedRef<boolean>\n} {\n const variants = computed(() => product.value.variants ?? [])\n const currentStockId = computed(() => stockId?.value ?? null)\n\n // Цены всех вариантов с учётом склада\n const resolvedPrices = computed(() =>\n variants.value.map((v) => resolveVariantPrice(v, currentStockId.value))\n )\n\n // Минимальная обязательная стоимость модификаторов, которая всегда добавляется к цене:\n // 1. modEntry.is_required — модификатор всегда присылается в API (нельзя убрать)\n // 2. groupEntry.is_required — пользователь обязан выбрать хотя бы один из группы →\n // добавляем минимальную цену из группы (если группа не покрыта is_required-модификатором)\n const minRequiredModifiersCost = computed<number>(() => {\n let total = 0\n\n for (const groupEntry of product.value.modifiers_groups ?? []) {\n const group = groupEntry.group\n\n // Обязательные модификаторы внутри группы — всегда добавляются в заказ\n for (const modEntry of group.modifiers) {\n if (modEntry.is_required && modEntry.modifier.price) {\n total += modEntry.modifier.price * Math.max(modEntry.min_quantity ?? 0, 1)\n }\n }\n\n if (\n groupEntry.is_required &&\n group.modifiers.length &&\n !group.modifiers.some((m) => m.is_required)\n ) {\n const cheapest = group.modifiers.reduce((min, m) =>\n (m.modifier.price ?? 0) < (min.modifier.price ?? 0) ? m : min\n )\n total += (cheapest.modifier.price ?? 0) * Math.max(cheapest.min_quantity ?? 0, 1)\n }\n }\n\n return total\n })\n\n const displayPrice = computed<number>(() => {\n if (!resolvedPrices.value.length) {\n return 0\n }\n\n return Math.min(...resolvedPrices.value.map((r) => r.price)) + minRequiredModifiersCost.value\n })\n\n // Цена без скидки: original_price минимального по цене варианта + обязательные модификаторы.\n // null если скидки нет.\n // original_price может быть null даже при наличии скидки — тогда вычисляем через discount.difference.\n const originalDisplayPrice = computed<number | null>(() => {\n if (!resolvedPrices.value.length) return null\n\n // Находим вариант с минимальной ценой (тот же, что определяет displayPrice)\n const cheapest = resolvedPrices.value.reduce((min, r) => (r.price < min.price ? r : min))\n\n // Приоритет: original_price, затем вычисление через discount\n let originalVariantPrice: number | null = null\n\n if (cheapest.originalPrice && cheapest.originalPrice > cheapest.price) {\n originalVariantPrice = cheapest.originalPrice\n } else if (cheapest.discount && cheapest.discount.difference > 0) {\n originalVariantPrice = cheapest.price + cheapest.discount.difference\n }\n\n if (!originalVariantPrice) return null\n\n return originalVariantPrice + minRequiredModifiersCost.value\n })\n\n const hasDifferentPrices = computed<boolean>(() => {\n if (resolvedPrices.value.length <= 1) {\n return false\n }\n\n const prices = new Set(resolvedPrices.value.map((r) => r.price))\n\n return prices.size > 1\n })\n\n const needsSelection = computed<boolean>(() => {\n if (variants.value.length > 1) {\n return true\n }\n\n const mods = product.value.modifiers\n const groups = product.value.modifiers_groups\n\n return (\n (Array.isArray(mods) && mods.length > 0) || (Array.isArray(groups) && groups.length > 0)\n )\n })\n\n return { displayPrice, originalDisplayPrice, hasDifferentPrices, needsSelection }\n}\n","import { computed, ref, watch, type ComputedRef, type Ref } from 'vue'\n\nimport type {\n Product,\n ProductVariant,\n ProductVariantOption,\n ProductVariantOptionValue,\n} from '@zenky/storefront-api'\n\nexport interface ProductVariantOptionListItem {\n id: string\n name: string | null\n values: ProductVariantOptionValue[]\n}\n\nfunction getDefaultOptionsModel(product: Product): Record<string, string> {\n const model: Record<string, string> = {}\n\n if (!product.variants?.length) {\n return model\n }\n\n const firstVariant = product.variants.find(\n (variant: ProductVariant) => variant.options && variant.options.length\n )\n\n if (!firstVariant) {\n return model\n }\n\n firstVariant.options!.forEach((option: ProductVariantOption) => {\n model[option.id] = option.value.id\n })\n\n return model\n}\n\nfunction getProductVariantOptionsList(product: Product): ProductVariantOptionListItem[] {\n const list: ProductVariantOptionListItem[] = []\n\n if (!product.variants?.length) {\n return list\n }\n\n product.variants.forEach((variant: ProductVariant) => {\n if (!variant.options?.length) {\n return\n }\n\n variant.options.forEach((option: ProductVariantOption) => {\n let index = list.findIndex((item: ProductVariantOptionListItem) => item.id === option.id)\n\n if (index === -1) {\n index = list.push({\n id: option.id,\n name: option.name,\n values: [],\n })\n\n index--\n }\n\n const valueIndex = list[index]!.values.findIndex(\n (value: ProductVariantOptionValue) => value.id === option.value.id\n )\n\n if (valueIndex === -1) {\n list[index]!.values.push(option.value)\n }\n })\n })\n\n return list\n}\n\nfunction computeDisabledValues(\n variants: ProductVariant[],\n optionsList: ProductVariantOptionListItem[],\n optionsModel: Record<string, string>\n): Record<string, Set<string>> {\n if (!variants.length) return {}\n\n const result: Record<string, Set<string>> = {}\n\n for (const option of optionsList) {\n const disabled = new Set<string>()\n\n for (const value of option.values) {\n const hasMatch = variants.some((variant) => {\n if (!variant.options?.length) return false\n\n const variantMap: Record<string, string> = {}\n for (const opt of variant.options) {\n variantMap[opt.id] = opt.value.id\n }\n\n // Variant must have this specific value for this option\n if (variantMap[option.id] !== value.id) return false\n\n // Variant must match all OTHER currently-selected values\n for (const [otherId, selectedId] of Object.entries(optionsModel)) {\n if (otherId === option.id) continue\n if (variantMap[otherId] !== selectedId) return false\n }\n\n return true\n })\n\n if (!hasMatch) {\n disabled.add(value.id)\n }\n }\n\n result[option.id] = disabled\n }\n\n return result\n}\n\nexport function useProductVariant(product: ComputedRef<Product>): {\n optionsModel: Ref<Record<string, string>>\n optionsList: Ref<ProductVariantOptionListItem[]>\n selectedVariant: ComputedRef<ProductVariant | null>\n disabledValues: ComputedRef<Record<string, Set<string>>>\n} {\n const optionsModel = ref({ ...getDefaultOptionsModel(product.value) })\n const optionsList = ref([...getProductVariantOptionsList(product.value)])\n\n const selectedVariant = computed<ProductVariant | null>(() => {\n if (!product.value.variants?.length) {\n return null\n } else if (product.value.variants.length === 1 || !Object.keys(optionsModel.value).length) {\n return product.value.variants[0] ?? null\n }\n\n return (\n product.value.variants.find((variant: ProductVariant) => {\n if (!variant.options?.length) {\n return false\n }\n\n return variant.options.every(\n (option: ProductVariantOption) =>\n optionsModel.value[option.id] === option.value.id\n )\n }) ?? null\n )\n })\n\n const disabledValues = computed<Record<string, Set<string>>>(() =>\n computeDisabledValues(product.value.variants ?? [], optionsList.value, optionsModel.value)\n )\n\n watch(product, () => {\n optionsModel.value = { ...getDefaultOptionsModel(product.value) }\n optionsList.value = [...getProductVariantOptionsList(product.value)]\n })\n\n return { optionsModel, optionsList, selectedVariant, disabledValues }\n}\n","import { computed, ref, watch, type ComputedRef, type Ref } from 'vue'\n\nimport type { Product, ProductModifiersRequest, ProductVariant } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { createDebounce } from '../utils/debounce'\nimport { resolveVariantPrice } from './useProductPricing'\n\ninterface PriceRecalculationOptions {\n product: ComputedRef<Product>\n selectedVariant: ComputedRef<ProductVariant | null>\n modifiersModel: Ref<ProductModifiersRequest[]>\n requiredModifiersGroupIsMissing: ComputedRef<boolean>\n selectedModifiersHash: Ref<string | null>\n}\n\nexport function usePriceRecalculation({\n product,\n selectedVariant,\n modifiersModel,\n requiredModifiersGroupIsMissing,\n selectedModifiersHash,\n}: PriceRecalculationOptions): {\n price: ComputedRef<number>\n originalPrice: ComputedRef<number | null>\n priceWasModified: ComputedRef<boolean>\n priceIsRecalculating: Ref<boolean>\n} {\n // SDK берём из рантайма (DI-порт), а не из Nuxt-специфичного useStorefrontApi().\n const sdk = useRuntime().sdk\n const profileStore = useStoreProfileStore()\n\n // -------------------------------------------------------------------------\n // Computed: stock-aware variant pricing\n // -------------------------------------------------------------------------\n\n const currentStockId = computed(() => profileStore.stock?.id ?? null)\n\n const resolvedVariant = computed(() => {\n if (!selectedVariant.value) return null\n\n return resolveVariantPrice(selectedVariant.value, currentStockId.value)\n })\n\n // -------------------------------------------------------------------------\n // Computed: modifier price helpers\n // -------------------------------------------------------------------------\n\n const modifierPriceMap = computed<Map<string, number>>(() => {\n const map = new Map<string, number>()\n\n for (const item of product.value.modifiers ?? []) {\n if (item.modifier.price) {\n map.set(item.modifier.id, item.modifier.price)\n }\n }\n\n for (const group of product.value.modifiers_groups ?? []) {\n for (const item of group.group.modifiers ?? []) {\n if (item.modifier.price) {\n map.set(item.modifier.id, item.modifier.price)\n }\n }\n }\n\n return map\n })\n\n // Сумма цен выбранных модификаторов (включая дефолтные — они в modifiersModel)\n const selectedModifierTotal = computed<number>(() =>\n modifiersModel.value.reduce(\n (sum, req) => sum + (modifierPriceMap.value.get(req.modifier_id) ?? 0) * req.quantity,\n 0\n )\n )\n\n // -------------------------------------------------------------------------\n // Computed: optimistic price (мгновенный, без API)\n // -------------------------------------------------------------------------\n\n // variant.price — базовая цена варианта (stock-specific или fallback),\n // НЕ включает модификаторы. selectedModifierTotal добавляет все выбранные\n // (дефолтные + обязательные + пользовательские).\n const optimisticPrice = computed<number>(() => {\n if (!resolvedVariant.value) return 0\n\n return resolvedVariant.value.price + selectedModifierTotal.value\n })\n\n const optimisticOriginalPrice = computed<number | null>(() => {\n if (!resolvedVariant.value) return null\n\n const r = resolvedVariant.value\n\n if (r.originalPrice && r.originalPrice > r.price) return r.originalPrice\n if (r.discount && r.discount.difference > 0) return r.price + r.discount.difference\n\n return null\n })\n\n // -------------------------------------------------------------------------\n // API-confirmed price (перезаписывает optimistic после ответа)\n // -------------------------------------------------------------------------\n\n const apiPrice = ref<number | null>(null)\n const apiOriginalPrice = ref<number | null>(null)\n const priceIsRecalculating = ref(false)\n let requestId = 0\n\n // -------------------------------------------------------------------------\n // Final displayed price: API > optimistic\n // -------------------------------------------------------------------------\n\n const price = computed<number>(() => apiPrice.value ?? optimisticPrice.value)\n const originalPrice = computed<number | null>(\n () => apiOriginalPrice.value ?? optimisticOriginalPrice.value\n )\n const priceWasModified = computed<boolean>(() => apiPrice.value !== null)\n\n // -------------------------------------------------------------------------\n // API recalculation (подтверждает / корректирует optimistic)\n // -------------------------------------------------------------------------\n\n async function recalculatePrice(): Promise<void> {\n if (requiredModifiersGroupIsMissing.value) return\n if (!modifiersModel.value.length || !selectedVariant.value) return\n\n const currentRequestId = ++requestId\n priceIsRecalculating.value = true\n\n try {\n const response = await sdk.products.getProductVariantPrice(\n profileStore.store!.id,\n product.value.id,\n selectedVariant.value.id,\n {\n modifiers: modifiersModel.value,\n // exactOptionalPropertyTypes: stock_id включаем только если есть\n ...(currentStockId.value ? { stock_id: currentStockId.value } : {}),\n }\n )\n\n if (currentRequestId !== requestId) return\n\n apiPrice.value = response.price\n apiOriginalPrice.value = response.original_price\n selectedModifiersHash.value = response.modifiers_hash\n } catch (e) {\n console.error('[usePriceRecalculation] price recalculation failed', e)\n } finally {\n if (currentRequestId === requestId) {\n priceIsRecalculating.value = false\n }\n }\n }\n\n const debouncedRecalculate = createDebounce(() => recalculatePrice(), 300)\n\n // -------------------------------------------------------------------------\n // Watcher: сброс API-цены + пересчёт при смене варианта/модификаторов\n // -------------------------------------------------------------------------\n\n watch(selectedVariant, () => {\n apiPrice.value = null\n apiOriginalPrice.value = null\n requestId++\n selectedModifiersHash.value = selectedVariant.value?.default_modifiers?.hash ?? null\n })\n\n watch(\n modifiersModel,\n () => {\n apiPrice.value = null\n apiOriginalPrice.value = null\n requestId++\n\n if (modifiersModel.value.length && selectedVariant.value) {\n debouncedRecalculate()\n } else {\n selectedModifiersHash.value = selectedVariant.value?.default_modifiers?.hash ?? null\n }\n },\n { deep: true }\n )\n\n return { price, originalPrice, priceWasModified, priceIsRecalculating }\n}\n","import { computed, watch, type ComputedRef, type Ref } from 'vue'\n\nimport type { Product, ProductModifiersRequest, ProductVariant } from '@zenky/storefront-api'\n\nimport { usePriceRecalculation } from './usePriceRecalculation'\nimport { useProductVariant, type ProductVariantOptionListItem } from './useProductVariant'\nimport { useProductVariantModifiers } from './useProductVariantModifiers'\n\n// SDK-поле min_quantity опционально (number | null); нормализуем в положительное количество.\nfunction resolveQuantity(minQuantity: number | null): number {\n return minQuantity && minQuantity > 0 ? minQuantity : 1\n}\n\nexport function useProductVariantSelector(product: ComputedRef<Product>): {\n optionsModel: Ref<Record<string, string>>\n optionsList: Ref<ProductVariantOptionListItem[]>\n disabledValues: ComputedRef<Record<string, Set<string>>>\n modifiersModel: Ref<ProductModifiersRequest[]>\n selectedVariant: ComputedRef<ProductVariant | null>\n price: ComputedRef<number>\n originalPrice: ComputedRef<number | null>\n priceWasModified: ComputedRef<boolean>\n priceIsRecalculating: Ref<boolean>\n selectedModifiersHash: Ref<string | null>\n requiredModifiersGroupIsMissing: ComputedRef<boolean>\n} {\n const { optionsModel, optionsList, selectedVariant, disabledValues } = useProductVariant(product)\n const { modifiersModel, selectedModifiersHash } = useProductVariantModifiers(selectedVariant)\n\n // Обязательные модификаторы — всегда должны быть в модели.\n // 1) modEntry.is_required — индивидуальный обязательный модификатор\n // 2) groupEntry.is_required — обязательная группа: если в ней нет is_required-модификаторов,\n // автоматически выбираем самый дешёвый (зеркалит minRequiredModifiersCost в useProductPricing)\n const requiredModifierEntries = computed<ProductModifiersRequest[]>(() => {\n const result: ProductModifiersRequest[] = []\n\n for (const groupEntry of product.value.modifiers_groups ?? []) {\n const group = groupEntry.group\n const hasIndividualRequired = group.modifiers.some((m) => m.is_required)\n\n // 1. Индивидуальные обязательные модификаторы\n for (const modEntry of group.modifiers) {\n if (modEntry.is_required) {\n result.push({\n modifier_id: modEntry.modifier.id,\n modifiers_group_id: group.id,\n quantity: resolveQuantity(modEntry.min_quantity),\n })\n }\n }\n\n // 2. Обязательная группа без is_required-модификаторов →\n // пользователь должен выбрать хотя бы один; берём самый дешёвый\n if (groupEntry.is_required && !hasIndividualRequired) {\n const sorted = [...group.modifiers].sort(\n (a, b) => (a.modifier.price ?? 0) - (b.modifier.price ?? 0)\n )\n const cheapest = sorted[0]\n\n if (cheapest) {\n result.push({\n modifier_id: cheapest.modifier.id,\n modifiers_group_id: group.id,\n quantity: resolveQuantity(cheapest.min_quantity),\n })\n }\n }\n }\n\n return result\n })\n\n // Добавляет обязательные модификаторы в модель (для UI и API).\n // Одна мутация — без лишних реактивных перерасчётов.\n function seedRequiredModifiers(): void {\n const missing = requiredModifierEntries.value.filter(\n (req) => !modifiersModel.value.some((m) => m.modifier_id === req.modifier_id)\n )\n\n if (missing.length) {\n modifiersModel.value = [...modifiersModel.value, ...missing]\n }\n }\n\n // Синхронная инициализация — до регистрации любых watchers в usePriceRecalculation,\n // чтобы первый рендер сразу видел корректную цену.\n seedRequiredModifiers()\n\n // При смене варианта: useProductVariantModifiers watcher сбрасывает модель до дефолтов,\n // затем мы добавляем обязательные обратно. Оба watcher'а flush: 'pre' — отрабатывают\n // в порядке регистрации до рендера.\n watch(selectedVariant, seedRequiredModifiers)\n\n const requiredModifiersGroupIsMissing = computed<boolean>(() => {\n const requiredGroups = (product.value.modifiers_groups ?? [])\n .filter((group) => group.is_required)\n .map((group) => group.group.id)\n\n if (!requiredGroups.length) return false\n\n return requiredGroups.some(\n (groupId) =>\n !modifiersModel.value.find((m) => m.modifiers_group_id === groupId && m.quantity > 0)\n )\n })\n\n const { price, originalPrice, priceWasModified, priceIsRecalculating } = usePriceRecalculation({\n product,\n selectedVariant,\n modifiersModel,\n requiredModifiersGroupIsMissing,\n selectedModifiersHash,\n })\n\n return {\n optionsModel,\n optionsList,\n disabledValues,\n modifiersModel,\n selectedVariant,\n price,\n originalPrice,\n priceWasModified,\n priceIsRecalculating,\n selectedModifiersHash,\n requiredModifiersGroupIsMissing,\n }\n}\n","// Запросы рекомендованных товаров. SDK не предоставляет типизированных методов\n// related.products.list — идём через публичный sdk.client.request.\nimport type { Product } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { createRuntimeState } from '../ports/runtimeState'\nimport { useAuthStore } from '../stores/auth'\nimport { useStoreProfileStore } from '../stores/store-profile'\n\nexport interface OrderCredentials {\n id: string\n token: string\n}\n\ninterface UseRelatedProductsApi {\n fetchForProduct: (\n productId: string,\n orderCredentials: OrderCredentials | null,\n signal?: AbortSignal\n ) => Promise<Product[]>\n fetchForOrder: (orderId: string, orderToken: string, signal?: AbortSignal) => Promise<Product[]>\n}\n\n/**\n * Один из вариантов товара и ни одного модификатора — такой товар можно класть\n * в корзину одним кликом по рекомендации, минуя открытие карточки.\n */\nexport function canAddDirectly(product: Product): boolean {\n const variantsCount = product.variants?.length ?? 0\n const hasModifiers = (product.modifiers?.length ?? 0) > 0\n const hasModifierGroups = (product.modifiers_groups?.length ?? 0) > 0\n return variantsCount === 1 && !hasModifiers && !hasModifierGroups\n}\n\n// Без `variants.prices` приходят 0₽ (цены живут на variants). Без modifiers/groups\n// сломается canAddDirectly — посчитает товар «прямым добавлением», хотя модификаторы есть.\nconst RELATED_PRODUCT_INCLUDES = 'variants.prices,modifiers,modifiers_groups'\n\ninterface RelatedProductsState {\n productInFlight: Map<string, Promise<Product[]>>\n}\n\nconst getRelatedProductsState = createRuntimeState<RelatedProductsState>(() => ({\n productInFlight: new Map<string, Promise<Product[]>>(),\n}))\n\nexport function useRelatedProducts(): UseRelatedProductsApi {\n const runtime = useRuntime()\n const { sdk } = runtime\n const { productInFlight } = getRelatedProductsState(runtime)\n const profileStore = useStoreProfileStore()\n const authStore = useAuthStore()\n\n function getStoreId(): string {\n const id = profileStore.store?.id\n if (!id) throw new Error('Store is not initialized')\n return id\n }\n\n async function fetchForProduct(\n productId: string,\n orderCredentials: OrderCredentials | null,\n signal?: AbortSignal\n ): Promise<Product[]> {\n if (signal?.aborted) return []\n\n const key = orderCredentials ? `${productId}:${orderCredentials.id}` : productId\n\n let promise = productInFlight.get(key)\n if (!promise) {\n promise = (async (): Promise<Product[]> => {\n try {\n const storeId = getStoreId()\n const query: Record<string, string> = { with: RELATED_PRODUCT_INCLUDES }\n if (orderCredentials) {\n query.order_id = orderCredentials.id\n query.order_token = orderCredentials.token\n }\n const url = sdk.client.getStoreUrl(\n storeId,\n `/products/${productId}/related/products`,\n query\n )\n const response = await sdk.client.request('GET', url, undefined, authStore.token)\n return (response?.data as Product[] | undefined) ?? []\n } catch (e: unknown) {\n // По ТЗ при ошибке/пустом ответе никаких сообщений покупателю —\n // блок просто не появляется. Лог нужен разработчику.\n console.warn('[recommendations:product] fetch failed', e)\n return []\n }\n })().finally(() => productInFlight.delete(key))\n productInFlight.set(key, promise)\n }\n\n const result = await promise\n return signal?.aborted ? [] : result\n }\n\n async function fetchForOrder(\n orderId: string,\n orderToken: string,\n signal?: AbortSignal\n ): Promise<Product[]> {\n if (signal?.aborted) return []\n\n try {\n const storeId = getStoreId()\n const url = sdk.client.getStoreUrl(storeId, `/orders/${orderId}/related/products`, {\n token: orderToken,\n with: RELATED_PRODUCT_INCLUDES,\n })\n const response = await sdk.client.request('GET', url, undefined, authStore.token)\n if (signal?.aborted) return []\n return (response?.data as Product[] | undefined) ?? []\n } catch (e: unknown) {\n console.warn('[recommendations:order] fetch failed', e)\n return []\n }\n }\n\n return { fetchForProduct, fetchForOrder }\n}\n","import type { CatalogItem, Product } from '@zenky/storefront-api'\n\nexport interface CatalogProductMatch {\n product: Product\n catalogItem: CatalogItem\n}\n\n/** Поиск товара по short_id в статичном каталоге. null — если не найден. */\nexport function findProductInCatalog(\n catalog: CatalogItem[],\n shortId: string\n): CatalogProductMatch | null {\n for (const item of catalog) {\n if (!item.products.length) continue\n\n const found = item.products.find((p) => p.short_id === shortId)\n if (found) return { product: found, catalogItem: item }\n }\n\n return null\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cart/constants.ts","../src/cart/normalizeAddress.ts","../src/cart/cartLineKey.ts","../src/cart/buildMainPaymentRequest.ts","../src/cart/cashChangePresets.ts","../src/cart/logCartError.ts","../src/cart/useCartMutation.ts","../src/cart/useCartQuantities.ts","../src/cart/useCheckoutFlow.ts","../src/cart/useOrderTotal.ts","../src/cart/useOrderSettings.ts","../src/cart/useOnlinePaymentRetry.ts","../src/cart/useCartAddressSync.ts","../src/cart/useCartInitialization.ts","../src/cart/useOrderBonuses.ts","../src/cart/usePaymentSelection.ts","../src/cart/useBonusesReconciliation.ts","../src/cart/useCartRecalculation.ts","../src/cart/useCustomerAttach.ts","../src/cart/useCartCustomerAttachment.ts","../src/cart/useCartStockWatcher.ts","../src/cart/useOrderDelivery.ts","../src/cart/useOrderPromocode.ts","../src/cart/useCartDeliveryAttachment.ts","../src/cart/useCartOperations.ts","../src/cart/useCheckoutSubmit.ts","../src/cart/useStorefrontCart.ts","../src/cart/useOrderChannel.ts"],"names":["computed","ref","PaymentMethod","PaymentMethodEnum","watch"],"mappings":"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","file":"chunk-OQLU7FSR.js","sourcesContent":["/** WebSocket события канала заказа */\nexport const ORDER_EVENTS = {\n PriceRecalculated: 'orders.price.recalculated',\n Reload: 'orders.reload',\n Submitted: 'orders.submitted',\n Repeated: 'orders.repeated',\n PromotionsNotFound: 'orders.promotions.not_found',\n RewardsDisplaySelection: 'orders.rewards.display_selection',\n RewardsReload: 'orders.rewards.reload',\n} as const\n","/** Нормализация строки адреса для сравнения (lowercase, схлопывание запятых/пробелов). */\nexport function normalizeAddress(value: string | null | undefined): string {\n if (!value) return ''\n\n return value\n .toLowerCase()\n .replace(/[,\\s]+/g, ' ')\n .trim()\n}\n","import type { OrderProductVariant, ProductModifiersRequest } from '@zenky/storefront-api'\n\nexport interface CartLineKeyParams {\n productVariantId: string\n modifiers?: ProductModifiersRequest[]\n promotionId?: string\n promotionRewardId?: string\n}\n\n/** Детерминированный ключ строки корзины: variant + sorted modifiers + promotion. */\nexport function buildCartLineKey(params: CartLineKeyParams): string {\n const modifiers = (params.modifiers ?? [])\n .map((m) => `${m.modifier_id ?? ''}:${m.quantity}`)\n .sort()\n .join('|')\n\n return [\n params.productVariantId,\n modifiers,\n params.promotionId ?? '',\n params.promotionRewardId ?? '',\n ].join('::')\n}\n\nexport function variantLineKey(variant: OrderProductVariant): string {\n const modifiers: ProductModifiersRequest[] = (variant.modifiers ?? []).map((m) => ({\n modifier_id: m.modifier?.id ?? m.id,\n modifiers_group_id: m.modifiers_group_id ?? undefined,\n quantity: m.quantity,\n }))\n\n return buildCartLineKey({\n productVariantId: variant.product_variant_id,\n modifiers,\n promotionId: variant.promotion?.id,\n promotionRewardId: variant.promotion?.reward_id,\n })\n}\n","import { PaymentMethod } from '@zenky/storefront-api'\n\nimport type { OrderPaymentMethodRequest } from '@zenky/storefront-api'\n\nimport { minorToMajor } from '../money'\n\nexport interface MainPaymentRequestParams {\n method: PaymentMethod | null\n billMinor: number | null\n cardTokenId: string | null\n saveCard: boolean\n currency: string\n}\n\n/**\n * Основной (не-бонусный) payment-request из выбранного способа оплаты.\n * Единый источник для UI и reconciliation; `bill` конвертируется minor→major здесь.\n */\nexport function buildMainPaymentRequest(\n params: MainPaymentRequestParams\n): OrderPaymentMethodRequest | null {\n if (!params.method || params.method === PaymentMethod.Bonuses) return null\n\n return {\n method: params.method,\n bill:\n params.billMinor != null && params.billMinor > 0\n ? minorToMajor(params.billMinor, params.currency)\n : undefined,\n save_card: params.saveCard,\n card_token_id: params.cardTokenId ?? undefined,\n }\n}\n","/**\n * Утилиты для построения пресетов «с какой суммы приготовить сдачу» (cash bill)\n * в минорных единицах валюты (копейки/тыйны/сатанги).\n *\n * UI отображает пресеты как пилюли: «1100 ₽», «1500 ₽», «5000 ₽» и т.п.\n */\n\nimport { majorToMinor } from '../money'\n\n/**\n * Номиналы банкнот по странам в **мажорных** единицах валюты.\n * Набор банкнот зависит от страны (рубли РФ ≠ тенге KZ), а конвертация\n * мажор → минор — от валюты (через `majorToMinor`, который сам учитывает\n * число дробных знаков по ISO-коду). Поэтому `getCashDenominationsMinor`\n * принимает и страну (выбор набора), и валюту (фактор конвертации).\n */\nexport const CASH_DENOMINATIONS_MAJOR: Record<string, number[]> = {\n RU: [10, 50, 100, 200, 500, 1000, 2000, 5000, 10000],\n KZ: [200, 500, 1000, 2000, 5000, 10000, 20000],\n BY: [5, 10, 20, 50, 100, 200, 500],\n UA: [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000],\n}\n\n/**\n * Шаги округления вверх в **мажорных** единицах: 10 / 50 / 100 / 200 / 500 / 1000.\n * Конвертируются в минорные по валюте через `getDefaultRoundStepsMinor` —\n * чтобы работать для валют с любым числом дробных знаков, а не только ×100.\n */\nexport const DEFAULT_ROUND_STEPS_MAJOR: readonly number[] = [10, 50, 100, 200, 500, 1000] as const\n\nexport function getDefaultRoundStepsMinor(currency = 'RUB'): number[] {\n return DEFAULT_ROUND_STEPS_MAJOR.map((value) => majorToMinor(value, currency))\n}\n\n/** Номиналы в минорных единицах для страны магазина (с фолбэком на RU). */\nexport function getCashDenominationsMinor(\n country: string | null | undefined,\n currency = 'RUB'\n): number[] {\n const code = country ?? 'RU'\n const major = CASH_DENOMINATIONS_MAJOR[code] ?? CASH_DENOMINATIONS_MAJOR.RU ?? []\n return major.map((d) => majorToMinor(d, currency))\n}\n\nexport interface CashChangePresetsOptions {\n /** Сумма заказа в минорных единицах. */\n totalMinor: number\n /** Номиналы банкнот в минорных единицах (см. `getCashDenominationsMinor`). */\n denominationsMinor: number[]\n /** Шаги округления — переопределяй только если знаешь зачем. */\n roundStepsMinor?: readonly number[]\n}\n\n/**\n * Строит пресеты сдачи в минорных единицах:\n * объединяем округлённые вверх суммы (до 10/50/100/200/500/1000) и все\n * банкноты > total, дедупим, сортируем по возрастанию.\n *\n * Округления — strict (`total + 1`), чтобы сдача всегда была > 0.\n *\n * Примеры (для RU, total в рублях для краткости):\n * total = 1080: 1090 / 1100 / 1200 / 1500 / 2000 / 5000 / 10000\n * total = 1130: 1140 / 1150 / 1200 / 1500 / 2000 / 5000 / 10000\n * total = 3060: 3070 / 3100 / 3200 / 3500 / 4000 / 5000 / 10000\n * total = 3982: 3990 / 4000 / 5000 / 10000\n * total = 0: все банкноты как есть.\n */\nexport function buildCashChangePresets({\n totalMinor,\n denominationsMinor,\n roundStepsMinor = getDefaultRoundStepsMinor(),\n}: CashChangePresetsOptions): number[] {\n const total = Math.max(totalMinor, 0)\n if (total === 0) return [...denominationsMinor]\n\n const candidates = new Set<number>()\n\n for (const step of roundStepsMinor) {\n candidates.add(Math.ceil((total + 1) / step) * step)\n }\n for (const d of denominationsMinor) {\n if (d > total) candidates.add(d)\n }\n\n return [...candidates].sort((a, b) => a - b)\n}\n","/**\n * Единый формат логов ошибок для всех cart/checkout-операций + извлечение\n * читаемых сообщений из ZenkyError для UI (toast / inline).\n *\n * Контракт ошибок Zenky API (см. `ApiError` в SDK):\n * {\n * err: {\n * message: string, // локализованное — \"Адрес доставки не указан.\"\n * original_message: string, // англ. оригинал\n * http_code: number,\n * error_code: string, // 'addresses.not_specified' | 'validation' | etc.\n * meta: any, // для validation: { errors: { [field]: string[] } }\n * }\n * }\n *\n * Для validation-ошибок (`error_code === 'validation'`) — берём сообщения из\n * `meta.errors`, не верхнеуровневое generic сообщение.\n */\n\ninterface ZenkyValidationMeta {\n errors?: Record<string, string[]>\n request?: unknown\n}\n\ninterface ZenkyErrorPayload {\n http_code?: number\n error_code?: string\n message?: string\n meta?: ZenkyValidationMeta | unknown\n}\n\ninterface ZenkyErrorLike {\n err?: ZenkyErrorPayload\n}\n\nexport interface CartErrorScope {\n /** Префикс — operation name (`cart-add` / `delivery` / `promocode-apply` / etc.) */\n scope: string\n /** Параметры операции — id'шники, входы, что в данный момент в credentials */\n context?: Record<string, unknown>\n}\n\n/**\n * Залогировать ошибку cart/checkout-операции в едином формате.\n * Безопасно для любого `unknown` — не падает на не-ZenkyError ошибках.\n */\nexport function logCartError({ scope, context }: CartErrorScope, e: unknown): void {\n const err = (e as ZenkyErrorLike | undefined)?.err\n\n console.error(`[${scope}] failed`, {\n ...(context ?? {}),\n httpCode: err?.http_code,\n errorCode: err?.error_code,\n message: err?.message,\n meta: err?.meta,\n // raw — полный объект ошибки на случай нестандартных полей\n raw: e,\n })\n}\n\n/**\n * Достаёт `error_code` бэка (например `addresses.not_specified`).\n * Возвращает undefined для не-Zenky ошибок.\n */\nexport function getCartErrorCode(e: unknown): string | undefined {\n return (e as ZenkyErrorLike | undefined)?.err?.error_code\n}\n\n/**\n * Достаёт HTTP-код бэка (например 401 для требующей авторизации операции).\n * Возвращает undefined для не-Zenky ошибок.\n */\nexport function getCartErrorHttpCode(e: unknown): number | undefined {\n return (e as ZenkyErrorLike | undefined)?.err?.http_code\n}\n\n/**\n * Достаёт field → [messages] из ZenkyError для валидации.\n * Возвращает {} если ошибка не validation или meta.errors пусто.\n */\nexport function getValidationErrors(e: unknown): Record<string, string[]> {\n const err = (e as ZenkyErrorLike | undefined)?.err\n if (!err || err.error_code !== 'validation') return {}\n const meta = err.meta as ZenkyValidationMeta | undefined\n return meta?.errors ?? {}\n}\n\n/**\n * Вытащить читаемое сообщение для UI (toast / inline).\n *\n * Приоритет:\n * 1. Если validation-ошибка → склеиваем все сообщения из `meta.errors` (по всем полям)\n * 2. Иначе — `err.message` (generic от бэка)\n * 3. Иначе — `fallback`\n */\nexport function getCartErrorMessage(e: unknown, fallback: string): string {\n const err = (e as ZenkyErrorLike | undefined)?.err\n if (!err) return fallback\n\n // Validation — собираем все поля и сообщения, склеиваем\n if (err.error_code === 'validation') {\n const errors = (err.meta as ZenkyValidationMeta | undefined)?.errors\n if (errors) {\n const messages = Object.values(errors).flat().filter(Boolean)\n if (messages.length > 0) return messages.join(' ')\n }\n }\n\n return err.message ?? fallback\n}\n","/**\n * Race-safe выполнение мутаций корзины.\n *\n * Проблема: SDK Zenky не поддерживает AbortSignal — нельзя физически отменить\n * запрос на полпути. Если пользователь быстро жмёт `+ → доставка → оплата`,\n * ответы могут прийти в произвольном порядке и устаревший ответ перепишет\n * свежее состояние (race condition).\n *\n * Решение: версионирование per-kind. У каждого вида операции свой счётчик —\n * новый вызов инкрементирует его, после await callback проверяет «я ещё актуален?»\n * через `isStale()`. Если устарел — side-effect (`cartStore.setOrder`) пропускается.\n * HTTP-запрос всё равно завершается на бэке (минорный overhead), но фронт\n * игнорирует результат → race гарантированно не пройдёт.\n *\n * Дополнительно — debounce per-kind. Быстрые подряд клики «++++» схлопываются\n * в один запрос после паузы.\n *\n * Состояние версий общее для composables одного storefront runtime, но изолировано\n * между SSR-запросами и отдельными Vue-приложениями.\n */\n\nimport { useRuntime } from '../ports/runtime'\nimport { createRuntimeState } from '../ports/runtimeState'\n\ninterface MutationState {\n versions: Map<string, number>\n}\n\nconst getMutationState = createRuntimeState<MutationState>(() => ({\n versions: new Map<string, number>(),\n}))\n\n/**\n * `cart-line-${lineKey}` — динамический ключ строки корзины: add и remove одной\n * строки делят kind, т.к. конфликтуют по одному ресурсу.\n */\nexport type MutationKind =\n | 'delivery'\n | 'delivery-settle'\n | 'payment'\n | 'promocode'\n | 'bonuses'\n | 'customer'\n | 'total'\n | 'settings'\n | 'checkout'\n | `cart-line-${string}`\n\nexport interface MutationOptions {\n /** Уникальный kind — мутации одного kind заменяют друг друга */\n kind: MutationKind\n /** Debounce в мс перед отправкой (0 = без debounce) */\n debounce?: number\n}\n\nexport interface CartMutationComposable {\n /**\n * Запустить мутацию. Внутри callback'а можно делать side-effect только\n * если `isStale()` вернул `false` — иначе старый результат затрёт свежий.\n *\n * Возвращает результат `fn` или `undefined` если был stale.\n *\n * @example\n * await run({ kind: 'payment', debounce: 300 }, async (isStale) => {\n * const order = await sdk.orders.setOrderPayments(...)\n * if (isStale()) return // Пришёл новый клик — наш результат устарел\n * cartStore.setOrder(order)\n * return order\n * })\n */\n run: <T>(\n options: MutationOptions,\n fn: (isStale: () => boolean) => Promise<T>\n ) => Promise<T | undefined>\n /** Получить текущую версию kind'а — для тестов / отладки */\n getVersion: (kind: MutationKind) => number\n /**\n * Bump-нуть версии всех kind с указанным префиксом — все in-flight операции,\n * матчащие префикс, станут stale и их side-effect'ы будут проигнорированы.\n *\n * Используется при `clearAndResetCart` / `logout` — отменить все pending\n * мутации старого заказа, чтобы поздние ответы не записались в свежий стейт.\n */\n bumpKindsWithPrefix: (prefix: string) => void\n}\n\nexport function useCartMutation(): CartMutationComposable {\n const runtime = useRuntime()\n const { versions } = getMutationState(runtime)\n\n async function run<T>(\n options: MutationOptions,\n fn: (isStale: () => boolean) => Promise<T>\n ): Promise<T | undefined> {\n const { kind, debounce = 0 } = options\n\n // Bump версию — все предыдущие in-flight операции kind становятся stale\n const myVersion = (versions.get(kind) ?? 0) + 1\n versions.set(kind, myVersion)\n\n const isStale = (): boolean => versions.get(kind) !== myVersion\n\n // Debounce: ждём паузу. Если за это время кто-то ещё bumped версию,\n // выходим без запроса.\n if (debounce > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, debounce))\n if (isStale()) return undefined\n }\n\n try {\n return await fn(isStale)\n } catch (e) {\n // Stale ошибки тоже игнорируем (старая операция, которая всё равно\n // не должна была завершиться) — иначе toast'ы будут лишние.\n if (isStale()) return undefined\n throw e\n }\n }\n\n function getVersion(kind: MutationKind): number {\n return versions.get(kind) ?? 0\n }\n\n function bumpKindsWithPrefix(prefix: string): void {\n for (const kind of versions.keys()) {\n if (kind.startsWith(prefix)) {\n versions.set(kind, (versions.get(kind) ?? 0) + 1)\n }\n }\n }\n\n return { run, getVersion, bumpKindsWithPrefix }\n}\n","import { computed, toValue, type ComputedRef, type MaybeRefOrGetter } from 'vue'\n\nimport type { ProductModifiersRequest } from '@zenky/storefront-api'\n\nimport { useCartStore } from '../stores/cart'\n\nexport interface CartQuantities {\n getProductQuantity: (productId: string) => ComputedRef<number>\n getVariantQuantity: (\n productVariantId: MaybeRefOrGetter<string | null>,\n modifiers: MaybeRefOrGetter<ProductModifiersRequest[]>\n ) => ComputedRef<number>\n}\n\nexport function useCartQuantities(): CartQuantities {\n const cartStore = useCartStore()\n\n function getProductQuantity(productId: string): ComputedRef<number> {\n return computed<number>(() => {\n const serverQty = cartStore.productQuantities[productId] ?? 0\n const adjustment = cartStore.optimisticAdjustments[productId] ?? 0\n\n return Math.max(0, serverQty + adjustment)\n })\n }\n\n function getVariantQuantity(\n productVariantId: MaybeRefOrGetter<string | null>,\n modifiers: MaybeRefOrGetter<ProductModifiersRequest[]>\n ): ComputedRef<number> {\n return computed<number>(() => {\n const variantId = toValue(productVariantId)\n\n if (!variantId) return 0\n\n const requestedMods = toValue(modifiers)\n\n const match = cartStore.variants.find((cartItem) => {\n if (cartItem.product_variant_id !== variantId) return false\n\n const cartMods = cartItem.modifiers ?? []\n\n if (cartMods.length !== requestedMods.length) return false\n if (requestedMods.length === 0) return true\n\n return requestedMods.every((mod) =>\n cartMods.some((cm) => cm.id === mod.modifier_id && cm.quantity === mod.quantity)\n )\n })\n\n return match?.quantity ?? 0\n })\n }\n\n return {\n getProductQuantity,\n getVariantQuantity,\n }\n}\n","import { OrderAuthenticationMethod } from '@zenky/storefront-api'\nimport { computed, type ComputedRef } from 'vue'\n\nimport { useStoreProfileStore } from '../stores/store-profile'\n\nexport interface CheckoutFlowFlags {\n /** Режим из настроек магазина (Disabled / Preauth / Confirmation) */\n mode: ComputedRef<OrderAuthenticationMethod>\n /** Нужна авторизация перед submit (открывается AuthModal вместо checkoutOrder) */\n needsAuth: ComputedRef<boolean>\n /** Нужно показать CustomerForm в корзине (phone + name) */\n needsCustomerForm: ComputedRef<boolean>\n}\n\n/**\n * Определяет поведение чекаута в зависимости от настроек магазина.\n *\n * Матрица:\n * ┌──────────────┬──────────┬──────────────────┐\n * │ mode │ needsAuth│ needsCustomerForm│\n * ├──────────────┼──────────┼──────────────────┤\n * │ Preauth │ true │ false │\n * │ Confirmation │ false │ true (гости) │\n * │ Disabled │ false │ true (гости) │\n * └──────────────┴──────────┴──────────────────┘\n *\n * Нужна ли SMS-подтверждение — фронт не вычисляет: бэк возвращает\n * `confirmation.required` в ответе `checkoutOrder`, и UI реагирует на него.\n *\n * Примечание: `needsCustomerForm` сейчас возвращает true для гостей во всех\n * режимах кроме Preauth. Для авторизованных клиентов форма не нужна\n * (данные автозаполняются через authStore).\n */\nexport function useCheckoutFlow(): CheckoutFlowFlags {\n const profileStore = useStoreProfileStore()\n\n const mode = computed<OrderAuthenticationMethod>(\n () =>\n (profileStore.store?.settings?.orders?.authentication_method as\n | OrderAuthenticationMethod\n | undefined) ?? OrderAuthenticationMethod.Disabled\n )\n\n const needsAuth = computed<boolean>(() => mode.value === OrderAuthenticationMethod.Preauth)\n\n const needsCustomerForm = computed<boolean>(\n () =>\n mode.value === OrderAuthenticationMethod.Disabled ||\n mode.value === OrderAuthenticationMethod.Confirmation\n )\n\n return { mode, needsAuth, needsCustomerForm }\n}\n","import { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { OrderCheckoutTotal } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartMutation } from './useCartMutation'\n\nexport interface OrderTotal {\n total: ComputedRef<OrderCheckoutTotal | null>\n loading: Ref<boolean>\n fetchTotal: () => Promise<void>\n}\n\nexport function useOrderTotal(): OrderTotal {\n const loading = ref<boolean>(false)\n const sdk = useRuntime().sdk\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { run } = useCartMutation()\n\n const total = computed(() => cartStore.checkoutTotal)\n\n async function fetchTotal(): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n await run({ kind: 'total', debounce: 100 }, async (isStale) => {\n try {\n const orderCredentials = credentials.getCredentials()\n loading.value = true\n const fresh = await sdk.orders.getOrderTotal(storeId, orderCredentials)\n if (isStale()) return\n cartStore.setCheckoutTotal(fresh)\n } catch (e) {\n if (isStale()) return\n logCartError(\n { scope: 'order-total', context: { orderId: cartStore.credentials?.id } },\n e\n )\n } finally {\n loading.value = false\n }\n })\n }\n\n return { total, loading, fetchTotal }\n}\n","import { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { OrderDeliveryMethod, OrderPaymentMethod, OrderSettings } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartMutation } from './useCartMutation'\n\nexport interface OrderSettingsComposable {\n /** Полный снепшот настроек — читается из `cartStore.orderSettings` */\n settings: ComputedRef<OrderSettings | null>\n paymentMethods: ComputedRef<OrderPaymentMethod[]>\n deliveryMethods: ComputedRef<OrderDeliveryMethod[]>\n loading: Ref<boolean>\n /**\n * Перезапросить настройки с бэка. Вызывается:\n * - при старте (через useCartInitialization)\n * - после setOrderDeliveryMethod (набор payment-методов меняется от доставки)\n */\n fetchSettings: () => Promise<void>\n}\n\nexport function useOrderSettings(): OrderSettingsComposable {\n const sdk = useRuntime().sdk\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { run } = useCartMutation()\n\n const loading = ref<boolean>(false)\n\n const settings = computed<OrderSettings | null>(() => cartStore.orderSettings)\n const paymentMethods = computed<OrderPaymentMethod[]>(() => cartStore.paymentMethods)\n const deliveryMethods = computed<OrderDeliveryMethod[]>(() => cartStore.deliveryMethods)\n\n async function fetchSettings(): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n await run({ kind: 'settings' }, async (isStale) => {\n loading.value = true\n try {\n const orderCredentials = credentials.getCredentials()\n const fresh = await sdk.orders.getOrderSettings(storeId, orderCredentials)\n if (isStale()) return\n cartStore.setOrderSettings(fresh)\n } catch (e) {\n if (isStale()) return\n logCartError(\n { scope: 'order-settings', context: { orderId: cartStore.credentials?.id } },\n e\n )\n } finally {\n loading.value = false\n }\n })\n }\n\n return { settings, paymentMethods, deliveryMethods, loading, fetchSettings }\n}\n","import { useRuntime } from '../ports/runtime'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { logCartError } from './logCartError'\n\nexport interface OrderCredentialsLike {\n id: string\n token?: string | null\n}\n\nexport interface RetryOptions {\n /**\n * ID существующей online-payment транзакции (`order.payments[].id` где\n * `is_online === true && status === 'pending'`). Используется как fallback\n * если основной retry-эндпоинт вернул ошибку (typically 409\n * `order_is_not_submitted` для свежих pending-заказов).\n */\n transactionId?: string | null\n\n /**\n * Куда вернуть юзера после оплаты. По дефолту `window.location.href` —\n * на success-странице это правильно (вернёт обратно на success), но\n * со страницы заказа `/me/orders/[id]` лучше передать success-URL явно,\n * иначе после оплаты юзер останется на странице заказа без `?payment=`\n * query и не увидит результат оплаты.\n */\n currentUrl?: string\n}\n\n/**\n * Повторная попытка онлайн-оплаты заказа.\n *\n * **Стратегия (двухуровневая)**:\n * 1. `sdk.orders.retryOnlinePayment` — официальный retry-эндпоинт (submitted-заказы).\n * 2. `getOnlinePaymentRedirect(transactionId)` — fallback для pending-заказов (409\n * `order_is_not_submitted`).\n *\n * Возвращает `redirect_url` или `null` если оба способа упали.\n */\nexport function useOnlinePaymentRetry(): {\n retry(creds: OrderCredentialsLike, options?: RetryOptions): Promise<string | null>\n} {\n const sdk = useRuntime().sdk\n const profileStore = useStoreProfileStore()\n\n async function retry(\n creds: OrderCredentialsLike,\n options: RetryOptions = {}\n ): Promise<string | null> {\n const storeId = profileStore.store?.id\n if (!storeId) return null\n if (!creds.id) return null\n\n const credentials = { id: creds.id, token: creds.token ?? '' }\n const currentUrl =\n options.currentUrl ??\n (typeof window === 'undefined' ? null : window.location.href)\n if (!currentUrl) return null\n\n // 1. Основной путь — SDK retryOnlinePayment\n try {\n const redirect = await sdk.orders.retryOnlinePayment(storeId, credentials, {\n current_url: currentUrl,\n })\n if (redirect?.redirect_url) {\n return redirect.redirect_url\n }\n } catch (e: unknown) {\n // Не логируем как ошибку — это ожидаемый путь для pending-заказов.\n // Продолжаем к fallback если есть transactionId.\n if (!options.transactionId) {\n logCartError({ scope: 'payment-retry', context: { orderId: creds.id } }, e)\n return null\n }\n }\n\n // 2. Fallback — getOnlinePaymentRedirect для существующей транзакции\n if (!options.transactionId) return null\n\n try {\n const redirect = await sdk.orders.getOnlinePaymentRedirect(\n storeId,\n credentials,\n options.transactionId,\n { current_url: currentUrl }\n )\n return redirect?.redirect_url ?? null\n } catch (e: unknown) {\n logCartError(\n {\n scope: 'payment-retry-fallback',\n context: { orderId: creds.id, transactionId: options.transactionId },\n },\n e\n )\n return null\n }\n }\n\n return { retry }\n}\n","import { watch } from 'vue'\n\nimport type { DeliveryAddress } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useAuthStore } from '../stores/auth'\nimport { useOrderSettingsStore } from '../stores/order-settings'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { normalizeAddress } from './normalizeAddress'\n\nexport function useCartAddressSync(): void {\n const authStore = useAuthStore()\n const orderSettings = useOrderSettingsStore()\n const profileStore = useStoreProfileStore()\n const sdk = useRuntime().sdk\n\n async function syncOnLogin(): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n\n const requestedToken = authStore.token\n if (!requestedToken) return\n\n let addresses: DeliveryAddress[]\n try {\n const response = await sdk.customer.getAddresses(storeId, undefined, requestedToken)\n addresses = response.items ?? []\n } catch (e: unknown) {\n console.error('[address-sync] failed to fetch saved addresses', e)\n return\n }\n\n if (!authStore.isAuthenticated || authStore.token !== requestedToken) return\n\n if (addresses.length === 0) return\n\n if (!orderSettings.selectedAddress) {\n const first = addresses[0]\n if (!first) return\n orderSettings.setSelectedAddress(first.address, first.id, first.name)\n return\n }\n\n if (\n orderSettings.selectedAddressId &&\n addresses.some((a) => a.id === orderSettings.selectedAddressId)\n ) {\n return\n }\n\n const normalizedSelected = normalizeAddress(orderSettings.selectedAddress)\n const match = addresses.find((a) => normalizeAddress(a.address) === normalizedSelected)\n if (match) {\n orderSettings.setSelectedAddress(match.address, match.id, match.name)\n return\n }\n\n // Выбранный адрес не найден среди сохранённых — устарел, чистим.\n orderSettings.setSelectedAddress(null, null, null)\n }\n\n watch(\n () => authStore.isAuthenticated,\n async (isAuth, wasAuth) => {\n if (isAuth && !wasAuth) await syncOnLogin()\n }\n )\n}\n","import type { InclusionRequest, ZenkyStorefront } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { createRuntimeState } from '../ports/runtimeState'\nimport { useCartStore } from '../stores/cart'\nimport type { CartCredentials } from './useCartCredentials'\nimport { useOrderTotal } from './useOrderTotal'\n\nconst ORDER_INCLUDES = [\n 'city.schedule',\n 'stock.schedule',\n 'delivery_address',\n 'delivery_interval',\n 'customer',\n 'payments',\n 'progress',\n 'promocode',\n 'variants.variant.options',\n 'variants.product.images',\n 'variants.product.categories',\n 'variants.modifiers.modifier',\n 'variants.modifiers.modifiers_group',\n].join(',')\n\nexport const ORDER_WITH: InclusionRequest = { with: ORDER_INCLUDES }\n\ninterface InitializationState {\n promise: Promise<void> | null\n}\n\nconst getInitializationState = createRuntimeState<InitializationState>(() => ({ promise: null }))\n\nexport interface CartInitialization {\n initializeOrder: () => Promise<void>\n}\n\nexport function useCartInitialization(\n credentials: CartCredentials,\n sdk: ZenkyStorefront\n): CartInitialization {\n const cartStore = useCartStore()\n const runtime = useRuntime()\n const state = getInitializationState(runtime)\n const { fetchTotal } = useOrderTotal()\n\n async function createNewOrder(): Promise<void> {\n const storeId = credentials.getStoreId()\n const cityId = credentials.getCityId()\n const apiToken = credentials.getApiToken()\n const newOrder = await sdk.orders.createOrder(storeId, { city_id: cityId }, apiToken)\n\n cartStore.setOrder(newOrder)\n credentials.persistCredentials(newOrder)\n runtime.events?.get()?.orderCreated({ order: newOrder })\n }\n\n async function loadOrderSettings(): Promise<void> {\n try {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n const settings = await sdk.orders.getOrderSettings(storeId, orderCredentials)\n\n cartStore.setOrderSettings(settings)\n } catch (e) {\n console.error('[cart] Failed to load order settings', e)\n }\n }\n\n async function _doInitialize(): Promise<void> {\n cartStore.setInitializing(true)\n\n try {\n if (credentials.orderIdCookie.value && credentials.orderTokenCookie.value) {\n const orderCredentials = credentials.buildCredentials(\n credentials.orderIdCookie.value,\n credentials.orderTokenCookie.value\n )\n\n try {\n const storeId = credentials.getStoreId()\n const existingOrder = await sdk.orders.getOrder(\n storeId,\n orderCredentials,\n ORDER_WITH\n )\n\n if (credentials.isOrderActive(existingOrder)) {\n cartStore.setOrder(existingOrder)\n runtime.events?.get()?.orderLoaded({ order: existingOrder })\n\n return\n }\n\n credentials.clearPersistedCredentials()\n cartStore.clearCart()\n } catch {\n credentials.clearPersistedCredentials()\n cartStore.clearCart()\n }\n }\n\n await createNewOrder()\n } catch (e) {\n runtime.events?.get()?.orderInitializationFailed()\n throw e\n } finally {\n if (cartStore.hasCredentials) {\n await loadOrderSettings()\n if (cartStore.order?.variants?.length) {\n await fetchTotal()\n }\n }\n cartStore.setInitializing(false)\n }\n }\n\n function initializeOrder(): Promise<void> {\n if (cartStore.hasOrder) return Promise.resolve()\n\n if (state.promise !== null) return state.promise\n\n state.promise = _doInitialize().finally(() => {\n state.promise = null\n })\n\n return state.promise\n }\n\n return {\n initializeOrder,\n }\n}\n","import { PaymentMethod } from '@zenky/storefront-api'\nimport { computed, type ComputedRef } from 'vue'\n\nimport type {\n OrderPaymentMethodRequest,\n OrderPaymentTransaction,\n PaymentMethod as PaymentMethodEnum,\n} from '@zenky/storefront-api'\n\nimport { minorToMajor } from '../money'\nimport type { ActivityReporter } from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartMutation } from './useCartMutation'\nimport { useOrderTotal } from './useOrderTotal'\n\nexport interface OrderBonusesComposable {\n maxAvailable: ComputedRef<number>\n apply: (\n additionalPayments?: OrderPaymentMethodRequest[],\n pin?: string,\n amount?: number\n ) => Promise<void>\n remove: (mainPayment: OrderPaymentMethodRequest | null) => Promise<void>\n}\n\nexport interface OrderBonusesDeps {\n activity?: ActivityReporter\n}\n\nexport function useOrderBonuses(deps: OrderBonusesDeps = {}): OrderBonusesComposable {\n const runtime = useRuntime()\n const activity = deps.activity ?? runtime.activity\n const sdk = runtime.sdk\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { total, fetchTotal } = useOrderTotal()\n const { run: runMutation } = useCartMutation()\n\n const maxAvailable = computed<number>(() => total.value?.max_bonuses_payment ?? 0)\n\n function bonusesAmountToApi(amount: number): number {\n const currency = profileStore.store?.settings?.currency ?? 'RUB'\n return minorToMajor(amount, currency)\n }\n\n async function apply(\n additionalPayments: OrderPaymentMethodRequest[] = [],\n pin?: string,\n amount?: number\n ): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n const requested = amount ?? maxAvailable.value\n const finalAmount = Math.min(requested, maxAvailable.value)\n if (!Number.isFinite(finalAmount) || finalAmount <= 0) return\n\n const bonusesPayment: OrderPaymentMethodRequest & { pin?: string } = {\n method: PaymentMethod.Bonuses as PaymentMethodEnum,\n amount: bonusesAmountToApi(finalAmount),\n }\n if (pin) bonusesPayment.pin = pin\n\n try {\n await runMutation({ kind: 'bonuses' }, async (isStale) => {\n activity.begin('bonuses')\n try {\n const orderCredentials = credentials.getCredentials()\n const updatedOrder = await sdk.orders.setOrderPayments(storeId, orderCredentials, {\n payments: [...additionalPayments, bonusesPayment],\n })\n if (isStale()) return\n if (Array.isArray(updatedOrder)) {\n cartStore.setOrderPaymentsState(updatedOrder as OrderPaymentTransaction[])\n } else {\n cartStore.setOrder(updatedOrder)\n }\n await fetchTotal()\n } finally {\n activity.end('bonuses')\n }\n })\n } catch (e) {\n logCartError(\n {\n scope: 'bonuses-apply',\n context: { amount, orderId: cartStore.credentials?.id },\n },\n e\n )\n throw e\n }\n }\n\n async function remove(mainPayment: OrderPaymentMethodRequest | null): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n try {\n await runMutation({ kind: 'bonuses' }, async (isStale) => {\n activity.begin('bonuses')\n try {\n const orderCredentials = credentials.getCredentials()\n const updatedOrder = await sdk.orders.setOrderPayments(storeId, orderCredentials, {\n payments: mainPayment ? [mainPayment] : [],\n })\n if (isStale()) return\n if (Array.isArray(updatedOrder)) {\n cartStore.setOrderPaymentsState(updatedOrder as OrderPaymentTransaction[])\n } else {\n cartStore.setOrder(updatedOrder)\n }\n await fetchTotal()\n } finally {\n activity.end('bonuses')\n }\n })\n } catch (e) {\n logCartError(\n {\n scope: 'bonuses-remove',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n throw e\n }\n }\n\n return {\n maxAvailable,\n apply,\n remove,\n }\n}\n","import {\n PaymentMethod as PaymentMethodEnum,\n type Order,\n type OrderPaymentMethodRequest,\n type OrderPaymentTransaction,\n type PaymentMethod,\n} from '@zenky/storefront-api'\n\nimport { minorToMajor } from '../money'\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { getCartErrorMessage, logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartMutation } from './useCartMutation'\nimport { useOrderTotal } from './useOrderTotal'\n\nconst PAYMENT_DEBOUNCE_MS = 300 as const\n\nexport interface PaymentSelection {\n method: PaymentMethod\n bill?: number | null\n save_card?: boolean\n card_token_id?: string | null\n}\n\nexport interface PaymentSelectionComposable {\n setPayment: (selection: PaymentSelection) => Promise<void>\n syncPaymentNow: (selection: PaymentSelection) => Promise<void>\n clearPayments: () => Promise<void>\n}\n\nexport function usePaymentSelection(): PaymentSelectionComposable {\n const { sdk, notifier, activity } = useRuntime()\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { fetchTotal } = useOrderTotal()\n const { run: runMutation } = useCartMutation()\n\n async function sendPayments(\n payments: OrderPaymentMethodRequest[],\n debounce: number = PAYMENT_DEBOUNCE_MS\n ): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n await runMutation({ kind: 'payment', debounce }, async (isStale) => {\n activity.begin('payment')\n try {\n const orderCredentials = credentials.getCredentials()\n const result = await sdk.orders.setOrderPayments(storeId, orderCredentials, {\n payments,\n })\n if (isStale()) return\n\n if (Array.isArray(result)) {\n cartStore.setOrderPaymentsState(result as OrderPaymentTransaction[])\n } else {\n cartStore.patchOrder(result as Order)\n }\n\n await fetchTotal()\n } catch (e) {\n if (isStale()) return\n logCartError(\n {\n scope: 'payment',\n context: {\n methods: payments.map((p) => p.method),\n count: payments.length,\n orderId: cartStore.credentials?.id,\n },\n },\n e\n )\n notifier.error(getCartErrorMessage(e, 'Не удалось обновить способ оплаты'))\n } finally {\n activity.end('payment')\n }\n })\n }\n\n function buildPaymentRequest(selection: PaymentSelection): OrderPaymentMethodRequest {\n const payment: OrderPaymentMethodRequest = { method: selection.method }\n if (selection.bill != null && selection.bill > 0) {\n const currency = profileStore.store?.settings?.currency ?? 'RUB'\n payment.bill = minorToMajor(selection.bill, currency)\n }\n if (selection.save_card !== undefined) payment.save_card = selection.save_card\n if (selection.card_token_id) payment.card_token_id = selection.card_token_id\n return payment\n }\n\n function getCurrentBonusesPayment(): OrderPaymentMethodRequest | null {\n if (!cartStore.hasBonusesApplied) return null\n\n const { total } = useOrderTotal()\n const bonusPayment = total.value?.payments?.find(\n (p) => p.method === PaymentMethodEnum.Bonuses\n )\n const amountMinor = bonusPayment ? Number(bonusPayment.amount) : 0\n if (!Number.isFinite(amountMinor) || amountMinor <= 0) return null\n\n const currency = profileStore.store?.settings?.currency ?? 'RUB'\n return {\n method: PaymentMethodEnum.Bonuses as PaymentMethod,\n amount: minorToMajor(amountMinor, currency),\n }\n }\n\n function buildPaymentsWithBonuses(selection: PaymentSelection): OrderPaymentMethodRequest[] {\n const main = buildPaymentRequest(selection)\n const bonuses = getCurrentBonusesPayment()\n return bonuses ? [main, bonuses] : [main]\n }\n\n async function setPayment(selection: PaymentSelection): Promise<void> {\n await sendPayments(buildPaymentsWithBonuses(selection))\n }\n\n async function syncPaymentNow(selection: PaymentSelection): Promise<void> {\n await sendPayments(buildPaymentsWithBonuses(selection), 0)\n }\n\n async function clearPayments(): Promise<void> {\n await sendPayments([])\n }\n\n return { setPayment, syncPaymentNow, clearPayments }\n}\n","import { PaymentMethod } from '@zenky/storefront-api'\n\nimport type { ActivityReporter, Notifier } from '../ports'\n\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { buildMainPaymentRequest } from './buildMainPaymentRequest'\nimport { logCartError } from './logCartError'\nimport { useOrderBonuses } from './useOrderBonuses'\n\nexport interface BonusesReconciliation {\n reconcileAfterOrderChange: () => Promise<void>\n}\n\nexport interface BonusesReconciliationDeps {\n notifier: Notifier\n activity?: ActivityReporter\n}\n\n/** Headless-синхронизация применённых бонусов после order-change (от server-state + intent). */\nexport function useBonusesReconciliation(deps: BonusesReconciliationDeps): BonusesReconciliation {\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { maxAvailable, apply, remove } = useOrderBonuses({ activity: deps.activity })\n\n function isPinEnabled(): boolean {\n return profileStore.store?.settings?.loyalty?.bonuses?.pin_enabled ?? false\n }\n\n function mainPayment() {\n return buildMainPaymentRequest({\n method: cartStore.selectedPaymentMethod,\n billMinor: cartStore.selectedPaymentBill,\n cardTokenId: cartStore.selectedCardTokenId,\n saveCard: cartStore.selectedSaveCard,\n currency: profileStore.store?.settings?.currency ?? 'RUB',\n })\n }\n\n /** Сколько бонусов сейчас реально применено к заказу (minor, из total.payments). */\n function appliedBonusesMinor(): number {\n const payments = cartStore.checkoutTotal?.payments ?? []\n const bonus = payments.find((p) => p.method === PaymentMethod.Bonuses)\n return bonus?.amount ?? 0\n }\n\n async function reconcileAfterOrderChange(): Promise<void> {\n const intent = cartStore.bonusesIntent\n if (!intent.enabled) return\n\n const payment = mainPayment()\n\n if (maxAvailable.value <= 0) {\n try {\n if (cartStore.hasBonusesApplied) await remove(payment)\n } catch (e) {\n logCartError(\n {\n scope: 'bonuses-reconcile-unavailable',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n }\n cartStore.setBonusesIntentEnabled(false)\n return\n }\n\n // PIN: фоновый reapply невозможен — снимаем бонусы, просим подтвердить заново.\n if (isPinEnabled()) {\n try {\n if (cartStore.hasBonusesApplied) await remove(payment)\n } catch (e) {\n logCartError(\n {\n scope: 'bonuses-reconcile-pin',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n }\n cartStore.setBonusesRequiresConfirmation(true)\n deps.notifier.message('Состав заказа изменился', {\n description: 'Подтвердите списание бонусов повторно',\n })\n return\n }\n\n const desired = intent.desiredAmountMinor\n const amount = desired === null ? maxAvailable.value : Math.min(desired, maxAvailable.value)\n\n // Уже применено сколько нужно — не дёргаем setOrderPayments (рвёт цикл\n // WS PriceRecalculated → apply → новый PriceRecalculated → …).\n if (appliedBonusesMinor() === amount) return\n\n const additionalPayments = payment ? [payment] : []\n\n try {\n await apply(additionalPayments, undefined, amount)\n } catch (e) {\n logCartError(\n { scope: 'bonuses-reconcile', context: { orderId: cartStore.credentials?.id } },\n e\n )\n }\n }\n\n return { reconcileAfterOrderChange }\n}\n","import type { ActivityReporter, Notifier } from '../ports'\n\nimport { usePromotionsChecker } from '../promotions/usePromotionsChecker'\nimport { useBonusesReconciliation } from './useBonusesReconciliation'\nimport { useOrderTotal } from './useOrderTotal'\n\nexport interface CartRecalculation {\n recalculateAfterOrderChange: () => Promise<void>\n}\n\nexport interface CartRecalculationDeps {\n notifier: Notifier\n activity?: ActivityReporter\n}\n\n/**\n * Orchestration после order-change: total → синхронизация бонусов → промо/min-price.\n * Вызывать явно после мутаций заказа; не привязывать к каждому fetchTotal (цикл).\n */\nexport function useCartRecalculation(deps: CartRecalculationDeps): CartRecalculation {\n const { fetchTotal } = useOrderTotal()\n const { reconcileAfterOrderChange } = useBonusesReconciliation({\n notifier: deps.notifier,\n activity: deps.activity,\n })\n const { dispatchCheck } = usePromotionsChecker()\n\n async function recalculateAfterOrderChange(): Promise<void> {\n await fetchTotal()\n await reconcileAfterOrderChange()\n dispatchCheck()\n }\n\n return { recalculateAfterOrderChange }\n}\n","import { computed, type ComputedRef } from 'vue'\n\nimport type { SetOrderCustomerRequest } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport type { AttachedCustomerCache } from './attachedCustomerCache'\nimport { getCartErrorMessage, logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { ORDER_WITH } from './useCartInitialization'\nimport { useCartMutation } from './useCartMutation'\n\nexport interface CustomerAttachComposable {\n /** Прикреплён ли покупатель к заказу (есть `order.customer`) */\n isAttached: ComputedRef<boolean>\n /**\n * Привязать customer к заказу (phone + имя + опционально фамилия / дата рождения).\n * После успешного вызова заказ перечитываем с includes — чтобы `order.customer`\n * попал в `cartStore.order` и компоненты могли его увидеть.\n *\n * Обёрнуто в activity('custom') — блокирует кнопку «Оформить» на время запроса.\n */\n attach: (request: SetOrderCustomerRequest) => Promise<void>\n}\n\n/**\n * Работа с прикреплением клиента к заказу.\n *\n * Используется в двух режимах OrderAuthenticationMethod:\n * - `Disabled` — гость заполняет phone+name, `attach` до `checkoutOrder`\n * - `Confirmation` — гость заполняет phone+name, после `checkoutOrder` придёт SMS\n *\n * Для `Preauth` обычно не нужно — customer прикрепляется автоматически,\n * когда SDK имеет `api_token` клиента (см. `authStore`).\n *\n * @param cache client-local кэш покупателя (реализация потребителя — localStorage).\n */\nexport function useCustomerAttach(cache: AttachedCustomerCache): CustomerAttachComposable {\n const { sdk, notifier, activity } = useRuntime()\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { run: runMutation } = useCartMutation()\n\n /**\n * Customer привязан, если:\n * - бэк вернул `order.customer` (для авторизованных),\n * - ИЛИ есть запись в локальном кэше для текущего заказа (для анонимов —\n * бэк не возвращает customer в GET без токена, поэтому fallback на кэш).\n * Соответствует логике отображения в CartCustomer.vue.\n */\n const cachedCustomer = cache.forOrder(() => cartStore.order?.id ?? null)\n const isAttached = computed<boolean>(\n () => cartStore.order?.customer != null || cachedCustomer.value != null\n )\n\n async function attach(request: SetOrderCustomerRequest): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n const orderId = cartStore.credentials?.id\n if (!orderId) return\n\n try {\n await runMutation({ kind: 'customer' }, async (isStale) => {\n activity.begin('custom')\n try {\n const orderCredentials = credentials.getCredentials()\n await sdk.orders.setOrderCustomer(storeId, orderCredentials, request)\n if (isStale()) return\n\n // Бэк не возвращает customer в GET /order для анонимных запросов\n // (без auth token). Поэтому кэшируем то, что отправили — иначе\n // после reload UI не сможет показать привязанные данные.\n cache.set(orderId, request)\n\n // setOrderCustomer возвращает boolean — нет нового заказа.\n // Дочитываем order с includes — для авторизованных юзеров там\n // придёт customer, для анонимов будет null (и UI возьмёт из кэша).\n const fresh = await sdk.orders.getOrder(storeId, orderCredentials, ORDER_WITH)\n if (isStale()) return\n\n cartStore.setOrder(fresh)\n } finally {\n activity.end('custom')\n }\n })\n } catch (e) {\n logCartError(\n {\n scope: 'customer-attach',\n context: {\n firstName: request.first_name,\n lastName: request.last_name,\n phoneCountry: request.phone?.country,\n orderId: cartStore.credentials?.id,\n },\n },\n e\n )\n notifier.error(getCartErrorMessage(e, 'Не удалось сохранить контактные данные'))\n throw e\n }\n }\n\n return { isAttached, attach }\n}\n","import { watch } from 'vue'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useAuthStore } from '../stores/auth'\nimport { useCartStore } from '../stores/cart'\nimport { useOrderSettingsStore } from '../stores/order-settings'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport type { AttachedCustomerCache } from './attachedCustomerCache'\nimport { useCartCredentials } from './useCartCredentials'\nimport { ORDER_WITH } from './useCartInitialization'\n\n/** Сравнение телефонов по цифрам — игнорируем «+», пробелы, скобки и т.п. */\nfunction normalizePhone(phone: string | null | undefined): string | null {\n if (!phone) return null\n const digits = phone.replace(/\\D/g, '')\n return digits || null\n}\n\n/**\n * Привязывает customer'а авторизованного юзера к текущему заказу.\n *\n * Срабатывает в двух кейсах:\n * 1) Юзер залогинился (auth state изменилась) — `notifyOnPhoneChange = true`,\n * в этом сценарии возможно был анонимный customer с другим телефоном —\n * показываем тост, если телефон реально изменился.\n * 2) У авторизованного юзера появился новый заказ без customer'а\n * (например, после очистки корзины и добавления товара) — `notifyOnPhoneChange = false`,\n * тост не нужен, это безшумная синхронизация.\n *\n * @param cache client-local кэш покупателя (реализация потребителя — localStorage).\n */\nexport function useCartCustomerAttachment(cache: AttachedCustomerCache): void {\n const { sdk, notifier } = useRuntime()\n const authStore = useAuthStore()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const orderSettings = useOrderSettingsStore()\n const cartCredentials = useCartCredentials()\n\n async function attachCurrentUser(notifyOnPhoneChange: boolean): Promise<void> {\n if (!authStore.isAuthenticated || !cartStore.hasOrder) return\n\n const storeId = profileStore.store?.id\n if (!storeId) return\n\n // Snapshot до await — re-check после, чтобы не записать ответ в чужой/новый стейт.\n const requestedToken = authStore.token\n const requestedOrderId = cartStore.order?.id\n\n // Старый телефон (из order.customer или из кэша анонима) — нужен только\n // для тоста при логине.\n const previousPhone = notifyOnPhoneChange\n ? normalizePhone(\n cartStore.order?.customer?.phone?.number ??\n cache.forOrder(() => cartStore.order?.id ?? null).value?.phone?.number ??\n null\n )\n : null\n\n try {\n const credentials = cartCredentials.getCredentials()\n\n await sdk.orders.setOrderCustomer(storeId, credentials, {\n phone: { number: authStore.phone ?? '', country: authStore.countryCode },\n })\n console.log('[cart] customer attached to order')\n\n const fresh = await sdk.orders.getOrder(storeId, credentials, ORDER_WITH)\n\n // Auth-состояние / заказ изменились пока летели запросы — не пишем.\n if (!authStore.isAuthenticated || authStore.token !== requestedToken) return\n if (cartStore.order?.id !== requestedOrderId) return\n\n cartStore.setOrder(fresh)\n\n cache.clear()\n\n if (notifyOnPhoneChange) {\n const newPhone = normalizePhone(fresh.customer?.phone?.number ?? null)\n if (previousPhone && newPhone && previousPhone !== newPhone) {\n const firstName = fresh.customer?.first_name\n notifier.success(\n firstName\n ? `Контактные данные обновлены — ${firstName}`\n : 'Контактные данные обновлены'\n )\n }\n }\n } catch (e: unknown) {\n console.error('[cart] failed to attach customer to order', e)\n if (notifyOnPhoneChange) {\n notifier.error('Не удалось обновить контактные данные после входа')\n }\n }\n }\n\n async function refreshOrderAfterLogout(): Promise<void> {\n orderSettings.setSelectedAddress(null, null, null)\n\n if (!cartStore.hasOrder) return\n\n const storeId = profileStore.store?.id\n if (!storeId) return\n\n const requestedOrderId = cartStore.order?.id\n\n try {\n const credentials = cartCredentials.getCredentials()\n const fresh = await sdk.orders.getOrder(storeId, credentials, ORDER_WITH)\n\n // Юзер успел залогиниться / сменить заказ — не пишем анонимный снимок.\n if (authStore.isAuthenticated) return\n if (cartStore.order?.id !== requestedOrderId) return\n\n cartStore.setOrder(fresh)\n cache.clear()\n } catch (e: unknown) {\n console.error('[cart] failed to refresh order after logout', e)\n }\n }\n\n // Кейс 1: смена auth state.\n // true → синкаем customer авторизованного юзера + тост при смене телефона.\n // false → перечитываем order анонимно, чтобы customer прежнего юзера ушёл из state.\n watch(\n () => authStore.isAuthenticated,\n async (isAuthenticated) => {\n if (isAuthenticated) {\n await attachCurrentUser(true)\n } else {\n await refreshOrderAfterLogout()\n }\n }\n )\n\n // Кейс 2: авторизованный юзер получил новый заказ без customer'а\n // (новый order появляется при очистке корзины + добавлении товара).\n watch(\n () => cartStore.order?.id,\n async (newId, oldId) => {\n if (!newId || newId === oldId) return\n if (!authStore.isAuthenticated) return\n if (cartStore.order?.customer) return // уже привязан — ничего не делаем\n await attachCurrentUser(false)\n }\n )\n}\n","import { OrderCartCheckerResultAction } from '@zenky/storefront-api'\n\nimport type { Order } from '@zenky/storefront-api'\n\nimport { getRemoteCatalog } from '../catalog/catalogResolver'\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useCatalogStore } from '../stores/catalog'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { useCartCredentials } from './useCartCredentials'\nimport { ORDER_WITH } from './useCartInitialization'\nimport { logCartError } from './logCartError'\nimport { useOrderTotal } from './useOrderTotal'\n\n// Совпадает с прежним CookieKey.StockId.\nconst KEY_STOCK_ID = 'zenky_stock_id'\nconst YEAR_SECONDS = 60 * 60 * 24 * 365\n\nexport interface CartStockWatcher {\n /**\n * Реагирует на смену склада в обновлённом заказе: переключает stock,\n * перегружает каталог при смене хэша и валидирует товары корзины.\n */\n handleStockChange: (updatedOrder: Order) => Promise<void>\n}\n\nexport function useCartStockWatcher(): CartStockWatcher {\n const { sdk, notifier, storage, catalogReloader } = useRuntime()\n const profileStore = useStoreProfileStore()\n const catalogStore = useCatalogStore()\n const cartStore = useCartStore()\n const credentials = useCartCredentials()\n const { fetchTotal } = useOrderTotal()\n\n async function handleStockChange(updatedOrder: Order): Promise<void> {\n const newStockId = updatedOrder.stock?.id ?? null\n const currentStockId = profileStore.stock?.id ?? null\n\n if (newStockId === currentStockId) return\n\n try {\n profileStore.setStock(updatedOrder.stock ?? null)\n if (newStockId) storage.set(KEY_STOCK_ID, newStockId, { maxAge: YEAR_SECONDS })\n else storage.remove(KEY_STOCK_ID)\n\n if (profileStore.store && profileStore.city) {\n const remoteCatalog = getRemoteCatalog(\n profileStore.store,\n profileStore.city,\n updatedOrder.stock ?? null\n )\n\n if (\n remoteCatalog &&\n remoteCatalog.hash !== catalogStore.currentHash &&\n catalogReloader\n ) {\n await catalogReloader.reload(profileStore.store.id, remoteCatalog)\n }\n }\n\n if (cartStore.hasCredentials) {\n await checkCartProducts()\n }\n } catch (e) {\n logCartError(\n {\n scope: 'stock-change',\n context: { currentStockId, newStockId },\n },\n e\n )\n notifier.warning('Не удалось обновить каталог для выбранного склада')\n }\n }\n\n async function checkCartProducts(): Promise<void> {\n try {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n const result = await sdk.orders.checkProducts(storeId, orderCredentials)\n\n if (result.action === OrderCartCheckerResultAction.Cleanup) {\n const freshOrder = await sdk.orders.getOrder(storeId, orderCredentials, ORDER_WITH)\n cartStore.setOrder(freshOrder)\n await fetchTotal()\n notifier.warning('Некоторые товары больше недоступны и были удалены из корзины')\n } else if (result.order_variants.length > 0) {\n await fetchTotal()\n notifier.warning('Цены некоторых товаров обновлены')\n }\n } catch (e) {\n logCartError(\n {\n scope: 'stock-products-check',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n notifier.warning('Не удалось проверить доступность товаров в корзине')\n }\n }\n\n return { handleStockChange }\n}\n","import type { SetOrderDeliveryRequest } from '@zenky/storefront-api'\n\nimport {\n type ActivityReporter,\n type Notifier,\n type Result,\n} from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartMutation } from './useCartMutation'\nimport { useCartRecalculation } from './useCartRecalculation'\nimport { useCartStockWatcher } from './useCartStockWatcher'\nimport { ORDER_WITH } from './useCartInitialization'\nimport { useOrderSettings } from './useOrderSettings'\n\ninterface DeliveryIntervalInput {\n date: string\n id: string\n}\n\ninterface SettleOptions {\n awaitSettle?: boolean\n}\n\nexport interface OrderDeliveryDeps {\n activity?: ActivityReporter\n notifier?: Notifier\n}\n\nexport interface OrderDelivery {\n setDelivery: (request: SetOrderDeliveryRequest, options?: SettleOptions) => Promise<Result>\n setDeliveryInterval: (\n selection: DeliveryIntervalInput,\n options?: SettleOptions\n ) => Promise<Result>\n resetDeliveryInterval: (options?: SettleOptions) => Promise<Result>\n setDeliveryTime: (deliverAt: string, options?: SettleOptions) => Promise<Result>\n}\n\nexport function useOrderDelivery(deps: OrderDeliveryDeps = {}): OrderDelivery {\n const runtime = useRuntime()\n const activity = deps.activity ?? runtime.activity\n const notifier = deps.notifier ?? runtime.notifier\n const { sdk } = runtime\n const cartStore = useCartStore()\n const credentials = useCartCredentials()\n const { handleStockChange } = useCartStockWatcher()\n const { fetchSettings } = useOrderSettings()\n const { recalculateAfterOrderChange } = useCartRecalculation({\n notifier,\n activity,\n })\n const { run: runMutation } = useCartMutation()\n\n function hasCredentials(): boolean {\n return Boolean(cartStore.credentials?.id && cartStore.credentials?.token)\n }\n\n async function settleAfter(options: {\n withStockChange: boolean\n awaitStockChange: boolean\n }): Promise<void> {\n await runMutation({ kind: 'delivery-settle' }, async (isStale) => {\n activity.begin('delivery')\n try {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n\n const freshOrder = await sdk.orders.getOrder(storeId, orderCredentials, ORDER_WITH)\n if (isStale()) return\n\n cartStore.setOrder(freshOrder)\n await fetchSettings()\n if (isStale()) return\n\n await recalculateAfterOrderChange()\n\n if (options.withStockChange) {\n if (options.awaitStockChange) await handleStockChange(freshOrder)\n else void handleStockChange(freshOrder)\n }\n } catch (e) {\n if (!isStale()) {\n logCartError(\n {\n scope: 'delivery-settle',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n }\n } finally {\n activity.end('delivery')\n }\n })\n }\n\n async function setDelivery(\n request: SetOrderDeliveryRequest,\n options: SettleOptions = {}\n ): Promise<Result> {\n const awaitSettle = options.awaitSettle ?? false\n\n if (!hasCredentials()) {\n return { ok: false, error: new Error('cart:no_credentials') }\n }\n\n // /checkout/delivery сбрасывает deliver_at. Если пользователь выбирал время —\n // переотправляем его в этом же запросе (если caller не задал своё).\n const finalRequest: SetOrderDeliveryRequest =\n request.deliver_at === undefined && cartStore.deliveryTimeIntent\n ? { ...request, deliver_at: cartStore.deliveryTimeIntent }\n : request\n\n try {\n await runMutation({ kind: 'delivery' }, async (isStale) => {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n await sdk.orders.setOrderDeliveryMethod(storeId, orderCredentials, finalRequest)\n if (isStale()) return\n })\n } catch (e) {\n logCartError(\n {\n scope: 'delivery',\n context: {\n method: request.delivery_method,\n stockId: request.stock_id,\n addressId:\n typeof request.delivery_address === 'object' &&\n request.delivery_address !== null &&\n 'id' in request.delivery_address\n ? (request.delivery_address as { id?: string }).id\n : undefined,\n table: request.on_premise?.table,\n orderId: cartStore.credentials?.id,\n },\n },\n e\n )\n return { ok: false, error: e }\n }\n\n const settlePromise = settleAfter({ withStockChange: true, awaitStockChange: awaitSettle })\n if (awaitSettle) await settlePromise\n else void settlePromise\n\n return { ok: true, value: undefined }\n }\n\n async function runIntervalMutation(\n apiCall: () => Promise<unknown>,\n errorContext: Record<string, unknown>,\n awaitSettle: boolean\n ): Promise<Result> {\n if (!hasCredentials()) {\n return { ok: false, error: new Error('cart:no_credentials') }\n }\n\n try {\n await runMutation({ kind: 'delivery' }, async (isStale) => {\n await apiCall()\n if (isStale()) return\n })\n } catch (e) {\n logCartError(\n {\n scope: 'delivery',\n context: { ...errorContext, orderId: cartStore.credentials?.id },\n },\n e\n )\n return { ok: false, error: e }\n }\n\n const settlePromise = settleAfter({ withStockChange: false, awaitStockChange: awaitSettle })\n if (awaitSettle) await settlePromise\n else void settlePromise\n\n return { ok: true, value: undefined }\n }\n\n async function setDeliveryInterval(\n selection: DeliveryIntervalInput,\n options: SettleOptions = {}\n ): Promise<Result> {\n return runIntervalMutation(\n () => {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n return sdk.orders.setOrderDeliveryInterval(storeId, orderCredentials, {\n date: selection.date,\n interval_id: selection.id,\n })\n },\n { intervalDate: selection.date, intervalId: selection.id },\n options.awaitSettle ?? false\n )\n }\n\n async function resetDeliveryInterval(options: SettleOptions = {}): Promise<Result> {\n return runIntervalMutation(\n () => {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n return sdk.orders.resetOrderDeliveryInterval(storeId, orderCredentials)\n },\n {},\n options.awaitSettle ?? false\n )\n }\n\n // Назначение времени отдельным эндпоинтом /checkout/delivery/time: время не\n // требует адреса и не привязано к способу доставки. У SDK нет типизированной\n // обёртки — используем публичный generic client.request (Authorization он ставит\n // сам, никакого raw fetch).\n async function setDeliveryTime(\n deliverAt: string,\n options: SettleOptions = {}\n ): Promise<Result> {\n return runIntervalMutation(\n () => {\n const storeId = credentials.getStoreId()\n const orderCredentials = credentials.getCredentials()\n // getCredentials() всегда возвращает объектную ветку union'а.\n if (typeof orderCredentials === 'string') {\n throw new Error('cart:no_credentials')\n }\n const path = sdk.client.getStoreUrl(\n storeId,\n `/orders/${orderCredentials.id}/checkout/delivery/time`,\n { token: orderCredentials.token }\n )\n return sdk.client.request(\n 'POST',\n path,\n { deliver_at: deliverAt },\n orderCredentials.api_token ?? null\n )\n },\n { deliverAt },\n options.awaitSettle ?? false\n )\n }\n\n return {\n setDelivery,\n setDeliveryInterval,\n resetDeliveryInterval,\n setDeliveryTime,\n }\n}\n","import { computed, type ComputedRef, ref, type Ref } from 'vue'\n\nimport type { OrderPromocode } from '@zenky/storefront-api'\n\nimport type { ActivityReporter, Notifier } from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { getCartErrorMessage, logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartMutation } from './useCartMutation'\nimport { useCartRecalculation } from './useCartRecalculation'\nimport { ORDER_WITH } from './useCartInitialization'\n\nexport interface OrderPromocodeComposable {\n /** Применённый к заказу промокод (читается из cartStore.order.promocode) */\n applied: ComputedRef<OrderPromocode | null>\n isApplied: ComputedRef<boolean>\n loading: Ref<boolean>\n /** Сообщение об ошибке (невалидный / просрочен / не подходит к заказу) */\n errorMessage: Ref<string | null>\n /** Применить промокод. Обёрнуто в activity('promocode'). */\n apply: (code: string) => Promise<void>\n /** Убрать ранее применённый промокод */\n remove: () => Promise<void>\n /** Сбросить состояние ошибки (например, при редактировании поля) */\n clearError: () => void\n}\n\nexport interface OrderPromocodeDeps {\n notifier?: Notifier\n activity?: ActivityReporter\n}\n\nexport function useOrderPromocode(deps: OrderPromocodeDeps = {}): OrderPromocodeComposable {\n const runtime = useRuntime()\n const { sdk } = runtime\n const activity = deps.activity ?? runtime.activity\n const notifier = deps.notifier ?? runtime.notifier\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { recalculateAfterOrderChange } = useCartRecalculation({\n notifier,\n activity,\n })\n const { run: runMutation } = useCartMutation()\n\n const loading = ref<boolean>(false)\n const errorMessage = ref<string | null>(null)\n\n const applied = computed<OrderPromocode | null>(() => cartStore.order?.promocode ?? null)\n const isApplied = computed<boolean>(() => applied.value !== null)\n\n function clearError(): void {\n errorMessage.value = null\n }\n\n async function refreshOrder(): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n try {\n const orderCredentials = credentials.getCredentials()\n const fresh = await sdk.orders.getOrder(storeId, orderCredentials, ORDER_WITH)\n cartStore.setOrder(fresh)\n } catch (e) {\n logCartError(\n {\n scope: 'promocode-refresh-order',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n }\n }\n\n async function apply(code: string): Promise<void> {\n const trimmed = code.trim()\n if (!trimmed) return\n\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n errorMessage.value = null\n loading.value = true\n\n try {\n await runMutation({ kind: 'promocode' }, async (isStale) => {\n activity.begin('promocode')\n try {\n const orderCredentials = credentials.getCredentials()\n await sdk.orders.setOrderPromocode(storeId, orderCredentials, {\n promocode: trimmed,\n })\n if (isStale()) return\n await refreshOrder()\n await recalculateAfterOrderChange()\n } finally {\n activity.end('promocode')\n }\n })\n } catch (e) {\n errorMessage.value = getCartErrorMessage(e, 'Не удалось применить промокод')\n logCartError(\n {\n scope: 'promocode-apply',\n context: { code: trimmed, orderId: cartStore.credentials?.id },\n },\n e\n )\n } finally {\n loading.value = false\n }\n }\n\n async function remove(): Promise<void> {\n const storeId = profileStore.store?.id\n if (!storeId) return\n if (!cartStore.credentials?.id) return\n\n errorMessage.value = null\n loading.value = true\n\n try {\n await runMutation({ kind: 'promocode' }, async (isStale) => {\n activity.begin('promocode')\n try {\n const orderCredentials = credentials.getCredentials()\n await sdk.orders.removeOrderPromocode(storeId, orderCredentials)\n if (isStale()) return\n await refreshOrder()\n await recalculateAfterOrderChange()\n } finally {\n activity.end('promocode')\n }\n })\n } catch (e) {\n errorMessage.value = getCartErrorMessage(e, 'Не удалось убрать промокод')\n logCartError(\n {\n scope: 'promocode-remove',\n context: {\n code: applied.value?.promocode,\n orderId: cartStore.credentials?.id,\n },\n },\n e\n )\n } finally {\n loading.value = false\n }\n }\n\n return {\n applied,\n isApplied,\n loading,\n errorMessage,\n apply,\n remove,\n clearError,\n }\n}\n","import { DeliveryMethod } from '@zenky/storefront-api'\nimport { watch } from 'vue'\n\nimport type { DeliveryAddress } from '@zenky/storefront-api'\n\nimport type { Result } from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { useAuthStore } from '../stores/auth'\nimport { useCartStore } from '../stores/cart'\nimport { useOrderSettingsStore } from '../stores/order-settings'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { getCartErrorCode } from './logCartError'\nimport { normalizeAddress } from './normalizeAddress'\nimport { useOrderDelivery } from './useOrderDelivery'\n\nexport function useCartDeliveryAttachment(): void {\n const { sdk } = useRuntime()\n const cartStore = useCartStore()\n const orderSettings = useOrderSettingsStore()\n const profileStore = useStoreProfileStore()\n const authStore = useAuthStore()\n const { setDelivery } = useOrderDelivery()\n\n /**\n * Сохранённый id адреса протух (бэк вернул `addresses.not_found`).\n * Пробуем найти тот же адрес по строке среди актуальных сохранённых\n * (id мог смениться) и назначить его в заказ с валидным id. Возвращает\n * true, если адрес восстановлен; false — если совпадения нет (надо чистить).\n */\n async function recoverDeliveryAddress(): Promise<boolean> {\n const selected = orderSettings.selectedAddress\n const storeId = profileStore.store?.id\n if (!selected || !storeId || !authStore.isAuthenticated) return false\n\n let addresses: DeliveryAddress[]\n try {\n const response = await sdk.customer.getAddresses(storeId)\n addresses = response.items ?? []\n } catch {\n return false\n }\n\n const target = normalizeAddress(selected)\n const match = addresses.find((a) => normalizeAddress(a.address) === target)\n if (!match) return false\n\n const result = await setDelivery({\n delivery_method: DeliveryMethod.Delivery,\n delivery_address: { id: match.id },\n })\n if (!result.ok) return false\n\n orderSettings.setSelectedAddress(match.address, match.id, match.name)\n return true\n }\n\n async function reattachDelivery(): Promise<void> {\n const order = cartStore.order\n if (!order) return\n\n let result: Result | null = null\n\n switch (orderSettings.deliveryMethod) {\n case DeliveryMethod.Delivery: {\n if (order.delivery_address) return\n\n const addressId = orderSettings.selectedAddressId\n if (!addressId) {\n const recovered = await recoverDeliveryAddress()\n if (!recovered && orderSettings.selectedAddress) {\n orderSettings.setSelectedAddress(null, null, null)\n }\n return\n }\n\n result = await setDelivery({\n delivery_method: DeliveryMethod.Delivery,\n delivery_address: { id: addressId },\n })\n break\n }\n\n case DeliveryMethod.Pickup: {\n if (order.stock) return\n const stock = orderSettings.selectedStock\n if (!stock) return\n result = await setDelivery({\n delivery_method: DeliveryMethod.Pickup,\n stock_id: stock.id,\n })\n break\n }\n\n case DeliveryMethod.OnPremise: {\n if (order.stock) return\n const stock = orderSettings.selectedStock\n if (!stock) return\n result = await setDelivery({\n delivery_method: DeliveryMethod.OnPremise,\n stock_id: stock.id,\n on_premise: { table: orderSettings.onPremiseTable ?? '' },\n })\n break\n }\n }\n\n if (result && !result.ok) {\n // Стейл selectedAddressId → бэк 404. Сначала пробуем переназначить\n // тот же адрес с актуальным id; не нашли — чистим cookie, иначе UI\n // показывает «фантомный» адрес, которого нет в заказе.\n if (getCartErrorCode(result.error) === 'addresses.not_found') {\n const recovered = await recoverDeliveryAddress()\n if (!recovered) orderSettings.setSelectedAddress(null, null, null)\n return\n }\n console.error('[cart-delivery-attach] failed', result.error)\n }\n }\n\n watch(\n () => cartStore.order?.id,\n async (newId, oldId) => {\n if (!newId || newId === oldId) return\n await reattachDelivery()\n }\n )\n}\n","import type {\n OrderProductVariantRequest,\n ProductModifiersRequest,\n ZenkyStorefront,\n} from '@zenky/storefront-api'\n\nimport type { ActivityReporter, Notifier } from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { createRuntimeState } from '../ports/runtimeState'\nimport { minorToMajor } from '../money'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { buildCartLineKey, variantLineKey } from './cartLineKey'\nimport { getCartErrorMessage, logCartError } from './logCartError'\nimport { ORDER_WITH } from './useCartInitialization'\nimport { useCartMutation } from './useCartMutation'\nimport { useCartRecalculation } from './useCartRecalculation'\nimport type { CartCredentials } from './useCartCredentials'\nimport type { CartInitialization } from './useCartInitialization'\n\n// RUM-имена (совпадают с прежними RUM_MARK/RUM_METRIC в приложении).\nconst RUM_MARK_CART_ADD = 'rum:cart:add'\nconst RUM_MARK_CART_REMOVE = 'rum:cart:remove'\nconst RUM_METRIC_CART_ADD = 'rum_cart_add_seconds'\nconst RUM_METRIC_CART_REMOVE = 'rum_cart_remove_seconds'\n\nexport interface CartItemRequest {\n productId: string\n productVariantId: string\n quantity?: number\n modifiers?: ProductModifiersRequest[]\n productName?: string\n variantLabel?: string\n promotionId?: string\n promotionRewardId?: string\n}\n\nexport interface CartDependencies {\n notifier: Notifier\n activity: ActivityReporter\n}\n\nexport interface CartOperations {\n addToCart: (request: CartItemRequest) => Promise<void>\n removeFromCart: (request: CartItemRequest) => Promise<void>\n refreshCart: (options?: { silent?: boolean }) => Promise<void>\n clearAndResetCart: () => void\n}\n\nconst BATCH_DELAY = 250\nconst CART_LINE_KIND_PREFIX = 'cart-line-'\n\ninterface PendingBatch {\n lineKey: string\n productId: string\n variantId: string\n delta: number\n modifiers?: ProductModifiersRequest[]\n promotionId?: string\n promotionRewardId?: string\n productName?: string\n variantLabel?: string\n timer: ReturnType<typeof setTimeout>\n}\n\ninterface OperationsState {\n batches: Map<string, PendingBatch>\n inflight: Set<string>\n}\n\nconst getOperationsState = createRuntimeState<OperationsState>(() => ({\n batches: new Map<string, PendingBatch>(),\n inflight: new Set<string>(),\n}))\n\nexport function useCartOperations(\n credentials: CartCredentials,\n initialization: CartInitialization,\n sdk: ZenkyStorefront,\n deps: CartDependencies\n): CartOperations {\n const { notifier, activity } = deps\n const runtime = useRuntime()\n const { events, rum, commerceEvents } = runtime\n const { batches, inflight } = getOperationsState(runtime)\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n const { run: runMutation, bumpKindsWithPrefix } = useCartMutation()\n const { recalculateAfterOrderChange } = useCartRecalculation({ notifier, activity })\n\n function flushBatch(lineKey: string): void {\n if (inflight.has(lineKey)) return\n\n const batch = batches.get(lineKey)\n if (!batch) return\n batches.delete(lineKey)\n\n if (batch.delta === 0) {\n activity.end('cart')\n return\n }\n\n inflight.add(lineKey)\n\n const sentDelta = batch.delta\n const isAdd = sentDelta > 0\n const qty = Math.abs(sentDelta)\n const { variantId, productId, productName, variantLabel } = batch\n\n const execute = async (): Promise<void> => {\n const kind = `${CART_LINE_KIND_PREFIX}${lineKey}` as const\n\n let optimisticCorrected = false\n\n try {\n await runMutation({ kind }, async (isStale) => {\n const orderCredentials = credentials.getCredentials()\n const storeId = credentials.getStoreId()\n\n const wasInCartBefore =\n cartStore.order?.variants?.some((v) => variantLineKey(v) === lineKey) ?? false\n const variantBeforeChange = !isAdd\n ? (cartStore.order?.variants?.find((v) => variantLineKey(v) === lineKey) ??\n null)\n : null\n\n if (isAdd) {\n rum?.mark(RUM_MARK_CART_ADD)\n const updatedOrder = await sdk.orders.addProductVariantToOrder(\n storeId,\n orderCredentials,\n {\n product_variant_id: variantId,\n quantity: qty,\n modifiers: batch.modifiers,\n }\n )\n rum?.measure(RUM_METRIC_CART_ADD, RUM_MARK_CART_ADD)\n if (isStale()) return\n cartStore.patchOrder(updatedOrder)\n credentials.persistCredentials(updatedOrder)\n } else {\n const removeRequest: OrderProductVariantRequest = {\n product_variant_id: variantId,\n quantity: qty,\n modifiers: batch.modifiers,\n ...(batch.promotionId\n ? {\n promotion_id: batch.promotionId,\n promotion_reward_id: batch.promotionRewardId,\n }\n : {}),\n }\n\n rum?.mark(RUM_MARK_CART_REMOVE)\n const updatedOrder = await sdk.orders.removeProductVariantFromOrder(\n storeId,\n orderCredentials,\n removeRequest\n )\n rum?.measure(RUM_METRIC_CART_REMOVE, RUM_MARK_CART_REMOVE)\n if (isStale()) return\n cartStore.patchOrder(updatedOrder)\n }\n\n cartStore.adjustOptimistic(productId, -sentDelta)\n cartStore.adjustLineOptimistic(lineKey, -sentDelta)\n optimisticCorrected = true\n\n const integrations = events?.get() ?? null\n const orderVariant =\n cartStore.order?.variants?.find((v) => variantLineKey(v) === lineKey) ?? null\n\n if (isAdd) {\n if (!wasInCartBefore) {\n integrations?.productAddedToCart({\n order: cartStore.order,\n orderVariant,\n })\n } else {\n integrations?.productQuantityIncreased({\n order: cartStore.order,\n orderVariant,\n })\n }\n } else {\n const isNowInCart =\n cartStore.order?.variants?.some((v) => variantLineKey(v) === lineKey) ??\n false\n if (!isNowInCart) {\n const product = variantBeforeChange?.product ?? null\n integrations?.productRemovedFromCart({\n order: cartStore.order,\n product,\n })\n } else {\n integrations?.productQuantityDecreased({\n order: cartStore.order,\n orderVariant,\n })\n }\n }\n\n // Commerce-event трекинг (#29) — опциональный порт.\n const commerceOrderId = cartStore.credentials?.id\n if (commerceOrderId && commerceEvents) {\n if (isAdd) {\n const currency = profileStore.currency\n const cartTotal = cartStore.order?.total_price\n commerceEvents.trackAddedToCart(commerceOrderId, {\n productId,\n productVariantId: variantId,\n quantity: qty,\n unitPrice: orderVariant\n ? minorToMajor(orderVariant.unit_price, currency)\n : undefined,\n totalPrice:\n cartTotal != null ? minorToMajor(cartTotal, currency) : undefined,\n })\n } else {\n commerceEvents.trackRemovedFromCart(commerceOrderId, {\n productId,\n productVariantId: variantId,\n quantity: qty,\n })\n }\n }\n\n await recalculateAfterOrderChange()\n\n if (isAdd && productName) {\n const parts = [productName, variantLabel].filter(Boolean)\n notifier.message('Добавлено:', { description: parts.join(', ') })\n }\n })\n } catch (e) {\n logCartError(\n {\n scope: isAdd ? 'cart-add' : 'cart-remove',\n context: {\n lineKey,\n variantId,\n productId,\n qty,\n modifiers: batch.modifiers?.length ?? 0,\n promotionId: batch.promotionId,\n orderId: cartStore.credentials?.id,\n },\n },\n e\n )\n\n const integrations = events?.get() ?? null\n if (isAdd) {\n integrations?.productQuantityIncreaseFailed({ order: cartStore.order })\n } else {\n integrations?.productQuantityDecreaseFailed({ order: cartStore.order })\n }\n\n notifier.error(getCartErrorMessage(e, 'Не удалось обновить корзину'))\n\n try {\n await refreshCart({ silent: true })\n } catch (refreshErr) {\n logCartError(\n { scope: 'cart-refresh-after-fail', context: { lineKey, variantId } },\n refreshErr\n )\n }\n } finally {\n if (!optimisticCorrected) {\n cartStore.adjustOptimistic(productId, -sentDelta)\n cartStore.adjustLineOptimistic(lineKey, -sentDelta)\n }\n\n activity.end('cart')\n inflight.delete(lineKey)\n\n if (batches.has(lineKey)) flushBatch(lineKey)\n }\n }\n\n execute()\n }\n\n function enqueueDelta(request: CartItemRequest, delta: number): void {\n const lineKey = buildCartLineKey({\n productVariantId: request.productVariantId,\n modifiers: request.modifiers,\n promotionId: request.promotionId,\n promotionRewardId: request.promotionRewardId,\n })\n\n cartStore.adjustOptimistic(request.productId, delta)\n cartStore.adjustLineOptimistic(lineKey, delta)\n\n const existing = batches.get(lineKey)\n if (existing) {\n clearTimeout(existing.timer)\n existing.delta += delta\n existing.timer = setTimeout(() => flushBatch(lineKey), BATCH_DELAY)\n return\n }\n\n activity.begin('cart')\n const timer = setTimeout(() => flushBatch(lineKey), BATCH_DELAY)\n\n batches.set(lineKey, {\n lineKey,\n variantId: request.productVariantId,\n productId: request.productId,\n delta,\n modifiers: request.modifiers,\n promotionId: request.promotionId,\n promotionRewardId: request.promotionRewardId,\n productName: request.productName,\n variantLabel: request.variantLabel,\n timer,\n })\n }\n\n async function addToCart(request: CartItemRequest): Promise<void> {\n if (cartStore.initializing || !cartStore.hasCredentials) {\n throw new Error('cart:not_ready')\n }\n\n enqueueDelta(request, request.quantity ?? 1)\n }\n\n async function removeFromCart(request: CartItemRequest): Promise<void> {\n if (!cartStore.hasCredentials) return\n\n enqueueDelta(request, -(request.quantity ?? 1))\n }\n\n async function refreshCart(options?: { silent?: boolean }): Promise<void> {\n if (!cartStore.hasCredentials) return\n\n const silent = options?.silent ?? false\n\n if (!silent) {\n cartStore.setLoading(true)\n }\n\n try {\n const orderCredentials = credentials.getCredentials()\n const storeId = credentials.getStoreId()\n const freshOrder = await sdk.orders.getOrder(storeId, orderCredentials, ORDER_WITH)\n cartStore.setOrder(freshOrder)\n } catch (e) {\n logCartError(\n {\n scope: 'cart-refresh',\n context: { orderId: cartStore.credentials?.id, silent },\n },\n e\n )\n cartStore.clearCart()\n credentials.clearPersistedCredentials()\n } finally {\n if (!silent) {\n cartStore.setLoading(false)\n }\n }\n }\n\n function cancelPendingCartMutations(): void {\n for (const batch of batches.values()) clearTimeout(batch.timer)\n batches.clear()\n inflight.clear()\n bumpKindsWithPrefix(CART_LINE_KIND_PREFIX)\n activity.end('cart')\n }\n\n function clearAndResetCart(): void {\n cancelPendingCartMutations()\n credentials.clearPersistedCredentials()\n cartStore.clearCart()\n\n initialization.initializeOrder().catch((e) => {\n logCartError({ scope: 'cart-reinit' }, e)\n })\n }\n\n return {\n addToCart,\n removeFromCart,\n refreshCart,\n clearAndResetCart,\n }\n}\n","import { RecaptchaAction } from '@zenky/storefront-api'\nimport { ref, type Ref } from 'vue'\n\nimport type {\n OrderCheckoutResult,\n RecaptchaAction as RecaptchaActionType,\n} from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { logCartError } from './logCartError'\nimport { useCartCredentials } from './useCartCredentials'\n\n/** Провайдер reCAPTCHA-payload (реализация потребителя — Google reCAPTCHA v3). */\nexport type RecaptchaPayloadProvider = (\n action: RecaptchaActionType\n) => Promise<{ token: string } | undefined>\n\nexport interface CheckoutSubmitComposable {\n /** Последний результат `checkoutOrder` — нужен для UI (ConfirmationModal / online redirect) */\n result: Ref<OrderCheckoutResult | null>\n /** Идёт ли сейчас submit */\n submitting: Ref<boolean>\n /**\n * Отправить заказ.\n * Собирает `OrderCheckoutRequest` из `cartStore` (notes + persons_count).\n * Возвращает `OrderCheckoutResult` с флагами confirmation/online_payment.\n */\n submit: () => Promise<OrderCheckoutResult | null>\n /** Подтвердить SMS-код (после checkoutOrder с confirmation.required) */\n confirm: (code: string) => Promise<boolean>\n /** Переотправить код (с backoff — должен следить UI) */\n resendCode: () => Promise<boolean>\n /** Отменить pending-заказ (cancelOrder) */\n cancel: () => Promise<boolean>\n}\n\n/**\n * Финальный submit заказа + SMS-подтверждение.\n *\n * @param getRecaptchaPayload провайдер reCAPTCHA-токена (app-специфичен, инжектится).\n */\nexport function useCheckoutSubmit(\n getRecaptchaPayload: RecaptchaPayloadProvider\n): CheckoutSubmitComposable {\n const { sdk, activity, events, commerceEvents } = useRuntime()\n const credentials = useCartCredentials()\n const cartStore = useCartStore()\n const profileStore = useStoreProfileStore()\n\n const result = ref<OrderCheckoutResult | null>(null)\n const submitting = ref<boolean>(false)\n\n async function runBusy<T>(fn: () => Promise<T>): Promise<T> {\n activity.begin('custom')\n try {\n return await fn()\n } finally {\n activity.end('custom')\n }\n }\n\n async function submit(): Promise<OrderCheckoutResult | null> {\n const storeId = profileStore.store?.id\n if (!storeId) return null\n if (!cartStore.credentials?.id) return null\n\n submitting.value = true\n\n try {\n return await runBusy(async () => {\n const orderCredentials = credentials.getCredentials()\n const recaptcha = await getRecaptchaPayload(RecaptchaAction.OrderSubmission)\n const integrations = events?.get() ?? null\n const analyticsData = integrations ? await integrations.analytics.getAll() : null\n const request = {\n notes: cartStore.comment || undefined,\n persons_count: cartStore.personsCount,\n recaptcha,\n ...(commerceEvents?.getIdentity() ?? {}),\n ...(analyticsData?.length ? { analytics_data: analyticsData } : {}),\n }\n const cartVariants = cartStore.order?.variants ?? []\n const res = await sdk.orders.checkoutOrder(storeId, orderCredentials, request)\n const orderForEvent = { ...res.order, variants: res.order.variants ?? cartVariants }\n integrations?.orderSubmitted({ order: orderForEvent })\n result.value = res\n return res\n })\n } catch (e) {\n logCartError(\n {\n scope: 'checkout-submit',\n context: {\n orderId: cartStore.credentials?.id,\n notes: cartStore.comment ? cartStore.comment.length : 0,\n personsCount: cartStore.personsCount,\n },\n },\n e\n )\n throw e\n } finally {\n submitting.value = false\n }\n }\n\n async function confirm(code: string): Promise<boolean> {\n const storeId = profileStore.store?.id\n if (!storeId) return false\n if (!cartStore.credentials?.id) return false\n\n try {\n return await runBusy(async () => {\n const orderCredentials = credentials.getCredentials()\n return await sdk.orders.confirmOrder(storeId, orderCredentials, { code })\n })\n } catch (e) {\n logCartError(\n {\n scope: 'checkout-confirm',\n context: { orderId: cartStore.credentials?.id, codeLength: code.length },\n },\n e\n )\n throw e\n }\n }\n\n async function resendCode(): Promise<boolean> {\n const storeId = profileStore.store?.id\n if (!storeId) return false\n if (!cartStore.credentials?.id) return false\n\n try {\n const orderCredentials = credentials.getCredentials()\n return await sdk.orders.resendOrderConfirmationCode(storeId, orderCredentials)\n } catch (e) {\n logCartError(\n {\n scope: 'checkout-resend-code',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n throw e\n }\n }\n\n async function cancel(): Promise<boolean> {\n const storeId = profileStore.store?.id\n if (!storeId) return false\n if (!cartStore.credentials?.id) return false\n\n try {\n const orderCredentials = credentials.getCredentials()\n const ok = await sdk.orders.cancelOrder(storeId, orderCredentials)\n if (ok) {\n result.value = null\n credentials.clearPersistedCredentials()\n cartStore.clearCart()\n }\n return ok\n } catch (e) {\n logCartError(\n { scope: 'checkout-cancel', context: { orderId: cartStore.credentials?.id } },\n e\n )\n throw e\n }\n }\n\n return { result, submitting, submit, confirm, resendCode, cancel }\n}\n","import { storeToRefs } from 'pinia'\nimport { computed, type ComputedRef, type MaybeRefOrGetter, type Ref } from 'vue'\n\nimport type { Order, OrderProductVariant, ProductModifiersRequest } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useCartStore } from '../stores/cart'\nimport { useCartCredentials } from './useCartCredentials'\nimport { useCartInitialization } from './useCartInitialization'\nimport { useCartOperations } from './useCartOperations'\nimport { useCartQuantities } from './useCartQuantities'\nimport { useCartRecalculation } from './useCartRecalculation'\n\nimport type { CartItemRequest } from './useCartOperations'\n\nexport type { CartItemRequest } from './useCartOperations'\n\nexport interface StorefrontCart {\n order: Ref<Order | null>\n variants: ComputedRef<OrderProductVariant[]>\n itemCount: ComputedRef<number>\n totalPrice: ComputedRef<number>\n loading: Ref<boolean>\n initializing: Ref<boolean>\n hasOrder: ComputedRef<boolean>\n getProductQuantity: (productId: string) => ComputedRef<number>\n getVariantQuantity: (\n productVariantId: MaybeRefOrGetter<string | null>,\n modifiers: MaybeRefOrGetter<ProductModifiersRequest[]>\n ) => ComputedRef<number>\n initializeOrder: () => Promise<void>\n addToCart: (request: CartItemRequest) => Promise<void>\n removeFromCart: (request: CartItemRequest) => Promise<void>\n refreshCart: (options?: { silent?: boolean }) => Promise<void>\n clearAndResetCart: () => void\n recalculate: () => Promise<void>\n}\n\nexport function useStorefrontCart(): StorefrontCart {\n const { sdk, notifier, activity } = useRuntime()\n const cartStore = useCartStore()\n\n const { order, loading, initializing } = storeToRefs(cartStore)\n\n const variants = computed<OrderProductVariant[]>(() => cartStore.variants)\n const itemCount = computed<number>(() => cartStore.itemCount)\n const totalPrice = computed<number>(() => cartStore.totalPrice)\n const hasOrder = computed<boolean>(() => cartStore.hasOrder)\n\n const credentials = useCartCredentials()\n const { getProductQuantity, getVariantQuantity } = useCartQuantities()\n const { initializeOrder } = useCartInitialization(credentials, sdk)\n const { addToCart, removeFromCart, refreshCart, clearAndResetCart } = useCartOperations(\n credentials,\n { initializeOrder },\n sdk,\n { notifier, activity }\n )\n const { recalculateAfterOrderChange } = useCartRecalculation({ notifier, activity })\n\n return {\n order,\n variants,\n itemCount,\n totalPrice,\n loading,\n initializing,\n hasOrder,\n getProductQuantity,\n getVariantQuantity,\n initializeOrder,\n addToCart,\n removeFromCart,\n refreshCart,\n clearAndResetCart,\n recalculate: recalculateAfterOrderChange,\n }\n}\n","import { getCurrentScope, onScopeDispose, watchEffect } from 'vue'\n\nimport type { RealtimeChannel } from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { createRuntimeState } from '../ports/runtimeState'\nimport { useCartStore } from '../stores/cart'\nimport { usePromotionsStore } from '../stores/promotions'\nimport { ORDER_EVENTS } from './constants'\nimport { useBonusesReconciliation } from './useBonusesReconciliation'\nimport { useOrderTotal } from './useOrderTotal'\nimport { useStorefrontCart } from './useStorefrontCart'\n\n/**\n * Подписка на WebSocket канал заказа.\n * Обрабатывает real-time события: пересчёт цены, перезагрузка, промо-акции.\n * Вызывать один раз на клиенте после инициализации заказа.\n */\ninterface OrderChannelState {\n currentChannel: RealtimeChannel | null\n currentChannelName: string | null\n initialized: boolean\n priceReconcileTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst getOrderChannelState = createRuntimeState<OrderChannelState>(() => ({\n currentChannel: null,\n currentChannelName: null,\n initialized: false,\n priceReconcileTimer: null,\n}))\n\nexport function useOrderChannel(): void {\n const runtime = useRuntime()\n const state = getOrderChannelState(runtime)\n if (state.initialized) return\n\n const { realtime, notifier, events } = runtime\n // Нет realtime-транспорта у потребителя — WS-канал не поднимаем.\n const resolvedRealtime = realtime?.get() ?? null\n if (!resolvedRealtime) return\n // Захват в non-null const — иначе narrowing не доходит до вложенных замыканий.\n const rt = resolvedRealtime\n\n state.initialized = true\n\n const cartStore = useCartStore()\n const promotionsStore = usePromotionsStore()\n const { refreshCart } = useStorefrontCart()\n const { fetchTotal } = useOrderTotal()\n const { reconcileAfterOrderChange } = useBonusesReconciliation({ notifier })\n\n function getChannelName(): string | null {\n const creds = cartStore.credentials\n // Защита от {id: undefined, token: undefined} — без этого подписка летит\n // на `orders.undefined.undefined` и потом любой setOrderX уходит в 404.\n if (!creds?.id || !creds?.token) return null\n\n return `orders.${creds.id}.${creds.token}`\n }\n\n function subscribeToOrder(): void {\n const channelName = getChannelName()\n\n // Уже подписаны на этот канал\n if (channelName === state.currentChannelName) return\n\n // Отписаться от старого канала\n if (state.currentChannelName) {\n rt.unsubscribe(state.currentChannelName)\n state.currentChannel = null\n state.currentChannelName = null\n }\n\n if (!channelName) return\n\n state.currentChannel = rt.subscribe(channelName)\n state.currentChannelName = channelName\n\n if (!state.currentChannel) return\n\n // Пересчёт цены на сервере → authoritative /total + reconcile бонусов по\n // свежему max_bonuses_payment. Дебаунс склеивает пачку событий в один проход.\n // reconcile идемпотентен (не дёргает apply если сумма уже верна) → без цикла.\n state.currentChannel.bind(ORDER_EVENTS.PriceRecalculated, () => {\n events?.get()?.orderPriceRecalculated({ order: cartStore.order })\n if (state.priceReconcileTimer) clearTimeout(state.priceReconcileTimer)\n state.priceReconcileTimer = setTimeout(() => {\n state.priceReconcileTimer = null\n void fetchTotal().then(() => reconcileAfterOrderChange())\n }, 150)\n })\n\n // Перезагрузка заказа\n state.currentChannel.bind(ORDER_EVENTS.Reload, () => {\n events?.get()?.orderShouldBeReloaded({ order: cartStore.order })\n void refreshCart({ silent: true }).then(() => fetchTotal())\n })\n\n // Заказ дублирован\n state.currentChannel.bind(ORDER_EVENTS.Repeated, () => {\n // no-op\n })\n\n // Промо-акции не найдены → очистить подарки\n state.currentChannel.bind(ORDER_EVENTS.PromotionsNotFound, () => {\n const integrations = events?.get() ?? null\n integrations?.orderPromotionsNotFound({ order: cartStore.order })\n integrations?.promotionsCheckerCompleted({ order: cartStore.order })\n promotionsStore.setChecking(false)\n promotionsStore.clearRewards()\n })\n\n // Доступен выбор подарка → сохранить в store\n state.currentChannel.bind(ORDER_EVENTS.RewardsDisplaySelection, (data?: unknown) => {\n if (!data || typeof data !== 'object') return\n\n const payload = data as {\n offer?: { id?: string; short_id?: string; slug?: string }\n promotion_id?: string\n reward_id?: string\n context?: { type?: string; id?: string }\n limit?: number\n }\n\n if (\n typeof payload.promotion_id === 'string' &&\n typeof payload.reward_id === 'string'\n ) {\n const integrations = events?.get() ?? null\n integrations?.displayOrderPromotionRewardSelection({\n order: cartStore.order,\n selection: payload,\n })\n integrations?.promotionsCheckerCompleted({ order: cartStore.order })\n promotionsStore.setChecking(false)\n promotionsStore.addOrUpdateReward({\n offerId: payload.offer?.id ?? '',\n promotionId: payload.promotion_id,\n rewardId: payload.reward_id,\n context:\n payload.context?.type != null && payload.context?.id != null\n ? { type: payload.context.type, id: payload.context.id }\n : null,\n limit: payload.limit ?? 1,\n })\n }\n })\n\n // Обновить награды → перезагрузить заказ\n state.currentChannel.bind(ORDER_EVENTS.RewardsReload, () => {\n events?.get()?.orderPromotionRewardsShouldBeReloaded({\n order: cartStore.order,\n })\n void refreshCart({ silent: true }).then(() => fetchTotal())\n })\n }\n\n // Подписаться когда realtime готов И есть credentials\n // watchEffect реагирует на оба — rt.isReady и cartStore.credentials\n watchEffect(() => {\n if (rt.isReady.value) {\n subscribeToOrder()\n }\n })\n\n // Cleanup scope (unmount / HMR): отписка + сброс состояния runtime.\n // useOrderChannel может вызываться вне setup (из onMounted в app.vue) —\n // onScopeDispose без активного scope бросает варнинг, поэтому проверяем.\n if (getCurrentScope()) {\n onScopeDispose(() => {\n if (state.priceReconcileTimer) {\n clearTimeout(state.priceReconcileTimer)\n state.priceReconcileTimer = null\n }\n if (state.currentChannelName) {\n rt.unsubscribe(state.currentChannelName)\n }\n state.currentChannel = null\n state.currentChannelName = null\n state.initialized = false\n })\n }\n}\n"]}