@zenky/storefront-vue 0.10.4 → 0.10.5

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.
@@ -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","../src/cart/useRestrictionGate.ts","../src/cart/useRestrictedAddToCart.ts","../src/cart/useVisibleCartVariants.ts"],"names":["computed","ref","PaymentMethod","PaymentMethodEnum","watch"],"mappings":"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","file":"chunk-YS5DXYYV.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\nconst REDACTED = '[REDACTED]'\nconst MAX_LOG_DEPTH = 6\nconst MAX_ARRAY_ITEMS = 25\nconst MAX_OBJECT_KEYS = 50\n\nconst SENSITIVE_KEY_PARTS = [\n 'authorization',\n 'cookie',\n 'credential',\n 'password',\n 'recaptcha',\n 'secret',\n 'token',\n]\nconst SENSITIVE_EXACT_KEYS = new Set(['cvc', 'cvv', 'otp', 'pan', 'pin'])\n\nconst SENSITIVE_ASSIGNMENT =\n /((?:authorization|cookie|password|recaptcha|secret|(?:api|access|auth|card|order|refresh)[_-]?token|token)\\s*[=:]\\s*[\"']?)([^\\s,\"';&}\\]]+)/gi\nconst SENSITIVE_QUERY_PARAM =\n /([?&#](?:authorization|password|recaptcha|secret|(?:api|access|auth|card|order|refresh)[_-]?token|token)=)([^&#\\s]+)/gi\nconst BEARER_TOKEN = /(bearer\\s+)[a-z0-9._~+/=-]+/gi\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\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.replace(/[^a-z0-9]/gi, '').toLowerCase()\n return (\n SENSITIVE_EXACT_KEYS.has(normalized) ||\n normalized.includes('confirmationcode') ||\n normalized.includes('verificationcode') ||\n SENSITIVE_KEY_PARTS.some((part) => normalized.includes(part))\n )\n}\n\nfunction sanitizeString(value: string): string {\n return value\n .replace(BEARER_TOKEN, `$1${REDACTED}`)\n .replace(SENSITIVE_QUERY_PARAM, `$1${REDACTED}`)\n .replace(SENSITIVE_ASSIGNMENT, `$1${REDACTED}`)\n}\n\n/**\n * Рекурсивно готовит неизвестное значение к диагностическому логу.\n *\n * Это defense-in-depth на случай, если SDK положит request headers/body в `meta`\n * или в произвольное поле ошибки. Ограничения глубины/размера защищают сам логгер\n * от циклических и чрезмерно больших payload'ов.\n *\n * @internal Не является частью публичного API пакета; экспорт нужен для тестов.\n */\nexport function sanitizeLogValue(\n value: unknown,\n depth = 0,\n seen: WeakSet<object> = new WeakSet<object>()\n): unknown {\n if (typeof value === 'string') return sanitizeString(value)\n if (value === null || typeof value !== 'object') return value\n if (depth >= MAX_LOG_DEPTH) return '[TRUNCATED]'\n if (seen.has(value)) return '[CIRCULAR]'\n\n seen.add(value)\n\n if (Array.isArray(value)) {\n const sanitized = value\n .slice(0, MAX_ARRAY_ITEMS)\n .map((item) => sanitizeLogValue(item, depth + 1, seen))\n if (value.length > MAX_ARRAY_ITEMS) sanitized.push('[TRUNCATED]')\n return sanitized\n }\n\n const result: Record<string, unknown> = {}\n\n if (value instanceof Error) {\n result.name = sanitizeString(value.name)\n result.message = sanitizeString(value.message)\n }\n\n let allEntries: [string, unknown][]\n try {\n allEntries = Object.entries(value)\n } catch {\n return '[UNSERIALIZABLE]'\n }\n\n const entries = allEntries.slice(0, MAX_OBJECT_KEYS)\n for (const [key, nestedValue] of entries) {\n if (key === 'name' || key === 'message') continue\n result[key] = isSensitiveKey(key)\n ? REDACTED\n : sanitizeLogValue(nestedValue, depth + 1, seen)\n }\n\n if (allEntries.length > MAX_OBJECT_KEYS) result.__truncated__ = true\n return result\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 const safeContext = sanitizeLogValue(context) as Record<string, unknown> | undefined\n\n console.error(`[${scope}] failed`, {\n ...(safeContext ?? {}),\n httpCode: err?.http_code,\n errorCode: err?.error_code,\n message: sanitizeLogValue(err?.message),\n meta: sanitizeLogValue(err?.meta),\n error: sanitizeLogValue(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?.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 ?? (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 { logCartError } from './logCartError'\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 logCartError({ scope: 'address-sync', context: { storeId } }, 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 { logCartError } from './logCartError'\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 // Ограничения позиций (#32): is_blocking для сообщений в корзине и блокировки чекаута.\n 'variants.restrictions',\n].join(',')\n\nexport const ORDER_WITH: InclusionRequest = { with: ORDER_INCLUDES }\n\n// RUM: длительность инициализации корзины (создание/восстановление заказа).\nconst RUM_MARK_CART_INIT = 'rum:cart:init'\nconst RUM_METRIC_CART_INIT = 'rum_cart_init_seconds'\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 logCartError(\n {\n scope: 'cart-load-order-settings',\n context: { orderId: cartStore.credentials?.id },\n },\n e\n )\n }\n }\n\n async function _doInitialize(): Promise<void> {\n runtime.rum?.mark(RUM_MARK_CART_INIT)\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 runtime.rum?.measure(RUM_METRIC_CART_INIT, RUM_MARK_CART_INIT)\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(\n storeId,\n orderCredentials,\n {\n payments: [...additionalPayments, bonusesPayment],\n }\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(\n storeId,\n orderCredentials,\n {\n payments: mainPayment ? [mainPayment] : [],\n }\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, messages, 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, messages.format('cart.payment.updateFailed')))\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'\nimport { useRuntime } from '../ports/runtime'\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 { messages } = useRuntime()\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(messages.format('cart.bonuses.changed.title'), {\n description: messages.format('cart.bonuses.changed.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, messages, 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, messages.format('cart.customer.saveFailed')))\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'\nimport { logCartError } from './logCartError'\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, messages } = 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\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 ? messages.format('cart.customer.updatedWithName', { firstName })\n : messages.format('cart.customer.updated')\n )\n }\n }\n } catch (e: unknown) {\n logCartError(\n {\n scope: 'cart-customer-attach',\n context: { orderId: requestedOrderId },\n },\n e\n )\n if (notifyOnPhoneChange) {\n notifier.error(messages.format('cart.customer.updateAfterLoginFailed'))\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 logCartError(\n {\n scope: 'cart-customer-refresh-after-logout',\n context: { orderId: requestedOrderId },\n },\n e\n )\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, messages, 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(messages.format('cart.stock.catalogReloadFailed'))\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(messages.format('cart.stock.itemsRemoved'))\n } else if (result.order_variants.length > 0) {\n await fetchTotal()\n notifier.warning(messages.format('cart.stock.pricesUpdated'))\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(messages.format('cart.stock.checkFailed'))\n }\n }\n\n return { handleStockChange }\n}\n","import type { SetOrderDeliveryRequest } from '@zenky/storefront-api'\n\nimport type { ActivityReporter, Notifier, Result } 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(\n e,\n runtime.messages.format('cart.promocode.applyFailed')\n )\n logCartError(\n {\n scope: 'promocode-apply',\n context: { codeLength: trimmed.length, 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(\n e,\n runtime.messages.format('cart.promocode.removeFailed')\n )\n logCartError(\n {\n scope: 'promocode-remove',\n context: {\n codeLength: applied.value?.promocode?.length,\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, logCartError } 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 logCartError(\n {\n scope: 'cart-delivery-attach',\n context: { orderId: cartStore.credentials?.id },\n },\n result.error\n )\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, messages } = 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) ??\n 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) ??\n 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\n ? minorToMajor(cartTotal, currency)\n : 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(messages.format('cart.added.title'), {\n description: parts.join(', '),\n })\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, messages.format('cart.updateFailed')))\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 (typeof payload.promotion_id === 'string' && typeof payload.reward_id === 'string') {\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","import { ref, type Ref } from 'vue'\n\nimport type { EvaluatedRestriction, Media } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { createRuntimeState } from '../ports/runtimeState'\n\n/** Данные товара для показа в модалке гейта (как строка корзины). */\nexport interface RestrictionGateProduct {\n name: string\n image: Media | null\n}\n\ninterface RestrictionGateState {\n isOpen: Ref<boolean>\n blocking: Ref<EvaluatedRestriction[]>\n product: Ref<RestrictionGateProduct | null>\n resolver: ((confirmed: boolean) => void) | null\n}\n\nconst getGateState = createRuntimeState<RestrictionGateState>(() => ({\n isOpen: ref(false),\n blocking: ref([]),\n product: ref(null),\n resolver: null,\n}))\n\nexport interface RestrictionGate {\n isOpen: Ref<boolean>\n blocking: Ref<EvaluatedRestriction[]>\n product: Ref<RestrictionGateProduct | null>\n confirmBlocking: (\n items: EvaluatedRestriction[],\n gateProduct: RestrictionGateProduct\n ) => Promise<boolean>\n confirm: () => void\n cancel: () => void\n}\n\nexport function useRestrictionGate(): RestrictionGate {\n const state = getGateState(useRuntime())\n\n function settle(confirmed: boolean): void {\n state.isOpen.value = false\n const resolve = state.resolver\n state.resolver = null\n resolve?.(confirmed)\n }\n\n function confirmBlocking(\n items: EvaluatedRestriction[],\n gateProduct: RestrictionGateProduct\n ): Promise<boolean> {\n settle(false)\n state.blocking.value = items\n state.product.value = gateProduct\n state.isOpen.value = true\n\n return new Promise<boolean>((resolve) => {\n state.resolver = resolve\n })\n }\n\n return {\n isOpen: state.isOpen,\n blocking: state.blocking,\n product: state.product,\n confirmBlocking,\n confirm: () => settle(true),\n cancel: () => settle(false),\n }\n}\n","import type { EvaluatedRestriction, Product } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useStoreProfileStore } from '../stores/store-profile'\nimport { logCartError } from './logCartError'\nimport { useRestrictionGate } from './useRestrictionGate'\nimport { useStorefrontCart } from './useStorefrontCart'\n\nimport type { CartItemRequest } from './useCartOperations'\n\ntype RestrictedProduct = Pick<Product, 'id' | 'restrictions' | 'name' | 'images'>\n\nexport interface RestrictedAddToCart {\n checkRestrictionsAllowed: (\n product: RestrictedProduct,\n alreadyInCart: boolean\n ) => Promise<boolean>\n addWithRestrictionCheck: (\n product: RestrictedProduct,\n request: CartItemRequest,\n alreadyInCart: boolean\n ) => Promise<void>\n}\n\nexport function useRestrictedAddToCart(): RestrictedAddToCart {\n const { sdk } = useRuntime()\n const profileStore = useStoreProfileStore()\n const { addToCart } = useStorefrontCart()\n const { confirmBlocking, isOpen: gateIsOpen } = useRestrictionGate()\n\n async function checkRestrictionsAllowed(\n product: RestrictedProduct,\n alreadyInCart: boolean\n ): Promise<boolean> {\n if (alreadyInCart || !product.restrictions?.length) return true\n\n const storeId = profileStore.store?.id\n const cityId = profileStore.city?.id\n if (!storeId || !cityId) return true\n\n let blocking: EvaluatedRestriction[] = []\n try {\n // SDK-метод getProductRestrictions(storeId, productId) не передаёт city_id,\n // а без него эндпоинт отвечает 422 → гейт молча не открывался. Поэтому строим\n // запрос через sdk.client (тот же токен/заголовки/таймзона), добавляя контекст\n // города и склада — от них зависит вычисление is_blocking по расписанию.\n const url = sdk.client.getStoreUrl(storeId, `/products/${product.id}/restrictions`, {\n city_id: cityId,\n stock_id: profileStore.stock?.id ?? undefined,\n })\n const response = (await sdk.client.request('GET', url)) as {\n data?: EvaluatedRestriction[]\n }\n blocking = (response?.data ?? []).filter((item) => item.is_blocking)\n } catch (error) {\n // Fail-open: не блокируем добавление из-за сетевой ошибки — блокировку\n // всё равно повторно проверит сервер на оформлении заказа. Логируем, чтобы\n // флейки-кейсы были видны в диагностике.\n logCartError({ scope: 'restrictions-check', context: { productId: product.id } }, error)\n return true\n }\n\n if (!blocking.length) return true\n\n // Один гейт за раз: если модалка уже открыта для другого товара, не затираем её\n // (иначе confirmBlocking молча резолвнул бы чужой промис как «отмена»).\n if (gateIsOpen.value) return false\n\n return confirmBlocking(blocking, {\n name: product.name ?? '',\n image: product.images?.[0] ?? null,\n })\n }\n\n async function addWithRestrictionCheck(\n product: RestrictedProduct,\n request: CartItemRequest,\n alreadyInCart: boolean\n ): Promise<void> {\n if (await checkRestrictionsAllowed(product, alreadyInCart)) {\n await addToCart(request)\n }\n }\n\n return { checkRestrictionsAllowed, addWithRestrictionCheck }\n}\n","import { computed, type ComputedRef } from 'vue'\n\nimport type { OrderProductVariant } from '@zenky/storefront-api'\n\nimport { useCartStore } from '../stores/cart'\nimport { variantLineKey } from './cartLineKey'\n\n/**\n * Позиции корзины, видимые покупателю: серверное количество с учётом оптимистичной дельты.\n * Единый источник для списка, футера и подсветки — иначе блокировка чекаута, поиск\n * блокирующей позиции и реальный рендер списка могут разъехаться.\n */\nexport function useVisibleCartVariants(): ComputedRef<OrderProductVariant[]> {\n const cartStore = useCartStore()\n\n return computed(() =>\n cartStore.variants.filter((variant) => {\n const delta = cartStore.lineOptimistic[variantLineKey(variant)] ?? 0\n return variant.quantity + delta > 0\n })\n )\n}\n"]}