@zenky/storefront-vue 0.9.46 → 0.10.0
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/LICENSE.md +2 -2
- package/README.md +163 -6
- package/dist/cart/index.d.ts +559 -0
- package/dist/cart/index.js +13 -0
- package/dist/cart/index.js.map +1 -0
- package/dist/catalog/index.d.ts +73 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/chunk-2OD7CLKD.js +102 -0
- package/dist/chunk-2OD7CLKD.js.map +1 -0
- package/dist/chunk-4MJKN7PL.js +111 -0
- package/dist/chunk-4MJKN7PL.js.map +1 -0
- package/dist/chunk-5QCUH3FF.js +15 -0
- package/dist/chunk-5QCUH3FF.js.map +1 -0
- package/dist/chunk-AL5W5JSD.js +41 -0
- package/dist/chunk-AL5W5JSD.js.map +1 -0
- package/dist/chunk-BIGTKVC6.js +38 -0
- package/dist/chunk-BIGTKVC6.js.map +1 -0
- package/dist/chunk-BWUKMWHL.js +45 -0
- package/dist/chunk-BWUKMWHL.js.map +1 -0
- package/dist/chunk-DKWDKVXQ.js +91 -0
- package/dist/chunk-DKWDKVXQ.js.map +1 -0
- package/dist/chunk-EMGQXBU3.js +3 -0
- package/dist/chunk-EMGQXBU3.js.map +1 -0
- package/dist/chunk-EYRCAUUP.js +45 -0
- package/dist/chunk-EYRCAUUP.js.map +1 -0
- package/dist/chunk-GW2QNTAD.js +327 -0
- package/dist/chunk-GW2QNTAD.js.map +1 -0
- package/dist/chunk-IGDDWGS4.js +557 -0
- package/dist/chunk-IGDDWGS4.js.map +1 -0
- package/dist/chunk-OQLU7FSR.js +1841 -0
- package/dist/chunk-OQLU7FSR.js.map +1 -0
- package/dist/chunk-PJ2LEKW6.js +229 -0
- package/dist/chunk-PJ2LEKW6.js.map +1 -0
- package/dist/chunk-PWHIDGKW.js +97 -0
- package/dist/chunk-PWHIDGKW.js.map +1 -0
- package/dist/chunk-RO25KNM5.js +36 -0
- package/dist/chunk-RO25KNM5.js.map +1 -0
- package/dist/chunk-V3VVDQIR.js +27 -0
- package/dist/chunk-V3VVDQIR.js.map +1 -0
- package/dist/chunk-VL3T36VM.js +386 -0
- package/dist/chunk-VL3T36VM.js.map +1 -0
- package/dist/chunk-XUGXLJZB.js +14 -0
- package/dist/chunk-XUGXLJZB.js.map +1 -0
- package/dist/chunk-Z3IW4ODZ.js +36 -0
- package/dist/chunk-Z3IW4ODZ.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.d.ts +54 -0
- package/dist/layout/index.js +102 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/money/index.d.ts +26 -0
- package/dist/money/index.js +3 -0
- package/dist/money/index.js.map +1 -0
- package/dist/order/index.d.ts +34 -0
- package/dist/order/index.js +209 -0
- package/dist/order/index.js.map +1 -0
- package/dist/pagination/index.d.ts +87 -0
- package/dist/pagination/index.js +97 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/ports/index.d.ts +124 -0
- package/dist/ports/index.js +3 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/products/index.d.ts +105 -0
- package/dist/products/index.js +7 -0
- package/dist/products/index.js.map +1 -0
- package/dist/promotions/index.d.ts +10 -0
- package/dist/promotions/index.js +7 -0
- package/dist/promotions/index.js.map +1 -0
- package/dist/schedule-Dd3zwHEb.d.ts +27 -0
- package/dist/seo/index.d.ts +91 -0
- package/dist/seo/index.js +289 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/snippets/index.d.ts +17 -0
- package/dist/snippets/index.js +3 -0
- package/dist/snippets/index.js.map +1 -0
- package/dist/snippets-BC5bkSjm.d.ts +23 -0
- package/dist/stores/index.d.ts +196 -0
- package/dist/stores/index.js +8 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/theme/index.d.ts +60 -0
- package/dist/theme/index.js +3 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/utils/index.d.ts +66 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/website-settings/index.d.ts +38 -0
- package/dist/website-settings/index.js +3 -0
- package/dist/website-settings/index.js.map +1 -0
- package/package.json +122 -41
- package/dist/esm/index.js +0 -3642
- package/dist/zenky.d.ts +0 -10377
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
import { ProductModifiersRequest, OrderProductVariant, PaymentMethod, OrderPaymentMethodRequest, OrderAuthenticationMethod, OrderCredentials, Order, OrderCheckoutTotal, OrderSettings, OrderPaymentMethod, OrderDeliveryMethod, InclusionRequest, ZenkyStorefront, SetOrderCustomerRequest, SetOrderDeliveryRequest, OrderPromocode, OrderCheckoutResult, RecaptchaAction } from '@zenky/storefront-api';
|
|
2
|
+
import { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
|
|
3
|
+
import { ActivityReporter, Notifier, Result } from '../ports/index.js';
|
|
4
|
+
import '@zenky/integrations-sdk';
|
|
5
|
+
|
|
6
|
+
/** WebSocket события канала заказа */
|
|
7
|
+
declare const ORDER_EVENTS: {
|
|
8
|
+
readonly PriceRecalculated: "orders.price.recalculated";
|
|
9
|
+
readonly Reload: "orders.reload";
|
|
10
|
+
readonly Submitted: "orders.submitted";
|
|
11
|
+
readonly Repeated: "orders.repeated";
|
|
12
|
+
readonly PromotionsNotFound: "orders.promotions.not_found";
|
|
13
|
+
readonly RewardsDisplaySelection: "orders.rewards.display_selection";
|
|
14
|
+
readonly RewardsReload: "orders.rewards.reload";
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** Нормализация строки адреса для сравнения (lowercase, схлопывание запятых/пробелов). */
|
|
18
|
+
declare function normalizeAddress(value: string | null | undefined): string;
|
|
19
|
+
|
|
20
|
+
interface CartLineKeyParams {
|
|
21
|
+
productVariantId: string;
|
|
22
|
+
modifiers?: ProductModifiersRequest[];
|
|
23
|
+
promotionId?: string;
|
|
24
|
+
promotionRewardId?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Детерминированный ключ строки корзины: variant + sorted modifiers + promotion. */
|
|
27
|
+
declare function buildCartLineKey(params: CartLineKeyParams): string;
|
|
28
|
+
declare function variantLineKey(variant: OrderProductVariant): string;
|
|
29
|
+
|
|
30
|
+
interface MainPaymentRequestParams {
|
|
31
|
+
method: PaymentMethod | null;
|
|
32
|
+
billMinor: number | null;
|
|
33
|
+
cardTokenId: string | null;
|
|
34
|
+
saveCard: boolean;
|
|
35
|
+
currency: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Основной (не-бонусный) payment-request из выбранного способа оплаты.
|
|
39
|
+
* Единый источник для UI и reconciliation; `bill` конвертируется minor→major здесь.
|
|
40
|
+
*/
|
|
41
|
+
declare function buildMainPaymentRequest(params: MainPaymentRequestParams): OrderPaymentMethodRequest | null;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Утилиты для построения пресетов «с какой суммы приготовить сдачу» (cash bill)
|
|
45
|
+
* в минорных единицах валюты (копейки/тыйны/сатанги).
|
|
46
|
+
*
|
|
47
|
+
* UI отображает пресеты как пилюли: «1100 ₽», «1500 ₽», «5000 ₽» и т.п.
|
|
48
|
+
*/
|
|
49
|
+
/**
|
|
50
|
+
* Номиналы банкнот по странам в **мажорных** единицах валюты.
|
|
51
|
+
* Набор банкнот зависит от страны (рубли РФ ≠ тенге KZ), а конвертация
|
|
52
|
+
* мажор → минор — от валюты (через `majorToMinor`, который сам учитывает
|
|
53
|
+
* число дробных знаков по ISO-коду). Поэтому `getCashDenominationsMinor`
|
|
54
|
+
* принимает и страну (выбор набора), и валюту (фактор конвертации).
|
|
55
|
+
*/
|
|
56
|
+
declare const CASH_DENOMINATIONS_MAJOR: Record<string, number[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Шаги округления вверх в **мажорных** единицах: 10 / 50 / 100 / 200 / 500 / 1000.
|
|
59
|
+
* Конвертируются в минорные по валюте через `getDefaultRoundStepsMinor` —
|
|
60
|
+
* чтобы работать для валют с любым числом дробных знаков, а не только ×100.
|
|
61
|
+
*/
|
|
62
|
+
declare const DEFAULT_ROUND_STEPS_MAJOR: readonly number[];
|
|
63
|
+
declare function getDefaultRoundStepsMinor(currency?: string): number[];
|
|
64
|
+
/** Номиналы в минорных единицах для страны магазина (с фолбэком на RU). */
|
|
65
|
+
declare function getCashDenominationsMinor(country: string | null | undefined, currency?: string): number[];
|
|
66
|
+
interface CashChangePresetsOptions {
|
|
67
|
+
/** Сумма заказа в минорных единицах. */
|
|
68
|
+
totalMinor: number;
|
|
69
|
+
/** Номиналы банкнот в минорных единицах (см. `getCashDenominationsMinor`). */
|
|
70
|
+
denominationsMinor: number[];
|
|
71
|
+
/** Шаги округления — переопределяй только если знаешь зачем. */
|
|
72
|
+
roundStepsMinor?: readonly number[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Строит пресеты сдачи в минорных единицах:
|
|
76
|
+
* объединяем округлённые вверх суммы (до 10/50/100/200/500/1000) и все
|
|
77
|
+
* банкноты > total, дедупим, сортируем по возрастанию.
|
|
78
|
+
*
|
|
79
|
+
* Округления — strict (`total + 1`), чтобы сдача всегда была > 0.
|
|
80
|
+
*
|
|
81
|
+
* Примеры (для RU, total в рублях для краткости):
|
|
82
|
+
* total = 1080: 1090 / 1100 / 1200 / 1500 / 2000 / 5000 / 10000
|
|
83
|
+
* total = 1130: 1140 / 1150 / 1200 / 1500 / 2000 / 5000 / 10000
|
|
84
|
+
* total = 3060: 3070 / 3100 / 3200 / 3500 / 4000 / 5000 / 10000
|
|
85
|
+
* total = 3982: 3990 / 4000 / 5000 / 10000
|
|
86
|
+
* total = 0: все банкноты как есть.
|
|
87
|
+
*/
|
|
88
|
+
declare function buildCashChangePresets({ totalMinor, denominationsMinor, roundStepsMinor, }: CashChangePresetsOptions): number[];
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Единый формат логов ошибок для всех cart/checkout-операций + извлечение
|
|
92
|
+
* читаемых сообщений из ZenkyError для UI (toast / inline).
|
|
93
|
+
*
|
|
94
|
+
* Контракт ошибок Zenky API (см. `ApiError` в SDK):
|
|
95
|
+
* {
|
|
96
|
+
* err: {
|
|
97
|
+
* message: string, // локализованное — "Адрес доставки не указан."
|
|
98
|
+
* original_message: string, // англ. оригинал
|
|
99
|
+
* http_code: number,
|
|
100
|
+
* error_code: string, // 'addresses.not_specified' | 'validation' | etc.
|
|
101
|
+
* meta: any, // для validation: { errors: { [field]: string[] } }
|
|
102
|
+
* }
|
|
103
|
+
* }
|
|
104
|
+
*
|
|
105
|
+
* Для validation-ошибок (`error_code === 'validation'`) — берём сообщения из
|
|
106
|
+
* `meta.errors`, не верхнеуровневое generic сообщение.
|
|
107
|
+
*/
|
|
108
|
+
interface CartErrorScope {
|
|
109
|
+
/** Префикс — operation name (`cart-add` / `delivery` / `promocode-apply` / etc.) */
|
|
110
|
+
scope: string;
|
|
111
|
+
/** Параметры операции — id'шники, входы, что в данный момент в credentials */
|
|
112
|
+
context?: Record<string, unknown>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Залогировать ошибку cart/checkout-операции в едином формате.
|
|
116
|
+
* Безопасно для любого `unknown` — не падает на не-ZenkyError ошибках.
|
|
117
|
+
*/
|
|
118
|
+
declare function logCartError({ scope, context }: CartErrorScope, e: unknown): void;
|
|
119
|
+
/**
|
|
120
|
+
* Достаёт `error_code` бэка (например `addresses.not_specified`).
|
|
121
|
+
* Возвращает undefined для не-Zenky ошибок.
|
|
122
|
+
*/
|
|
123
|
+
declare function getCartErrorCode(e: unknown): string | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Достаёт HTTP-код бэка (например 401 для требующей авторизации операции).
|
|
126
|
+
* Возвращает undefined для не-Zenky ошибок.
|
|
127
|
+
*/
|
|
128
|
+
declare function getCartErrorHttpCode(e: unknown): number | undefined;
|
|
129
|
+
/**
|
|
130
|
+
* Достаёт field → [messages] из ZenkyError для валидации.
|
|
131
|
+
* Возвращает {} если ошибка не validation или meta.errors пусто.
|
|
132
|
+
*/
|
|
133
|
+
declare function getValidationErrors(e: unknown): Record<string, string[]>;
|
|
134
|
+
/**
|
|
135
|
+
* Вытащить читаемое сообщение для UI (toast / inline).
|
|
136
|
+
*
|
|
137
|
+
* Приоритет:
|
|
138
|
+
* 1. Если validation-ошибка → склеиваем все сообщения из `meta.errors` (по всем полям)
|
|
139
|
+
* 2. Иначе — `err.message` (generic от бэка)
|
|
140
|
+
* 3. Иначе — `fallback`
|
|
141
|
+
*/
|
|
142
|
+
declare function getCartErrorMessage(e: unknown, fallback: string): string;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Race-safe выполнение мутаций корзины.
|
|
146
|
+
*
|
|
147
|
+
* Проблема: SDK Zenky не поддерживает AbortSignal — нельзя физически отменить
|
|
148
|
+
* запрос на полпути. Если пользователь быстро жмёт `+ → доставка → оплата`,
|
|
149
|
+
* ответы могут прийти в произвольном порядке и устаревший ответ перепишет
|
|
150
|
+
* свежее состояние (race condition).
|
|
151
|
+
*
|
|
152
|
+
* Решение: версионирование per-kind. У каждого вида операции свой счётчик —
|
|
153
|
+
* новый вызов инкрементирует его, после await callback проверяет «я ещё актуален?»
|
|
154
|
+
* через `isStale()`. Если устарел — side-effect (`cartStore.setOrder`) пропускается.
|
|
155
|
+
* HTTP-запрос всё равно завершается на бэке (минорный overhead), но фронт
|
|
156
|
+
* игнорирует результат → race гарантированно не пройдёт.
|
|
157
|
+
*
|
|
158
|
+
* Дополнительно — debounce per-kind. Быстрые подряд клики «++++» схлопываются
|
|
159
|
+
* в один запрос после паузы.
|
|
160
|
+
*
|
|
161
|
+
* Состояние версий общее для composables одного storefront runtime, но изолировано
|
|
162
|
+
* между SSR-запросами и отдельными Vue-приложениями.
|
|
163
|
+
*/
|
|
164
|
+
/**
|
|
165
|
+
* `cart-line-${lineKey}` — динамический ключ строки корзины: add и remove одной
|
|
166
|
+
* строки делят kind, т.к. конфликтуют по одному ресурсу.
|
|
167
|
+
*/
|
|
168
|
+
type MutationKind = 'delivery' | 'delivery-settle' | 'payment' | 'promocode' | 'bonuses' | 'customer' | 'total' | 'settings' | 'checkout' | `cart-line-${string}`;
|
|
169
|
+
interface MutationOptions {
|
|
170
|
+
/** Уникальный kind — мутации одного kind заменяют друг друга */
|
|
171
|
+
kind: MutationKind;
|
|
172
|
+
/** Debounce в мс перед отправкой (0 = без debounce) */
|
|
173
|
+
debounce?: number;
|
|
174
|
+
}
|
|
175
|
+
interface CartMutationComposable {
|
|
176
|
+
/**
|
|
177
|
+
* Запустить мутацию. Внутри callback'а можно делать side-effect только
|
|
178
|
+
* если `isStale()` вернул `false` — иначе старый результат затрёт свежий.
|
|
179
|
+
*
|
|
180
|
+
* Возвращает результат `fn` или `undefined` если был stale.
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* await run({ kind: 'payment', debounce: 300 }, async (isStale) => {
|
|
184
|
+
* const order = await sdk.orders.setOrderPayments(...)
|
|
185
|
+
* if (isStale()) return // Пришёл новый клик — наш результат устарел
|
|
186
|
+
* cartStore.setOrder(order)
|
|
187
|
+
* return order
|
|
188
|
+
* })
|
|
189
|
+
*/
|
|
190
|
+
run: <T>(options: MutationOptions, fn: (isStale: () => boolean) => Promise<T>) => Promise<T | undefined>;
|
|
191
|
+
/** Получить текущую версию kind'а — для тестов / отладки */
|
|
192
|
+
getVersion: (kind: MutationKind) => number;
|
|
193
|
+
/**
|
|
194
|
+
* Bump-нуть версии всех kind с указанным префиксом — все in-flight операции,
|
|
195
|
+
* матчащие префикс, станут stale и их side-effect'ы будут проигнорированы.
|
|
196
|
+
*
|
|
197
|
+
* Используется при `clearAndResetCart` / `logout` — отменить все pending
|
|
198
|
+
* мутации старого заказа, чтобы поздние ответы не записались в свежий стейт.
|
|
199
|
+
*/
|
|
200
|
+
bumpKindsWithPrefix: (prefix: string) => void;
|
|
201
|
+
}
|
|
202
|
+
declare function useCartMutation(): CartMutationComposable;
|
|
203
|
+
|
|
204
|
+
interface CartQuantities {
|
|
205
|
+
getProductQuantity: (productId: string) => ComputedRef<number>;
|
|
206
|
+
getVariantQuantity: (productVariantId: MaybeRefOrGetter<string | null>, modifiers: MaybeRefOrGetter<ProductModifiersRequest[]>) => ComputedRef<number>;
|
|
207
|
+
}
|
|
208
|
+
declare function useCartQuantities(): CartQuantities;
|
|
209
|
+
|
|
210
|
+
interface CheckoutFlowFlags {
|
|
211
|
+
/** Режим из настроек магазина (Disabled / Preauth / Confirmation) */
|
|
212
|
+
mode: ComputedRef<OrderAuthenticationMethod>;
|
|
213
|
+
/** Нужна авторизация перед submit (открывается AuthModal вместо checkoutOrder) */
|
|
214
|
+
needsAuth: ComputedRef<boolean>;
|
|
215
|
+
/** Нужно показать CustomerForm в корзине (phone + name) */
|
|
216
|
+
needsCustomerForm: ComputedRef<boolean>;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Определяет поведение чекаута в зависимости от настроек магазина.
|
|
220
|
+
*
|
|
221
|
+
* Матрица:
|
|
222
|
+
* ┌──────────────┬──────────┬──────────────────┐
|
|
223
|
+
* │ mode │ needsAuth│ needsCustomerForm│
|
|
224
|
+
* ├──────────────┼──────────┼──────────────────┤
|
|
225
|
+
* │ Preauth │ true │ false │
|
|
226
|
+
* │ Confirmation │ false │ true (гости) │
|
|
227
|
+
* │ Disabled │ false │ true (гости) │
|
|
228
|
+
* └──────────────┴──────────┴──────────────────┘
|
|
229
|
+
*
|
|
230
|
+
* Нужна ли SMS-подтверждение — фронт не вычисляет: бэк возвращает
|
|
231
|
+
* `confirmation.required` в ответе `checkoutOrder`, и UI реагирует на него.
|
|
232
|
+
*
|
|
233
|
+
* Примечание: `needsCustomerForm` сейчас возвращает true для гостей во всех
|
|
234
|
+
* режимах кроме Preauth. Для авторизованных клиентов форма не нужна
|
|
235
|
+
* (данные автозаполняются через authStore).
|
|
236
|
+
*/
|
|
237
|
+
declare function useCheckoutFlow(): CheckoutFlowFlags;
|
|
238
|
+
|
|
239
|
+
interface CartCredentials {
|
|
240
|
+
orderIdCookie: Ref<string | null>;
|
|
241
|
+
orderTokenCookie: Ref<string | null>;
|
|
242
|
+
getStoreId: () => string;
|
|
243
|
+
getCityId: () => string;
|
|
244
|
+
getApiToken: () => string | undefined;
|
|
245
|
+
buildCredentials: (orderId: string, orderToken: string) => OrderCredentials;
|
|
246
|
+
getCredentials: () => OrderCredentials;
|
|
247
|
+
persistCredentials: (savedOrder: Order) => void;
|
|
248
|
+
clearPersistedCredentials: () => void;
|
|
249
|
+
isOrderActive: (order: Order) => boolean;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Управление credentials заказа. Персистенс order-id/token — через порт `storage`
|
|
253
|
+
* (ядро не знает про useCookie). Рефы инициализируются из storage, persist пишет в оба.
|
|
254
|
+
*/
|
|
255
|
+
declare function useCartCredentials(): CartCredentials;
|
|
256
|
+
|
|
257
|
+
interface OrderTotal {
|
|
258
|
+
total: ComputedRef<OrderCheckoutTotal | null>;
|
|
259
|
+
loading: Ref<boolean>;
|
|
260
|
+
fetchTotal: () => Promise<void>;
|
|
261
|
+
}
|
|
262
|
+
declare function useOrderTotal(): OrderTotal;
|
|
263
|
+
|
|
264
|
+
interface OrderSettingsComposable {
|
|
265
|
+
/** Полный снепшот настроек — читается из `cartStore.orderSettings` */
|
|
266
|
+
settings: ComputedRef<OrderSettings | null>;
|
|
267
|
+
paymentMethods: ComputedRef<OrderPaymentMethod[]>;
|
|
268
|
+
deliveryMethods: ComputedRef<OrderDeliveryMethod[]>;
|
|
269
|
+
loading: Ref<boolean>;
|
|
270
|
+
/**
|
|
271
|
+
* Перезапросить настройки с бэка. Вызывается:
|
|
272
|
+
* - при старте (через useCartInitialization)
|
|
273
|
+
* - после setOrderDeliveryMethod (набор payment-методов меняется от доставки)
|
|
274
|
+
*/
|
|
275
|
+
fetchSettings: () => Promise<void>;
|
|
276
|
+
}
|
|
277
|
+
declare function useOrderSettings(): OrderSettingsComposable;
|
|
278
|
+
|
|
279
|
+
interface OrderCredentialsLike {
|
|
280
|
+
id: string;
|
|
281
|
+
token?: string | null;
|
|
282
|
+
}
|
|
283
|
+
interface RetryOptions {
|
|
284
|
+
/**
|
|
285
|
+
* ID существующей online-payment транзакции (`order.payments[].id` где
|
|
286
|
+
* `is_online === true && status === 'pending'`). Используется как fallback
|
|
287
|
+
* если основной retry-эндпоинт вернул ошибку (typically 409
|
|
288
|
+
* `order_is_not_submitted` для свежих pending-заказов).
|
|
289
|
+
*/
|
|
290
|
+
transactionId?: string | null;
|
|
291
|
+
/**
|
|
292
|
+
* Куда вернуть юзера после оплаты. По дефолту `window.location.href` —
|
|
293
|
+
* на success-странице это правильно (вернёт обратно на success), но
|
|
294
|
+
* со страницы заказа `/me/orders/[id]` лучше передать success-URL явно,
|
|
295
|
+
* иначе после оплаты юзер останется на странице заказа без `?payment=`
|
|
296
|
+
* query и не увидит результат оплаты.
|
|
297
|
+
*/
|
|
298
|
+
currentUrl?: string;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Повторная попытка онлайн-оплаты заказа.
|
|
302
|
+
*
|
|
303
|
+
* **Стратегия (двухуровневая)**:
|
|
304
|
+
* 1. `sdk.orders.retryOnlinePayment` — официальный retry-эндпоинт (submitted-заказы).
|
|
305
|
+
* 2. `getOnlinePaymentRedirect(transactionId)` — fallback для pending-заказов (409
|
|
306
|
+
* `order_is_not_submitted`).
|
|
307
|
+
*
|
|
308
|
+
* Возвращает `redirect_url` или `null` если оба способа упали.
|
|
309
|
+
*/
|
|
310
|
+
declare function useOnlinePaymentRetry(): {
|
|
311
|
+
retry(creds: OrderCredentialsLike, options?: RetryOptions): Promise<string | null>;
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
declare function useCartAddressSync(): void;
|
|
315
|
+
|
|
316
|
+
declare const ORDER_WITH: InclusionRequest;
|
|
317
|
+
interface CartInitialization {
|
|
318
|
+
initializeOrder: () => Promise<void>;
|
|
319
|
+
}
|
|
320
|
+
declare function useCartInitialization(credentials: CartCredentials, sdk: ZenkyStorefront): CartInitialization;
|
|
321
|
+
|
|
322
|
+
interface OrderBonusesComposable {
|
|
323
|
+
maxAvailable: ComputedRef<number>;
|
|
324
|
+
apply: (additionalPayments?: OrderPaymentMethodRequest[], pin?: string, amount?: number) => Promise<void>;
|
|
325
|
+
remove: (mainPayment: OrderPaymentMethodRequest | null) => Promise<void>;
|
|
326
|
+
}
|
|
327
|
+
interface OrderBonusesDeps {
|
|
328
|
+
activity?: ActivityReporter;
|
|
329
|
+
}
|
|
330
|
+
declare function useOrderBonuses(deps?: OrderBonusesDeps): OrderBonusesComposable;
|
|
331
|
+
|
|
332
|
+
interface PaymentSelection {
|
|
333
|
+
method: PaymentMethod;
|
|
334
|
+
bill?: number | null;
|
|
335
|
+
save_card?: boolean;
|
|
336
|
+
card_token_id?: string | null;
|
|
337
|
+
}
|
|
338
|
+
interface PaymentSelectionComposable {
|
|
339
|
+
setPayment: (selection: PaymentSelection) => Promise<void>;
|
|
340
|
+
syncPaymentNow: (selection: PaymentSelection) => Promise<void>;
|
|
341
|
+
clearPayments: () => Promise<void>;
|
|
342
|
+
}
|
|
343
|
+
declare function usePaymentSelection(): PaymentSelectionComposable;
|
|
344
|
+
|
|
345
|
+
interface BonusesReconciliation {
|
|
346
|
+
reconcileAfterOrderChange: () => Promise<void>;
|
|
347
|
+
}
|
|
348
|
+
interface BonusesReconciliationDeps {
|
|
349
|
+
notifier: Notifier;
|
|
350
|
+
activity?: ActivityReporter;
|
|
351
|
+
}
|
|
352
|
+
/** Headless-синхронизация применённых бонусов после order-change (от server-state + intent). */
|
|
353
|
+
declare function useBonusesReconciliation(deps: BonusesReconciliationDeps): BonusesReconciliation;
|
|
354
|
+
|
|
355
|
+
interface CartRecalculation {
|
|
356
|
+
recalculateAfterOrderChange: () => Promise<void>;
|
|
357
|
+
}
|
|
358
|
+
interface CartRecalculationDeps {
|
|
359
|
+
notifier: Notifier;
|
|
360
|
+
activity?: ActivityReporter;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Orchestration после order-change: total → синхронизация бонусов → промо/min-price.
|
|
364
|
+
* Вызывать явно после мутаций заказа; не привязывать к каждому fetchTotal (цикл).
|
|
365
|
+
*/
|
|
366
|
+
declare function useCartRecalculation(deps: CartRecalculationDeps): CartRecalculation;
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* View прикреплённого покупателя для UI. `national` форматируется потребителем
|
|
370
|
+
* (нужна app-специфичная маска страны — Nuxt useAppConfig), ядро его не считает.
|
|
371
|
+
*/
|
|
372
|
+
interface CachedCustomerView {
|
|
373
|
+
first_name: string;
|
|
374
|
+
last_name: string;
|
|
375
|
+
phone: {
|
|
376
|
+
number: string;
|
|
377
|
+
national: string;
|
|
378
|
+
country: string;
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Контракт client-local кэша покупателя. Реализация — на стороне потребителя
|
|
383
|
+
* (localStorage + app-форматтер телефона), инжектится параметром в
|
|
384
|
+
* `useCustomerAttach` / `useCartCustomerAttachment`.
|
|
385
|
+
*/
|
|
386
|
+
interface AttachedCustomerCache {
|
|
387
|
+
forOrder: (orderId: MaybeRefOrGetter<string | null | undefined>) => ComputedRef<CachedCustomerView | null>;
|
|
388
|
+
set: (orderId: string, request: SetOrderCustomerRequest) => void;
|
|
389
|
+
clear: () => void;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
interface CustomerAttachComposable {
|
|
393
|
+
/** Прикреплён ли покупатель к заказу (есть `order.customer`) */
|
|
394
|
+
isAttached: ComputedRef<boolean>;
|
|
395
|
+
/**
|
|
396
|
+
* Привязать customer к заказу (phone + имя + опционально фамилия / дата рождения).
|
|
397
|
+
* После успешного вызова заказ перечитываем с includes — чтобы `order.customer`
|
|
398
|
+
* попал в `cartStore.order` и компоненты могли его увидеть.
|
|
399
|
+
*
|
|
400
|
+
* Обёрнуто в activity('custom') — блокирует кнопку «Оформить» на время запроса.
|
|
401
|
+
*/
|
|
402
|
+
attach: (request: SetOrderCustomerRequest) => Promise<void>;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Работа с прикреплением клиента к заказу.
|
|
406
|
+
*
|
|
407
|
+
* Используется в двух режимах OrderAuthenticationMethod:
|
|
408
|
+
* - `Disabled` — гость заполняет phone+name, `attach` до `checkoutOrder`
|
|
409
|
+
* - `Confirmation` — гость заполняет phone+name, после `checkoutOrder` придёт SMS
|
|
410
|
+
*
|
|
411
|
+
* Для `Preauth` обычно не нужно — customer прикрепляется автоматически,
|
|
412
|
+
* когда SDK имеет `api_token` клиента (см. `authStore`).
|
|
413
|
+
*
|
|
414
|
+
* @param cache client-local кэш покупателя (реализация потребителя — localStorage).
|
|
415
|
+
*/
|
|
416
|
+
declare function useCustomerAttach(cache: AttachedCustomerCache): CustomerAttachComposable;
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Привязывает customer'а авторизованного юзера к текущему заказу.
|
|
420
|
+
*
|
|
421
|
+
* Срабатывает в двух кейсах:
|
|
422
|
+
* 1) Юзер залогинился (auth state изменилась) — `notifyOnPhoneChange = true`,
|
|
423
|
+
* в этом сценарии возможно был анонимный customer с другим телефоном —
|
|
424
|
+
* показываем тост, если телефон реально изменился.
|
|
425
|
+
* 2) У авторизованного юзера появился новый заказ без customer'а
|
|
426
|
+
* (например, после очистки корзины и добавления товара) — `notifyOnPhoneChange = false`,
|
|
427
|
+
* тост не нужен, это безшумная синхронизация.
|
|
428
|
+
*
|
|
429
|
+
* @param cache client-local кэш покупателя (реализация потребителя — localStorage).
|
|
430
|
+
*/
|
|
431
|
+
declare function useCartCustomerAttachment(cache: AttachedCustomerCache): void;
|
|
432
|
+
|
|
433
|
+
interface CartStockWatcher {
|
|
434
|
+
/**
|
|
435
|
+
* Реагирует на смену склада в обновлённом заказе: переключает stock,
|
|
436
|
+
* перегружает каталог при смене хэша и валидирует товары корзины.
|
|
437
|
+
*/
|
|
438
|
+
handleStockChange: (updatedOrder: Order) => Promise<void>;
|
|
439
|
+
}
|
|
440
|
+
declare function useCartStockWatcher(): CartStockWatcher;
|
|
441
|
+
|
|
442
|
+
interface DeliveryIntervalInput {
|
|
443
|
+
date: string;
|
|
444
|
+
id: string;
|
|
445
|
+
}
|
|
446
|
+
interface SettleOptions {
|
|
447
|
+
awaitSettle?: boolean;
|
|
448
|
+
}
|
|
449
|
+
interface OrderDeliveryDeps {
|
|
450
|
+
activity?: ActivityReporter;
|
|
451
|
+
notifier?: Notifier;
|
|
452
|
+
}
|
|
453
|
+
interface OrderDelivery {
|
|
454
|
+
setDelivery: (request: SetOrderDeliveryRequest, options?: SettleOptions) => Promise<Result>;
|
|
455
|
+
setDeliveryInterval: (selection: DeliveryIntervalInput, options?: SettleOptions) => Promise<Result>;
|
|
456
|
+
resetDeliveryInterval: (options?: SettleOptions) => Promise<Result>;
|
|
457
|
+
setDeliveryTime: (deliverAt: string, options?: SettleOptions) => Promise<Result>;
|
|
458
|
+
}
|
|
459
|
+
declare function useOrderDelivery(deps?: OrderDeliveryDeps): OrderDelivery;
|
|
460
|
+
|
|
461
|
+
interface OrderPromocodeComposable {
|
|
462
|
+
/** Применённый к заказу промокод (читается из cartStore.order.promocode) */
|
|
463
|
+
applied: ComputedRef<OrderPromocode | null>;
|
|
464
|
+
isApplied: ComputedRef<boolean>;
|
|
465
|
+
loading: Ref<boolean>;
|
|
466
|
+
/** Сообщение об ошибке (невалидный / просрочен / не подходит к заказу) */
|
|
467
|
+
errorMessage: Ref<string | null>;
|
|
468
|
+
/** Применить промокод. Обёрнуто в activity('promocode'). */
|
|
469
|
+
apply: (code: string) => Promise<void>;
|
|
470
|
+
/** Убрать ранее применённый промокод */
|
|
471
|
+
remove: () => Promise<void>;
|
|
472
|
+
/** Сбросить состояние ошибки (например, при редактировании поля) */
|
|
473
|
+
clearError: () => void;
|
|
474
|
+
}
|
|
475
|
+
interface OrderPromocodeDeps {
|
|
476
|
+
notifier?: Notifier;
|
|
477
|
+
activity?: ActivityReporter;
|
|
478
|
+
}
|
|
479
|
+
declare function useOrderPromocode(deps?: OrderPromocodeDeps): OrderPromocodeComposable;
|
|
480
|
+
|
|
481
|
+
declare function useCartDeliveryAttachment(): void;
|
|
482
|
+
|
|
483
|
+
interface CartItemRequest {
|
|
484
|
+
productId: string;
|
|
485
|
+
productVariantId: string;
|
|
486
|
+
quantity?: number;
|
|
487
|
+
modifiers?: ProductModifiersRequest[];
|
|
488
|
+
productName?: string;
|
|
489
|
+
variantLabel?: string;
|
|
490
|
+
promotionId?: string;
|
|
491
|
+
promotionRewardId?: string;
|
|
492
|
+
}
|
|
493
|
+
interface CartDependencies {
|
|
494
|
+
notifier: Notifier;
|
|
495
|
+
activity: ActivityReporter;
|
|
496
|
+
}
|
|
497
|
+
interface CartOperations {
|
|
498
|
+
addToCart: (request: CartItemRequest) => Promise<void>;
|
|
499
|
+
removeFromCart: (request: CartItemRequest) => Promise<void>;
|
|
500
|
+
refreshCart: (options?: {
|
|
501
|
+
silent?: boolean;
|
|
502
|
+
}) => Promise<void>;
|
|
503
|
+
clearAndResetCart: () => void;
|
|
504
|
+
}
|
|
505
|
+
declare function useCartOperations(credentials: CartCredentials, initialization: CartInitialization, sdk: ZenkyStorefront, deps: CartDependencies): CartOperations;
|
|
506
|
+
|
|
507
|
+
/** Провайдер reCAPTCHA-payload (реализация потребителя — Google reCAPTCHA v3). */
|
|
508
|
+
type RecaptchaPayloadProvider = (action: RecaptchaAction) => Promise<{
|
|
509
|
+
token: string;
|
|
510
|
+
} | undefined>;
|
|
511
|
+
interface CheckoutSubmitComposable {
|
|
512
|
+
/** Последний результат `checkoutOrder` — нужен для UI (ConfirmationModal / online redirect) */
|
|
513
|
+
result: Ref<OrderCheckoutResult | null>;
|
|
514
|
+
/** Идёт ли сейчас submit */
|
|
515
|
+
submitting: Ref<boolean>;
|
|
516
|
+
/**
|
|
517
|
+
* Отправить заказ.
|
|
518
|
+
* Собирает `OrderCheckoutRequest` из `cartStore` (notes + persons_count).
|
|
519
|
+
* Возвращает `OrderCheckoutResult` с флагами confirmation/online_payment.
|
|
520
|
+
*/
|
|
521
|
+
submit: () => Promise<OrderCheckoutResult | null>;
|
|
522
|
+
/** Подтвердить SMS-код (после checkoutOrder с confirmation.required) */
|
|
523
|
+
confirm: (code: string) => Promise<boolean>;
|
|
524
|
+
/** Переотправить код (с backoff — должен следить UI) */
|
|
525
|
+
resendCode: () => Promise<boolean>;
|
|
526
|
+
/** Отменить pending-заказ (cancelOrder) */
|
|
527
|
+
cancel: () => Promise<boolean>;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Финальный submit заказа + SMS-подтверждение.
|
|
531
|
+
*
|
|
532
|
+
* @param getRecaptchaPayload провайдер reCAPTCHA-токена (app-специфичен, инжектится).
|
|
533
|
+
*/
|
|
534
|
+
declare function useCheckoutSubmit(getRecaptchaPayload: RecaptchaPayloadProvider): CheckoutSubmitComposable;
|
|
535
|
+
|
|
536
|
+
declare function useOrderChannel(): void;
|
|
537
|
+
|
|
538
|
+
interface StorefrontCart {
|
|
539
|
+
order: Ref<Order | null>;
|
|
540
|
+
variants: ComputedRef<OrderProductVariant[]>;
|
|
541
|
+
itemCount: ComputedRef<number>;
|
|
542
|
+
totalPrice: ComputedRef<number>;
|
|
543
|
+
loading: Ref<boolean>;
|
|
544
|
+
initializing: Ref<boolean>;
|
|
545
|
+
hasOrder: ComputedRef<boolean>;
|
|
546
|
+
getProductQuantity: (productId: string) => ComputedRef<number>;
|
|
547
|
+
getVariantQuantity: (productVariantId: MaybeRefOrGetter<string | null>, modifiers: MaybeRefOrGetter<ProductModifiersRequest[]>) => ComputedRef<number>;
|
|
548
|
+
initializeOrder: () => Promise<void>;
|
|
549
|
+
addToCart: (request: CartItemRequest) => Promise<void>;
|
|
550
|
+
removeFromCart: (request: CartItemRequest) => Promise<void>;
|
|
551
|
+
refreshCart: (options?: {
|
|
552
|
+
silent?: boolean;
|
|
553
|
+
}) => Promise<void>;
|
|
554
|
+
clearAndResetCart: () => void;
|
|
555
|
+
recalculate: () => Promise<void>;
|
|
556
|
+
}
|
|
557
|
+
declare function useStorefrontCart(): StorefrontCart;
|
|
558
|
+
|
|
559
|
+
export { type AttachedCustomerCache, type BonusesReconciliation, type BonusesReconciliationDeps, CASH_DENOMINATIONS_MAJOR, type CachedCustomerView, type CartCredentials, type CartDependencies, type CartErrorScope, type CartInitialization, type CartItemRequest, type CartLineKeyParams, type CartMutationComposable, type CartOperations, type CartQuantities, type CartRecalculation, type CartRecalculationDeps, type CartStockWatcher, type CashChangePresetsOptions, type CheckoutFlowFlags, type CheckoutSubmitComposable, type CustomerAttachComposable, DEFAULT_ROUND_STEPS_MAJOR, type MainPaymentRequestParams, type MutationKind, type MutationOptions, ORDER_EVENTS, ORDER_WITH, type OrderBonusesComposable, type OrderBonusesDeps, type OrderCredentialsLike, type OrderDelivery, type OrderDeliveryDeps, type OrderPromocodeComposable, type OrderPromocodeDeps, type OrderSettingsComposable, type OrderTotal, type PaymentSelection, type PaymentSelectionComposable, type RecaptchaPayloadProvider, type RetryOptions, type StorefrontCart, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getCashDenominationsMinor, getDefaultRoundStepsMinor, getValidationErrors, logCartError, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCredentials, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useStorefrontCart, variantLineKey };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { CASH_DENOMINATIONS_MAJOR, DEFAULT_ROUND_STEPS_MAJOR, ORDER_EVENTS, ORDER_WITH, buildCartLineKey, buildCashChangePresets, buildMainPaymentRequest, getCartErrorCode, getCartErrorHttpCode, getCartErrorMessage, getCashDenominationsMinor, getDefaultRoundStepsMinor, getValidationErrors, logCartError, normalizeAddress, useBonusesReconciliation, useCartAddressSync, useCartCustomerAttachment, useCartDeliveryAttachment, useCartInitialization, useCartMutation, useCartOperations, useCartQuantities, useCartRecalculation, useCartStockWatcher, useCheckoutFlow, useCheckoutSubmit, useCustomerAttach, useOnlinePaymentRetry, useOrderBonuses, useOrderChannel, useOrderDelivery, useOrderPromocode, useOrderSettings, useOrderTotal, usePaymentSelection, useStorefrontCart, variantLineKey } from '../chunk-OQLU7FSR.js';
|
|
2
|
+
export { useCartCredentials } from '../chunk-4MJKN7PL.js';
|
|
3
|
+
import '../chunk-5QCUH3FF.js';
|
|
4
|
+
import '../chunk-Z3IW4ODZ.js';
|
|
5
|
+
import '../chunk-BWUKMWHL.js';
|
|
6
|
+
import '../chunk-PWHIDGKW.js';
|
|
7
|
+
import '../chunk-EYRCAUUP.js';
|
|
8
|
+
import '../chunk-VL3T36VM.js';
|
|
9
|
+
import '../chunk-V3VVDQIR.js';
|
|
10
|
+
import '../chunk-RO25KNM5.js';
|
|
11
|
+
import '../chunk-AL5W5JSD.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { NestedCategory, Product, Store, City, Stock, RemoteCatalog, ZenkyStorefront, CollectionsListRequest, ProductsCollection } from '@zenky/storefront-api';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Рекурсивный поиск категории в дереве по `short_id`.
|
|
5
|
+
*
|
|
6
|
+
* `NestedCategory[]` — это дерево: корневые категории на верхнем уровне,
|
|
7
|
+
* вложенные — внутри `children[]`. Простой `tree.find()` найдёт только
|
|
8
|
+
* корневые. Для вложенных (например «Куртки» внутри «Мужская» внутри «Одежда»)
|
|
9
|
+
* нужно рекурсивно обойти все ветки.
|
|
10
|
+
*
|
|
11
|
+
* Возвращает первое совпадение (DFS pre-order).
|
|
12
|
+
*/
|
|
13
|
+
declare function findCategoryByShortId(tree: NestedCategory[], shortId: string): NestedCategory | null;
|
|
14
|
+
/**
|
|
15
|
+
* Находит корневого предка категории по `parent_id`.
|
|
16
|
+
*
|
|
17
|
+
* Для вложенной «Куртки» (parent: «Мужская») вернёт «Одежда» (корень ветки).
|
|
18
|
+
* Для корневой «Одежда» вернёт саму себя.
|
|
19
|
+
*
|
|
20
|
+
* Используется в `CategoryTabs`, чтобы подсветить корневой таб когда юзер
|
|
21
|
+
* находится на вложенной категории.
|
|
22
|
+
*/
|
|
23
|
+
declare function findRootAncestor(tree: NestedCategory[], category: NestedCategory): NestedCategory | null;
|
|
24
|
+
/** Рекурсивный поиск по `id` (не `short_id`). Используется в findRootAncestor. */
|
|
25
|
+
declare function findCategoryById(tree: NestedCategory[], id: string): NestedCategory | null;
|
|
26
|
+
/**
|
|
27
|
+
* Возвращает путь от корневой категории до указанной (включительно).
|
|
28
|
+
*
|
|
29
|
+
* Пример для «Куртки» в ветке «Одежда → Мужская → Куртки»:
|
|
30
|
+
* → [Одежда, Мужская, Куртки]
|
|
31
|
+
*
|
|
32
|
+
* Используется для построения хлебных крошек.
|
|
33
|
+
*/
|
|
34
|
+
declare function getCategoryPath(tree: NestedCategory[], target: NestedCategory): NestedCategory[];
|
|
35
|
+
|
|
36
|
+
interface SubcategoryGroup {
|
|
37
|
+
category: NestedCategory;
|
|
38
|
+
products: Product[];
|
|
39
|
+
}
|
|
40
|
+
interface GroupedProducts {
|
|
41
|
+
rootDirect: Product[];
|
|
42
|
+
groups: SubcategoryGroup[];
|
|
43
|
+
}
|
|
44
|
+
declare function collectDescendantIds(category: NestedCategory): string[];
|
|
45
|
+
declare function groupProductsBySubcategory(rootCategory: NestedCategory, products: Product[]): GroupedProducts;
|
|
46
|
+
|
|
47
|
+
declare function getCity(store: Store, cityId?: string | null): City | null;
|
|
48
|
+
declare function getStock(city: City, stockId?: string | null): Stock | null;
|
|
49
|
+
declare function getRemoteCatalog(store: Store, city: City, stock: Stock | null): RemoteCatalog | null;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Загрузка списка коллекций товаров магазина.
|
|
53
|
+
* Pure composable — SDK передаётся параметром (DI), Nuxt не нужен.
|
|
54
|
+
*
|
|
55
|
+
* NOTE: одиночный `getCollection(id)` в storefront API не предусмотрен,
|
|
56
|
+
* для получения товаров коллекции используется `GET /products?collection_id=...`.
|
|
57
|
+
* Чтобы получить метаданные коллекции — ищем в списке через `loadCollections`.
|
|
58
|
+
*/
|
|
59
|
+
declare function useCollections(sdk: ZenkyStorefront): {
|
|
60
|
+
loadCollections: (storeId: string, request?: CollectionsListRequest) => Promise<ProductsCollection[]>;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** URL-хелперы каталога — единая точка правды для путей категорий/коллекций. */
|
|
64
|
+
declare const catalogRoutes: {
|
|
65
|
+
/** Корневая страница каталога: список категорий + коллекций */
|
|
66
|
+
readonly index: () => string;
|
|
67
|
+
/** Страница конкретной категории */
|
|
68
|
+
readonly category: (shortId: string, slug: string | null) => string;
|
|
69
|
+
/** Страница конкретной коллекции */
|
|
70
|
+
readonly collection: (id: string) => string;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export { type GroupedProducts, type SubcategoryGroup, catalogRoutes, collectDescendantIds, findCategoryById, findCategoryByShortId, findRootAncestor, getCategoryPath, getCity, getRemoteCatalog, getStock, groupProductsBySubcategory, useCollections };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { catalogRoutes, collectDescendantIds, findCategoryById, findCategoryByShortId, findRootAncestor, getCategoryPath, groupProductsBySubcategory, useCollections } from '../chunk-2OD7CLKD.js';
|
|
2
|
+
export { getCity, getRemoteCatalog, getStock } from '../chunk-EYRCAUUP.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|