import { VIDEO_POOL } from './videos'; import type { IThumbUrls } from '../types'; const HOUR = 3600; const DAY = 24 * HOUR; export type HistoryStubCard = { guid: string; id: string; title: string; duration: number; thumbUrls: IThumbUrls; previewUrl: string; channelName?: string; channelAvatar?: string; /** Доля просмотренного, 0–100 */ progress: number; /** Unix timestamp (сек.) последнего просмотра */ watchedAt: number; }; /** * Состояние просмотра поверх общего пула роликов — индекс в индекс с `VIDEO_POOL`. * `watchedAgo` — смещение в секундах от «сейчас», чтобы даты в вёрстке не устаревали. */ const WATCH_STATE = [ { progress: 57, watchedAgo: 2 * HOUR }, { progress: 74, watchedAgo: 5 * HOUR }, { progress: 91, watchedAgo: 8 * HOUR }, { progress: 48, watchedAgo: DAY + 3 * HOUR }, { progress: 100, watchedAgo: DAY + 7 * HOUR }, { progress: 23, watchedAgo: DAY + 11 * HOUR }, { progress: 99, watchedAgo: DAY + 16 * HOUR }, { progress: 66, watchedAgo: 2 * DAY + 4 * HOUR }, { progress: 12, watchedAgo: 2 * DAY + 9 * HOUR }, { progress: 88, watchedAgo: 2 * DAY + 15 * HOUR }, { progress: 35, watchedAgo: 4 * DAY + 6 * HOUR }, { progress: 71, watchedAgo: 4 * DAY + 12 * HOUR }, ]; const ITEMS = VIDEO_POOL.map((video, index) => ({ ...video, ...WATCH_STATE[index] })); /** Тот же набор, отодвинутый глубже в прошлое — чтобы набралось несколько страниц. */ const WAVES = [0, 7 * DAY, 21 * DAY, 45 * DAY, 120 * DAY]; /** Окно выборки в секундах для значений `?period=` из `historyPeriods`. */ const PERIOD_WINDOW: Record = { 'all-time': Number.POSITIVE_INFINITY, today: DAY, week: 7 * DAY, month: 30 * DAY, }; export function getHistoryStub(period = 'all-time'): HistoryStubCard[] { const now = Math.floor(Date.now() / 1000); const window = PERIOD_WINDOW[period] ?? PERIOD_WINDOW['all-time']; return WAVES .flatMap((offset, wave) => ITEMS.map(item => ({ ...item, guid: `${item.id}-${wave}`, watchedAgo: item.watchedAgo + offset, }))) .filter(item => item.watchedAgo < window) .map(({ watchedAgo, ...item }) => ({ ...item, watchedAt: now - watchedAgo })) .sort((a, b) => b.watchedAt - a.watchedAt); }