import { convertString } from '../../runtime'; export interface Referer { type: string; value: string; } // Роут-источник (без суффикса локали) → тип referer'а и параметр роута со значением. // Расширяется добавлением строки: позже сюда лягут model, channel и т.д. export const REFERER_BY_ROUTE: Record = { 'categories-slug': { type: 'category', param: 'slug' }, 'tag-tag': { type: 'tag', param: 'tag' }, 'models-slug-tag-tag': { type: 'tag', param: 'tag' }, 'search-slug': { type: 'search', param: 'slug' }, 'search-slug-videos': { type: 'search', param: 'slug' }, 'search-slug-models': { type: 'search', param: 'slug' }, }; /** * Сопоставляет предыдущий роут (имя + параметры из History API) карточке-источнику ролика. * Возвращает referer, если пришли из листинга (категория/тег/поиск); иначе null — навигация * была не из листинга (video→video, главная и т.п.), исходной карточки нет → дефолтный плейсхолдер. * @param routeName - имя предыдущего роута (возможно с суффиксом локали `___xx`) * @param params - параметры предыдущего роута */ export function resolveReferer( routeName: string, params: Record, ): Referer | null { const name = routeName.replace(/___[a-zA-Z-]+$/, ''); const rule = REFERER_BY_ROUTE[name]; if (!rule) return null; const raw = String(params[rule.param] || ''); if (!raw) return null; // Декодируем так же, как useSlug — бек принимает referer_value в том же виде, // что и slug в остальных методах (напр. useFetchCategoriesByName). const decoded = convertString().fromSlug(raw); const value = String(Array.isArray(decoded) ? decoded[0] : decoded); return value ? { type: rule.type, value } : null; }