@zenky/storefront-vue 0.10.7 → 0.10.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +4 -18
  3. package/dist/cart/index.d.ts +167 -160
  4. package/dist/cart/index.js +7 -7
  5. package/dist/catalog/index.d.ts +18 -21
  6. package/dist/catalog/index.js +2 -2
  7. package/dist/{chunk-RO25KNM5.js → chunk-2Y6QTHXI.js} +2 -2
  8. package/dist/chunk-2Y6QTHXI.js.map +1 -0
  9. package/dist/{chunk-5YD4AIY2.js → chunk-46FNHMWC.js} +4 -4
  10. package/dist/chunk-46FNHMWC.js.map +1 -0
  11. package/dist/{chunk-Z3IW4ODZ.js → chunk-6QCFHSLX.js} +2 -2
  12. package/dist/chunk-6QCFHSLX.js.map +1 -0
  13. package/dist/{chunk-2SMSLZ6G.js → chunk-AVES4WJZ.js} +15 -11
  14. package/dist/chunk-AVES4WJZ.js.map +1 -0
  15. package/dist/{chunk-4IFPVEO7.js → chunk-BUNI6MGH.js} +3 -3
  16. package/dist/chunk-BUNI6MGH.js.map +1 -0
  17. package/dist/{chunk-PTMSPB34.js → chunk-FXKG5TFQ.js} +3 -3
  18. package/dist/chunk-FXKG5TFQ.js.map +1 -0
  19. package/dist/{chunk-MOG6UMFM.js → chunk-GILJFP55.js} +2 -2
  20. package/dist/chunk-GILJFP55.js.map +1 -0
  21. package/dist/{chunk-2CI4RW7V.js → chunk-GLQXTMVW.js} +2 -2
  22. package/dist/{chunk-2CI4RW7V.js.map → chunk-GLQXTMVW.js.map} +1 -1
  23. package/dist/{chunk-MZ66ARDL.js → chunk-GXDTRTUT.js} +2 -2
  24. package/dist/chunk-GXDTRTUT.js.map +1 -0
  25. package/dist/{chunk-E3G7NGCH.js → chunk-KFCO46RB.js} +2 -2
  26. package/dist/{chunk-E3G7NGCH.js.map → chunk-KFCO46RB.js.map} +1 -1
  27. package/dist/{chunk-VFMVQR6Y.js → chunk-QZ3S3NN3.js} +5 -3
  28. package/dist/chunk-QZ3S3NN3.js.map +1 -0
  29. package/dist/{chunk-B3UU7HF5.js → chunk-RF4ML3Q3.js} +47 -7
  30. package/dist/chunk-RF4ML3Q3.js.map +1 -0
  31. package/dist/{chunk-NG7RUIWW.js → chunk-RK5CGOM7.js} +2 -2
  32. package/dist/chunk-RK5CGOM7.js.map +1 -0
  33. package/dist/{chunk-Z247QRDJ.js → chunk-XULHV6SS.js} +3 -3
  34. package/dist/chunk-XULHV6SS.js.map +1 -0
  35. package/dist/index.d.ts +4 -4
  36. package/dist/index.js +14 -14
  37. package/dist/money/index.d.ts +8 -8
  38. package/dist/money/index.js +1 -1
  39. package/dist/order/index.d.ts +3 -3
  40. package/dist/order/index.js.map +1 -1
  41. package/dist/pagination/index.d.ts +29 -37
  42. package/dist/pagination/index.js.map +1 -1
  43. package/dist/ports/index.d.ts +23 -22
  44. package/dist/ports/index.js +1 -1
  45. package/dist/products/index.d.ts +20 -9
  46. package/dist/products/index.js +3 -3
  47. package/dist/promotions/index.d.ts +5 -5
  48. package/dist/promotions/index.js +3 -3
  49. package/dist/seo/index.d.ts +14 -12
  50. package/dist/seo/index.js +5 -5
  51. package/dist/seo/index.js.map +1 -1
  52. package/dist/snippets/index.js +1 -1
  53. package/dist/stores/index.d.ts +4 -5
  54. package/dist/stores/index.js +4 -4
  55. package/dist/theme/index.d.ts +3 -3
  56. package/dist/theme/index.js +1 -1
  57. package/dist/utils/index.d.ts +16 -16
  58. package/dist/utils/index.js +1 -1
  59. package/docs/architecture.md +84 -0
  60. package/docs/consumer-setup.md +13 -54
  61. package/docs/ports.md +12 -13
  62. package/package.json +1 -1
  63. package/dist/chunk-2SMSLZ6G.js.map +0 -1
  64. package/dist/chunk-4IFPVEO7.js.map +0 -1
  65. package/dist/chunk-5YD4AIY2.js.map +0 -1
  66. package/dist/chunk-B3UU7HF5.js.map +0 -1
  67. package/dist/chunk-MOG6UMFM.js.map +0 -1
  68. package/dist/chunk-MZ66ARDL.js.map +0 -1
  69. package/dist/chunk-NG7RUIWW.js.map +0 -1
  70. package/dist/chunk-PTMSPB34.js.map +0 -1
  71. package/dist/chunk-RO25KNM5.js.map +0 -1
  72. package/dist/chunk-VFMVQR6Y.js.map +0 -1
  73. package/dist/chunk-Z247QRDJ.js.map +0 -1
  74. package/dist/chunk-Z3IW4ODZ.js.map +0 -1
