// Home screen data store - featured items, continue watching, recently added // TRACES: UR-023, UR-024, UR-034 | DR-026, DR-027, DR-038, DR-039 import { writable, derived } from "svelte/store"; import type { MediaItem } from "$lib/api/types"; import { auth } from "./auth"; interface HomeState { heroItems: MediaItem[]; resumeItems: MediaItem[]; nextUpItems: MediaItem[]; latestItems: MediaItem[]; recentlyPlayedAudio: MediaItem[]; resumeMovies: MediaItem[]; isLoading: boolean; error: string | null; } function createHomeStore() { const initialState: HomeState = { heroItems: [], resumeItems: [], nextUpItems: [], latestItems: [], recentlyPlayedAudio: [], resumeMovies: [], isLoading: false, error: null, }; const { subscribe, set, update } = writable(initialState); async function loadHomeSections() { // Only show loading spinner when no data is available yet update(s => ({ ...s, isLoading: s.heroItems.length === 0 && s.latestItems.length === 0, error: null })); try { const repo = auth.getRepository(); const [resume, nextUp, latest, recentAudio, resumeMovies] = await Promise.all([ repo.getResumeItems(undefined, 12), repo.getNextUpEpisodes(undefined, 12), repo.getLatestItems("", 16), repo.getRecentlyPlayedAudio(12), // Backend now handles intelligent grouping repo.getResumeMovies(12), ]); // Use resume items or latest as hero items const hero = resume.length >= 3 ? resume.slice(0, 5) : latest.slice(0, 5); update(s => ({ ...s, heroItems: hero, resumeItems: resume, nextUpItems: nextUp, latestItems: latest, recentlyPlayedAudio: recentAudio, resumeMovies: resumeMovies, isLoading: false, })); } catch (error) { const message = error instanceof Error ? error.message : "Failed to load home sections"; update(s => ({ ...s, isLoading: false, error: message })); console.error("Failed to load home sections:", error); } } function reset() { set(initialState); } return { subscribe, loadHomeSections, reset, }; } export const home = createHomeStore(); // Derived stores for convenience export const heroItems = derived(home, $home => $home.heroItems); export const resumeItems = derived(home, $home => $home.resumeItems); export const nextUpItems = derived(home, $home => $home.nextUpItems); export const latestItems = derived(home, $home => $home.latestItems); export const recentlyPlayedAudio = derived(home, $home => $home.recentlyPlayedAudio); export const resumeMovies = derived(home, $home => $home.resumeMovies); export const isHomeLoading = derived(home, $home => $home.isLoading);