First working POC
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
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<HomeState>(initialState);
|
||||
|
||||
async function loadHomeSections() {
|
||||
update(s => ({ ...s, isLoading: true, 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);
|
||||
Reference in New Issue
Block a user