Перейти к основному содержимому

Web SDK: методы и lifecycle

Для первого подключения используйте Web SDK. Здесь собран контракт методов основного bundle.

Методы основного SDK​

Параметр SDK clientId принимает тот же идентификатор проекта, который в Public API называется applicationId. Используйте значение, выданное ShopStory, без преобразований. Общие правила: Идентификаторы.

show​

Монтирует каталог в контейнер сайта. Возвращает undefined (тип void), не предоставляет Promise загрузки каталога.

ПараметрОбязательноНазначение
containerElementДаСуществующий DOM-элемент, который сайт сохраняет на время работы SDK
config.clientIdДаСтроковый идентификатор проекта, выданный ShopStory
actionsНетОбработчики добавления товара в корзину и проверки наличия для этого экземпляра
cartUrlНетАдрес корзины для повторного клика по состоянию «В корзине»; относительный путь разрешается от origin сайта

await ShopStorySDK.show(...) не ждёт каталог. Ограничения повторной инициализации описаны в разделе SPA и lifecycle.

showPlayer​

Открывает указанную трансляцию в собственном контейнере в document.body. При первом вызове SDK создаёт контейнер, при следующих использует его повторно. Оба параметра обязательны:

ПараметрТипНазначение
clientIdstringИдентификатор проекта
streamIdstringИдентификатор трансляции из API

Возвращает Promise<void>. Promise завершается после внутренней инициализации SDK, ещё до подтверждения загрузки данных эфира и воспроизведения видео. Использовать его как сигнал «видео готово» нельзя.

show-player.js
async function openShopStoryPlayer(streamId) {
const sdk = window.ShopStorySDK;
if (!sdk) {
console.error('Основной bundle ShopStory не загружен');
return;
}

try {
await sdk.showPlayer({
clientId: 'assigned-application-id',
streamId,
});
} catch (error) {
console.error('Не удалось вызвать плеер ShopStory', error);
}
}

Передавайте идентификаторы строками. Список трансляций для собственного интерфейса получайте через GET /v3/streams.

showPlayer() не принимает actions и cartUrl и не наследует их из ранее вызванного show(). Для прямой корзины используйте плеер внутри каталога, созданного через show({ actions, ... }), либо согласованный commerce-контракт.

Готовность и ошибки​

У основного SDK нет публичных событий или параметров onReady / onError для загрузки каталога и плеера. Событие load у <script> позволяет начать инициализацию; готовность каталога или видео оно не подтверждает.

Что произошлоЧто получает код сайта
Основной bundle не загрузился или не выполнилсяwindow.ShopStorySDK отсутствует; проверьте загрузку скрипта до вызова методов
show() вернулсяТолько завершение вызова монтирования; данные загружаются отдельно
showPlayer() завершил PromiseВнутренняя инициализация завершена; данные эфира и видео ещё могут загружаться
Вызов метода выбросил исключение или его Promise отклонёнИсключение можно обработать через try/catch
Ошибка обработана внутри SDK при загрузке или отрисовкеПубличного callback для сайта нет; возможны сообщение внутри SDK или отсутствие его интерфейса

try/catch в примере не перехватывает все ошибки загрузки и воспроизведения. При сбое до завершения инициализации Promise showPlayer() может остаться незавершённым. Не связывайте с ним разблокировку страницы, корзины или других функций сайта.

Состояние страницы без SDK и отключение loader через feature flag остаются на стороне клиента. Если вашему интерфейсу нужны собственные состояния загрузки, пустой выдачи и ошибки каталога, используйте Public API.

Типы для TypeScript​

Для подключения через <script> добавьте локальный файл деклараций в каталог, включённый в tsconfig.json. Он описывает поддерживаемые на этой странице методы и параметры; сам SDK по-прежнему загружается скриптом.

shopstory-sdk.d.ts
type ProductAvailabilityMap = Record<string, boolean>;

type ClientActions = {
addProductToCartById?: (
feedProductId: string,
callback: (success: boolean) => void,
) => void;
addProductToCart?: (
vendorCode: string,
callback: (success: boolean) => void,
) => void;
resolveProductsAvailability?: (
feedProductIds: string[],
callback: (availability: ProductAvailabilityMap) => void,
) => void;
};

type ShopStoryShowOptions = {
containerElement: Element;
config: { clientId: string };
actions?: ClientActions;
cartUrl?: string;
};

type ShopStoryPlayerParams = {
clientId: string;
streamId: string;
};

declare global {
interface Window {
ShopStorySDK?: {
show(options: ShopStoryShowOptions): void;
showPlayer(params: ShopStoryPlayerParams): Promise<void>;
refreshProductsAvailability?(): void;
};
}
}

export {};

Поле ShopStorySDK намеренно необязательное: до выполнения bundle объекта нет. По той же причине необязателен refreshProductsAvailability — вызывайте его только через проверку существования. Результат корзины и приоритет обработчиков описаны в разделе Добавление в корзину, карта наличия — в разделе Наличие и остатки.

SPA и lifecycle​

Текущий публичный контракт основного SDK рассчитан на один вызов show() для одного стабильного container. Публичного destroy() нет. В SPA сохраняйте container между route transitions и не вызывайте show() из каждого render/effect без собственной защиты от повторной инициализации.

PiP bundle читает согласованный PDP-шаблон и идентификатор товара во время своего lifecycle. До оценки SPA-интеграции передайте ShopStory используемый router, список PDP routes, способ смены SKU и момент замены DOM. Проверка должна охватывать прямой вход, client-side переход между товарами, back/forward и уход с PDP.

Что включить в оценку​

Work packageРабота клиентаНужный вход
BootstrapПодключить нужный bundle; для основного SDK передать clientId; исключить повторную инициализациюВыбранная поверхность, MPA/SPA topology и routes
КаталогСоздать стабильный container и состояние страницы без SDKURL каталога и test applicationId
Product PDPСохранить строковый feedProductId в согласованном местеВсе PDP/SKU templates и test products
CommerceВыбрать переход на PDP, callback основного SDK или custom PiP flowCart API, variant/store context и fallback
НаличиеРеализовать обработчик наличия и вызывать refreshProductsAvailability() при смене магазинаПакетный stock API, источник выбранного магазина и семантика available в фиде
SecurityОбновить действующую CSP и проверить registered originsCSP, media origins и browser matrix
ReleaseДобавить feature flag, acceptance и client-side rollbackTest/live/VOD fixtures и порядок включения

Если неизвестны SPA lifecycle, целевые браузеры или cart contract, оценка этих частей остаётся discovery scope. Базовый MPA-каталог с переходом на PDP можно оценивать отдельно.