@zenky/storefront-vue 0.10.13 → 0.10.14
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.
package/CHANGELOG.md
CHANGED
|
@@ -117,14 +117,11 @@ All notable changes to this project are documented in this file. The format foll
|
|
|
117
117
|
|
|
118
118
|
### Fixed
|
|
119
119
|
|
|
120
|
-
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
order id/token cookie previously survived untouched, so every later checkout on
|
|
126
|
-
that browser kept hitting the same broken order. Mirrors the unconditional clear
|
|
127
|
-
`useCartOperations.refreshCart()` already does on its own failed `getOrder()`.
|
|
120
|
+
- Deleting an account (or logging out) now clears and reinitializes the cart if the
|
|
121
|
+
post-logout refresh confirms the order is broken server-side, instead of leaving it
|
|
122
|
+
pointed at an order the backend can no longer serve. `useCartCustomerAttachment` takes
|
|
123
|
+
an optional `clearAndResetCart` param for this — omit it and it falls back to clearing
|
|
124
|
+
credentials only, same as before.
|
|
128
125
|
- `authFlow.goToReset()` no longer confuses the resend timer between phone numbers.
|
|
129
126
|
`resendTimerEndsAt`/`codeContext` are shared, request-scoped refs, and were only
|
|
130
127
|
cleared by a full `reset()` — checking a second phone number after abandoning a
|
package/dist/cart/index.d.ts
CHANGED
|
@@ -438,8 +438,10 @@ declare function useCustomerAttach(cache: AttachedCustomerCache): CustomerAttach
|
|
|
438
438
|
* no toast needed, this is a silent sync.
|
|
439
439
|
*
|
|
440
440
|
* @param cache client-local customer cache (implemented by the consumer — localStorage).
|
|
441
|
+
* @param clearAndResetCart same function `useStorefrontCart()` exposes. Optional — omit
|
|
442
|
+
* to fall back to a credentials-only clear (no reinit).
|
|
441
443
|
*/
|
|
442
|
-
declare function useCartCustomerAttachment(cache: AttachedCustomerCache): void;
|
|
444
|
+
declare function useCartCustomerAttachment(cache: AttachedCustomerCache, clearAndResetCart?: () => void): void;
|
|
443
445
|
|
|
444
446
|
interface CartStockWatcher {
|
|
445
447
|
/**
|
package/dist/cart/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey } from '../chunk-
|
|
1
|
+
export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey } from '../chunk-KQBNLJLQ.js';
|
|
2
2
|
export { useCartCredentials } from '../chunk-W43D7JYV.js';
|
|
3
3
|
import '../chunk-5QCUH3FF.js';
|
|
4
4
|
export { getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getValidationErrors, logCartError } from '../chunk-TE42OCFK.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCartCredentials, usePromotionsChecker } from './chunk-W43D7JYV.js';
|
|
2
2
|
import { createRuntimeState } from './chunk-5QCUH3FF.js';
|
|
3
|
-
import { logCartError, getCartErrorCode, getCartErrorMessage } from './chunk-TE42OCFK.js';
|
|
3
|
+
import { logCartError, getCartErrorHttpCode, getCartErrorCode, getCartErrorMessage } from './chunk-TE42OCFK.js';
|
|
4
4
|
import { useCartStore, useOrderSettingsStore, usePromotionsStore } from './chunk-TE2QPH74.js';
|
|
5
5
|
import { useCatalogStore } from './chunk-NSOIL7PW.js';
|
|
6
6
|
import { useRuntime, useAuthStore } from './chunk-WTZXTBF6.js';
|
|
@@ -425,9 +425,13 @@ function useCartInitialization(credentials, sdk) {
|
|
|
425
425
|
runtime.rum?.measure(RUM_METRIC_CART_INIT, RUM_MARK_CART_INIT);
|
|
426
426
|
}
|
|
427
427
|
}
|
|
428
|
-
function initializeOrder() {
|
|
429
|
-
if (cartStore.hasOrder) return
|
|
430
|
-
if (state.promise !== null)
|
|
428
|
+
async function initializeOrder() {
|
|
429
|
+
if (cartStore.hasOrder) return;
|
|
430
|
+
if (state.promise !== null) {
|
|
431
|
+
await state.promise;
|
|
432
|
+
if (!cartStore.hasOrder) return initializeOrder();
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
431
435
|
state.promise = _doInitialize().finally(() => {
|
|
432
436
|
state.promise = null;
|
|
433
437
|
});
|
|
@@ -769,7 +773,7 @@ function normalizePhone(phone) {
|
|
|
769
773
|
const digits = phone.replace(/\D/g, "");
|
|
770
774
|
return digits || null;
|
|
771
775
|
}
|
|
772
|
-
function useCartCustomerAttachment(cache) {
|
|
776
|
+
function useCartCustomerAttachment(cache, clearAndResetCart) {
|
|
773
777
|
const { sdk, notifier, messages } = useRuntime();
|
|
774
778
|
const authStore = useAuthStore();
|
|
775
779
|
const cartStore = useCartStore();
|
|
@@ -840,8 +844,14 @@ function useCartCustomerAttachment(cache) {
|
|
|
840
844
|
);
|
|
841
845
|
if (authStore.isAuthenticated) return;
|
|
842
846
|
if (cartStore.order?.id !== requestedOrderId) return;
|
|
843
|
-
|
|
844
|
-
|
|
847
|
+
if (getCartErrorHttpCode(e) === void 0) return;
|
|
848
|
+
cache.clear();
|
|
849
|
+
if (clearAndResetCart) {
|
|
850
|
+
clearAndResetCart();
|
|
851
|
+
} else {
|
|
852
|
+
cartStore.clearCart();
|
|
853
|
+
cartCredentials.clearPersistedCredentials();
|
|
854
|
+
}
|
|
845
855
|
}
|
|
846
856
|
}
|
|
847
857
|
watch(
|
|
@@ -1119,6 +1129,7 @@ function useOrderPromocode(deps = {}) {
|
|
|
1119
1129
|
},
|
|
1120
1130
|
e
|
|
1121
1131
|
);
|
|
1132
|
+
throw e;
|
|
1122
1133
|
}
|
|
1123
1134
|
}
|
|
1124
1135
|
async function apply(code) {
|
|
@@ -1924,5 +1935,5 @@ function useVisibleCartVariants() {
|
|
|
1924
1935
|
}
|
|
1925
1936
|
|
|
1926
1937
|
export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey };
|
|
1927
|
-
//# sourceMappingURL=chunk-
|
|
1928
|
-
//# sourceMappingURL=chunk-
|
|
1938
|
+
//# sourceMappingURL=chunk-KQBNLJLQ.js.map
|
|
1939
|
+
//# sourceMappingURL=chunk-KQBNLJLQ.js.map
|
|
@@ -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/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-KQBNLJLQ.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 * 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 async function initializeOrder(): Promise<void> {\n if (cartStore.hasOrder) return\n\n if (state.promise !== null) {\n await state.promise\n\n // The order we piggybacked on may have been cleared mid-flight (e.g. by\n // `clearAndResetCart()`) — retry instead of reporting false success.\n if (!cartStore.hasOrder) return initializeOrder()\n\n return\n }\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 { getCartErrorHttpCode, 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 * @param clearAndResetCart same function `useStorefrontCart()` exposes. Optional — omit\n * to fall back to a credentials-only clear (no reinit).\n */\nexport function useCartCustomerAttachment(\n cache: AttachedCustomerCache,\n clearAndResetCart?: () => void\n): 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 // The user managed to log in / switch orders while this was in flight — the\n // order this failure is about no longer matters, leave current state alone.\n if (authStore.isAuthenticated) return\n if (cartStore.order?.id !== requestedOrderId) return\n\n // Only clear on a confirmed backend response — a network failure has no\n // `http_code` and shouldn't cost the user their cart over a one-off blip.\n if (getCartErrorHttpCode(e) === undefined) return\n\n cache.clear()\n\n if (clearAndResetCart) {\n clearAndResetCart()\n } else {\n cartStore.clearCart()\n cartCredentials.clearPersistedCredentials()\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 throw e\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 { toRequestedMethod, type SelectableConfirmationChannel } from '../auth/types'\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 /**\n * Resend the code (with backoff — the UI is responsible for that).\n * `channel` re-requests a specific one; omitted reuses the current.\n */\n resendCode: (channel?: SelectableConfirmationChannel) => 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(channel?: SelectableConfirmationChannel): 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 method = toRequestedMethod(channel)\n return await sdk.orders.resendOrderConfirmationCode(\n storeId,\n orderCredentials,\n method ? { method } : undefined\n )\n } catch (e) {\n logCartError(\n {\n scope: 'checkout-resend-code',\n context: { orderId: cartStore.credentials?.id, channel: channel ?? null },\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"]}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export { canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductDetail, useProductList, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from './chunk-6FVXAF7L.js';
|
|
2
2
|
export { normalizeSnippets } from './chunk-GLQXTMVW.js';
|
|
3
|
-
export { RESEND_TIMER_SECONDS, useAuthFlowStore, useProductsStore, useStore, useStorefrontProfile } from './chunk-LUJSF6V7.js';
|
|
4
3
|
export { buildCssVariableMap, generatePrimaryShades, generateShades, useTheme } from './chunk-BUNI6MGH.js';
|
|
4
|
+
export { RESEND_TIMER_SECONDS, useAuthFlowStore, useProductsStore, useStore, useStorefrontProfile } from './chunk-LUJSF6V7.js';
|
|
5
5
|
export { buildQrCodeUrl, createOperationChain, formatAddressCityLast, formatDate, formatDateTime, formatPhoneNational, formatPhoneSpaced, formatScheduleStatus, getApiErrorMessage, getApiFieldErrors, getEmailLink, getPhoneTelLink, getSocialLinks, getTodayInfo, getWebsiteLink, getWeeklySchedule, groupScheduleDays, pluralize, toDateInputValue, todayInTimezone } from './chunk-RURXGVWW.js';
|
|
6
6
|
export { createDebounce } from './chunk-XUGXLJZB.js';
|
|
7
7
|
import './chunk-EMGQXBU3.js';
|
|
8
8
|
import './chunk-5B2P5W3E.js';
|
|
9
|
-
export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey } from './chunk-
|
|
9
|
+
export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey } from './chunk-KQBNLJLQ.js';
|
|
10
10
|
export { useCartCredentials } from './chunk-W43D7JYV.js';
|
|
11
11
|
import './chunk-5QCUH3FF.js';
|
|
12
12
|
export { getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getValidationErrors, logCartError } from './chunk-TE42OCFK.js';
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cart/constants.ts","../src/cart/normalizeAddress.ts","../src/cart/cartLineKey.ts","../src/cart/buildMainPaymentRequest.ts","../src/cart/cashChangePresets.ts","../src/cart/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-5P42ZPIC.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 * 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 // The user managed to log in / switch orders while this was in flight — the\n // order this failure is about no longer matters, leave current state alone.\n if (authStore.isAuthenticated) return\n if (cartStore.order?.id !== requestedOrderId) return\n\n // Same as `refreshCart()` — a broken order (most commonly its customer was\n // deleted server-side) fails every future lookup the same way. Clear it instead\n // of leaving the id/token cookie pointed at something the backend can't serve.\n cartStore.clearCart()\n cartCredentials.clearPersistedCredentials()\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 { toRequestedMethod, type SelectableConfirmationChannel } from '../auth/types'\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 /**\n * Resend the code (with backoff — the UI is responsible for that).\n * `channel` re-requests a specific one; omitted reuses the current.\n */\n resendCode: (channel?: SelectableConfirmationChannel) => 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(channel?: SelectableConfirmationChannel): 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 method = toRequestedMethod(channel)\n return await sdk.orders.resendOrderConfirmationCode(\n storeId,\n orderCredentials,\n method ? { method } : undefined\n )\n } catch (e) {\n logCartError(\n {\n scope: 'checkout-resend-code',\n context: { orderId: cartStore.credentials?.id, channel: channel ?? null },\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"]}
|