Интеграция корзины и избранного
🛒 Интеграция корзины с SearchBooster
Обзор
Для синхронизации корзины с виджетом SearchBooster необходимо реализовать набор глобальных функций, доступных через объект window.
Виджет использует эти функции для:
-
получения состояния корзины;
-
изменения количества товаров;
-
синхронизации UI.
⚠️ Важное примечание для клиента
Все описанные ниже функции должны быть самостоятельно реализованы на вашем сайте разработчиком вашей команды.
Контракты данных
type ProductId = string;
type CartItems = Record<ProductId, number>;
type OperationType = 'add' | 'inc' | 'dec' | 'removeAll';
type Offer = {
id: ProductId;
name?: string;
price?: number;
[key: string]: any;
};
type UpdateCartItemParams = {
operationType: OperationType;
currentQuantity: number;
} & Offer;
1. Получение содержимого корзины
Возвращает текущее состояние корзины.
window.getCartItems(): Promise<CartItems> | CartItems
Требования:
-
ключ —
idтовара из фида SearchBooster; -
значение — количество товара (целое число ≥ 0);
-
возвращать только товары с количеством > 0. Пример
window.getCartItems = async () => {
return {
'1234': 1,
'5678': 2
};
};
Когда вызывается:
-
при инициализации виджета;
-
при полном обновлении (
UPDATE_CART); -
при синхронизации состояния.
2. Изменение количества товара
Вызывается при любом изменении количества товара.
window.updateCartItem(params: UpdateCartItemParams): Promise<number> | number
Параметры:
-
operationType: -
add— первый клик "В корзину"; -
inc— увеличение; -
dec— уменьшение; -
removeAll— удаление; -
currentQuantity— текущее количество; -
offer— объект товара.
Требования:
-
функция должна вернуть финальное количество товара;
-
значение должно быть ≥ 0.
Пример
window.updateCartItem = async ({ operationType, currentQuantity, ...offer }) => {
const cart = window.yourCart || {};
switch (operationType) {
case 'add':
cart[offer.id] = 1;
break;
case 'inc':
cart[offer.id] = currentQuantity + 1;
break;
case 'dec':
cart[offer.id] = Math.max(currentQuantity - 1, 0);
break;
case 'removeAll':
delete cart[offer.id];
break;
}
if (cart[offer.id] === 0) {
delete cart[offer.id];
}
window.yourCart = cart;
return cart[offer.id] || 0;
};
Обработка ошибок
Рекомендуется обрабатывать ошибки внутри функции и возвращать консистентное состояние:
try {
// обновление корзины
} catch (e) {
return currentQuantity;
}
3. Кастомизация кнопки (опционально)
Позволяет изменить поведение кнопки.
window.getAddToCartConfig(offer)
window.getAddToCartConfig = (offer) => {
if (!offer.available) {
return {
label: 'Подробнее',
action: () => {
window.location.href = offer.url;
}
};
}
return undefined;
};
4. Переход в корзину (опционально)
Синхронизация состояния
window.goToCart = () => {
window.location.href = '/cart';
};
Если корзина изменилась вне виджета:
Частичное обновление (рекомендуется):
if (window.sbEvents) {
window.sbEvents.pushEvent('UPDATE_CART', {
'123': 2,
'777': 0
});
}
Полное обновление
if (window.sbEvents) {
window.sbEvents.pushEvent('UPDATE_CART');
}
Минимальная интеграция
window.getCartItems = async () => ({});
window.updateCartItem = async () => 0;
Поведение при отсутствии функций:
-
если getCartItems не определена — корзина не отображается;
-
если updateCartItem не определена — изменения невозможны.
Flow взаимодействия:
-
Пользователь нажимает «В корзину».
-
Виджет вызывает updateCartItem.
-
Функция обновляет состояние.
-
Возвращает новое количество.
-
Виджет обновляет UI.
❤️ Интеграция избранного с SearchBooster
Обзор
Виджет SearchBooster может отображать и управлять избранными товарами через глобальные функции.
⚠️ Важное примечание для клиента
Все описанные ниже функции должны быть самостоятельно реализованы на вашем сайте разработчиком вашей команды.
Контракты данных
type ProductId = string;
type Favourites = Record<ProductId, boolean>;
type Offer = {
id: ProductId;
name?: string;
price?: number;
[key: string]: any;
};
1. Получение избранного
Возвращает текущее состояние избранного.
window.getFavourites(): Promise<Favourites> | Favourites
Требования:
-
возвращать только товары в избранном (true);
-
отсутствующие товары считаются false.
Пример:
window.getFavourites = async () => {
return {
'1234': true,
'5678': true
};
};
2. Изменение состояния избранного
Вызывается при клике на иконку избранного.
window.toggleFavourite({ isFavourite, ...offer }): Promise<boolean> | boolean
Параметры:
-
isFavourite— желаемое состояние; -
offer— объект товара.
Требование: вернуть финальное состояние (true / false).
Пример
window.toggleFavourite = async ({ isFavourite, ...offer }) => {
const favourites = window.yourFavourites || {};
if (isFavourite) {
favourites[offer.id] = true;
} else {
delete favourites[offer.id];
}
window.yourFavourites = favourites;
return isFavourite;
};
//Синхронизация состояния
//Частичное обновление
if (window.sbEvents) {
window.sbEvents.pushEvent('UPDATE_FAVOURITES', {
'123': true,
'777': false
});
}
//Полное обновление
if (window.sbEvents) {
window.sbEvents.pushEvent('UPDATE_FAVOURITES');
}
Важно:
-
при partial update необходимо передавать все изменённые товары, включая удалённые (false);
-
если второй параметр не передан — вызывается getFavourites.
Минимальная интеграция:
window.getFavourites = async () => ({});
window.toggleFavourite = async () => false;
Flow взаимодействия:
-
Пользователь нажимает на иконку избранного.
-
Виджет вызывает toggleFavourite.
-
Функция обновляет состояние.
-
Возвращает результат.
-
Виджет обновляет UI.