@zenky/storefront-vue 0.10.17 → 0.10.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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"]}
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-YTYCSTHP.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"]}
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
- export { canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductDetail, useProductList, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from './chunk-F2LJ6TDH.js';
1
+ export { canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductDetail, useProductList, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from './chunk-LABBB43Q.js';
2
2
  export { normalizeSnippets } from './chunk-GLQXTMVW.js';
3
+ export { RESEND_TIMER_SECONDS, useAuthFlowStore, useProductsStore, useStore, useStorefrontProfile } from './chunk-YTYCSTHP.js';
3
4
  export { buildCssVariableMap, generatePrimaryShades, generateShades, useTheme } from './chunk-BUNI6MGH.js';
4
5
  export { buildQrCodeUrl, createOperationChain, formatAddressCityLast, formatDate, formatDateTime, formatPhoneNational, formatPhoneSpaced, formatScheduleStatus, getApiErrorMessage, getApiFieldErrors, getEmailLink, getPhoneTelLink, getSocialLinks, getTodayInfo, getWebsiteLink, getWeeklySchedule, groupScheduleDays, pluralize, toDateInputValue, todayInTimezone } from './chunk-RURXGVWW.js';
5
6
  export { createDebounce } from './chunk-XUGXLJZB.js';
6
- export { RESEND_TIMER_SECONDS, useAuthFlowStore, useProductsStore, useStore, useStorefrontProfile } from './chunk-LUJSF6V7.js';
7
7
  import './chunk-EMGQXBU3.js';
8
8
  import './chunk-5B2P5W3E.js';
9
- export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey } from './chunk-U5E6QSUO.js';
10
- export { useCartCredentials } from './chunk-L7UQIKDY.js';
9
+ export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCashDenominationsMinor, getDefaultRoundStepsMinor, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useRestrictedAddToCart, useRestrictionGate, useStorefrontCart, useVisibleCartVariants, variantLineKey } from './chunk-6BXHWR5E.js';
10
+ export { useCartCredentials } from './chunk-2DUKIVKC.js';
11
11
  import './chunk-5QCUH3FF.js';
12
12
  export { getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getValidationErrors, logCartError } from './chunk-TE42OCFK.js';
13
- export { useCartStore, useOrderSettingsStore, usePromotionsStore } from './chunk-54T72OLR.js';
13
+ export { usePromotionsStore } from './chunk-544USTPB.js';
14
14
  export { useCatalogStore } from './chunk-4JCJHAL3.js';
15
- export { createStorefront, provideStorefront, useAuthStore, useRuntime } from './chunk-WTZXTBF6.js';
15
+ export { createStorefront, provideStorefront, useAuthStore, useCartStore, useOrderSettingsStore, useRuntime } from './chunk-T52G6JN7.js';
16
16
  import './chunk-TIQ7AJLY.js';
17
17
  export { useStoreProfileStore } from './chunk-IOYYCA75.js';
18
18
  export { catalogItemEntity, collectDescendantIds, findCategoryById, findCategoryByShortId, findRootAncestor, getCategoryPath, groupProductsBySubcategory, isRenderableCatalogItem, useCollections } from './chunk-EHARSEZT.js';
@@ -1,8 +1,8 @@
1
- export { canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductDetail, useProductList, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from '../chunk-F2LJ6TDH.js';
1
+ export { canAddDirectly, findProductInCatalog, formatWeight, getProductWeight, getVariantWeight, resolveVariantPrice, toGrams, usePriceRecalculation, useProductDetail, useProductList, useProductPricing, useProductVariant, useProductVariantModifiers, useProductVariantSelector, useProductsByCategory, useRelatedProducts } from '../chunk-LABBB43Q.js';
2
2
  import '../chunk-XUGXLJZB.js';
3
3
  import '../chunk-5QCUH3FF.js';
4
4
  import '../chunk-4JCJHAL3.js';
5
- import '../chunk-WTZXTBF6.js';
5
+ import '../chunk-T52G6JN7.js';
6
6
  import '../chunk-IOYYCA75.js';
7
7
  //# sourceMappingURL=index.js.map
8
8
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- export { usePromotionsChecker } from '../chunk-L7UQIKDY.js';
2
- import '../chunk-54T72OLR.js';
3
- import '../chunk-WTZXTBF6.js';
1
+ export { usePromotionsChecker } from '../chunk-2DUKIVKC.js';
2
+ import '../chunk-544USTPB.js';
3
+ import '../chunk-T52G6JN7.js';
4
4
  import '../chunk-IOYYCA75.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
package/dist/seo/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import { resolveVariantPrice } from '../chunk-F2LJ6TDH.js';
1
+ import { resolveVariantPrice } from '../chunk-LABBB43Q.js';
2
2
  import { getSocialLinks } from '../chunk-RURXGVWW.js';
3
3
  import '../chunk-XUGXLJZB.js';
4
4
  import '../chunk-5QCUH3FF.js';
5
5
  import '../chunk-4JCJHAL3.js';
6
- import '../chunk-WTZXTBF6.js';
6
+ import '../chunk-T52G6JN7.js';
7
7
  import '../chunk-IOYYCA75.js';
8
8
  import { minorToMajorString } from '../chunk-2Y6QTHXI.js';
9
9
  import { ContactType } from '@zenky/storefront-api';
@@ -1,9 +1,9 @@
1
- export { RESEND_TIMER_SECONDS, useAuthFlowStore, useProductsStore, useStore, useStorefrontProfile } from '../chunk-LUJSF6V7.js';
1
+ export { RESEND_TIMER_SECONDS, useAuthFlowStore, useProductsStore, useStore, useStorefrontProfile } from '../chunk-YTYCSTHP.js';
2
2
  import '../chunk-5B2P5W3E.js';
3
3
  import '../chunk-TE42OCFK.js';
4
- export { useCartStore, useOrderSettingsStore, usePromotionsStore } from '../chunk-54T72OLR.js';
4
+ export { usePromotionsStore } from '../chunk-544USTPB.js';
5
5
  export { useCatalogStore } from '../chunk-4JCJHAL3.js';
6
- export { useAuthStore } from '../chunk-WTZXTBF6.js';
6
+ export { useAuthStore, useCartStore, useOrderSettingsStore } from '../chunk-T52G6JN7.js';
7
7
  import '../chunk-TIQ7AJLY.js';
8
8
  export { useStoreProfileStore } from '../chunk-IOYYCA75.js';
9
9
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenky/storefront-vue",
3
- "version": "0.10.17",
3
+ "version": "0.10.18",
4
4
  "description": "Zenky Storefront SDK for Vue 3.",
5
5
  "keywords": [
6
6
  "zenky",
@@ -1 +0,0 @@
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-54T72OLR.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 clearOrderSettings: () => 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 clearCheckoutTotal: () => 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 clearOrderSettings(): void {\n orderSettings.value = null\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 clearCheckoutTotal(): void {\n checkoutTotal.value = null\n minPriceViolation.value = 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 clearOrderSettings,\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 clearCheckoutTotal,\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"]}