useCategories
Async composable над shared storefront client. Shop не передається з фронта: контекст уже резолвиться на бекенді через publicToken.
- `tree` - готове nested дерево категорій з API
- `pending` - стан завантаження
- `error` - стан помилки
- `refresh` - ручний refetch
TS interface і приклад формату документа, який повертається у tree:
useProducts
З explicit key повертає singleton catalog store у межах поточного Nuxt app/request; без key створює ізольований instance.
- Однаковий explicit key повертає той самий store object і один fetch/watch lifecycle. Для окремого каталогу використовуй інший стабільний key.
- Повертає items, total, page і perPage для pagination UI.
- Supports sort: updated-desc | updated-asc | created-desc | created-asc | price-desc | price-asc.
- Якщо catalog filters збігаються з quick filters товару, item.catalogSelection містить одну доступну/найдешевшу конфігурацію та відповідну картинку, ціну і stock.
Typical flow: managed grid володіє keyed products lifecycle, а filters і pagination працюють з тим самим store/query key.
usePage
Завантажує одну публічну контентну сторінку поточного магазину за slug або ID.
- Передай рівно один lookup: `slug` або `id`.
- `page` містить локалізовані title, contentHtml, pictures та metadata.
- Сторінки створюються в admin.a.zynk.uno/pages/shop і одразу доступні storefront.
useProductQuickSelection
Керує швидким вибором значень у товарі та обчислює активну конфігурацію, ціну, стару ціну, кількість і доступні картинки.
- За замовчуванням вибирає найдешевшу доступну конфігурацію; стратегія `FIRST` вибирає першу доступну.
- Порожні overrides успадковують значення товару, а `stockQty = null` означає, що кількість не менеджиться і конфігурація доступна.
- `selectedConfiguration` містить стабільний UUID вибраної конфігурації, а `prices` надає ефективні значення для всіх комбінацій.
- У межах правила картинки умови працюють як AND, між правилами як OR; неповні правила не обмежують невказані фільтри.
- initialConfigurationId відновлює конфігурацію з картки/URL; невалідний UUID безпечно повертає стандартний CHEAPEST/FIRST вибір.
useBasket
Client-side basket composable with useState source of truth, localStorage persistence, and product/configuration line identity.
- Hydrates basket from localStorage on client mount only (no server reads).
- Supports isolated baskets via storageKey, for example basket:default or basket:shop-123.
- lineId is productId:configurationId; use it for quantity changes and removal.
useCheckout
Action composable for storefront guest orders: list payment methods, create an order, and load its status by opaque token.
- `createOrder(payload, options?)` додає Idempotency-Key, створює order + payment і повертає backend-generated `{ order, guestToken }`; після network failure незмінний payload автоматично повторно використовує pending key.
- `getOrder(orderId, guestToken)` loads the public order status page data.
useCatalogSearch
Локальний рейтинговий пошук товарів з debounce від 3 символів за назвою, SKU та штрихкодами, готовим imageUrl і прямим переходом на товар.
- `term` зберігається локально і не пишеться в query.search.
- Результати ранжуються backend за exact SKU (100), barcode (95), name (90), потім prefix і contains; мінімальна довжина запиту — 3 символи.
- `select(item)` очищає пошук і відкриває `/products/:slug`; `imageUrl` надає перевагу thumbnail і використовує primary як fallback.