@zenky/storefront-vue 0.10.10 → 0.10.12
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 +139 -0
- package/README.md +1 -1
- package/dist/auth/index.d.ts +14 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cart/index.d.ts +4 -28
- package/dist/cart/index.js +9 -6
- package/dist/chunk-5B2P5W3E.js +20 -0
- package/dist/chunk-5B2P5W3E.js.map +1 -0
- package/dist/{chunk-32SLDGE5.js → chunk-6FVXAF7L.js} +4 -3
- package/dist/chunk-6FVXAF7L.js.map +1 -0
- package/dist/{chunk-4UMDIBW5.js → chunk-EM6H5WFS.js} +19 -110
- package/dist/chunk-EM6H5WFS.js.map +1 -0
- package/dist/chunk-IOYYCA75.js +52 -0
- package/dist/chunk-IOYYCA75.js.map +1 -0
- package/dist/chunk-LUJSF6V7.js +530 -0
- package/dist/chunk-LUJSF6V7.js.map +1 -0
- package/dist/{chunk-GXDTRTUT.js → chunk-RURXGVWW.js} +35 -6
- package/dist/chunk-RURXGVWW.js.map +1 -0
- package/dist/{chunk-XULHV6SS.js → chunk-TE2QPH74.js} +3 -3
- package/dist/{chunk-XULHV6SS.js.map → chunk-TE2QPH74.js.map} +1 -1
- package/dist/chunk-TE42OCFK.js +102 -0
- package/dist/chunk-TE42OCFK.js.map +1 -0
- package/dist/chunk-TIQ7AJLY.js +52 -0
- package/dist/chunk-TIQ7AJLY.js.map +1 -0
- package/dist/{chunk-GILJFP55.js → chunk-VTZYJ6OZ.js} +2 -2
- package/dist/chunk-VTZYJ6OZ.js.map +1 -0
- package/dist/{chunk-46FNHMWC.js → chunk-W43D7JYV.js} +5 -4
- package/dist/chunk-W43D7JYV.js.map +1 -0
- package/dist/{chunk-QZ3S3NN3.js → chunk-WTZXTBF6.js} +3 -47
- package/dist/chunk-WTZXTBF6.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +15 -11
- package/dist/ports/index.d.ts +1 -1
- package/dist/ports/index.js +1 -1
- package/dist/products/index.js +3 -2
- package/dist/promotions/index.js +4 -3
- package/dist/seo/index.js +5 -4
- package/dist/seo/index.js.map +1 -1
- package/dist/stores/index.d.ts +56 -1
- package/dist/stores/index.js +7 -3
- package/dist/types-CXm2F6Hz.d.ts +55 -0
- package/dist/useCheckoutSubmit-C934F26-.d.ts +34 -0
- package/dist/utils/index.d.ts +6 -1
- package/dist/utils/index.js +1 -1
- package/docs/architecture.md +79 -3
- package/package.json +7 -3
- package/dist/chunk-32SLDGE5.js.map +0 -1
- package/dist/chunk-46FNHMWC.js.map +0 -1
- package/dist/chunk-4UMDIBW5.js.map +0 -1
- package/dist/chunk-FXKG5TFQ.js +0 -38
- package/dist/chunk-FXKG5TFQ.js.map +0 -1
- package/dist/chunk-GILJFP55.js.map +0 -1
- package/dist/chunk-GXDTRTUT.js.map +0 -1
- package/dist/chunk-QZ3S3NN3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stores/products.ts","../src/stores/authFlow.ts","../src/stores/useStore.ts","../src/stores/useStorefrontProfile.ts"],"names":["defineStore","ref","computed"],"mappings":"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","file":"chunk-LUJSF6V7.js","sourcesContent":["import { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { Product } from '@zenky/storefront-api'\n\n// Explicit return type — keeps `Product` as a named reference in the .d.ts instead of expanding it.\nexport interface ProductsStore {\n products: Ref<Product[]>\n setProducts: (list: Product[]) => void\n hasProducts: ComputedRef<boolean>\n}\n\n// Products live in this store, but it's populated from the catalog, not from a separate API call.\nexport const useProductsStore = defineStore('zenky-products', (): ProductsStore => {\n const products = ref<Product[]>([])\n\n function setProducts(list: Product[]): void {\n products.value = list\n }\n\n const hasProducts = computed(() => products.value.length > 0)\n\n return { products, setProducts, hasProducts }\n})\n","import { RecaptchaAction } from '@zenky/storefront-api'\n\nimport type { RequestedConfirmationMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { customRef, ref, type ComputedRef, type Ref } from 'vue'\n\nimport { useAvailableConfirmationChannels } from '../auth/useAvailableConfirmationChannels'\nimport {\n AUTH_STEP,\n CHANNEL_INTENT,\n CODE_CONTEXT,\n CONFIRMATION_CHANNEL,\n toConfirmationChannel,\n toRequestedMethod,\n type AuthStep,\n type ChannelIntent,\n type CodeContext,\n type ConfirmationChannel,\n type SelectableConfirmationChannel,\n} from '../auth/types'\n// Тот же провайдер и error-парсинг, что уже использует useCheckoutSubmit — не дублируем.\n// getCartErrorMessage (в отличие от старой локальной версии) никогда не пропускает наружу\n// сырой e.message для не-ZenkyError — только `fallback`.\nimport {\n getCartErrorCode,\n getCartErrorMessage,\n getValidationErrors,\n logCartError,\n} from '../cart/logCartError'\nimport type { RecaptchaPayloadProvider } from '../cart/useCheckoutSubmit'\nimport type { StorefrontMessageKey } from '../ports'\nimport { useRuntime } from '../ports/runtime'\nimport { useAuthStore } from './auth'\nimport { useStoreProfileStore } from './store-profile'\n\nconst RESEND_TIMER_SECONDS = 60\nexport { RESEND_TIMER_SECONDS }\n\nconst AUTH_ERROR_CODE = {\n ConfirmationRequired: 'auth.registration.confirmation_required',\n InvalidCode: 'auth.confirmation.invalid_code',\n InvalidRegistrationCode: 'auth.registration.invalid_confirmation_code',\n InvalidResetCode: 'auth.password_reset.invalid_code',\n ExpiredCode: 'auth.confirmation.expired_code',\n OtpRequestFailed: 'auth.otp_request.failed',\n} as const\n\n// Named return type (the dts rule).\nexport interface AuthFlowStore {\n currentStep: Ref<AuthStep>\n phone: Ref<string>\n countryCode: Ref<string>\n loading: Ref<boolean>\n error: Ref<string | null>\n fieldErrors: Ref<Record<string, string[]>>\n codeContext: Ref<CodeContext>\n confirmationMethod: Ref<ConfirmationChannel | null>\n /** Какой flow привёл на AUTH_STEP.Channel — публичное, часть $state (SSR-гидратируется). */\n channelIntent: Ref<ChannelIntent | null>\n /**\n * Канал, на котором последний раз получили `auth.otp_request.failed`. UI может\n * скрыть/задизейблить эту кнопку на повторном показе Channel — бэк уже отказал,\n * выбор того же канала снова даст ту же ошибку.\n */\n lastFailedChannel: Ref<SelectableConfirmationChannel | null>\n resetCode: Ref<string>\n registerCode: Ref<string>\n resendTimerEndsAt: Ref<number>\n pendingPassword: Ref<string>\n availableChannels: ComputedRef<SelectableConfirmationChannel[]>\n checkPhone: (getRecaptchaPayload: RecaptchaPayloadProvider) => Promise<void>\n /**\n * @returns true — токен получен, флоу завершён. false — либо ошибка (см. `error`),\n * либо телефон зарегистрирован, но не подтверждён: код уже отправлен и `currentStep`\n * ушёл на Code/Channel — в этом случае `error` пустой, это не сбой.\n */\n login: (password: string, getRecaptchaPayload: RecaptchaPayloadProvider) => Promise<boolean>\n /** @returns true — токен получен (сразу или через login-fallback при 0 каналах), false — код отправлен / ошибка / шаг выбора канала */\n register: (password: string, getRecaptchaPayload: RecaptchaPayloadProvider) => Promise<boolean>\n confirmRegistration: (code: string, password?: string) => Promise<boolean>\n resendCode: (getRecaptchaPayload: RecaptchaPayloadProvider) => Promise<number>\n dispatchReset: (getRecaptchaPayload: RecaptchaPayloadProvider) => Promise<void>\n resetPassword: (code: string, password: string) => Promise<boolean>\n selectChannel: (\n channel: SelectableConfirmationChannel,\n getRecaptchaPayload: RecaptchaPayloadProvider\n ) => Promise<boolean>\n /** Сбрасывает выбранный канал перед ручным resend — иначе гейт сработает только один раз. */\n changeChannel: () => void\n goToChannelBack: () => void\n goToReset: () => void\n goToPhone: () => void\n goToMethod: () => void\n goToLogin: () => void\n goToNewPassword: (code: string) => void\n goToResetCode: () => void\n goToRegisterPassword: (code: string) => void\n goToRegisterCode: () => void\n reset: () => void\n}\n\nexport const useAuthFlowStore = defineStore('zenky-auth-flow', (): AuthFlowStore => {\n const { sdk, notifier, messages } = useRuntime()\n const authStore = useAuthStore()\n const profileStore = useStoreProfileStore()\n\n const currentStep = ref<AuthStep>(AUTH_STEP.Phone)\n const phone = invalidatingRef('')\n const countryCode = invalidatingRef('RU')\n const loading = ref(false)\n const error = ref<string | null>(null)\n const codeContext = ref<CodeContext>(CODE_CONTEXT.Register)\n const confirmationMethod = ref<ConfirmationChannel | null>(null)\n const resetCode = ref('')\n const registerCode = ref('')\n const resendTimerEndsAt = ref(0)\n const fieldErrors = ref<Record<string, string[]>>({})\n const pendingPassword = ref('')\n const channelIntent = ref<ChannelIntent | null>(null)\n const lastFailedChannel = ref<SelectableConfirmationChannel | null>(null)\n\n /**\n * Race-condition guard. Каждый top-level вызов получает свою ревизию через\n * `beginOperation()`; после каждого `await` функция проверяет `isStale(revision)`\n * перед тем как трогать state. Более поздний вызов инкрементирует счётчик и тем\n * самым «протухает» всё, что было запущено раньше, — их ответы дописывают в никуда.\n *\n * Вложенные вызовы (checkPhone/login → resendCode, register → login, selectChannel\n * → register/resendCode/dispatchReset) — продолжение той же попытки, не новая:\n * родитель передаёт им свою ревизию третьим (необязательным) параметром вместо\n * `beginOperation()`, иначе инвалидировал бы сам себя. Параметр — деталь реализации,\n * в публичном `AuthFlowStore` его нет.\n */\n const operationRevision = ref(0)\n\n function invalidatePendingOperation(): void {\n operationRevision.value += 1\n }\n\n /**\n * Инвалидирует то, что в полёте, и синхронно гасит `loading` — не полагается на то,\n * что «следующая строка» его переустановит, потому что у большинства действий между\n * вызовом этой функции и реальным `loading.value = true` есть ранние `return`\n * (channel-гейт, отсутствие `storeId`), после которых до запроса дело не доходит.\n * Действие, которое реально запрашивает, выставляет `loading` обратно в `true`\n * следующей строкой — без `await` между ними, так что снаружи это один переход.\n */\n function beginOperation(): number {\n invalidatePendingOperation()\n loading.value = false\n return operationRevision.value\n }\n\n /** То же, что `beginOperation()` — новая операция не начинается, только отмена (Back/`reset()`/`changeChannel()`). Отдельное имя для читаемости на месте вызова. */\n function cancelPendingOperation(): void {\n beginOperation()\n }\n\n function isStale(revision: number): boolean {\n return revision !== operationRevision.value\n }\n\n /**\n * Ref, прямая запись в который отменяет pending-операцию, как `cancelPendingOperation()`,\n * но без явного вызова действия. `phone`/`countryCode` обычно v-model'ятся на инпут\n * напрямую — пользователь может отредактировать поле, пока предыдущий checkPhone/\n * login/register ждёт ответ, минуя все action'ы стора, и revision этого не увидит.\n * Публичный тип остаётся `Ref<T>` — `v-model` работает без изменений.\n */\n function invalidatingRef<T>(initial: T): Ref<T> {\n let value = initial\n return customRef<T>((track, trigger) => ({\n get() {\n track()\n return value\n },\n set(newValue) {\n if (newValue === value) return\n value = newValue\n cancelPendingOperation()\n trigger()\n },\n }))\n }\n\n const availableChannels = useAvailableConfirmationChannels()\n\n /**\n * `ConfirmationChannel` шире, чем `RequestedConfirmationMethod` (см. auth/types.ts).\n * Явный выбор > единственный доступный канал > undefined (бэк дефолтит на sms).\n */\n function resolveOutgoingMethod(): RequestedConfirmationMethod | undefined {\n const channel =\n confirmationMethod.value ??\n (availableChannels.value.length === 1 ? availableChannels.value[0] : undefined)\n return toRequestedMethod(channel)\n }\n\n function getStoreId(): string | null {\n return profileStore.store?.id ?? null\n }\n\n function phoneRequest(): { number: string; country: string } {\n return { number: phone.value, country: countryCode.value }\n }\n\n function clearError(): void {\n error.value = null\n fieldErrors.value = {}\n }\n\n // 422 validation: сообщение → notifier, per-field ошибки → inline под полем.\n // Прочие ошибки → один inline `error`. Обёртка над логированием — каждый catch\n // передаёт свой scope, чтобы в логе было видно, какой именно вызов упал. `fallbackKey` —\n // ключ messages-порта, не готовая строка: текст/локаль остаются на стороне потребителя.\n function handleAuthError(e: unknown, fallbackKey: StorefrontMessageKey, scope: string): void {\n logCartError({ scope: `auth-${scope}`, context: { step: currentStep.value } }, e)\n\n const fallback = messages.format(fallbackKey)\n const validationErrors = getValidationErrors(e)\n if (Object.keys(validationErrors).length > 0) {\n notifier.error(getCartErrorMessage(e, fallback))\n fieldErrors.value = validationErrors\n return\n }\n\n error.value = getCartErrorMessage(e, fallback)\n }\n\n /**\n * `true` = ошибку обработали (вернули на Channel), вызывающий код НЕ должен\n * звать handleAuthError следом. Логирует сама — это альтернативная ветка\n * обработки, не проходит через handleAuthError.\n *\n * `attemptedChannel` — снэпшот `confirmationMethod.value`, взятый вызывающей\n * функцией ДО await (как и `phoneSnapshot`/`method` для самого запроса), а не\n * прочитанный здесь заново. Мы уже внутри catch, то есть после как минимум одного\n * await — если бы читали `confirmationMethod.value` живьём, унаследованное от\n * ПОЗЖЕ выбранного канала (или сброшенное `changeChannel()`) значение записалось\n * бы как «упавший канал» для запроса, который на деле пытался другой.\n */\n function handleOtpDispatchError(\n e: unknown,\n intent: ChannelIntent,\n scope: string,\n attemptedChannel: ConfirmationChannel | null\n ): boolean {\n if (\n getCartErrorCode(e) === AUTH_ERROR_CODE.OtpRequestFailed &&\n availableChannels.value.length >= 2\n ) {\n logCartError({ scope: `auth-${scope}`, context: { step: currentStep.value } }, e)\n // Call — легаси, response-only (см. auth/types.ts) — никогда не выбирается\n // явно и не показывается ни в одной кнопке. Если унаследованный snapshot\n // всё же Call (бэк звонил вместо реальной отправки на предыдущем успешном\n // dispatch), запоминать его как «упавший канал» бессмысленно.\n lastFailedChannel.value =\n attemptedChannel && attemptedChannel !== CONFIRMATION_CHANNEL.Call\n ? attemptedChannel\n : null\n confirmationMethod.value = null\n error.value = messages.format('auth.otpUnavailable')\n channelIntent.value = intent\n currentStep.value = AUTH_STEP.Channel\n return true\n }\n return false\n }\n\n /**\n * Сбрасывает выбранный канал — следующий register/resendCode/dispatchReset снова\n * спросит. Инвалидирует pending-операцию — если предыдущий dispatch ещё не ответил,\n * его успешный ответ (`confirmationMethod.value = toConfirmationChannel(result.method)`)\n * иначе воскресил бы канал, который пользователь только что явно сбросил.\n */\n function changeChannel(): void {\n cancelPendingOperation()\n confirmationMethod.value = null\n lastFailedChannel.value = null\n }\n\n function reset(): void {\n cancelPendingOperation()\n currentStep.value = AUTH_STEP.Phone\n phone.value = ''\n countryCode.value = 'RU'\n error.value = null\n fieldErrors.value = {}\n codeContext.value = CODE_CONTEXT.Register\n confirmationMethod.value = null\n resetCode.value = ''\n registerCode.value = ''\n resendTimerEndsAt.value = 0\n pendingPassword.value = ''\n channelIntent.value = null\n lastFailedChannel.value = null\n }\n\n async function checkPhone(getRecaptchaPayload: RecaptchaPayloadProvider): Promise<void> {\n // Новая попытка проверки телефона — самая частая точка входа, всегда top-level:\n // инвалидирует любую предыдущую попытку (для этого же номера или для другого,\n // если пользователь успел вернуться на Phone и ввести новый).\n const revision = beginOperation()\n clearError()\n // checkPhone — единственная точка входа в flow для номера телефона. Сбрасываем\n // весь phone-scoped state: без этого попытка для номера A (выбранный канал,\n // pending-пароль, таймер, intent, коды) утекала бы в проверку номера B — например,\n // canal/пароль, выбранные для A, автоматически применились бы к B, минуя picker.\n codeContext.value = CODE_CONTEXT.Register\n resendTimerEndsAt.value = 0\n confirmationMethod.value = null\n lastFailedChannel.value = null\n pendingPassword.value = ''\n channelIntent.value = null\n resetCode.value = ''\n registerCode.value = ''\n\n const storeId = getStoreId()\n if (!storeId) return\n\n // Снэпшот номера — берём то, что было введено на момент вызова, а не то, что\n // окажется в phone.value/countryCode.value к моменту, когда SDK ответит.\n const phoneSnapshot = phoneRequest()\n loading.value = true\n\n try {\n const result = await sdk.auth.checkPhone(storeId, { phone: phoneSnapshot })\n if (isStale(revision)) return\n\n if (result.registered && result.confirmed) {\n currentStep.value = AUTH_STEP.Login\n } else if (result.registered && !result.confirmed) {\n // resendCode сам решит: гейт на Channel (≥2 каналов) или сразу код.\n // Своя ревизия не создаётся — это продолжение этой же попытки, не новая.\n codeContext.value = CODE_CONTEXT.Register\n await resendCode(getRecaptchaPayload, revision)\n if (isStale(revision)) return\n if (currentStep.value !== AUTH_STEP.Channel) currentStep.value = AUTH_STEP.Code\n } else {\n currentStep.value = AUTH_STEP.Register\n }\n } catch (e: unknown) {\n if (!isStale(revision)) handleAuthError(e, 'auth.checkPhoneFailed', 'check-phone')\n } finally {\n // Ревизия протухла — за loading уже отвечает более новая операция, эта не трогает.\n if (!isStale(revision)) loading.value = false\n }\n }\n\n /**\n * `parentRevision` — только для вызова изнутри `register()` (0-channel fallback).\n * Прямой вызов из UI её не передаёт, функция сама открывает новую операцию.\n */\n async function login(\n password: string,\n getRecaptchaPayload: RecaptchaPayloadProvider,\n parentRevision?: number\n ): Promise<boolean> {\n const revision = parentRevision ?? beginOperation()\n clearError()\n const storeId = getStoreId()\n if (!storeId) return false\n\n const phoneSnapshot = phoneRequest()\n loading.value = true\n\n try {\n const result = await sdk.auth.login(storeId, { phone: phoneSnapshot, password })\n if (isStale(revision)) return false\n\n authStore.setToken(result.token, phoneSnapshot.number, phoneSnapshot.country)\n pendingPassword.value = ''\n return true\n } catch (e: unknown) {\n if (isStale(revision)) return false\n\n // Если телефон не подтверждён — отправить код и перейти на ввод.\n if (getCartErrorCode(e) === AUTH_ERROR_CODE.ConfirmationRequired) {\n pendingPassword.value = password\n codeContext.value = CODE_CONTEXT.Register\n loading.value = false\n await resendCode(getRecaptchaPayload, revision)\n if (isStale(revision)) return false\n if (currentStep.value !== AUTH_STEP.Channel) currentStep.value = AUTH_STEP.Code\n return false\n }\n\n handleAuthError(e, 'auth.invalidPassword', 'login')\n return false\n } finally {\n if (!isStale(revision)) loading.value = false\n }\n }\n\n /** `parentRevision` — только для вызова изнутри `selectChannel()`. */\n async function register(\n password: string,\n getRecaptchaPayload: RecaptchaPayloadProvider,\n parentRevision?: number\n ): Promise<boolean> {\n const revision = parentRevision ?? beginOperation()\n clearError()\n pendingPassword.value = password\n\n if (confirmationMethod.value === null && availableChannels.value.length >= 2) {\n channelIntent.value = CHANNEL_INTENT.Register\n currentStep.value = AUTH_STEP.Channel\n return false\n }\n\n const storeId = getStoreId()\n if (!storeId) return false\n\n const phoneSnapshot = phoneRequest()\n const method = resolveOutgoingMethod()\n const attemptedChannel = confirmationMethod.value\n loading.value = true\n\n try {\n const recaptcha = await getRecaptchaPayload(RecaptchaAction.Registration)\n // reCAPTCHA сама по себе — await; если за это время пользователь успел\n // выбрать другой канал (новая операция), нет смысла долетать до SDK — тот,\n // другой вызов уже переопределил, что сейчас актуально.\n if (isStale(revision)) return false\n\n const result = await sdk.auth.register(storeId, {\n phone: phoneSnapshot,\n password,\n recaptcha,\n method,\n })\n if (isStale(revision)) return false\n\n if (result.confirmation_required) {\n codeContext.value = CODE_CONTEXT.Register\n confirmationMethod.value = toConfirmationChannel(result.method)\n resendTimerEndsAt.value = Date.now() + RESEND_TIMER_SECONDS * 1000\n currentStep.value = AUTH_STEP.Code\n channelIntent.value = null\n lastFailedChannel.value = null\n return false\n }\n\n // Регистрация без подтверждения (0 каналов включено на магазине). SDK не\n // возвращает токен в этом ответе (AuthConfirmationStatus его не содержит) —\n // логинимся отдельным вызовом с тем же паролем, чтобы реально авторизовать,\n // а не просто закрыть флоу с пустым (== неаутентифицированным) токеном.\n // await, не голый return — иначе register()'s finally сработает раньше, чем\n // login() завершит свой собственный loading-цикл, и погасит индикатор\n // посреди ещё идущего запроса. Та же revision — это продолжение той же попытки.\n channelIntent.value = null\n lastFailedChannel.value = null\n return await login(password, getRecaptchaPayload, revision)\n } catch (e: unknown) {\n if (isStale(revision)) return false\n if (!handleOtpDispatchError(e, CHANNEL_INTENT.Register, 'register', attemptedChannel)) {\n handleAuthError(e, 'auth.registerFailed', 'register')\n }\n return false\n } finally {\n if (!isStale(revision)) loading.value = false\n }\n }\n\n async function confirmRegistration(code: string, password?: string): Promise<boolean> {\n const revision = beginOperation()\n clearError()\n const storeId = getStoreId()\n if (!storeId) return false\n\n const phoneSnapshot = phoneRequest()\n const passwordSnapshot = password || pendingPassword.value || undefined\n loading.value = true\n\n try {\n const result = await sdk.auth.confirmRegistration(storeId, {\n phone: phoneSnapshot,\n code,\n password: passwordSnapshot,\n })\n if (isStale(revision)) return false\n\n authStore.setToken(result.token, phoneSnapshot.number, phoneSnapshot.country)\n pendingPassword.value = ''\n return true\n } catch (e: unknown) {\n if (isStale(revision)) return false\n handleAuthError(e, 'auth.invalidCode', 'confirm-registration')\n return false\n } finally {\n if (!isStale(revision)) loading.value = false\n }\n }\n\n /** `parentRevision` — только для вызова изнутри checkPhone/login/selectChannel. */\n async function resendCode(\n getRecaptchaPayload: RecaptchaPayloadProvider,\n parentRevision?: number\n ): Promise<number> {\n const revision = parentRevision ?? beginOperation()\n clearError()\n\n if (confirmationMethod.value === null && availableChannels.value.length >= 2) {\n channelIntent.value = CHANNEL_INTENT.Resend\n currentStep.value = AUTH_STEP.Channel\n return 0\n }\n\n const storeId = getStoreId()\n if (!storeId) return 0\n\n const phoneSnapshot = phoneRequest()\n const method = resolveOutgoingMethod()\n const context = codeContext.value\n const attemptedChannel = confirmationMethod.value\n loading.value = true\n\n try {\n const recaptcha = await getRecaptchaPayload(\n context === CODE_CONTEXT.Reset\n ? RecaptchaAction.ResetPassword\n : RecaptchaAction.ResendRegistrationCode\n )\n if (isStale(revision)) return 0\n\n const result =\n context === CODE_CONTEXT.Reset\n ? await sdk.auth.dispatchPasswordReset(storeId, {\n phone: phoneSnapshot,\n recaptcha,\n method,\n })\n : await sdk.auth.resendRegistrationConfirmation(storeId, {\n phone: phoneSnapshot,\n recaptcha,\n method,\n })\n if (isStale(revision)) return 0\n\n confirmationMethod.value = toConfirmationChannel(result.method)\n resendTimerEndsAt.value = Date.now() + RESEND_TIMER_SECONDS * 1000\n // Успешная отправка — прошлый сбой (если был) уже неактуален для новых попыток.\n lastFailedChannel.value = null\n // Если сюда попали прямо с Channel (через selectChannel) — успешный dispatch\n // завершает channel-selection, переходим на Code сами. Обычный resend (вызван\n // с Code) этой веткой не задет — currentStep уже Code, условие не сработает.\n if (currentStep.value === AUTH_STEP.Channel) {\n channelIntent.value = null\n currentStep.value = AUTH_STEP.Code\n }\n return RESEND_TIMER_SECONDS\n } catch (e: unknown) {\n if (isStale(revision)) return 0\n if (\n !handleOtpDispatchError(e, CHANNEL_INTENT.Resend, 'resend-code', attemptedChannel)\n ) {\n handleAuthError(e, 'auth.resendCodeFailed', 'resend-code')\n }\n return 0\n } finally {\n if (!isStale(revision)) loading.value = false\n }\n }\n\n /** `parentRevision` — только для вызова изнутри `selectChannel()`. */\n async function dispatchReset(\n getRecaptchaPayload: RecaptchaPayloadProvider,\n parentRevision?: number\n ): Promise<void> {\n const revision = parentRevision ?? beginOperation()\n clearError()\n\n if (confirmationMethod.value === null && availableChannels.value.length >= 2) {\n channelIntent.value = CHANNEL_INTENT.DispatchReset\n currentStep.value = AUTH_STEP.Channel\n return\n }\n\n const storeId = getStoreId()\n if (!storeId) return\n\n const phoneSnapshot = phoneRequest()\n const method = resolveOutgoingMethod()\n const attemptedChannel = confirmationMethod.value\n loading.value = true\n\n try {\n const recaptcha = await getRecaptchaPayload(RecaptchaAction.ResetPassword)\n if (isStale(revision)) return\n\n const result = await sdk.auth.dispatchPasswordReset(storeId, {\n phone: phoneSnapshot,\n recaptcha,\n method,\n })\n if (isStale(revision)) return\n\n codeContext.value = CODE_CONTEXT.Reset\n confirmationMethod.value = toConfirmationChannel(result.method)\n resendTimerEndsAt.value = Date.now() + RESEND_TIMER_SECONDS * 1000\n currentStep.value = AUTH_STEP.Code\n channelIntent.value = null\n lastFailedChannel.value = null\n } catch (e: unknown) {\n if (isStale(revision)) return\n if (\n !handleOtpDispatchError(\n e,\n CHANNEL_INTENT.DispatchReset,\n 'dispatch-reset',\n attemptedChannel\n )\n ) {\n handleAuthError(e, 'auth.dispatchResetFailed', 'dispatch-reset')\n }\n } finally {\n if (!isStale(revision)) loading.value = false\n }\n }\n\n async function resetPassword(code: string, password: string): Promise<boolean> {\n const revision = beginOperation()\n clearError()\n const storeId = getStoreId()\n if (!storeId) return false\n\n const phoneSnapshot = phoneRequest()\n loading.value = true\n\n try {\n const result = await sdk.auth.resetPassword(storeId, {\n phone: phoneSnapshot,\n code,\n password,\n })\n if (isStale(revision)) return false\n\n authStore.setToken(result.token, phoneSnapshot.number, phoneSnapshot.country)\n return true\n } catch (e: unknown) {\n if (isStale(revision)) return false\n\n const errorCode = getCartErrorCode(e)\n if (\n errorCode === AUTH_ERROR_CODE.InvalidCode ||\n errorCode === AUTH_ERROR_CODE.InvalidRegistrationCode ||\n errorCode === AUTH_ERROR_CODE.InvalidResetCode ||\n errorCode === AUTH_ERROR_CODE.ExpiredCode\n ) {\n handleAuthError(e, 'auth.invalidCode', 'reset-password')\n resetCode.value = ''\n currentStep.value = AUTH_STEP.Code\n return false\n }\n\n handleAuthError(e, 'auth.resetPasswordFailed', 'reset-password')\n return false\n } finally {\n if (!isStale(revision)) loading.value = false\n }\n }\n\n /**\n * Выбор канала на шаге AUTH_STEP.Channel — повторяет вызов, который привёл сюда.\n * НЕ обнуляет `channelIntent` сама — register/resendCode/dispatchReset обнуляют его\n * только на реальном успехе. При ошибке (валидация, сеть, otp_request.failed — что\n * угодно, не только последнее) intent и currentStep остаются как были: пользователь\n * видит picker снова и может повторить попытку, а не упирается в молчаливый no-op.\n */\n async function selectChannel(\n channel: SelectableConfirmationChannel,\n getRecaptchaPayload: RecaptchaPayloadProvider\n ): Promise<boolean> {\n if (!availableChannels.value.includes(channel)) return false\n\n // Каждый выбор канала — новая попытка пользователя, top-level: если предыдущий\n // выбор ещё висит на recaptcha/сети, этот его инвалидирует, а не наоборот —\n // побеждает то, что пользователь выбрал последним.\n const revision = beginOperation()\n confirmationMethod.value = channel\n const intent = channelIntent.value\n\n if (intent === CHANNEL_INTENT.Register)\n return register(pendingPassword.value, getRecaptchaPayload, revision)\n if (intent === CHANNEL_INTENT.Resend) {\n await resendCode(getRecaptchaPayload, revision)\n return false\n }\n if (intent === CHANNEL_INTENT.DispatchReset) {\n await dispatchReset(getRecaptchaPayload, revision)\n return false\n }\n return false\n }\n\n function goToChannelBack(): void {\n // Back с Channel почти всегда означает «отменить то, что сейчас в полёте»\n // (пользователь передумал после клика по каналу, пока шёл recaptcha/dispatch).\n cancelPendingOperation()\n clearError()\n const intent = channelIntent.value\n channelIntent.value = null\n\n if (intent === CHANNEL_INTENT.Register) currentStep.value = AUTH_STEP.Register\n else if (intent === CHANNEL_INTENT.Resend) currentStep.value = AUTH_STEP.Code\n else if (intent === CHANNEL_INTENT.DispatchReset) currentStep.value = AUTH_STEP.Reset\n else currentStep.value = AUTH_STEP.Phone\n }\n\n /** Перейти к шагу сброса пароля (или сразу к коду, если для сброса уже отправлен код и таймер ещё активен) */\n function goToReset(): void {\n cancelPendingOperation()\n clearError()\n\n if (codeContext.value === CODE_CONTEXT.Reset && resendTimerEndsAt.value > Date.now()) {\n currentStep.value = AUTH_STEP.Code\n } else {\n currentStep.value = AUTH_STEP.Reset\n }\n }\n\n function goToPhone(): void {\n cancelPendingOperation()\n clearError()\n currentStep.value = AUTH_STEP.Phone\n }\n\n function goToMethod(): void {\n cancelPendingOperation()\n clearError()\n currentStep.value = AUTH_STEP.Method\n }\n\n function goToLogin(): void {\n cancelPendingOperation()\n clearError()\n currentStep.value = AUTH_STEP.Login\n }\n\n function goToNewPassword(code: string): void {\n cancelPendingOperation()\n clearError()\n resetCode.value = code\n currentStep.value = AUTH_STEP.NewPassword\n }\n\n function goToResetCode(): void {\n cancelPendingOperation()\n clearError()\n resetCode.value = ''\n currentStep.value = AUTH_STEP.Code\n }\n\n function goToRegisterPassword(code: string): void {\n cancelPendingOperation()\n clearError()\n registerCode.value = code\n currentStep.value = AUTH_STEP.RegisterPassword\n }\n\n function goToRegisterCode(): void {\n cancelPendingOperation()\n clearError()\n registerCode.value = ''\n currentStep.value = AUTH_STEP.Code\n }\n\n return {\n currentStep,\n phone,\n countryCode,\n loading,\n error,\n fieldErrors,\n codeContext,\n confirmationMethod,\n channelIntent,\n lastFailedChannel,\n resetCode,\n registerCode,\n resendTimerEndsAt,\n pendingPassword,\n availableChannels,\n checkPhone,\n login,\n register,\n confirmRegistration,\n resendCode,\n dispatchReset,\n resetPassword,\n selectChannel,\n changeChannel,\n goToChannelBack,\n goToReset,\n goToPhone,\n goToMethod,\n goToLogin,\n goToNewPassword,\n goToResetCode,\n goToRegisterPassword,\n goToRegisterCode,\n reset,\n }\n})\n","import { computed, type ComputedRef } from 'vue'\n\nimport type { City, Stock, Store } from '@zenky/storefront-api'\n\nimport { useStoreProfileStore } from './store-profile'\n\n/** Accessor for the loaded store/city/stock (store/city are guaranteed to be loaded). */\nexport function useStore(): {\n store: ComputedRef<Store>\n city: ComputedRef<City>\n stock: ComputedRef<Stock | null>\n} {\n const profileStore = useStoreProfileStore()\n\n return {\n store: computed(() => profileStore.store!),\n city: computed(() => profileStore.city!),\n stock: computed(() => profileStore.stock),\n }\n}\n","import { storeToRefs } from 'pinia'\nimport { computed } from 'vue'\n\nimport { useStoreProfileStore } from './store-profile'\n\nexport function useStorefrontProfile() {\n const profileStore = useStoreProfileStore()\n const { store, city, stock, categories } = storeToRefs(profileStore)\n\n const isReady = computed(() => profileStore.isReady)\n const hasStock = computed(() => profileStore.hasStock)\n\n return {\n store,\n city,\n stock,\n categories,\n isReady,\n hasStock,\n }\n}\n"]}
|
|
@@ -109,13 +109,25 @@ var DAY_ORDER = [
|
|
|
109
109
|
"saturday",
|
|
110
110
|
"sunday"
|
|
111
111
|
];
|
|
112
|
-
|
|
112
|
+
var MAX_CACHED_FORMATTERS = 32;
|
|
113
|
+
var dayNameFormatters = /* @__PURE__ */ new Map();
|
|
114
|
+
function getDayFormatter(locale, weekday) {
|
|
115
|
+
const key = `${locale}:${weekday}`;
|
|
116
|
+
let formatter = dayNameFormatters.get(key);
|
|
117
|
+
if (!formatter) {
|
|
118
|
+
formatter = new Intl.DateTimeFormat(locale, { weekday });
|
|
119
|
+
if (dayNameFormatters.size >= MAX_CACHED_FORMATTERS) dayNameFormatters.clear();
|
|
120
|
+
dayNameFormatters.set(key, formatter);
|
|
121
|
+
}
|
|
122
|
+
return formatter;
|
|
123
|
+
}
|
|
124
|
+
function getDayName(dayKey, locale, weekday) {
|
|
113
125
|
const index = DAY_TO_JS_INDEX[dayKey];
|
|
114
126
|
if (index === void 0) {
|
|
115
127
|
return dayKey;
|
|
116
128
|
}
|
|
117
129
|
const date = new Date(2e3, 0, 2 + index);
|
|
118
|
-
return
|
|
130
|
+
return getDayFormatter(locale, weekday).format(date);
|
|
119
131
|
}
|
|
120
132
|
var DEFAULT_STATUS_LABELS = { open: "\u041E\u0442\u043A\u0440\u044B\u0442\u043E", closed: "\u0417\u0430\u043A\u0440\u044B\u0442\u043E" };
|
|
121
133
|
var STATUS_LABELS = {
|
|
@@ -136,7 +148,7 @@ function getWeeklySchedule(schedule, locale = "ru-RU") {
|
|
|
136
148
|
if (!schedule) return [];
|
|
137
149
|
return DAY_ORDER.map((dayKey) => ({
|
|
138
150
|
dayKey,
|
|
139
|
-
name: getDayName(dayKey, locale),
|
|
151
|
+
name: getDayName(dayKey, locale, "long"),
|
|
140
152
|
hours: schedule.days[dayKey]?.hours ?? null
|
|
141
153
|
}));
|
|
142
154
|
}
|
|
@@ -145,6 +157,23 @@ function formatScheduleStatus(schedule, locale = "ru-RU") {
|
|
|
145
157
|
const labels = STATUS_LABELS[locale] ?? DEFAULT_STATUS_LABELS;
|
|
146
158
|
return schedule.is_open_now ? labels.open : labels.closed;
|
|
147
159
|
}
|
|
160
|
+
function groupScheduleDays(schedule, locale = "ru-RU") {
|
|
161
|
+
const days = getWeeklySchedule(schedule, locale);
|
|
162
|
+
const rows = [];
|
|
163
|
+
let firstDayOfRun = "";
|
|
164
|
+
for (let index = 0; index < days.length; index++) {
|
|
165
|
+
const day = days[index];
|
|
166
|
+
const previous = index > 0 ? days[index - 1] : null;
|
|
167
|
+
const short = getDayName(day.dayKey, locale, "short");
|
|
168
|
+
if (previous && previous.hours === day.hours) {
|
|
169
|
+
rows[rows.length - 1].label = `${firstDayOfRun} \u2014 ${short}`;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
firstDayOfRun = short;
|
|
173
|
+
rows.push({ label: short, hours: day.hours });
|
|
174
|
+
}
|
|
175
|
+
return rows;
|
|
176
|
+
}
|
|
148
177
|
|
|
149
178
|
// src/utils/qr.ts
|
|
150
179
|
function buildQrCodeUrl(target, apiBaseUrl, size = 200) {
|
|
@@ -239,6 +268,6 @@ function formatAddressCityLast(raw) {
|
|
|
239
268
|
return match ? `${match[2]}, ${match[1]}` : raw;
|
|
240
269
|
}
|
|
241
270
|
|
|
242
|
-
export { buildQrCodeUrl, createOperationChain, formatAddressCityLast, formatDate, formatDateTime, formatPhoneNational, formatPhoneSpaced, formatScheduleStatus, getApiErrorMessage, getApiFieldErrors, getEmailLink, getPhoneTelLink, getSocialLinks, getTodayInfo, getWebsiteLink, getWeeklySchedule, pluralize, toDateInputValue, todayInTimezone };
|
|
243
|
-
//# sourceMappingURL=chunk-
|
|
244
|
-
//# sourceMappingURL=chunk-
|
|
271
|
+
export { buildQrCodeUrl, createOperationChain, formatAddressCityLast, formatDate, formatDateTime, formatPhoneNational, formatPhoneSpaced, formatScheduleStatus, getApiErrorMessage, getApiFieldErrors, getEmailLink, getPhoneTelLink, getSocialLinks, getTodayInfo, getWebsiteLink, getWeeklySchedule, groupScheduleDays, pluralize, toDateInputValue, todayInTimezone };
|
|
272
|
+
//# sourceMappingURL=chunk-RURXGVWW.js.map
|
|
273
|
+
//# sourceMappingURL=chunk-RURXGVWW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/createOperationChain.ts","../src/utils/phone.ts","../src/utils/contacts.ts","../src/utils/schedule.ts","../src/utils/qr.ts","../src/utils/date.ts","../src/utils/pluralize.ts","../src/utils/errors.ts","../src/utils/address.ts"],"names":[],"mappings":"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","file":"chunk-RURXGVWW.js","sourcesContent":["// Serializes async operations by key: for each key, the next operation\n// only starts after the previous one finishes. Prevents races when\n// concurrent calls target the same resource.\n\nexport interface OperationChain {\n execute: (key: string, fn: () => Promise<void>) => Promise<void>\n readonly size: number\n}\n\nexport function createOperationChain(): OperationChain {\n const chains = new Map<string, Promise<void>>()\n\n async function execute(key: string, fn: () => Promise<void>): Promise<void> {\n const prev = chains.get(key) ?? Promise.resolve()\n\n const current = prev.then(fn)\n\n // Prevents an unhandled rejection from propagating through the chain\n const safe = current.catch(() => {})\n chains.set(key, safe)\n\n // Drop the entry once nothing else chained onto it after it settled\n safe.finally(() => {\n if (chains.get(key) === safe) {\n chains.delete(key)\n }\n })\n\n return current\n }\n\n return {\n execute,\n get size() {\n return chains.size\n },\n }\n}\n","import type { Phone } from '@zenky/storefront-api'\n\nexport function formatPhoneNational(phone: Phone | null | undefined): string | null {\n if (!phone) return null\n\n return phone.national || phone.number\n}\n\nexport function getPhoneTelLink(phone: Phone | null | undefined): string | null {\n if (!phone) return null\n\n return `tel:${phone.number}`\n}\n\n/**\n * Loose-spaced phone format: `+7 (999) 999-99-99` → `+7 999 999 99 99`.\n * Parens and dashes become spaces, repeated spaces collapse to one.\n */\nexport function formatPhoneSpaced(formatted: string | null | undefined): string {\n if (!formatted) return ''\n\n return formatted.replace(/[()-]/g, ' ').replace(/\\s+/g, ' ').trim()\n}\n","import { ContactType } from '@zenky/storefront-api'\n\nimport type { Contact } from '@zenky/storefront-api'\n\nexport interface SocialLink {\n type: ContactType\n url: string\n label: string\n}\n\nconst SOCIAL_TYPES = new Set<ContactType>([\n ContactType.Vk,\n ContactType.Instagram,\n ContactType.Facebook,\n ContactType.Twitter,\n ContactType.Ok,\n ContactType.Tiktok,\n ContactType.Telegram,\n ContactType.Max,\n])\n\nconst SOCIAL_LABELS: Record<string, string> = {\n [ContactType.Vk]: 'ВКонтакте',\n [ContactType.Instagram]: 'Instagram',\n [ContactType.Facebook]: 'Facebook',\n [ContactType.Twitter]: 'Twitter',\n [ContactType.Ok]: 'Одноклассники',\n [ContactType.Tiktok]: 'TikTok',\n [ContactType.Telegram]: 'Telegram',\n [ContactType.Max]: 'Max',\n} as const\n\nfunction buildSocialUrl(type: ContactType, value: string): string {\n if (value.startsWith('http://') || value.startsWith('https://')) {\n return value\n }\n\n const bases: Partial<Record<ContactType, string>> = {\n [ContactType.Vk]: 'https://vk.com/',\n [ContactType.Instagram]: 'https://instagram.com/',\n [ContactType.Facebook]: 'https://facebook.com/',\n [ContactType.Twitter]: 'https://x.com/',\n [ContactType.Ok]: 'https://ok.ru/',\n [ContactType.Tiktok]: 'https://tiktok.com/@',\n [ContactType.Telegram]: 'https://t.me/',\n [ContactType.Max]: 'https://max.ru/',\n }\n\n const base = bases[type]\n\n return base ? `${base}${value}` : value\n}\n\nexport function getSocialLinks(contacts: Contact[]): SocialLink[] {\n return contacts\n .filter((contact) => SOCIAL_TYPES.has(contact.type))\n .map((contact) => ({\n type: contact.type,\n url: buildSocialUrl(contact.type, contact.value),\n label: SOCIAL_LABELS[contact.type] ?? contact.type,\n }))\n}\n\nexport function getEmailLink(contacts: Contact[]): string | null {\n const email = contacts.find((c) => c.type === ContactType.Email)\n\n return email?.value ?? null\n}\n\nexport function getWebsiteLink(contacts: Contact[]): string | null {\n const website = contacts.find((c) => c.type === ContactType.Website)\n\n return website?.value ?? null\n}\n","import type { Schedule } from '@zenky/storefront-api'\n\nexport interface DayScheduleInfo {\n dayKey: string\n name: string\n hours: string | null\n}\n\nexport interface TodayScheduleInfo {\n isOpenNow: boolean\n todayHours: string | null\n openingAt: string | null\n closingAt: string | null\n}\n\n// API day key → JS day index (0=Sun, 1=Mon, ..., 6=Sat)\nconst DAY_TO_JS_INDEX: Record<string, number> = {\n sunday: 0,\n monday: 1,\n tuesday: 2,\n wednesday: 3,\n thursday: 4,\n friday: 5,\n saturday: 6,\n} as const\n\nconst DAY_ORDER = [\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n] as const\n\nconst MAX_CACHED_FORMATTERS = 32\nconst dayNameFormatters = new Map<string, Intl.DateTimeFormat>()\n\nfunction getDayFormatter(locale: string, weekday: 'long' | 'short'): Intl.DateTimeFormat {\n const key = `${locale}:${weekday}`\n let formatter = dayNameFormatters.get(key)\n\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(locale, { weekday })\n\n if (dayNameFormatters.size >= MAX_CACHED_FORMATTERS) dayNameFormatters.clear()\n\n dayNameFormatters.set(key, formatter)\n }\n\n return formatter\n}\n\n// Reference date: January 2, 2000 is a Sunday (JS index 0).\n// For dayIndex=0 (Sun) add 0, for 1 (Mon) add 1, and so on.\nfunction getDayName(dayKey: string, locale: string, weekday: 'long' | 'short'): string {\n const index = DAY_TO_JS_INDEX[dayKey]\n\n if (index === undefined) {\n return dayKey\n }\n\n const date = new Date(2000, 0, 2 + index)\n\n return getDayFormatter(locale, weekday).format(date)\n}\n\ninterface StatusLabels {\n open: string\n closed: string\n}\n\nconst DEFAULT_STATUS_LABELS: StatusLabels = { open: 'Открыто', closed: 'Закрыто' }\n\nconst STATUS_LABELS: Record<string, StatusLabels> = {\n 'ru-RU': DEFAULT_STATUS_LABELS,\n 'en-US': { open: 'Open', closed: 'Closed' },\n}\n\nexport function getTodayInfo(schedule: Schedule | null | undefined): TodayScheduleInfo | null {\n if (!schedule) return null\n\n const todayDay = schedule.days[schedule.day_id as keyof typeof schedule.days]\n\n return {\n isOpenNow: schedule.is_open_now,\n todayHours: todayDay?.hours ?? null,\n openingAt: schedule.opening_at,\n closingAt: schedule.closing_at,\n }\n}\n\nexport function getWeeklySchedule(\n schedule: Schedule | null | undefined,\n locale = 'ru-RU'\n): DayScheduleInfo[] {\n if (!schedule) return []\n\n return DAY_ORDER.map((dayKey) => ({\n dayKey,\n name: getDayName(dayKey, locale, 'long'),\n hours: schedule.days[dayKey]?.hours ?? null,\n }))\n}\n\nexport function formatScheduleStatus(\n schedule: Schedule | null | undefined,\n locale = 'ru-RU'\n): string | null {\n if (!schedule) return null\n\n const labels = STATUS_LABELS[locale] ?? DEFAULT_STATUS_LABELS\n\n return schedule.is_open_now ? labels.open : labels.closed\n}\n\nexport interface ScheduleRow {\n label: string\n hours: string | null\n}\n\nexport function groupScheduleDays(\n schedule: Schedule | null | undefined,\n locale = 'ru-RU'\n): ScheduleRow[] {\n const days = getWeeklySchedule(schedule, locale)\n const rows: ScheduleRow[] = []\n let firstDayOfRun = ''\n\n for (let index = 0; index < days.length; index++) {\n const day = days[index]!\n const previous = index > 0 ? days[index - 1]! : null\n const short = getDayName(day.dayKey, locale, 'short')\n\n if (previous && previous.hours === day.hours) {\n rows[rows.length - 1]!.label = `${firstDayOfRun} — ${short}`\n continue\n }\n\n firstDayOfRun = short\n rows.push({ label: short, hours: day.hours })\n }\n\n return rows\n}\n","/**\n * Builds a QR code image URL through the Zenky media API.\n *\n * The content is base64-encoded and passed in the `content` query param.\n * This implementation doesn't depend on `window`, `btoa`, or Node's `Buffer`,\n * so the same code works in the browser, Node SSR, and edge runtimes.\n */\nexport function buildQrCodeUrl(target: string, apiBaseUrl: string, size = 200): string {\n if (!target) return ''\n\n const utf8 = encodeBase64(new TextEncoder().encode(target))\n\n return `${apiBaseUrl}/media/qrcode?content=${utf8}&input=base64&size=${size}`\n}\n\nconst BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nfunction encodeBase64(bytes: Uint8Array): string {\n let output = ''\n\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0\n const second = bytes[index + 1]\n const third = bytes[index + 2]\n const group = (first << 16) | ((second ?? 0) << 8) | (third ?? 0)\n\n output += BASE64_ALPHABET[(group >> 18) & 63]\n output += BASE64_ALPHABET[(group >> 12) & 63]\n output += second === undefined ? '=' : BASE64_ALPHABET[(group >> 6) & 63]\n output += third === undefined ? '=' : BASE64_ALPHABET[group & 63]\n }\n\n return output\n}\n","export function formatDate(date: string): string {\n return new Date(date).toLocaleDateString('ru-RU', {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n })\n}\n\nexport function formatDateTime(date: string): string {\n const d = new Date(date)\n const datePart = d.toLocaleDateString('ru-RU', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n })\n const timePart = d.toLocaleTimeString('ru-RU', {\n hour: '2-digit',\n minute: '2-digit',\n })\n return `${datePart} ${timePart}`\n}\n\n/**\n * Extracts YYYY-MM-DD from an ISO string (e.g. \"1998-06-02T03:00:00+03:00\" → \"1998-06-02\").\n * For use in `<input type=\"date\">`.\n */\nexport function toDateInputValue(value: string | null): string {\n if (!value) return ''\n return value.slice(0, 10)\n}\n\n/**\n * Today's date in the given timezone, as YYYY-MM-DD.\n * Falls back to the browser's local timezone if `timezone` is invalid or omitted.\n *\n * Use this to match \"today\" against a backend date that's relative to the\n * store's timezone, not the user's.\n */\nexport function todayInTimezone(timezone?: string | null): string {\n const now = new Date()\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }\n\n // Only set timeZone when it's given: under exactOptionalPropertyTypes,\n // an optional property can't be assigned undefined.\n if (timezone) {\n options.timeZone = timezone\n }\n\n try {\n return new Intl.DateTimeFormat('en-CA', options).format(now)\n } catch {\n // Invalid timezone — fall back to the local one\n return new Intl.DateTimeFormat('en-CA').format(now)\n }\n}\n","/**\n * Noun declension by count, for Russian grammar (one/few/many forms).\n *\n * @example\n * pluralize(1, 'позиция', 'позиции', 'позиций') // 'позиция'\n * pluralize(3, 'позиция', 'позиции', 'позиций') // 'позиции'\n * pluralize(5, 'позиция', 'позиции', 'позиций') // 'позиций'\n */\nexport function pluralize(count: number, one: string, few: string, many: string): string {\n const abs = Math.abs(count)\n const mod10 = abs % 10\n const mod100 = abs % 100\n\n if (mod100 >= 11 && mod100 <= 19) return many\n if (mod10 === 1) return one\n if (mod10 >= 2 && mod10 <= 4) return few\n\n return many\n}\n","import { ZenkyError } from '@zenky/storefront-api'\n\n/** The message from a ZenkyError, or a fallback. */\nexport function getApiErrorMessage(e: unknown, fallback: string): string {\n if (e instanceof ZenkyError && e.err?.message) {\n return e.err.message\n }\n\n return fallback\n}\n\n/** Field-level errors from an API response's `meta.errors` (422 validation). */\nexport function getApiFieldErrors(e: unknown): Record<string, string[]> | null {\n if (e instanceof ZenkyError && e.err?.meta?.errors) {\n return e.err.meta.errors as Record<string, string[]>\n }\n\n return null\n}\n","/**\n * Moves the city to the end of an address string.\n * \"г Улан-Удэ, ул Ленина, д 29\" → \"ул Ленина, д 29, г Улан-Удэ\"\n */\nexport function formatAddressCityLast(raw: string): string {\n const match = raw.match(/^(г\\s[^,]+),\\s*(.+)$/)\n\n return match ? `${match[2]}, ${match[1]}` : raw\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useRuntime } from './chunk-
|
|
1
|
+
import { useRuntime } from './chunk-WTZXTBF6.js';
|
|
2
2
|
import { DeliveryMethod, PaymentMethod } from '@zenky/storefront-api';
|
|
3
3
|
import { defineStore } from 'pinia';
|
|
4
4
|
import { ref, computed } from 'vue';
|
|
@@ -426,5 +426,5 @@ var usePromotionsStore = defineStore("zenky-promotions", () => {
|
|
|
426
426
|
});
|
|
427
427
|
|
|
428
428
|
export { useCartStore, useOrderSettingsStore, usePromotionsStore };
|
|
429
|
-
//# sourceMappingURL=chunk-
|
|
430
|
-
//# sourceMappingURL=chunk-
|
|
429
|
+
//# sourceMappingURL=chunk-TE2QPH74.js.map
|
|
430
|
+
//# sourceMappingURL=chunk-TE2QPH74.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stores/order-settings.ts","../src/stores/cart.ts","../src/stores/promotions.ts"],"names":["defineStore","ref","raw","computed"],"mappings":"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","file":"chunk-XULHV6SS.js","sourcesContent":["import { DeliveryMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { City, Stock } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\n\n// Keys match the old CookieKey.* — so saved settings aren't lost.\nconst KEY_DELIVERY_METHOD = 'zenky_delivery_method'\nconst KEY_ON_PREMISE_TABLE = 'zenky_on_premise_table'\nconst KEY_SELECTED_STOCK_ID = 'zenky_selected_stock_id'\nconst KEY_SELECTED_ADDRESS = 'zenky_selected_address'\nconst KEY_SELECTED_ADDRESS_ID = 'zenky_selected_address_id'\nconst KEY_SELECTED_ADDRESS_NAME = 'zenky_selected_address_name'\n\nconst VALID_DELIVERY_METHODS = new Set<string>(Object.values(DeliveryMethod))\n\nexport interface OrderSettingsStore {\n deliveryMethod: Ref<DeliveryMethod>\n onPremiseTable: Ref<string | null>\n selectedStock: Ref<Stock | null>\n selectedAddress: Ref<string | null>\n selectedAddressId: Ref<string | null>\n selectedAddressName: Ref<string | null>\n setDeliveryMethod: (method: DeliveryMethod) => void\n setOnPremiseTable: (table: string | null) => void\n setSelectedStock: (stock: Stock | null) => void\n setSelectedAddress: (\n address: string | null,\n addressId?: string | null,\n addressName?: string | null\n ) => void\n validateDeliveryMethod: (availableMethods: DeliveryMethod[]) => void\n restoreFromCookies: (city: City) => void\n isDelivery: ComputedRef<boolean>\n isPickup: ComputedRef<boolean>\n isOnPremise: ComputedRef<boolean>\n needsAddress: ComputedRef<boolean>\n needsStock: ComputedRef<boolean>\n needsTable: ComputedRef<boolean>\n}\n\nexport const useOrderSettingsStore = defineStore('zenky-order-settings', (): OrderSettingsStore => {\n const { storage } = useRuntime()\n\n const deliveryMethod = ref<DeliveryMethod>(DeliveryMethod.Delivery)\n const onPremiseTable = ref<string | null>(null)\n const selectedStock = ref<Stock | null>(null)\n const selectedAddress = ref<string | null>(null)\n const selectedAddressId = ref<string | null>(null)\n const selectedAddressName = ref<string | null>(null)\n\n function setDeliveryMethod(method: DeliveryMethod): void {\n deliveryMethod.value = method\n storage.set(KEY_DELIVERY_METHOD, method)\n }\n\n function setOnPremiseTable(table: string | null): void {\n onPremiseTable.value = table\n if (table) storage.set(KEY_ON_PREMISE_TABLE, table)\n else storage.remove(KEY_ON_PREMISE_TABLE)\n }\n\n function setSelectedStock(stock: Stock | null): void {\n selectedStock.value = stock\n if (stock) storage.set(KEY_SELECTED_STOCK_ID, stock.id)\n else storage.remove(KEY_SELECTED_STOCK_ID)\n }\n\n function setSelectedAddress(\n address: string | null,\n addressId?: string | null,\n addressName?: string | null\n ): void {\n selectedAddress.value = address\n selectedAddressId.value = addressId ?? null\n selectedAddressName.value = addressName ?? null\n writeOrRemove(KEY_SELECTED_ADDRESS, address)\n writeOrRemove(KEY_SELECTED_ADDRESS_ID, addressId ?? null)\n writeOrRemove(KEY_SELECTED_ADDRESS_NAME, addressName ?? null)\n }\n\n function writeOrRemove(key: string, value: string | null): void {\n if (value) storage.set(key, value)\n else storage.remove(key)\n }\n\n function validateDeliveryMethod(availableMethods: DeliveryMethod[]): void {\n const first = availableMethods[0]\n if (!first) return\n\n if (!availableMethods.includes(deliveryMethod.value)) {\n deliveryMethod.value = first\n storage.set(KEY_DELIVERY_METHOD, first)\n }\n }\n\n /** Call only after the city has loaded. */\n function restoreFromCookies(city: City): void {\n const savedMethod = storage.get(KEY_DELIVERY_METHOD)\n if (savedMethod && VALID_DELIVERY_METHODS.has(savedMethod)) {\n deliveryMethod.value = savedMethod as DeliveryMethod\n }\n\n const savedStockId = storage.get(KEY_SELECTED_STOCK_ID)\n const stocks = city.stocks ?? []\n if (savedStockId && stocks.length) {\n const stock = stocks.find((s) => s.id === savedStockId) ?? null\n selectedStock.value = stock\n if (!stock) storage.remove(KEY_SELECTED_STOCK_ID)\n }\n\n const savedAddress = storage.get(KEY_SELECTED_ADDRESS)\n if (savedAddress) selectedAddress.value = savedAddress\n\n const savedAddressId = storage.get(KEY_SELECTED_ADDRESS_ID)\n if (savedAddressId) selectedAddressId.value = savedAddressId\n\n const savedAddressName = storage.get(KEY_SELECTED_ADDRESS_NAME)\n if (savedAddressName) selectedAddressName.value = savedAddressName\n\n const savedTable = storage.get(KEY_ON_PREMISE_TABLE)\n if (savedTable) onPremiseTable.value = savedTable\n }\n\n const isDelivery = computed(() => deliveryMethod.value === DeliveryMethod.Delivery)\n const isPickup = computed(() => deliveryMethod.value === DeliveryMethod.Pickup)\n const isOnPremise = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise)\n const needsAddress = computed(() => deliveryMethod.value === DeliveryMethod.Delivery)\n const needsStock = computed(\n () =>\n deliveryMethod.value === DeliveryMethod.Pickup ||\n deliveryMethod.value === DeliveryMethod.OnPremise\n )\n const needsTable = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise)\n\n return {\n deliveryMethod,\n onPremiseTable,\n selectedStock,\n selectedAddress,\n selectedAddressId,\n selectedAddressName,\n setDeliveryMethod,\n setOnPremiseTable,\n setSelectedStock,\n setSelectedAddress,\n validateDeliveryMethod,\n restoreFromCookies,\n isDelivery,\n isPickup,\n isOnPremise,\n needsAddress,\n needsStock,\n needsTable,\n }\n})\n","import { PaymentMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type {\n DeliveryMethod,\n Order,\n OrderCheckoutTotal,\n OrderDeliveryMethod,\n OrderPaymentMethod,\n OrderPaymentTransaction,\n OrderProductVariant,\n OrderSettings,\n} from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useOrderSettingsStore } from './order-settings'\n\n// Keys match the old CookieKey.* — so saved values aren't lost.\nconst KEY_COMMENT = 'zenky_order_comment'\nconst KEY_PERSONS_COUNT = 'zenky_order_persons_count'\n\nexport interface CartCredentials {\n id: string\n token: string\n}\n\n/** Bonus intent (business state) — used for headless reconciliation. */\nexport interface AppliedBonusesIntent {\n enabled: boolean\n /** null means \"redeem the maximum available\". */\n desiredAmountMinor: number | null\n /** PIN flow: bonuses were reset and need to be reconfirmed. */\n requiresConfirmation: boolean\n}\n\nexport interface MinPriceViolation {\n remaining: number\n progress: number\n minPrice: number\n}\n\nfunction emptyBonusesIntent(): AppliedBonusesIntent {\n return { enabled: false, desiredAmountMinor: null, requiresConfirmation: false }\n}\n\nfunction parsePersonsCount(raw: string | null): number {\n const parsed = raw ? Number.parseInt(raw, 10) : NaN\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0\n}\n\nexport interface CartStore {\n order: Ref<Order | null>\n credentials: Ref<CartCredentials | null>\n loading: Ref<boolean>\n initializing: Ref<boolean>\n optimisticAdjustments: Ref<Record<string, number>>\n lineOptimistic: Ref<Record<string, number>>\n deliveryMethods: Ref<OrderDeliveryMethod[]>\n orderSettings: Ref<OrderSettings | null>\n comment: Ref<string>\n personsCount: Ref<number>\n checkoutTotal: Ref<OrderCheckoutTotal | null>\n selectedPaymentMethod: Ref<PaymentMethod | null>\n selectedPaymentBill: Ref<number | null>\n selectedCardTokenId: Ref<string | null>\n selectedSaveCard: Ref<boolean>\n bonusesIntent: Ref<AppliedBonusesIntent>\n deliveryTimeIntent: Ref<string | null>\n minPriceViolation: Ref<MinPriceViolation | null>\n setOrder: (order: Order) => void\n patchOrder: (partial: Order) => void\n setCredentials: (credentials: CartCredentials) => void\n setLoading: (value: boolean) => void\n setInitializing: (value: boolean) => void\n adjustOptimistic: (productId: string, delta: number) => void\n clearOptimistic: (productId: string) => void\n adjustLineOptimistic: (lineKey: string, delta: number) => void\n setDeliveryMethods: (methods: OrderDeliveryMethod[]) => void\n setOrderSettings: (settings: OrderSettings) => void\n setComment: (value: string) => void\n setPersonsCount: (value: number) => void\n setSelectedPaymentMethod: (method: PaymentMethod | null) => void\n setSelectedPaymentBill: (bill: number | null) => void\n setSelectedCardTokenId: (id: string | null) => void\n setSelectedSaveCard: (value: boolean) => void\n setBonusesIntentEnabled: (value: boolean) => void\n setDesiredBonusesAmount: (value: number | null) => void\n setBonusesRequiresConfirmation: (value: boolean) => void\n clearBonusesIntent: () => void\n setDeliveryTimeIntent: (value: string | null) => void\n restorePaymentSelection: (payments: OrderPaymentTransaction[]) => void\n validatePaymentSelection: () => void\n setOrderPaymentsState: (payments: OrderPaymentTransaction[]) => void\n setCheckoutTotal: (value: OrderCheckoutTotal) => void\n clearCart: () => void\n hasOrder: ComputedRef<boolean>\n hasCredentials: ComputedRef<boolean>\n variants: ComputedRef<OrderProductVariant[]>\n totalPrice: ComputedRef<number>\n itemCount: ComputedRef<number>\n availableDeliveryMethodIds: ComputedRef<DeliveryMethod[]>\n paymentMethods: ComputedRef<OrderPaymentMethod[]>\n hasBonusesApplied: ComputedRef<boolean>\n productQuantities: ComputedRef<Record<string, number>>\n}\n\nexport const useCartStore = defineStore('zenky-cart', (): CartStore => {\n const { storage } = useRuntime()\n const settingsStore = useOrderSettingsStore()\n\n const order = ref<Order | null>(null)\n const credentials = ref<CartCredentials | null>(null)\n const loading = ref(false)\n const initializing = ref(false)\n const optimisticAdjustments = ref<Record<string, number>>({})\n const lineOptimistic = ref<Record<string, number>>({})\n const deliveryMethods = ref<OrderDeliveryMethod[]>([])\n const orderSettings = ref<OrderSettings | null>(null)\n const comment = ref(storage.get(KEY_COMMENT) ?? '')\n const personsCount = ref(parsePersonsCount(storage.get(KEY_PERSONS_COUNT)))\n const checkoutTotal = ref<OrderCheckoutTotal | null>(null)\n const selectedPaymentMethod = ref<PaymentMethod | null>(null)\n const selectedPaymentBill = ref<number | null>(null)\n const selectedCardTokenId = ref<string | null>(null)\n const selectedSaveCard = ref(false)\n const bonusesIntent = ref<AppliedBonusesIntent>(emptyBonusesIntent())\n const deliveryTimeIntent = ref<string | null>(null)\n const minPriceViolation = ref<MinPriceViolation | null>(null)\n\n function restorePaymentSelection(payments: OrderPaymentTransaction[]): void {\n const restored = payments.find((p) => {\n const raw = p.method as unknown\n const id = typeof raw === 'string' ? raw : ((raw as { id?: string } | null)?.id ?? null)\n return id !== PaymentMethod.Bonuses\n })\n if (!restored) return\n\n const raw = restored.method as unknown\n const methodId = (\n typeof raw === 'string' ? raw : ((raw as { id?: PaymentMethod } | null)?.id ?? null)\n ) as PaymentMethod | null\n if (!methodId || selectedPaymentMethod.value === methodId) return\n\n selectedPaymentMethod.value = methodId\n\n const meta = restored.transaction_meta as { bill?: number | null } | null | undefined\n const billMinor = meta?.bill ?? null\n const newBill = billMinor != null && billMinor > 0 ? billMinor : null\n if (selectedPaymentBill.value !== newBill) {\n selectedPaymentBill.value = newBill\n }\n }\n\n function validatePaymentSelection(): void {\n if (!selectedPaymentMethod.value) return\n const methods = orderSettings.value?.payment_methods ?? []\n if (!methods.some((m) => m.id === selectedPaymentMethod.value)) {\n selectedPaymentMethod.value = null\n selectedPaymentBill.value = null\n }\n }\n\n function setOrder(next: Order): void {\n if (!next?.id || !next.token) {\n console.warn('[cart] setOrder ignored — missing id/token', {\n hasId: Boolean(next?.id),\n hasToken: Boolean(next?.token),\n })\n return\n }\n\n order.value = next\n credentials.value = { id: next.id, token: next.token }\n\n if (Array.isArray(next.payments) && next.payments.length > 0) {\n restorePaymentSelection(next.payments as unknown as OrderPaymentTransaction[])\n }\n }\n\n function patchOrder(partial: Order): void {\n if (!partial?.id || !partial.token) {\n console.warn('[cart] patchOrder ignored — missing id/token', {\n hasId: Boolean(partial?.id),\n hasToken: Boolean(partial?.token),\n })\n return\n }\n\n if (!order.value) {\n order.value = partial\n } else {\n const merged: Order = { ...order.value }\n for (const key of Object.keys(partial) as (keyof Order)[]) {\n const value = partial[key]\n if (value !== undefined) {\n ;(merged as unknown as Record<string, unknown>)[key as string] = value\n }\n }\n order.value = merged\n }\n\n credentials.value = { id: partial.id, token: partial.token }\n\n if (Array.isArray(partial.payments) && partial.payments.length > 0) {\n restorePaymentSelection(partial.payments as unknown as OrderPaymentTransaction[])\n }\n }\n\n function setCredentials(next: CartCredentials): void {\n credentials.value = next\n }\n\n function setLoading(value: boolean): void {\n loading.value = value\n }\n\n function setInitializing(value: boolean): void {\n initializing.value = value\n }\n\n function adjustOptimistic(productId: string, delta: number): void {\n const next = (optimisticAdjustments.value[productId] ?? 0) + delta\n if (next === 0) delete optimisticAdjustments.value[productId]\n else optimisticAdjustments.value[productId] = next\n }\n\n function clearOptimistic(productId: string): void {\n delete optimisticAdjustments.value[productId]\n }\n\n function adjustLineOptimistic(lineKey: string, delta: number): void {\n const next = (lineOptimistic.value[lineKey] ?? 0) + delta\n if (next === 0) delete lineOptimistic.value[lineKey]\n else lineOptimistic.value[lineKey] = next\n }\n\n function setDeliveryMethods(methods: OrderDeliveryMethod[]): void {\n deliveryMethods.value = methods\n settingsStore.validateDeliveryMethod(methods.map((m) => m.id))\n }\n\n function setOrderSettings(settings: OrderSettings): void {\n orderSettings.value = settings\n setDeliveryMethods(settings.delivery_methods)\n validatePaymentSelection()\n }\n\n function setComment(value: string): void {\n comment.value = value\n if (value) storage.set(KEY_COMMENT, value)\n else storage.remove(KEY_COMMENT)\n }\n\n function setPersonsCount(value: number): void {\n personsCount.value = value\n if (value > 0) storage.set(KEY_PERSONS_COUNT, String(value))\n else storage.remove(KEY_PERSONS_COUNT)\n }\n\n function setSelectedPaymentMethod(method: PaymentMethod | null): void {\n selectedPaymentMethod.value = method\n }\n\n function setSelectedPaymentBill(bill: number | null): void {\n selectedPaymentBill.value = bill\n }\n\n function setSelectedCardTokenId(id: string | null): void {\n selectedCardTokenId.value = id\n }\n\n function setSelectedSaveCard(value: boolean): void {\n selectedSaveCard.value = value\n }\n\n function setBonusesIntentEnabled(value: boolean): void {\n bonusesIntent.value.enabled = value\n if (!value) {\n bonusesIntent.value.desiredAmountMinor = null\n bonusesIntent.value.requiresConfirmation = false\n }\n }\n\n function setDesiredBonusesAmount(value: number | null): void {\n bonusesIntent.value.desiredAmountMinor = value\n }\n\n function setBonusesRequiresConfirmation(value: boolean): void {\n bonusesIntent.value.requiresConfirmation = value\n }\n\n function clearBonusesIntent(): void {\n bonusesIntent.value = emptyBonusesIntent()\n }\n\n function setDeliveryTimeIntent(value: string | null): void {\n deliveryTimeIntent.value = value\n }\n\n function setOrderPaymentsState(payments: OrderPaymentTransaction[]): void {\n if (order.value) {\n order.value = { ...order.value, payments } as Order\n }\n restorePaymentSelection(payments)\n }\n\n function setCheckoutTotal(value: OrderCheckoutTotal): void {\n checkoutTotal.value = value\n\n const min = value.min_price\n // An empty order (no variants) with a non-zero delivery fee in the total\n // doesn't count as a minimum-price violation.\n const hasItems = (order.value?.variants?.length ?? 0) > 0\n minPriceViolation.value =\n hasItems && min != null && value.total > 0 && value.total < min\n ? {\n remaining: Math.max(0, min - value.total),\n progress: Math.min(1, value.total / min),\n minPrice: min,\n }\n : null\n }\n\n function clearCart(): void {\n order.value = null\n credentials.value = null\n checkoutTotal.value = null\n optimisticAdjustments.value = {}\n lineOptimistic.value = {}\n orderSettings.value = null\n comment.value = ''\n personsCount.value = 0\n storage.remove(KEY_COMMENT)\n storage.remove(KEY_PERSONS_COUNT)\n selectedPaymentMethod.value = null\n selectedPaymentBill.value = null\n selectedCardTokenId.value = null\n selectedSaveCard.value = false\n bonusesIntent.value = emptyBonusesIntent()\n deliveryTimeIntent.value = null\n minPriceViolation.value = null\n }\n\n const hasOrder = computed(() => order.value !== null)\n const hasCredentials = computed(() => credentials.value !== null)\n const variants = computed<OrderProductVariant[]>(() => order.value?.variants ?? [])\n const totalPrice = computed(() => order.value?.total_price ?? 0)\n const itemCount = computed(() => variants.value.reduce((sum, v) => sum + v.quantity, 0))\n const availableDeliveryMethodIds = computed<DeliveryMethod[]>(() =>\n deliveryMethods.value.map((m) => m.id)\n )\n const paymentMethods = computed<OrderPaymentMethod[]>(\n () => orderSettings.value?.payment_methods ?? []\n )\n const hasBonusesApplied = computed(() => {\n const payments = order.value?.payments ?? []\n return (payments as unknown as Array<{ method: unknown }>).some((p) => {\n const raw = p.method\n const id = typeof raw === 'string' ? raw : ((raw as { id?: string } | null)?.id ?? null)\n return id === PaymentMethod.Bonuses\n })\n })\n const productQuantities = computed<Record<string, number>>(() => {\n const map: Record<string, number> = {}\n for (const variant of variants.value) {\n const pid = variant.product_id\n map[pid] = (map[pid] ?? 0) + variant.quantity\n }\n return map\n })\n\n return {\n order,\n credentials,\n loading,\n initializing,\n optimisticAdjustments,\n lineOptimistic,\n deliveryMethods,\n orderSettings,\n comment,\n personsCount,\n checkoutTotal,\n selectedPaymentMethod,\n selectedPaymentBill,\n selectedCardTokenId,\n selectedSaveCard,\n bonusesIntent,\n deliveryTimeIntent,\n minPriceViolation,\n setOrder,\n patchOrder,\n setCredentials,\n setLoading,\n setInitializing,\n adjustOptimistic,\n clearOptimistic,\n adjustLineOptimistic,\n setDeliveryMethods,\n setOrderSettings,\n setComment,\n setPersonsCount,\n setSelectedPaymentMethod,\n setSelectedPaymentBill,\n setSelectedCardTokenId,\n setSelectedSaveCard,\n setBonusesIntentEnabled,\n setDesiredBonusesAmount,\n setBonusesRequiresConfirmation,\n clearBonusesIntent,\n setDeliveryTimeIntent,\n restorePaymentSelection,\n validatePaymentSelection,\n setOrderPaymentsState,\n setCheckoutTotal,\n clearCart,\n hasOrder,\n hasCredentials,\n variants,\n totalPrice,\n itemCount,\n availableDeliveryMethodIds,\n paymentMethods,\n hasBonusesApplied,\n productQuantities,\n }\n})\n","import { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nexport interface RewardSelectionContext {\n type: string\n id: string\n}\n\nexport interface RewardSelection {\n offerId: string\n promotionId: string\n rewardId: string\n context: RewardSelectionContext | null\n limit: number\n}\n\nexport interface PromotionsStore {\n rewards: Ref<RewardSelection[]>\n checking: Ref<boolean>\n addOrUpdateReward: (selection: RewardSelection) => void\n removeRewardByPromotion: (promotionId: string) => void\n clearRewards: () => void\n setChecking: (value: boolean) => void\n hasRewards: ComputedRef<boolean>\n totalEmptySlots: ComputedRef<number>\n rewardSelection: ComputedRef<RewardSelection | null>\n needsSelection: ComputedRef<boolean>\n}\n\nexport const usePromotionsStore = defineStore('zenky-promotions', (): PromotionsStore => {\n /** Available rewards (multiple promotions can be active at the same time). */\n const rewards = ref<RewardSelection[]>([])\n const checking = ref(false)\n\n function addOrUpdateReward(selection: RewardSelection): void {\n const index = rewards.value.findIndex((r) => r.promotionId === selection.promotionId)\n if (index >= 0) {\n rewards.value[index] = selection\n } else {\n rewards.value.push(selection)\n }\n }\n\n function removeRewardByPromotion(promotionId: string): void {\n rewards.value = rewards.value.filter((r) => r.promotionId !== promotionId)\n }\n\n function clearRewards(): void {\n rewards.value = []\n }\n\n function setChecking(value: boolean): void {\n checking.value = value\n }\n\n const hasRewards = computed(() => rewards.value.length > 0)\n const totalEmptySlots = computed(() => rewards.value.reduce((sum, r) => sum + r.limit, 0))\n /** Kept for backward compatibility — the first reward. */\n const rewardSelection = computed<RewardSelection | null>(() => rewards.value[0] ?? null)\n const needsSelection = computed(() => rewards.value.some((r) => r.context !== null))\n\n return {\n rewards,\n checking,\n addOrUpdateReward,\n removeRewardByPromotion,\n clearRewards,\n setChecking,\n hasRewards,\n totalEmptySlots,\n rewardSelection,\n needsSelection,\n }\n})\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stores/order-settings.ts","../src/stores/cart.ts","../src/stores/promotions.ts"],"names":["defineStore","ref","raw","computed"],"mappings":"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","file":"chunk-TE2QPH74.js","sourcesContent":["import { DeliveryMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type { City, Stock } from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\n\n// Keys match the old CookieKey.* — so saved settings aren't lost.\nconst KEY_DELIVERY_METHOD = 'zenky_delivery_method'\nconst KEY_ON_PREMISE_TABLE = 'zenky_on_premise_table'\nconst KEY_SELECTED_STOCK_ID = 'zenky_selected_stock_id'\nconst KEY_SELECTED_ADDRESS = 'zenky_selected_address'\nconst KEY_SELECTED_ADDRESS_ID = 'zenky_selected_address_id'\nconst KEY_SELECTED_ADDRESS_NAME = 'zenky_selected_address_name'\n\nconst VALID_DELIVERY_METHODS = new Set<string>(Object.values(DeliveryMethod))\n\nexport interface OrderSettingsStore {\n deliveryMethod: Ref<DeliveryMethod>\n onPremiseTable: Ref<string | null>\n selectedStock: Ref<Stock | null>\n selectedAddress: Ref<string | null>\n selectedAddressId: Ref<string | null>\n selectedAddressName: Ref<string | null>\n setDeliveryMethod: (method: DeliveryMethod) => void\n setOnPremiseTable: (table: string | null) => void\n setSelectedStock: (stock: Stock | null) => void\n setSelectedAddress: (\n address: string | null,\n addressId?: string | null,\n addressName?: string | null\n ) => void\n validateDeliveryMethod: (availableMethods: DeliveryMethod[]) => void\n restoreFromCookies: (city: City) => void\n isDelivery: ComputedRef<boolean>\n isPickup: ComputedRef<boolean>\n isOnPremise: ComputedRef<boolean>\n needsAddress: ComputedRef<boolean>\n needsStock: ComputedRef<boolean>\n needsTable: ComputedRef<boolean>\n}\n\nexport const useOrderSettingsStore = defineStore('zenky-order-settings', (): OrderSettingsStore => {\n const { storage } = useRuntime()\n\n const deliveryMethod = ref<DeliveryMethod>(DeliveryMethod.Delivery)\n const onPremiseTable = ref<string | null>(null)\n const selectedStock = ref<Stock | null>(null)\n const selectedAddress = ref<string | null>(null)\n const selectedAddressId = ref<string | null>(null)\n const selectedAddressName = ref<string | null>(null)\n\n function setDeliveryMethod(method: DeliveryMethod): void {\n deliveryMethod.value = method\n storage.set(KEY_DELIVERY_METHOD, method)\n }\n\n function setOnPremiseTable(table: string | null): void {\n onPremiseTable.value = table\n if (table) storage.set(KEY_ON_PREMISE_TABLE, table)\n else storage.remove(KEY_ON_PREMISE_TABLE)\n }\n\n function setSelectedStock(stock: Stock | null): void {\n selectedStock.value = stock\n if (stock) storage.set(KEY_SELECTED_STOCK_ID, stock.id)\n else storage.remove(KEY_SELECTED_STOCK_ID)\n }\n\n function setSelectedAddress(\n address: string | null,\n addressId?: string | null,\n addressName?: string | null\n ): void {\n selectedAddress.value = address\n selectedAddressId.value = addressId ?? null\n selectedAddressName.value = addressName ?? null\n writeOrRemove(KEY_SELECTED_ADDRESS, address)\n writeOrRemove(KEY_SELECTED_ADDRESS_ID, addressId ?? null)\n writeOrRemove(KEY_SELECTED_ADDRESS_NAME, addressName ?? null)\n }\n\n function writeOrRemove(key: string, value: string | null): void {\n if (value) storage.set(key, value)\n else storage.remove(key)\n }\n\n function validateDeliveryMethod(availableMethods: DeliveryMethod[]): void {\n const first = availableMethods[0]\n if (!first) return\n\n if (!availableMethods.includes(deliveryMethod.value)) {\n deliveryMethod.value = first\n storage.set(KEY_DELIVERY_METHOD, first)\n }\n }\n\n /** Call only after the city has loaded. */\n function restoreFromCookies(city: City): void {\n const savedMethod = storage.get(KEY_DELIVERY_METHOD)\n if (savedMethod && VALID_DELIVERY_METHODS.has(savedMethod)) {\n deliveryMethod.value = savedMethod as DeliveryMethod\n }\n\n const savedStockId = storage.get(KEY_SELECTED_STOCK_ID)\n const stocks = city.stocks ?? []\n if (savedStockId && stocks.length) {\n const stock = stocks.find((s) => s.id === savedStockId) ?? null\n selectedStock.value = stock\n if (!stock) storage.remove(KEY_SELECTED_STOCK_ID)\n }\n\n const savedAddress = storage.get(KEY_SELECTED_ADDRESS)\n if (savedAddress) selectedAddress.value = savedAddress\n\n const savedAddressId = storage.get(KEY_SELECTED_ADDRESS_ID)\n if (savedAddressId) selectedAddressId.value = savedAddressId\n\n const savedAddressName = storage.get(KEY_SELECTED_ADDRESS_NAME)\n if (savedAddressName) selectedAddressName.value = savedAddressName\n\n const savedTable = storage.get(KEY_ON_PREMISE_TABLE)\n if (savedTable) onPremiseTable.value = savedTable\n }\n\n const isDelivery = computed(() => deliveryMethod.value === DeliveryMethod.Delivery)\n const isPickup = computed(() => deliveryMethod.value === DeliveryMethod.Pickup)\n const isOnPremise = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise)\n const needsAddress = computed(() => deliveryMethod.value === DeliveryMethod.Delivery)\n const needsStock = computed(\n () =>\n deliveryMethod.value === DeliveryMethod.Pickup ||\n deliveryMethod.value === DeliveryMethod.OnPremise\n )\n const needsTable = computed(() => deliveryMethod.value === DeliveryMethod.OnPremise)\n\n return {\n deliveryMethod,\n onPremiseTable,\n selectedStock,\n selectedAddress,\n selectedAddressId,\n selectedAddressName,\n setDeliveryMethod,\n setOnPremiseTable,\n setSelectedStock,\n setSelectedAddress,\n validateDeliveryMethod,\n restoreFromCookies,\n isDelivery,\n isPickup,\n isOnPremise,\n needsAddress,\n needsStock,\n needsTable,\n }\n})\n","import { PaymentMethod } from '@zenky/storefront-api'\nimport { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport type {\n DeliveryMethod,\n Order,\n OrderCheckoutTotal,\n OrderDeliveryMethod,\n OrderPaymentMethod,\n OrderPaymentTransaction,\n OrderProductVariant,\n OrderSettings,\n} from '@zenky/storefront-api'\n\nimport { useRuntime } from '../ports/runtime'\nimport { useOrderSettingsStore } from './order-settings'\n\n// Keys match the old CookieKey.* — so saved values aren't lost.\nconst KEY_COMMENT = 'zenky_order_comment'\nconst KEY_PERSONS_COUNT = 'zenky_order_persons_count'\n\nexport interface CartCredentials {\n id: string\n token: string\n}\n\n/** Bonus intent (business state) — used for headless reconciliation. */\nexport interface AppliedBonusesIntent {\n enabled: boolean\n /** null means \"redeem the maximum available\". */\n desiredAmountMinor: number | null\n /** PIN flow: bonuses were reset and need to be reconfirmed. */\n requiresConfirmation: boolean\n}\n\nexport interface MinPriceViolation {\n remaining: number\n progress: number\n minPrice: number\n}\n\nfunction emptyBonusesIntent(): AppliedBonusesIntent {\n return { enabled: false, desiredAmountMinor: null, requiresConfirmation: false }\n}\n\nfunction parsePersonsCount(raw: string | null): number {\n const parsed = raw ? Number.parseInt(raw, 10) : NaN\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0\n}\n\nexport interface CartStore {\n order: Ref<Order | null>\n credentials: Ref<CartCredentials | null>\n loading: Ref<boolean>\n initializing: Ref<boolean>\n optimisticAdjustments: Ref<Record<string, number>>\n lineOptimistic: Ref<Record<string, number>>\n deliveryMethods: Ref<OrderDeliveryMethod[]>\n orderSettings: Ref<OrderSettings | null>\n comment: Ref<string>\n personsCount: Ref<number>\n checkoutTotal: Ref<OrderCheckoutTotal | null>\n selectedPaymentMethod: Ref<PaymentMethod | null>\n selectedPaymentBill: Ref<number | null>\n selectedCardTokenId: Ref<string | null>\n selectedSaveCard: Ref<boolean>\n bonusesIntent: Ref<AppliedBonusesIntent>\n deliveryTimeIntent: Ref<string | null>\n minPriceViolation: Ref<MinPriceViolation | null>\n setOrder: (order: Order) => void\n patchOrder: (partial: Order) => void\n setCredentials: (credentials: CartCredentials) => void\n setLoading: (value: boolean) => void\n setInitializing: (value: boolean) => void\n adjustOptimistic: (productId: string, delta: number) => void\n clearOptimistic: (productId: string) => void\n adjustLineOptimistic: (lineKey: string, delta: number) => void\n setDeliveryMethods: (methods: OrderDeliveryMethod[]) => void\n setOrderSettings: (settings: OrderSettings) => void\n setComment: (value: string) => void\n setPersonsCount: (value: number) => void\n setSelectedPaymentMethod: (method: PaymentMethod | null) => void\n setSelectedPaymentBill: (bill: number | null) => void\n setSelectedCardTokenId: (id: string | null) => void\n setSelectedSaveCard: (value: boolean) => void\n setBonusesIntentEnabled: (value: boolean) => void\n setDesiredBonusesAmount: (value: number | null) => void\n setBonusesRequiresConfirmation: (value: boolean) => void\n clearBonusesIntent: () => void\n setDeliveryTimeIntent: (value: string | null) => void\n restorePaymentSelection: (payments: OrderPaymentTransaction[]) => void\n validatePaymentSelection: () => void\n setOrderPaymentsState: (payments: OrderPaymentTransaction[]) => void\n setCheckoutTotal: (value: OrderCheckoutTotal) => void\n clearCart: () => void\n hasOrder: ComputedRef<boolean>\n hasCredentials: ComputedRef<boolean>\n variants: ComputedRef<OrderProductVariant[]>\n totalPrice: ComputedRef<number>\n itemCount: ComputedRef<number>\n availableDeliveryMethodIds: ComputedRef<DeliveryMethod[]>\n paymentMethods: ComputedRef<OrderPaymentMethod[]>\n hasBonusesApplied: ComputedRef<boolean>\n productQuantities: ComputedRef<Record<string, number>>\n}\n\nexport const useCartStore = defineStore('zenky-cart', (): CartStore => {\n const { storage } = useRuntime()\n const settingsStore = useOrderSettingsStore()\n\n const order = ref<Order | null>(null)\n const credentials = ref<CartCredentials | null>(null)\n const loading = ref(false)\n const initializing = ref(false)\n const optimisticAdjustments = ref<Record<string, number>>({})\n const lineOptimistic = ref<Record<string, number>>({})\n const deliveryMethods = ref<OrderDeliveryMethod[]>([])\n const orderSettings = ref<OrderSettings | null>(null)\n const comment = ref(storage.get(KEY_COMMENT) ?? '')\n const personsCount = ref(parsePersonsCount(storage.get(KEY_PERSONS_COUNT)))\n const checkoutTotal = ref<OrderCheckoutTotal | null>(null)\n const selectedPaymentMethod = ref<PaymentMethod | null>(null)\n const selectedPaymentBill = ref<number | null>(null)\n const selectedCardTokenId = ref<string | null>(null)\n const selectedSaveCard = ref(false)\n const bonusesIntent = ref<AppliedBonusesIntent>(emptyBonusesIntent())\n const deliveryTimeIntent = ref<string | null>(null)\n const minPriceViolation = ref<MinPriceViolation | null>(null)\n\n function restorePaymentSelection(payments: OrderPaymentTransaction[]): void {\n const restored = payments.find((p) => {\n const raw = p.method as unknown\n const id = typeof raw === 'string' ? raw : ((raw as { id?: string } | null)?.id ?? null)\n return id !== PaymentMethod.Bonuses\n })\n if (!restored) return\n\n const raw = restored.method as unknown\n const methodId = (\n typeof raw === 'string' ? raw : ((raw as { id?: PaymentMethod } | null)?.id ?? null)\n ) as PaymentMethod | null\n if (!methodId || selectedPaymentMethod.value === methodId) return\n\n selectedPaymentMethod.value = methodId\n\n const meta = restored.transaction_meta as { bill?: number | null } | null | undefined\n const billMinor = meta?.bill ?? null\n const newBill = billMinor != null && billMinor > 0 ? billMinor : null\n if (selectedPaymentBill.value !== newBill) {\n selectedPaymentBill.value = newBill\n }\n }\n\n function validatePaymentSelection(): void {\n if (!selectedPaymentMethod.value) return\n const methods = orderSettings.value?.payment_methods ?? []\n if (!methods.some((m) => m.id === selectedPaymentMethod.value)) {\n selectedPaymentMethod.value = null\n selectedPaymentBill.value = null\n }\n }\n\n function setOrder(next: Order): void {\n if (!next?.id || !next.token) {\n console.warn('[cart] setOrder ignored — missing id/token', {\n hasId: Boolean(next?.id),\n hasToken: Boolean(next?.token),\n })\n return\n }\n\n order.value = next\n credentials.value = { id: next.id, token: next.token }\n\n if (Array.isArray(next.payments) && next.payments.length > 0) {\n restorePaymentSelection(next.payments as unknown as OrderPaymentTransaction[])\n }\n }\n\n function patchOrder(partial: Order): void {\n if (!partial?.id || !partial.token) {\n console.warn('[cart] patchOrder ignored — missing id/token', {\n hasId: Boolean(partial?.id),\n hasToken: Boolean(partial?.token),\n })\n return\n }\n\n if (!order.value) {\n order.value = partial\n } else {\n const merged: Order = { ...order.value }\n for (const key of Object.keys(partial) as (keyof Order)[]) {\n const value = partial[key]\n if (value !== undefined) {\n ;(merged as unknown as Record<string, unknown>)[key as string] = value\n }\n }\n order.value = merged\n }\n\n credentials.value = { id: partial.id, token: partial.token }\n\n if (Array.isArray(partial.payments) && partial.payments.length > 0) {\n restorePaymentSelection(partial.payments as unknown as OrderPaymentTransaction[])\n }\n }\n\n function setCredentials(next: CartCredentials): void {\n credentials.value = next\n }\n\n function setLoading(value: boolean): void {\n loading.value = value\n }\n\n function setInitializing(value: boolean): void {\n initializing.value = value\n }\n\n function adjustOptimistic(productId: string, delta: number): void {\n const next = (optimisticAdjustments.value[productId] ?? 0) + delta\n if (next === 0) delete optimisticAdjustments.value[productId]\n else optimisticAdjustments.value[productId] = next\n }\n\n function clearOptimistic(productId: string): void {\n delete optimisticAdjustments.value[productId]\n }\n\n function adjustLineOptimistic(lineKey: string, delta: number): void {\n const next = (lineOptimistic.value[lineKey] ?? 0) + delta\n if (next === 0) delete lineOptimistic.value[lineKey]\n else lineOptimistic.value[lineKey] = next\n }\n\n function setDeliveryMethods(methods: OrderDeliveryMethod[]): void {\n deliveryMethods.value = methods\n settingsStore.validateDeliveryMethod(methods.map((m) => m.id))\n }\n\n function setOrderSettings(settings: OrderSettings): void {\n orderSettings.value = settings\n setDeliveryMethods(settings.delivery_methods)\n validatePaymentSelection()\n }\n\n function setComment(value: string): void {\n comment.value = value\n if (value) storage.set(KEY_COMMENT, value)\n else storage.remove(KEY_COMMENT)\n }\n\n function setPersonsCount(value: number): void {\n personsCount.value = value\n if (value > 0) storage.set(KEY_PERSONS_COUNT, String(value))\n else storage.remove(KEY_PERSONS_COUNT)\n }\n\n function setSelectedPaymentMethod(method: PaymentMethod | null): void {\n selectedPaymentMethod.value = method\n }\n\n function setSelectedPaymentBill(bill: number | null): void {\n selectedPaymentBill.value = bill\n }\n\n function setSelectedCardTokenId(id: string | null): void {\n selectedCardTokenId.value = id\n }\n\n function setSelectedSaveCard(value: boolean): void {\n selectedSaveCard.value = value\n }\n\n function setBonusesIntentEnabled(value: boolean): void {\n bonusesIntent.value.enabled = value\n if (!value) {\n bonusesIntent.value.desiredAmountMinor = null\n bonusesIntent.value.requiresConfirmation = false\n }\n }\n\n function setDesiredBonusesAmount(value: number | null): void {\n bonusesIntent.value.desiredAmountMinor = value\n }\n\n function setBonusesRequiresConfirmation(value: boolean): void {\n bonusesIntent.value.requiresConfirmation = value\n }\n\n function clearBonusesIntent(): void {\n bonusesIntent.value = emptyBonusesIntent()\n }\n\n function setDeliveryTimeIntent(value: string | null): void {\n deliveryTimeIntent.value = value\n }\n\n function setOrderPaymentsState(payments: OrderPaymentTransaction[]): void {\n if (order.value) {\n order.value = { ...order.value, payments } as Order\n }\n restorePaymentSelection(payments)\n }\n\n function setCheckoutTotal(value: OrderCheckoutTotal): void {\n checkoutTotal.value = value\n\n const min = value.min_price\n // An empty order (no variants) with a non-zero delivery fee in the total\n // doesn't count as a minimum-price violation.\n const hasItems = (order.value?.variants?.length ?? 0) > 0\n minPriceViolation.value =\n hasItems && min != null && value.total > 0 && value.total < min\n ? {\n remaining: Math.max(0, min - value.total),\n progress: Math.min(1, value.total / min),\n minPrice: min,\n }\n : null\n }\n\n function clearCart(): void {\n order.value = null\n credentials.value = null\n checkoutTotal.value = null\n optimisticAdjustments.value = {}\n lineOptimistic.value = {}\n orderSettings.value = null\n comment.value = ''\n personsCount.value = 0\n storage.remove(KEY_COMMENT)\n storage.remove(KEY_PERSONS_COUNT)\n selectedPaymentMethod.value = null\n selectedPaymentBill.value = null\n selectedCardTokenId.value = null\n selectedSaveCard.value = false\n bonusesIntent.value = emptyBonusesIntent()\n deliveryTimeIntent.value = null\n minPriceViolation.value = null\n }\n\n const hasOrder = computed(() => order.value !== null)\n const hasCredentials = computed(() => credentials.value !== null)\n const variants = computed<OrderProductVariant[]>(() => order.value?.variants ?? [])\n const totalPrice = computed(() => order.value?.total_price ?? 0)\n const itemCount = computed(() => variants.value.reduce((sum, v) => sum + v.quantity, 0))\n const availableDeliveryMethodIds = computed<DeliveryMethod[]>(() =>\n deliveryMethods.value.map((m) => m.id)\n )\n const paymentMethods = computed<OrderPaymentMethod[]>(\n () => orderSettings.value?.payment_methods ?? []\n )\n const hasBonusesApplied = computed(() => {\n const payments = order.value?.payments ?? []\n return (payments as unknown as Array<{ method: unknown }>).some((p) => {\n const raw = p.method\n const id = typeof raw === 'string' ? raw : ((raw as { id?: string } | null)?.id ?? null)\n return id === PaymentMethod.Bonuses\n })\n })\n const productQuantities = computed<Record<string, number>>(() => {\n const map: Record<string, number> = {}\n for (const variant of variants.value) {\n const pid = variant.product_id\n map[pid] = (map[pid] ?? 0) + variant.quantity\n }\n return map\n })\n\n return {\n order,\n credentials,\n loading,\n initializing,\n optimisticAdjustments,\n lineOptimistic,\n deliveryMethods,\n orderSettings,\n comment,\n personsCount,\n checkoutTotal,\n selectedPaymentMethod,\n selectedPaymentBill,\n selectedCardTokenId,\n selectedSaveCard,\n bonusesIntent,\n deliveryTimeIntent,\n minPriceViolation,\n setOrder,\n patchOrder,\n setCredentials,\n setLoading,\n setInitializing,\n adjustOptimistic,\n clearOptimistic,\n adjustLineOptimistic,\n setDeliveryMethods,\n setOrderSettings,\n setComment,\n setPersonsCount,\n setSelectedPaymentMethod,\n setSelectedPaymentBill,\n setSelectedCardTokenId,\n setSelectedSaveCard,\n setBonusesIntentEnabled,\n setDesiredBonusesAmount,\n setBonusesRequiresConfirmation,\n clearBonusesIntent,\n setDeliveryTimeIntent,\n restorePaymentSelection,\n validatePaymentSelection,\n setOrderPaymentsState,\n setCheckoutTotal,\n clearCart,\n hasOrder,\n hasCredentials,\n variants,\n totalPrice,\n itemCount,\n availableDeliveryMethodIds,\n paymentMethods,\n hasBonusesApplied,\n productQuantities,\n }\n})\n","import { defineStore } from 'pinia'\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nexport interface RewardSelectionContext {\n type: string\n id: string\n}\n\nexport interface RewardSelection {\n offerId: string\n promotionId: string\n rewardId: string\n context: RewardSelectionContext | null\n limit: number\n}\n\nexport interface PromotionsStore {\n rewards: Ref<RewardSelection[]>\n checking: Ref<boolean>\n addOrUpdateReward: (selection: RewardSelection) => void\n removeRewardByPromotion: (promotionId: string) => void\n clearRewards: () => void\n setChecking: (value: boolean) => void\n hasRewards: ComputedRef<boolean>\n totalEmptySlots: ComputedRef<number>\n rewardSelection: ComputedRef<RewardSelection | null>\n needsSelection: ComputedRef<boolean>\n}\n\nexport const usePromotionsStore = defineStore('zenky-promotions', (): PromotionsStore => {\n /** Available rewards (multiple promotions can be active at the same time). */\n const rewards = ref<RewardSelection[]>([])\n const checking = ref(false)\n\n function addOrUpdateReward(selection: RewardSelection): void {\n const index = rewards.value.findIndex((r) => r.promotionId === selection.promotionId)\n if (index >= 0) {\n rewards.value[index] = selection\n } else {\n rewards.value.push(selection)\n }\n }\n\n function removeRewardByPromotion(promotionId: string): void {\n rewards.value = rewards.value.filter((r) => r.promotionId !== promotionId)\n }\n\n function clearRewards(): void {\n rewards.value = []\n }\n\n function setChecking(value: boolean): void {\n checking.value = value\n }\n\n const hasRewards = computed(() => rewards.value.length > 0)\n const totalEmptySlots = computed(() => rewards.value.reduce((sum, r) => sum + r.limit, 0))\n /** Kept for backward compatibility — the first reward. */\n const rewardSelection = computed<RewardSelection | null>(() => rewards.value[0] ?? null)\n const needsSelection = computed(() => rewards.value.some((r) => r.context !== null))\n\n return {\n rewards,\n checking,\n addOrUpdateReward,\n removeRewardByPromotion,\n clearRewards,\n setChecking,\n hasRewards,\n totalEmptySlots,\n rewardSelection,\n needsSelection,\n }\n})\n"]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// src/cart/logCartError.ts
|
|
2
|
+
var REDACTED = "[REDACTED]";
|
|
3
|
+
var MAX_LOG_DEPTH = 6;
|
|
4
|
+
var MAX_ARRAY_ITEMS = 25;
|
|
5
|
+
var MAX_OBJECT_KEYS = 50;
|
|
6
|
+
var SENSITIVE_KEY_PARTS = [
|
|
7
|
+
"address",
|
|
8
|
+
"authorization",
|
|
9
|
+
"checkouturl",
|
|
10
|
+
"cookie",
|
|
11
|
+
"credential",
|
|
12
|
+
"email",
|
|
13
|
+
"password",
|
|
14
|
+
"paymentlink",
|
|
15
|
+
"paymentpageurl",
|
|
16
|
+
"phone",
|
|
17
|
+
"recaptcha",
|
|
18
|
+
"redirecturl",
|
|
19
|
+
"secret",
|
|
20
|
+
"token"
|
|
21
|
+
];
|
|
22
|
+
var SENSITIVE_EXACT_KEYS = /* @__PURE__ */ new Set(["cvc", "cvv", "otp", "pan", "pin"]);
|
|
23
|
+
var SENSITIVE_ASSIGNMENT = /((?:address|authorization|cookie|email|password|phone|recaptcha|secret|(?:checkout|redirect)[_-]?url|payment(?:[_-]?page)?[_-]?(?:link|url)|(?:api|access|auth|card|order|refresh)[_-]?token|token)\s*[=:]\s*["']?)([^\s,"';&}\]]+)/gi;
|
|
24
|
+
var SENSITIVE_QUERY_PARAM = /([?&#](?:address|authorization|email|password|phone|recaptcha|secret|(?:checkout|redirect)[_-]?url|payment(?:[_-]?page)?[_-]?(?:link|url)|(?:api|access|auth|card|order|refresh)[_-]?token|token)=)([^&#\s]+)/gi;
|
|
25
|
+
var BEARER_TOKEN = /(bearer\s+)[a-z0-9._~+/=-]+/gi;
|
|
26
|
+
function isSensitiveKey(key) {
|
|
27
|
+
const normalized = key.replace(/[^a-z0-9]/gi, "").toLowerCase();
|
|
28
|
+
return SENSITIVE_EXACT_KEYS.has(normalized) || normalized.includes("confirmationcode") || normalized.includes("verificationcode") || SENSITIVE_KEY_PARTS.some((part) => normalized.includes(part));
|
|
29
|
+
}
|
|
30
|
+
function sanitizeString(value) {
|
|
31
|
+
return value.replace(BEARER_TOKEN, `$1${REDACTED}`).replace(SENSITIVE_QUERY_PARAM, `$1${REDACTED}`).replace(SENSITIVE_ASSIGNMENT, `$1${REDACTED}`);
|
|
32
|
+
}
|
|
33
|
+
function sanitizeLogValue(value, depth = 0, seen = /* @__PURE__ */ new WeakSet()) {
|
|
34
|
+
if (typeof value === "string") return sanitizeString(value);
|
|
35
|
+
if (value === null || typeof value !== "object") return value;
|
|
36
|
+
if (depth >= MAX_LOG_DEPTH) return "[TRUNCATED]";
|
|
37
|
+
if (seen.has(value)) return "[CIRCULAR]";
|
|
38
|
+
seen.add(value);
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
const sanitized = value.slice(0, MAX_ARRAY_ITEMS).map((item) => sanitizeLogValue(item, depth + 1, seen));
|
|
41
|
+
if (value.length > MAX_ARRAY_ITEMS) sanitized.push("[TRUNCATED]");
|
|
42
|
+
return sanitized;
|
|
43
|
+
}
|
|
44
|
+
const result = {};
|
|
45
|
+
if (value instanceof Error) {
|
|
46
|
+
result.name = sanitizeString(value.name);
|
|
47
|
+
result.message = sanitizeString(value.message);
|
|
48
|
+
}
|
|
49
|
+
let allEntries;
|
|
50
|
+
try {
|
|
51
|
+
allEntries = Object.entries(value);
|
|
52
|
+
} catch {
|
|
53
|
+
return "[UNSERIALIZABLE]";
|
|
54
|
+
}
|
|
55
|
+
const entries = allEntries.slice(0, MAX_OBJECT_KEYS);
|
|
56
|
+
for (const [key, nestedValue] of entries) {
|
|
57
|
+
if (key === "name" || key === "message") continue;
|
|
58
|
+
result[key] = isSensitiveKey(key) ? REDACTED : sanitizeLogValue(nestedValue, depth + 1, seen);
|
|
59
|
+
}
|
|
60
|
+
if (allEntries.length > MAX_OBJECT_KEYS) result.__truncated__ = true;
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
function logCartError({ scope, context }, e) {
|
|
64
|
+
const err = e?.err;
|
|
65
|
+
const safeContext = sanitizeLogValue(context);
|
|
66
|
+
console.error(`[${scope}] failed`, {
|
|
67
|
+
...safeContext ?? {},
|
|
68
|
+
httpCode: err?.http_code,
|
|
69
|
+
errorCode: err?.error_code,
|
|
70
|
+
message: sanitizeLogValue(err?.message),
|
|
71
|
+
meta: sanitizeLogValue(err?.meta),
|
|
72
|
+
error: sanitizeLogValue(e)
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function getCartErrorCode(e) {
|
|
76
|
+
return e?.err?.error_code;
|
|
77
|
+
}
|
|
78
|
+
function getCartErrorHttpCode(e) {
|
|
79
|
+
return e?.err?.http_code;
|
|
80
|
+
}
|
|
81
|
+
function getValidationErrors(e) {
|
|
82
|
+
const err = e?.err;
|
|
83
|
+
if (err?.error_code !== "validation") return {};
|
|
84
|
+
const meta = err.meta;
|
|
85
|
+
return meta?.errors ?? {};
|
|
86
|
+
}
|
|
87
|
+
function getCartErrorMessage(e, fallback) {
|
|
88
|
+
const err = e?.err;
|
|
89
|
+
if (!err) return fallback;
|
|
90
|
+
if (err.error_code === "validation") {
|
|
91
|
+
const errors = err.meta?.errors;
|
|
92
|
+
if (errors) {
|
|
93
|
+
const messages = Object.values(errors).flat().filter(Boolean);
|
|
94
|
+
if (messages.length > 0) return messages.join(" ");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return err.message ?? fallback;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getValidationErrors, logCartError };
|
|
101
|
+
//# sourceMappingURL=chunk-TE42OCFK.js.map
|
|
102
|
+
//# sourceMappingURL=chunk-TE42OCFK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cart/logCartError.ts"],"names":[],"mappings":"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","file":"chunk-TE42OCFK.js","sourcesContent":["/**\n * Common error log format for all cart/checkout operations, plus extraction\n * of readable messages from a ZenkyError for the UI (toast / inline).\n *\n * Zenky API error contract (see `ApiError` in the SDK):\n * {\n * err: {\n * message: string, // localized — \"Адрес доставки не указан.\"\n * original_message: string, // English original\n * http_code: number,\n * error_code: string, // 'addresses.not_specified' | 'validation' | etc.\n * meta: any, // for validation: { errors: { [field]: string[] } }\n * }\n * }\n *\n * For validation errors (`error_code === 'validation'`), we take the messages\n * from `meta.errors` instead of the generic top-level message.\n */\n\ninterface ZenkyValidationMeta {\n errors?: Record<string, string[]>\n request?: unknown\n}\n\ninterface ZenkyErrorPayload {\n http_code?: number\n error_code?: string\n message?: string\n meta?: ZenkyValidationMeta | unknown\n}\n\ninterface ZenkyErrorLike {\n err?: ZenkyErrorPayload\n}\n\nconst REDACTED = '[REDACTED]'\nconst MAX_LOG_DEPTH = 6\nconst MAX_ARRAY_ITEMS = 25\nconst MAX_OBJECT_KEYS = 50\n\nconst SENSITIVE_KEY_PARTS = [\n 'address',\n 'authorization',\n 'checkouturl',\n 'cookie',\n 'credential',\n 'email',\n 'password',\n 'paymentlink',\n 'paymentpageurl',\n 'phone',\n 'recaptcha',\n 'redirecturl',\n 'secret',\n 'token',\n]\nconst SENSITIVE_EXACT_KEYS = new Set(['cvc', 'cvv', 'otp', 'pan', 'pin'])\n\nconst SENSITIVE_ASSIGNMENT =\n /((?:address|authorization|cookie|email|password|phone|recaptcha|secret|(?:checkout|redirect)[_-]?url|payment(?:[_-]?page)?[_-]?(?:link|url)|(?:api|access|auth|card|order|refresh)[_-]?token|token)\\s*[=:]\\s*[\"']?)([^\\s,\"';&}\\]]+)/gi\nconst SENSITIVE_QUERY_PARAM =\n /([?&#](?:address|authorization|email|password|phone|recaptcha|secret|(?:checkout|redirect)[_-]?url|payment(?:[_-]?page)?[_-]?(?:link|url)|(?:api|access|auth|card|order|refresh)[_-]?token|token)=)([^&#\\s]+)/gi\nconst BEARER_TOKEN = /(bearer\\s+)[a-z0-9._~+/=-]+/gi\n\nexport interface CartErrorScope {\n /** Prefix — operation name (`cart-add` / `delivery` / `promocode-apply` / etc.) */\n scope: string\n /** Operation parameters — ids, inputs, whatever is currently in credentials */\n context?: Record<string, unknown>\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const normalized = key.replace(/[^a-z0-9]/gi, '').toLowerCase()\n return (\n SENSITIVE_EXACT_KEYS.has(normalized) ||\n normalized.includes('confirmationcode') ||\n normalized.includes('verificationcode') ||\n SENSITIVE_KEY_PARTS.some((part) => normalized.includes(part))\n )\n}\n\nfunction sanitizeString(value: string): string {\n return value\n .replace(BEARER_TOKEN, `$1${REDACTED}`)\n .replace(SENSITIVE_QUERY_PARAM, `$1${REDACTED}`)\n .replace(SENSITIVE_ASSIGNMENT, `$1${REDACTED}`)\n}\n\n/**\n * Recursively prepares an unknown value for the diagnostic log.\n *\n * This is defense-in-depth in case the SDK puts request headers/body into\n * `meta` or some arbitrary error field. The depth/size limits protect the\n * logger itself from circular or excessively large payloads.\n *\n * @internal Not part of the package's public API; exported only for tests.\n */\nexport function sanitizeLogValue(\n value: unknown,\n depth = 0,\n seen: WeakSet<object> = new WeakSet<object>()\n): unknown {\n if (typeof value === 'string') return sanitizeString(value)\n if (value === null || typeof value !== 'object') return value\n if (depth >= MAX_LOG_DEPTH) return '[TRUNCATED]'\n if (seen.has(value)) return '[CIRCULAR]'\n\n seen.add(value)\n\n if (Array.isArray(value)) {\n const sanitized = value\n .slice(0, MAX_ARRAY_ITEMS)\n .map((item) => sanitizeLogValue(item, depth + 1, seen))\n if (value.length > MAX_ARRAY_ITEMS) sanitized.push('[TRUNCATED]')\n return sanitized\n }\n\n const result: Record<string, unknown> = {}\n\n if (value instanceof Error) {\n result.name = sanitizeString(value.name)\n result.message = sanitizeString(value.message)\n }\n\n let allEntries: [string, unknown][]\n try {\n allEntries = Object.entries(value)\n } catch {\n return '[UNSERIALIZABLE]'\n }\n\n const entries = allEntries.slice(0, MAX_OBJECT_KEYS)\n for (const [key, nestedValue] of entries) {\n if (key === 'name' || key === 'message') continue\n result[key] = isSensitiveKey(key)\n ? REDACTED\n : sanitizeLogValue(nestedValue, depth + 1, seen)\n }\n\n if (allEntries.length > MAX_OBJECT_KEYS) result.__truncated__ = true\n return result\n}\n\n/**\n * Logs a cart/checkout operation error in a common format.\n * Safe for any `unknown` value — doesn't throw on non-ZenkyError errors.\n */\nexport function logCartError({ scope, context }: CartErrorScope, e: unknown): void {\n const err = (e as ZenkyErrorLike | undefined)?.err\n const safeContext = sanitizeLogValue(context) as Record<string, unknown> | undefined\n\n console.error(`[${scope}] failed`, {\n ...(safeContext ?? {}),\n httpCode: err?.http_code,\n errorCode: err?.error_code,\n message: sanitizeLogValue(err?.message),\n meta: sanitizeLogValue(err?.meta),\n error: sanitizeLogValue(e),\n })\n}\n\n/**\n * Extracts the backend `error_code` (e.g. `addresses.not_specified`).\n * Returns undefined for non-Zenky errors.\n */\nexport function getCartErrorCode(e: unknown): string | undefined {\n return (e as ZenkyErrorLike | undefined)?.err?.error_code\n}\n\n/**\n * Extracts the backend HTTP code (e.g. 401 for an operation that requires\n * authorization). Returns undefined for non-Zenky errors.\n */\nexport function getCartErrorHttpCode(e: unknown): number | undefined {\n return (e as ZenkyErrorLike | undefined)?.err?.http_code\n}\n\n/**\n * Extracts field → [messages] from a ZenkyError for validation.\n * Returns {} if the error isn't a validation error or meta.errors is empty.\n */\nexport function getValidationErrors(e: unknown): Record<string, string[]> {\n const err = (e as ZenkyErrorLike | undefined)?.err\n if (err?.error_code !== 'validation') return {}\n const meta = err.meta as ZenkyValidationMeta | undefined\n return meta?.errors ?? {}\n}\n\n/**\n * Extracts a readable message for the UI (toast / inline).\n *\n * Priority:\n * 1. If it's a validation error → join all messages from `meta.errors` (across all fields)\n * 2. Otherwise — `err.message` (generic message from the backend)\n * 3. Otherwise — `fallback`\n */\nexport function getCartErrorMessage(e: unknown, fallback: string): string {\n const err = (e as ZenkyErrorLike | undefined)?.err\n if (!err) return fallback\n\n if (err.error_code === 'validation') {\n const errors = (err.meta as ZenkyValidationMeta | undefined)?.errors\n if (errors) {\n const messages = Object.values(errors).flat().filter(Boolean)\n if (messages.length > 0) return messages.join(' ')\n }\n }\n\n return err.message ?? fallback\n}\n"]}
|