@@ -0,0 +1 @@
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-AVES4WJZ.js","sourcesContent":["/** WebSocket events for the order channel */\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","/** Normalizes an address string for comparison (lowercase, collapse commas/spaces). */\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/** Deterministic cart line key: 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 * Builds the main (non-bonus) payment request from the selected payment method.\n * Single source of truth for both UI and reconciliation; `bill` is converted\n * minor → major here.\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 * Utilities for building \"prepare change from this amount\" (cash bill) presets,\n * in minor currency units (kopecks/tiyn/satang).\n *\n * The UI shows the presets as pills: \"1100 ₽\", \"1500 ₽\", \"5000 ₽\", etc.\n */\n\nimport { majorToMinor } from '../money'\n\n/**\n * Banknote denominations per country, in **major** currency units.\n * The set of banknotes depends on the country (RU rubles ≠ KZ tenge), while\n * the major → minor conversion depends on the currency (via `majorToMinor`,\n * which accounts for the number of decimal digits per ISO code). That's why\n * `getCashDenominationsMinor` takes both a country (to pick the set) and a\n * currency (the conversion factor).\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 * Round-up steps in **major** units: 10 / 50 / 100 / 200 / 500 / 1000.\n * Converted to minor units per currency via `getDefaultRoundStepsMinor` — so\n * it works for currencies with any number of decimal digits, not just ×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\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 totalMinor: number\n /** Banknote denominations in minor units (see `getCashDenominationsMinor`). */\n denominationsMinor: number[]\n /** Round-up steps — override this only if you know why. */\n roundStepsMinor?: readonly number[]\n}\n\n/**\n * Builds change presets in minor units: combines round-up sums (to\n * 10/50/100/200/500/1000) with all banknotes > total, dedupes, and sorts\n * ascending.\n *\n * Rounding is strict (`total + 1`), so the change is always > 0.\n *\n * Examples (for RU, total in rubles for brevity):\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: all banknotes as-is.\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 * Common error log format for all cart/checkout operations, plus extraction\n * of readable messages from a ZenkyError for the UI (toast / inline).\n *\n * Zenky API error contract (see `ApiError` in the SDK):\n * {\n * err: {\n * message: string, // localized — \"Адрес доставки не указан.\"\n * original_message: string, // English original\n * http_code: number,\n * error_code: string, // 'addresses.not_specified' | 'validation' | etc.\n * meta: any, // for validation: { errors: { [field]: string[] } }\n * }\n * }\n *\n * For validation errors (`error_code === 'validation'`), we take the messages\n * from `meta.errors` instead of the generic top-level message.\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 'address',\n 'authorization',\n 'checkouturl',\n 'cookie',\n 'credential',\n 'email',\n 'password',\n 'paymentlink',\n 'paymentpageurl',\n 'phone',\n 'recaptcha',\n 'redirecturl',\n 'secret',\n 'token',\n]\nconst SENSITIVE_EXACT_KEYS = new Set(['cvc', 'cvv', 'otp', 'pan', 'pin'])\n\nconst SENSITIVE_ASSIGNMENT =\n /((?:address|authorization|cookie|email|password|phone|recaptcha|secret|(?:checkout|redirect)[_-]?url|payment(?:[_-]?page)?[_-]?(?:link|url)|(?:api|access|auth|card|order|refresh)[_-]?token|token)\\s*[=:]\\s*[\"']?)([^\\s,\"';&}\\]]+)/gi\nconst SENSITIVE_QUERY_PARAM =\n /([?&#](?:address|authorization|email|password|phone|recaptcha|secret|(?:checkout|redirect)[_-]?url|payment(?:[_-]?page)?[_-]?(?:link|url)|(?:api|access|auth|card|order|refresh)[_-]?token|token)=)([^&#\\s]+)/gi\nconst BEARER_TOKEN = /(bearer\\s+)[a-z0-9._~+/=-]+/gi\n\nexport interface CartErrorScope {\n /** Prefix — operation name (`cart-add` / `delivery` / `promocode-apply` / etc.) */\n scope: string\n /** Operation parameters — ids, inputs, whatever is currently in 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 * Recursively prepares an unknown value for the diagnostic log.\n *\n * This is defense-in-depth in case the SDK puts request headers/body into\n * `meta` or some arbitrary error field. The depth/size limits protect the\n * logger itself from circular or excessively large payloads.\n *\n * @internal Not part of the package's public API; exported only for tests.\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 * Logs a cart/checkout operation error in a common format.\n * Safe for any `unknown` value — doesn't throw on non-ZenkyError errors.\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 * Extracts the backend `error_code` (e.g. `addresses.not_specified`).\n * Returns undefined for non-Zenky errors.\n */\nexport function getCartErrorCode(e: unknown): string | undefined {\n return (e as ZenkyErrorLike | undefined)?.err?.error_code\n}\n\n/**\n * Extracts the backend HTTP code (e.g. 401 for an operation that requires\n * authorization). Returns undefined for non-Zenky errors.\n */\nexport function getCartErrorHttpCode(e: unknown): number | undefined {\n return (e as ZenkyErrorLike | undefined)?.err?.http_code\n}\n\n/**\n * Extracts field → [messages] from a ZenkyError for validation.\n * Returns {} if the error isn't a validation error or meta.errors is empty.\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 * Extracts a readable message for the UI (toast / inline).\n *\n * Priority:\n * 1. If it's a validation error → join all messages from `meta.errors` (across all fields)\n * 2. Otherwise — `err.message` (generic message from the backend)\n * 3. Otherwise — `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 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 execution of cart mutations.\n *\n * Problem: the Zenky SDK doesn't support AbortSignal — a request can't actually\n * be canceled halfway through. If the user quickly clicks `+ → delivery →\n * payment`, responses can arrive out of order and a stale response can\n * overwrite fresher state (a race condition).\n *\n * Solution: per-kind versioning. Each operation kind has its own counter — a\n * new call increments it, and after the await the callback checks \"am I still\n * current?\" via `isStale()`. If it's stale, the side effect\n * (`cartStore.setOrder`) is skipped. The HTTP request still completes on the\n * backend (a minor overhead), but the frontend ignores the result, so the race\n * can never land.\n *\n * Also includes per-kind debounce. Rapid clicks like \"++++\" collapse into a\n * single request after a pause.\n *\n * Version state is shared across composables within one storefront runtime,\n * but isolated between SSR requests and separate Vue apps.\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}` — dynamic cart line key: add and remove for the same\n * line share a kind, since they contend for the same resource.\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 /** Unique kind — mutations of the same kind replace each other */\n kind: MutationKind\n /** Debounce in ms before sending (0 = no debounce) */\n debounce?: number\n}\n\nexport interface CartMutationComposable {\n /**\n * Run a mutation. Inside the callback, only do the side effect if\n * `isStale()` returns `false` — otherwise a stale result would overwrite a\n * fresher one.\n *\n * Returns the result of `fn`, or `undefined` if it went stale.\n *\n * @example\n * await run({ kind: 'payment', debounce: 300 }, async (isStale) => {\n * const order = await sdk.orders.setOrderPayments(...)\n * if (isStale()) return // A new click came in — our result is stale\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 /** Get the current version of a kind — for tests / debugging */\n getVersion: (kind: MutationKind) => number\n /**\n * Bump the versions of all kinds with the given prefix — every in-flight\n * operation matching the prefix becomes stale and its side effects are\n * ignored.\n *\n * Used by `clearAndResetCart` / `logout` — to cancel all pending mutations\n * of the old order, so late responses don't get written into the fresh\n * state.\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 the version — every previous in-flight operation of this kind becomes 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: wait out the pause. If someone else bumped the version meanwhile,\n // bail without sending the request.\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 // Ignore errors from stale operations too (an old operation that shouldn't have\n // completed anyway) — otherwise we'd get spurious toasts.\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 mode: ComputedRef<OrderAuthenticationMethod>\n /** Auth is required before submit (opens AuthModal instead of checkoutOrder) */\n needsAuth: ComputedRef<boolean>\n /** CustomerForm (phone + name) must be shown in the cart */\n needsCustomerForm: ComputedRef<boolean>\n}\n\n/**\n * Determines checkout behavior based on store settings.\n *\n * Matrix:\n * ┌──────────────┬──────────┬──────────────────┐\n * │ mode │ needsAuth│ needsCustomerForm│\n * ├──────────────┼──────────┼──────────────────┤\n * │ Preauth │ true │ false │\n * │ Confirmation │ false │ true (guests) │\n * │ Disabled │ false │ true (guests) │\n * └──────────────┴──────────┴──────────────────┘\n *\n * Whether SMS confirmation is needed is not computed on the frontend: the\n * backend returns `confirmation.required` in the `checkoutOrder` response,\n * and the UI reacts to that.\n *\n * Note: `needsCustomerForm` currently returns true for guests in every mode\n * except Preauth. Authenticated customers don't need the form (their data is\n * autofilled from 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 /** Full settings snapshot — read from `cartStore.orderSettings` */\n settings: ComputedRef<OrderSettings | null>\n paymentMethods: ComputedRef<OrderPaymentMethod[]>\n deliveryMethods: ComputedRef<OrderDeliveryMethod[]>\n loading: Ref<boolean>\n /**\n * Refetches settings from the backend. Called:\n * - on startup (via useCartInitialization)\n * - after setOrderDeliveryMethod (the set of payment methods changes based on delivery)\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 of an existing online-payment transaction (`order.payments[].id`\n * where `is_online === true && status === 'pending'`). Used as a fallback\n * if the main retry endpoint returns an error (typically 409\n * `order_is_not_submitted` for freshly created pending orders).\n */\n transactionId?: string | null\n\n /**\n * Where to send the user back after payment. Defaults to\n * `window.location.href` — correct on the success page (sends back to\n * success), but from the order page `/me/orders/[id]` it's better to pass\n * the success URL explicitly, otherwise after payment the user is left on\n * the order page without the `?payment=` query and never sees the\n * payment result.\n */\n currentUrl?: string\n}\n\n/**\n * Retries an order's online payment.\n *\n * **Strategy (two-tier)**:\n * 1. `sdk.orders.retryOnlinePayment` — the official retry endpoint (submitted orders).\n * 2. `getOnlinePaymentRedirect(transactionId)` — fallback for pending orders (409\n * `order_is_not_submitted`).\n *\n * Returns `redirect_url`, or `null` if both approaches fail.\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. Primary path — 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 // Not logged as an error — this is an expected path for pending orders.\n // Falls through to the fallback if a transactionId is present.\n if (!options.transactionId) {\n logCartError({ scope: 'payment-retry', context: { orderId: creds.id } }, e)\n return null\n }\n }\n\n // 2. Fallback — getOnlinePaymentRedirect for an existing transaction\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 // The selected address wasn't found among the saved ones — it's stale, so clear it.\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 // Line restrictions: is_blocking is used for cart messages and to block checkout.\n 'variants.restrictions',\n].join(',')\n\nexport const ORDER_WITH: InclusionRequest = { with: ORDER_INCLUDES }\n\n// RUM: cart initialization duration (order creation/restoration).\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, total } = 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 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 sync of applied bonuses after an order change (using 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 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: a background reapply isn't possible — remove the bonuses and ask the user to confirm again.\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 // Already applied the right amount — don't call setOrderPayments (it would trigger an\n // infinite WS PriceRecalculated → apply → new PriceRecalculated → … loop).\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 after an order change: total → bonus sync → promo/min-price.\n * Call this explicitly after order mutations; don't wire it to every fetchTotal\n * call (that would create a cycle).\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 /** Whether the customer is attached to the order (there's `order.customer`) */\n isAttached: ComputedRef<boolean>\n /**\n * Attach a customer to the order (phone + name + optional last name / birth date).\n * After a successful call, the order is re-fetched with includes — so that\n * `order.customer` lands in `cartStore.order` and components can see it.\n *\n * Wrapped in activity('custom') — blocks the \"Checkout\" button while the\n * request is in flight.\n */\n attach: (request: SetOrderCustomerRequest) => Promise<void>\n}\n\n/**\n * Handles attaching a customer to the order.\n *\n * Used in two OrderAuthenticationMethod modes:\n * - `Disabled` — the guest fills in phone+name, `attach` runs before `checkoutOrder`\n * - `Confirmation` — the guest fills in phone+name, an SMS arrives after `checkoutOrder`\n *\n * Usually not needed for `Preauth` — the customer is attached automatically\n * once the SDK has the client's `api_token` (see `authStore`).\n *\n * @param cache client-local customer cache (implemented by the consumer — 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 * The customer is considered attached if:\n * - the backend returned `order.customer` (for authenticated users),\n * - OR there's an entry in the local cache for the current order (for\n * anonymous users — the backend doesn't return customer on GET without a\n * token, hence the cache fallback).\n * Matches the display logic in 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 // The backend doesn't return customer on GET /order for anonymous requests\n // (without an auth token). So we cache what we sent — otherwise after a\n // reload the UI wouldn't be able to show the attached data.\n cache.set(orderId, request)\n\n // setOrderCustomer returns a boolean — no updated order comes back.\n // Re-fetch the order with includes — for authenticated users it will\n // contain customer; for anonymous users it will be null (and the UI\n // falls back to the cache).\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/** Compares phone numbers by digits only — ignore \"+\", spaces, parens, etc. */\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 * Attaches the authenticated user's customer record to the current order.\n *\n * Runs in two cases:\n * 1) The user logged in (auth state changed) — `notifyOnPhoneChange = true`;\n * there may have been an anonymous customer with a different phone, so we\n * show a toast if the phone actually changed.\n * 2) An authenticated user got a new order with no customer attached\n * (e.g. after clearing the cart and adding a product) — `notifyOnPhoneChange = false`,\n * no toast needed, this is a silent sync.\n *\n * @param cache client-local customer cache (implemented by the consumer — 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 before the await — recheck after, so we don't write the response into a\n // different/newer state.\n const requestedToken = authStore.token\n const requestedOrderId = cartStore.order?.id\n\n // Previous phone (from order.customer or from the anonymous customer's cache) —\n // only needed for the login toast.\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 state / order changed while the requests were in flight — don't write.\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 // The user managed to log in / switch orders — don't write the anonymous snapshot.\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 // Case 1: auth state change.\n // true → sync the authenticated user's customer + toast on phone change.\n // false → reload the order anonymously, so the previous user's customer leaves 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 // Case 2: an authenticated user got a new order with no customer\n // (a new order appears after clearing the cart and adding a product).\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// Matches the former CookieKey.StockId.\nconst KEY_STOCK_ID = 'zenky_stock_id'\nconst YEAR_SECONDS = 60 * 60 * 24 * 365\n\nexport interface CartStockWatcher {\n /**\n * Reacts to a stock change in the updated order: switches the stock,\n * reloads the catalog if the hash changed, and validates the cart items.\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 resets deliver_at. If the user had already picked a\n // time, resend it in this same request (unless the caller set its own).\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 // Setting the time uses a separate endpoint, /checkout/delivery/time: time\n // doesn't require an address and isn't tied to the delivery method.\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 return sdk.orders.setOrderDeliveryTime(storeId, orderCredentials, {\n deliver_at: deliverAt,\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 /** Promocode applied to the order (read from cartStore.order.promocode) */\n applied: ComputedRef<OrderPromocode | null>\n isApplied: ComputedRef<boolean>\n loading: Ref<boolean>\n /** Error message (invalid / expired / doesn't apply to this order) */\n errorMessage: Ref<string | null>\n /** Applies the promocode. Wrapped in activity('promocode'). */\n apply: (code: string) => Promise<void>\n remove: () => Promise<void>\n /** Resets the error state (e.g. when the field is being edited) */\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 * The saved address id went stale (the backend returned `addresses.not_found`).\n * Try to find the same address by its string among the currently saved\n * addresses (the id may have changed) and assign it to the order with a\n * valid id. Returns true if the address was recovered; false if there's\n * no match (the caller should clear it).\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 // Stale selectedAddressId → backend 404. First try to reassign the\n // same address with its current id; if there's no match, clear the\n // cookie — otherwise the UI shows a \"phantom\" address that isn't\n // actually on the order.\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 RecommendationsBlock,\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 names (match the previous RUM_MARK/RUM_METRIC in the app).\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 recommendationsBlock?: RecommendationsBlock\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 recommendationsBlock?: RecommendationsBlock\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 ...(batch.recommendationsBlock\n ? { recommendations_block: batch.recommendationsBlock }\n : {}),\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 tracking is an optional port.\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 recommendationsBlock: batch.recommendationsBlock,\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.recommendationsBlock ??= request.recommendationsBlock\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 recommendationsBlock: request.recommendationsBlock,\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 provider (implemented by the consumer app — Google reCAPTCHA v3). */\nexport type RecaptchaPayloadProvider = (\n action: RecaptchaActionType\n) => Promise<{ token: string } | undefined>\n\nexport interface CheckoutSubmitComposable {\n /** Last `checkoutOrder` result — needed by the UI (ConfirmationModal / online redirect) */\n result: Ref<OrderCheckoutResult | null>\n submitting: Ref<boolean>\n /**\n * Collects `OrderCheckoutRequest` from `cartStore` (notes + persons_count).\n * Returns `OrderCheckoutResult` with confirmation/online_payment flags.\n */\n submit: () => Promise<OrderCheckoutResult | null>\n /** Confirm the SMS code (after checkoutOrder returned confirmation.required) */\n confirm: (code: string) => Promise<boolean>\n /** Resend the code (with backoff — the UI is responsible for that) */\n resendCode: () => Promise<boolean>\n cancel: () => Promise<boolean>\n}\n\n/**\n * Final order submit + SMS confirmation.\n *\n * @param getRecaptchaPayload reCAPTCHA token provider (app-specific, injected).\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 * Subscription to the order's WebSocket channel.\n * Handles real-time events: price recalculation, reload, promotions.\n * Call once on the client after the order is initialized.\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 // No realtime transport from the consumer — skip setting up the WS channel.\n const resolvedRealtime = realtime?.get() ?? null\n if (!resolvedRealtime) return\n // Captured into a non-null const — otherwise narrowing doesn't reach nested closures.\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 // Guards against {id: undefined, token: undefined} — without this, the\n // subscription would go to `orders.undefined.undefined`, and any later\n // setOrderX call would then get a 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 if (channelName === state.currentChannelName) return\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 // Server-side price recalculation → authoritative /total + bonus\n // reconciliation against the fresh max_bonuses_payment. The debounce\n // merges a burst of events into a single pass. Reconcile is idempotent\n // (it skips apply if the amount is already correct), so this can't loop.\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 state.currentChannel.bind(ORDER_EVENTS.Reload, () => {\n events?.get()?.orderShouldBeReloaded({ order: cartStore.order })\n void refreshCart({ silent: true }).then(() => fetchTotal())\n })\n\n // Order was duplicated\n state.currentChannel.bind(ORDER_EVENTS.Repeated, () => {\n // no-op\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 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 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 // Subscribe when realtime is ready AND credentials exist.\n // watchEffect reacts to both — rt.isReady and cartStore.credentials.\n watchEffect(() => {\n if (rt.isReady.value) {\n subscribeToOrder()\n }\n })\n\n // Cleanup scope (unmount / HMR): unsubscribe + reset runtime state.\n // useOrderChannel can be called outside of setup (e.g. from onMounted in\n // app.vue) — onScopeDispose without an active scope throws a warning, so\n // we check first.\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/** Product data for display in the gate modal (shaped like a cart line). */\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 const restrictions = await sdk.products.getProductRestrictions(storeId, product.id, {\n city_id: cityId,\n })\n blocking = (restrictions ?? []).filter((item) => item.is_blocking)\n } catch (error) {\n // Fail open: don't block adding to cart because of a network error — the\n // server re-checks the restriction anyway at checkout. We log it so\n // flaky cases stay visible in diagnostics.\n logCartError({ scope: 'restrictions-check', context: { productId: product.id } }, error)\n return true\n }\n\n if (!blocking.length) return true\n\n // One gate at a time: if the modal is already open for a different product,\n // don't overwrite it (otherwise confirmBlocking would silently resolve\n // someone else's promise as \"cancel\").\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 * Cart lines visible to the customer: server quantity adjusted by the optimistic\n * delta. A single source for the list, footer, and highlighting — otherwise\n * checkout blocking, finding the blocking line, and the actual rendered list\n * could drift apart.\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"]}
@@ -163,7 +163,7 @@ function buildCssVariableMap(config) {
163
163
  "--zenky-accent-ink": mixColorsRgb(text, config.accent, 44),
164
164
  "--zenky-bg": bg,
165
165
  "--zenky-text": text,
166
- // Цвет текста поверх primary: ручная настройка или авто-контраст
166
+ // Text over primary: manual override or auto-contrast
167
167
  "--zenky-on-primary": config.onPrimary || getContrastColor(config.primary),
168
168
  "--zenky-on-accent": getContrastColor(config.accent),
169
169
  // Derived text shades
@@ -213,5 +213,5 @@ function useTheme(colorConfig, fontConfig) {
213
213
  }
214
214
 
215
215
  export { buildCssVariableMap, generatePrimaryShades, generateShades, useTheme };
216
- //# sourceMappingURL=chunk-4IFPVEO7.js.map
217
- //# sourceMappingURL=chunk-4IFPVEO7.js.map
216
+ //# sourceMappingURL=chunk-BUNI6MGH.js.map
217
+ //# sourceMappingURL=chunk-BUNI6MGH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/colors.ts","../src/theme/useTheme.ts"],"names":["p","q"],"mappings":"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","file":"chunk-BUNI6MGH.js","sourcesContent":["// Generates a color scale and CSS variables from a brand's base colors.\n// Pure HSL/RGB math — zero dependencies, zero Nuxt. Portable as-is.\n\nexport interface ThemeColorConfig {\n primary: string\n secondary: string\n accent: string\n background: string\n text: string\n success?: string\n danger?: string\n warning?: string\n info?: string\n /** Text color over the primary background. Computed automatically if not set. */\n onPrimary?: string\n headerBg?: string\n footerBg?: string\n footerText?: string\n footerTextMuted?: string\n}\n\ninterface HslColor {\n h: number\n s: number\n l: number\n}\n\nfunction hexToHsl(hex: string): HslColor {\n const clean = hex.replace('#', '')\n const r = parseInt(clean.substring(0, 2), 16) / 255\n const g = parseInt(clean.substring(2, 4), 16) / 255\n const b = parseInt(clean.substring(4, 6), 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n\n if (max === min) {\n return { h: 0, s: 0, l }\n }\n\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\n let h = 0\n\n if (max === r) {\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n } else if (max === g) {\n h = ((b - r) / d + 2) / 6\n } else {\n h = ((r - g) / d + 4) / 6\n }\n\n return { h, s, l }\n}\n\nfunction hslToHex(hsl: HslColor): string {\n const { h, s, l } = hsl\n\n if (s === 0) {\n const v = Math.round(l * 255)\n return `#${v.toString(16).padStart(2, '0').repeat(3)}`\n }\n\n const hue2rgb = (p: number, q: number, t: number): number => {\n let tt = t\n\n if (tt < 0) tt += 1\n if (tt > 1) tt -= 1\n if (tt < 1 / 6) return p + (q - p) * 6 * tt\n if (tt < 1 / 2) return q\n if (tt < 2 / 3) return p + (q - p) * (2 / 3 - tt) * 6\n\n return p\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n\n const r = Math.round(hue2rgb(p, q, h + 1 / 3) * 255)\n const g = Math.round(hue2rgb(p, q, h) * 255)\n const b = Math.round(hue2rgb(p, q, h - 1 / 3) * 255)\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`\n}\n\n// ---------------------------------------------------------------------------\n// Color utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Mix two hex colors in HSL space.\n * amount: 0 = pure hex1, 100 = pure hex2.\n */\nfunction mixColors(hex1: string, hex2: string, amount: number): string {\n const c1 = hexToHsl(hex1)\n const c2 = hexToHsl(hex2)\n const t = amount / 100\n\n // Handle achromatic mixing: if one color has no saturation,\n // inherit hue from the other\n let h: number\n if (c1.s === 0 && c2.s === 0) {\n h = 0\n } else if (c1.s === 0) {\n h = c2.h\n } else if (c2.s === 0) {\n h = c1.h\n } else {\n // Shortest path around the hue circle\n let dh = c2.h - c1.h\n if (dh > 0.5) dh -= 1\n if (dh < -0.5) dh += 1\n h = c1.h + dh * t\n if (h < 0) h += 1\n if (h > 1) h -= 1\n }\n\n return hslToHex({\n h,\n s: c1.s + (c2.s - c1.s) * t,\n l: c1.l + (c2.l - c1.l) * t,\n })\n}\n\n/**\n * Mix two hex colors in linear RGB space — matches CSS `linear-gradient` overlay behavior.\n * amount: 0 = pure hex1, 100 = pure hex2.\n */\nfunction mixColorsRgb(hex1: string, hex2: string, amount: number): string {\n const c1 = hex1.replace('#', '')\n const c2 = hex2.replace('#', '')\n const t = amount / 100\n\n const r1 = parseInt(c1.substring(0, 2), 16)\n const g1 = parseInt(c1.substring(2, 4), 16)\n const b1 = parseInt(c1.substring(4, 6), 16)\n const r2 = parseInt(c2.substring(0, 2), 16)\n const g2 = parseInt(c2.substring(2, 4), 16)\n const b2 = parseInt(c2.substring(4, 6), 16)\n\n const r = Math.round(r1 + (r2 - r1) * t)\n const g = Math.round(g1 + (g2 - g1) * t)\n const b = Math.round(b1 + (b2 - b1) * t)\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`\n}\n\n/**\n * Adjust lightness of a hex color by a relative percentage.\n * delta: -0.05 = 5% darker, +0.05 = 5% lighter.\n */\nfunction adjustLightness(hex: string, delta: number): string {\n const hsl = hexToHsl(hex)\n return hslToHex({\n h: hsl.h,\n s: hsl.s,\n l: Math.min(1, Math.max(0, hsl.l + delta)),\n })\n}\n\n/**\n * Returns a contrasting text color (white or dark) for a given background hex.\n * Uses relative luminance formula (WCAG).\n */\nfunction getContrastColor(hex: string): string {\n const clean = hex.replace('#', '')\n const r = parseInt(clean.substring(0, 2), 16) / 255\n const g = parseInt(clean.substring(2, 4), 16) / 255\n const b = parseInt(clean.substring(4, 6), 16) / 255\n\n // sRGB to linear\n const toLinear = (c: number): number =>\n c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n const luminance = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b)\n\n return luminance > 0.4 ? '#1a1a1a' : '#ffffff'\n}\n\n// ---------------------------------------------------------------------------\n// Primary shades\n// ---------------------------------------------------------------------------\n\nexport interface PrimaryShades {\n lightest: string\n lighter: string\n light: string\n base: string\n dark: string\n darker: string\n darkest: string\n tint: string\n tintHover: string\n tintPressed: string\n ink: string\n}\n\n/** Generic 11-step shade scale generator from a single hex color. */\nexport function generateShades(\n hex: string,\n bg: string = '#ffffff',\n text: string = '#000000'\n): PrimaryShades {\n return generatePrimaryShades(hex, bg, text)\n}\n\nexport function generatePrimaryShades(\n hex: string,\n bg: string = '#ffffff',\n text: string = '#000000'\n): PrimaryShades {\n const hsl = hexToHsl(hex)\n\n const clamp = (v: number): number => Math.min(1, Math.max(0, v))\n\n // For very dark colors (l < 0.15), dark shades go UP (lighten)\n // because you can't darken black — multiplying 0 by anything stays 0\n const isVeryDark = hsl.l < 0.15\n const dark = isVeryDark ? clamp(hsl.l + 0.12) : clamp(hsl.l * 0.85)\n const darker = isVeryDark ? clamp(hsl.l + 0.08) : clamp(hsl.l * 0.65)\n const darkest = isVeryDark ? clamp(hsl.l + 0.05) : clamp(hsl.l * 0.45)\n\n return {\n lightest: hslToHex({ h: hsl.h, s: hsl.s * 0.3, l: clamp(0.92) }),\n lighter: hslToHex({ h: hsl.h, s: hsl.s * 0.5, l: clamp(0.8) }),\n light: hslToHex({ h: hsl.h, s: hsl.s * 0.7, l: clamp(hsl.l + (1 - hsl.l) * 0.4) }),\n base: hex,\n dark: hslToHex({ h: hsl.h, s: hsl.s, l: dark }),\n darker: hslToHex({ h: hsl.h, s: hsl.s, l: darker }),\n darkest: hslToHex({ h: hsl.h, s: hsl.s, l: darkest }),\n tint: mixColorsRgb(bg, hex, 14),\n tintHover: mixColorsRgb(mixColorsRgb(bg, hex, 14), bg, 34),\n tintPressed: mixColorsRgb(bg, hex, 5),\n ink: mixColorsRgb(text, hex, 44),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build complete CSS variable map from core colors\n// ---------------------------------------------------------------------------\n\nexport function buildCssVariableMap(config: ThemeColorConfig): Record<string, string> {\n const bg = config.background\n const text = config.text\n const shades = generatePrimaryShades(config.primary, bg, text)\n const secondaryShades = generateShades(config.secondary, bg, text)\n\n const vars: Record<string, string> = {\n // Primary palette\n '--zenky-primary-lightest': shades.lightest,\n '--zenky-primary-lighter': shades.lighter,\n '--zenky-primary-light': shades.light,\n '--zenky-primary': shades.base,\n '--zenky-primary-dark': shades.dark,\n '--zenky-primary-darker': shades.darker,\n '--zenky-primary-darkest': shades.darkest,\n '--zenky-primary-tint': shades.tint,\n '--zenky-primary-tint-hover': shades.tintHover,\n '--zenky-primary-tint-pressed': shades.tintPressed,\n '--zenky-primary-ink': shades.ink,\n\n // Secondary palette\n '--zenky-secondary-lightest': secondaryShades.lightest,\n '--zenky-secondary-lighter': secondaryShades.lighter,\n '--zenky-secondary-light': secondaryShades.light,\n '--zenky-secondary': secondaryShades.base,\n '--zenky-secondary-dark': secondaryShades.dark,\n '--zenky-secondary-darker': secondaryShades.darker,\n '--zenky-secondary-darkest': secondaryShades.darkest,\n\n // Auto-contrast for secondary\n '--zenky-on-secondary': getContrastColor(config.secondary),\n\n // Accent\n '--zenky-accent': config.accent,\n '--zenky-accent-tint': mixColorsRgb(bg, config.accent, 14),\n '--zenky-accent-tint-hover': mixColorsRgb(mixColorsRgb(bg, config.accent, 14), bg, 34),\n '--zenky-accent-tint-pressed': mixColorsRgb(bg, config.accent, 5),\n '--zenky-accent-ink': mixColorsRgb(text, config.accent, 44),\n '--zenky-bg': bg,\n '--zenky-text': text,\n\n // Text over primary: manual override or auto-contrast\n '--zenky-on-primary': config.onPrimary || getContrastColor(config.primary),\n '--zenky-on-accent': getContrastColor(config.accent),\n\n // Derived text shades\n '--zenky-text-muted': mixColors(bg, text, 50),\n '--zenky-text-light': mixColors(bg, text, 35),\n\n // Derived borders\n '--zenky-border-light': mixColors(bg, text, 6),\n '--zenky-border': mixColors(bg, text, 12),\n '--zenky-border-strong': mixColors(bg, text, 35),\n\n // Derived surfaces\n '--zenky-surface-secondary': mixColors(bg, text, 5),\n '--zenky-surface-secondary-hover': mixColors(bg, text, 10),\n '--zenky-surface-active': mixColors(bg, config.primary, 8),\n '--zenky-surface-dark':\n getContrastColor(bg) === '#ffffff'\n ? adjustLightness(bg, 0.08)\n : adjustLightness(text, -0.1),\n '--zenky-control-active': mixColors(bg, text, 80),\n '--zenky-surface-elevated': adjustLightness(bg, 0.06),\n\n // Status (defaults if not provided)\n '--zenky-success': config.success ?? '#22c55e',\n '--zenky-danger': config.danger ?? '#ef4444',\n '--zenky-warning': config.warning ?? '#f59e0b',\n '--zenky-info': config.info ?? '#3b82f6',\n\n // Component semantic (auto-derived with optional overrides)\n '--zenky-header-bg': config.headerBg ?? adjustLightness(bg, -0.02),\n '--zenky-nav-bg': config.headerBg ?? adjustLightness(bg, -0.02),\n '--zenky-footer-bg': config.footerBg ?? adjustLightness(bg, -0.03),\n '--zenky-footer-text': config.footerText ?? mixColors(bg, text, 70),\n '--zenky-footer-text-muted': config.footerTextMuted ?? mixColors(bg, text, 40),\n }\n\n return vars\n}\n","import { computed, type ComputedRef } from 'vue'\n\nimport { buildCssVariableMap, type ThemeColorConfig } from './colors'\n\nexport interface FontConfig {\n family: string\n url: string\n}\n\nexport interface ThemeData {\n cssVariables: ComputedRef<Record<string, string>>\n fontFamily: ComputedRef<string | null>\n fontUrl: ComputedRef<string | null>\n}\n\n/** Theme CSS variables and font from color/font config. Injecting them into `<head>` is the app's job. */\nexport function useTheme(colorConfig: ThemeColorConfig, fontConfig: FontConfig): ThemeData {\n const cssVariables = computed<Record<string, string>>(() => {\n const vars = buildCssVariableMap(colorConfig)\n\n if (fontConfig.family) {\n const stack = `'${fontConfig.family}', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif`\n vars['--zenky-font-sans'] = stack\n }\n\n return vars\n })\n\n const fontFamily = computed<string | null>(() => fontConfig.family || null)\n const fontUrl = computed<string | null>(() => fontConfig.url || null)\n\n return {\n cssVariables,\n fontFamily,\n fontUrl,\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { useStoreProfileStore } from './chunk-VFMVQR6Y.js';
1
+ import { useStoreProfileStore } from './chunk-QZ3S3NN3.js';
2
2
  import { defineStore, storeToRefs } from 'pinia';
3
3
  import { ref, computed } from 'vue';
4
4
 
@@ -34,5 +34,5 @@ function useStorefrontProfile() {
34
34
  }
35
35
 
36
36
  export { useProductsStore, useStore, useStorefrontProfile };
37
- //# sourceMappingURL=chunk-PTMSPB34.js.map
38
- //# sourceMappingURL=chunk-PTMSPB34.js.map
37
+ //# sourceMappingURL=chunk-FXKG5TFQ.js.map
38
+ //# sourceMappingURL=chunk-FXKG5TFQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/products.ts","../src/stores/useStore.ts","../src/stores/useStorefrontProfile.ts"],"names":["computed"],"mappings":";;;;AAaO,IAAM,gBAAA,GAAmB,WAAA,CAAY,gBAAA,EAAkB,MAAqB;AAC/E,EAAA,MAAM,QAAA,GAAW,GAAA,CAAe,EAAE,CAAA;AAElC,EAAA,SAAS,YAAY,IAAA,EAAuB;AACxC,IAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,EACrB;AAEA,EAAA,MAAM,cAAc,QAAA,CAAS,MAAM,QAAA,CAAS,KAAA,CAAM,SAAS,CAAC,CAAA;AAE5D,EAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,WAAA,EAAY;AAChD,CAAC;AChBM,SAAS,QAAA,GAId;AACE,EAAA,MAAM,eAAe,oBAAA,EAAqB;AAE1C,EAAA,OAAO;AAAA,IACH,KAAA,EAAOA,QAAAA,CAAS,MAAM,YAAA,CAAa,KAAM,CAAA;AAAA,IACzC,IAAA,EAAMA,QAAAA,CAAS,MAAM,YAAA,CAAa,IAAK,CAAA;AAAA,IACvC,KAAA,EAAOA,QAAAA,CAAS,MAAM,YAAA,CAAa,KAAK;AAAA,GAC5C;AACJ;ACdO,SAAS,oBAAA,GAAuB;AACnC,EAAA,MAAM,eAAe,oBAAA,EAAqB;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,UAAA,EAAW,GAAI,YAAY,YAAY,CAAA;AAEnE,EAAA,MAAM,OAAA,GAAUA,QAAAA,CAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AACnD,EAAA,MAAM,QAAA,GAAWA,QAAAA,CAAS,MAAM,YAAA,CAAa,QAAQ,CAAA;AAErD,EAAA,OAAO;AAAA,IACH,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACJ;AACJ","file":"chunk-FXKG5TFQ.js","sourcesContent":["import { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { Product } from '@zenky/storefront-api'\n\n// Explicit return type — keeps `Product` as a named reference in the .d.ts instead of expanding it.\nexport interface ProductsStore {\n products: Ref<Product[]>\n setProducts: (list: Product[]) => void\n hasProducts: ComputedRef<boolean>\n}\n\n// Products live in this store, but it's populated from the catalog, not from a separate API call.\nexport const useProductsStore = defineStore('zenky-products', (): ProductsStore => {\n const products = ref<Product[]>([])\n\n function setProducts(list: Product[]): void {\n products.value = list\n }\n\n const hasProducts = computed(() => products.value.length > 0)\n\n return { products, setProducts, hasProducts }\n})\n","import { computed, type ComputedRef } from 'vue'\n\nimport type { City, Stock, Store } from '@zenky/storefront-api'\n\nimport { useStoreProfileStore } from './store-profile'\n\n/** Accessor for the loaded store/city/stock (store/city are guaranteed to be loaded). */\nexport function useStore(): {\n store: ComputedRef<Store>\n city: ComputedRef<City>\n stock: ComputedRef<Stock | null>\n} {\n const profileStore = useStoreProfileStore()\n\n return {\n store: computed(() => profileStore.store!),\n city: computed(() => profileStore.city!),\n stock: computed(() => profileStore.stock),\n }\n}\n","import { storeToRefs } from 'pinia'\nimport { computed } from 'vue'\n\nimport { useStoreProfileStore } from './store-profile'\n\nexport function useStorefrontProfile() {\n const profileStore = useStoreProfileStore()\n const { store, city, stock, categories } = storeToRefs(profileStore)\n\n const isReady = computed(() => profileStore.isReady)\n const hasStock = computed(() => profileStore.hasStock)\n\n return {\n store,\n city,\n stock,\n categories,\n isReady,\n hasStock,\n }\n}\n"]}
@@ -40,5 +40,5 @@ function createMemoryStorage() {
40
40
  }
41
41
 
42
42
  export { KEY_MESSAGE_FORMATTER, NOOP_ACTIVITY_REPORTER, NOOP_NOTIFIER, NOOP_RUM, createMemoryStorage, err, ok };
43
- //# sourceMappingURL=chunk-MOG6UMFM.js.map
44
- //# sourceMappingURL=chunk-MOG6UMFM.js.map
43
+ //# sourceMappingURL=chunk-GILJFP55.js.map
44
+ //# sourceMappingURL=chunk-GILJFP55.js.map