import type { IStripcashModel, IWebcamCounts, IWebcamsConfig } from '../../types'; import { WEBCAMS_DEFAULTS } from '../../runtime'; /** * Данные блока вебкамов: модели онлайн и счётчики онлайна — ОДНИМ запросом * в наш BFF (`/bff/webcams/block`), который сам сводит две ручки провайдера. * Компоненты не знают ни про провайдера, ни про версии его ручек. * * Ниша и язык уходят query-параметрами: прокси перекладывает их в заголовки * `X-Niche` / `X-Language`, которых ручка провайдера требует обязательно. * * Под флагом `FeatureWebcamsEnabled`: при выключенном флаге запроса нет вовсе. */ export const useFetchWebcams = async (options: { limit?: number, category?: string } = {}) => { const config = useRuntimeConfig().public.webcamsConfig as IWebcamsConfig | undefined; const { limit = config?.limit || WEBCAMS_DEFAULTS.limit, category } = options; const isEnabled = !!useRuntimeConfig().public.featureFlags.FeatureWebcamsEnabled; const { locale } = useI18n(); const niche = NicheHelper.getSiteDefaultNiche(); const items = ref([]); const counts = ref({ total: 0, byLanguages: {} }); if (!isEnabled) { return { items, counts, isEnabled }; } const nuxtApp = useNuxtApp(); const { data } = await useFetch<{ items: IStripcashModel[] } & IWebcamCounts>('/bff/webcams/block', { key: `webcams-${limit}-${category || 'all'}-${niche}-${locale.value}`, // выдача провайдера рандомная, поэтому повторный запрос на клиенте дал бы // ДРУГИЕ модели и рассинхрон с разметкой сервера (ссылки от одной модели, // подписи от другой) — берём то, что уже приехало в payload getCachedData: cacheKey => nuxtApp.payload.data[cacheKey] || nuxtApp.static.data[cacheKey], query: { limit, use_random: true, niche, lang: locale, ...(category ? { category } : {}), }, }); watchEffect(() => { items.value = data.value?.items || []; counts.value = { total: data.value?.total || 0, byLanguages: data.value?.byLanguages || {} }; }); return { items, counts, isEnabled }; };