diff --git a/src/lib/components/HeroCarousel/HeroCarousel.svelte b/src/lib/components/HeroCarousel/HeroCarousel.svelte index c7a8e10..f49c642 100644 --- a/src/lib/components/HeroCarousel/HeroCarousel.svelte +++ b/src/lib/components/HeroCarousel/HeroCarousel.svelte @@ -50,6 +50,7 @@ { const detail = event.detail; if (!backgroundHasFocus) return; diff --git a/src/lib/components/HeroShowcase/HeroShowcase.svelte b/src/lib/components/HeroShowcase/HeroShowcase.svelte index 9b8deae..b4bb0af 100644 --- a/src/lib/components/HeroShowcase/HeroShowcase.svelte +++ b/src/lib/components/HeroShowcase/HeroShowcase.svelte @@ -9,8 +9,19 @@ import SidebarMargin from '../SidebarMargin.svelte'; import { get } from 'svelte/store'; import { registrars } from '../../selectable.js'; + import { createEventDispatcher } from 'svelte'; + + const dispatch = createEventDispatcher<{ + select: ShowcaseItemProps | undefined; + }>(); export let items: Promise = Promise.resolve([]); + let awaitedItems: undefined | ShowcaseItemProps[]; + items.then((items) => (awaitedItems = items)); + + function openItem() { + if (awaitedItems) dispatch('select', awaitedItems[showcaseIndex]); + } let showcaseIndex = 0; @@ -24,23 +35,29 @@ get(registrars.sidebar)?.focus(); } }} + on:select={openItem} >
{#await items} -
- -
-
stats
-
title
-
genres
-
-
+ + + + + + + + {:then items} {@const item = items[showcaseIndex]} {#if item} -
+
- + +
= 15 } )} + on:click={openItem} > {item?.title}
diff --git a/src/lib/components/HeroShowcase/HeroShowcase.ts b/src/lib/components/HeroShowcase/HeroShowcase.ts index 1b6623b..db0be36 100644 --- a/src/lib/components/HeroShowcase/HeroShowcase.ts +++ b/src/lib/components/HeroShowcase/HeroShowcase.ts @@ -7,6 +7,7 @@ export type ShowcaseItemProps = { posterUrl: string; backdropUrl: string; + id: number; trailerUrl?: string; title: string; @@ -23,6 +24,7 @@ export async function getShowcasePropsFromTmdbMovie( response: Awaited> ): Promise { return response.slice(0, 10).map((movie) => ({ + id: movie.id || 0, title: movie.title || '', posterUrl: movie.poster_path || '', backdropUrl: movie.backdrop_path || '', @@ -40,17 +42,18 @@ export async function getShowcasePropsFromTmdbMovie( export async function getShowcasePropsFromTmdbSeries( response: Awaited> ): Promise { - return response.slice(0, 10).map((movie) => ({ - title: movie.name || '', - posterUrl: movie.poster_path || '', - backdropUrl: movie.backdrop_path || '', - rating: movie.vote_average?.toFixed(1) || '0', - genres: [], //(movie as any)?.genres?.map((genre: any) => genre?.name), - year: movie.first_air_date ? new Date(movie.first_air_date).getFullYear() : undefined, - runtime: formatMinutesToTime((movie as any).runtime || 0), + return response.slice(0, 10).map((series) => ({ + id: series.id || 0, + title: series.name || '', + posterUrl: series.poster_path || '', + backdropUrl: series.backdrop_path || '', + rating: series.vote_average?.toFixed(1) || '0', + genres: [], //(series as any)?.genres?.map((genre: any) => genre?.name), + year: series.first_air_date ? new Date(series.first_air_date).getFullYear() : undefined, + runtime: formatMinutesToTime((series as any).runtime || 0), ratingSource: 'tmdb', trailerUrl: '', - url: `https://www.themoviedb.org/movie/${movie.id}`, - overview: movie.overview || '' + url: `https://www.themoviedb.org/movie/${series.id}`, + overview: series.overview || '' })); } diff --git a/src/lib/pages/LibraryPage.svelte b/src/lib/pages/LibraryPage.svelte index b971101..cd0839b 100644 --- a/src/lib/pages/LibraryPage.svelte +++ b/src/lib/pages/LibraryPage.svelte @@ -25,9 +25,9 @@ })); - -
-
Library
+ +
+
Library
{#await libraryItemsP} diff --git a/src/lib/pages/MoviesHomePage.svelte b/src/lib/pages/MoviesHomePage.svelte index 9fc9037..efb14a7 100644 --- a/src/lib/pages/MoviesHomePage.svelte +++ b/src/lib/pages/MoviesHomePage.svelte @@ -9,11 +9,13 @@ import { jellyfinApi } from '../apis/jellyfin/jellyfin-api'; import { useRequest } from '../stores/data.store'; import JellyfinCard from '../components/Card/JellyfinCard.svelte'; - import { Route } from 'svelte-navigator'; + import { Route, useNavigate } from 'svelte-navigator'; import MoviePage from './MoviePage.svelte'; import { formatDateToYearMonthDay } from '../utils'; import TmdbCard from '../components/Card/TmdbCard.svelte'; + const navigate = useNavigate(); + const continueWatching = jellyfinApi.getContinueWatching('movie'); const recentlyAdded = jellyfinApi.getRecentlyAdded('movie'); @@ -61,6 +63,9 @@ { + navigate(`${detail?.id}`); + }} />
diff --git a/src/lib/pages/SeriesHomePage.svelte b/src/lib/pages/SeriesHomePage.svelte index 02465df..56b8582 100644 --- a/src/lib/pages/SeriesHomePage.svelte +++ b/src/lib/pages/SeriesHomePage.svelte @@ -10,11 +10,13 @@ import { getShowcasePropsFromTmdbSeries } from '../components/HeroShowcase/HeroShowcase'; import { scrollIntoView } from '../selectable'; import JellyfinCard from '../components/Card/JellyfinCard.svelte'; - import { Route } from 'svelte-navigator'; + import { Route, useNavigate } from 'svelte-navigator'; import SeriesPage from '../components/SeriesPage/SeriesPage.svelte'; import { formatDateToYearMonthDay } from '../utils'; import TmdbCard from '../components/Card/TmdbCard.svelte'; + const navigate = useNavigate(); + const continueWatching = jellyfinApi.getContinueWatchingSeries(); const recentlyAdded = jellyfinApi.getRecentlyAdded('series'); @@ -58,6 +60,9 @@ { + navigate(`${detail?.id}`); + }} />