From c215fda973718c57d32b019def17baaca1cfe793 Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Sat, 24 Jan 2026 10:48:42 +0100 Subject: [PATCH] feat(tv): add 60s background refresh for idle screens --- .../series/[id].tsx | 4 +++- components/home/Home.tv.tsx | 1 + components/home/InfiniteScrollingCollectionList.tv.tsx | 1 + components/home/StreamystatsPromotedWatchlists.tv.tsx | 6 ++++-- components/home/StreamystatsRecommendations.tv.tsx | 6 ++++-- components/series/TVSeriesPage.tsx | 4 +++- hooks/useItemQuery.ts | 3 +++ 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/(auth)/(tabs)/(home,libraries,search,favorites,watchlists)/series/[id].tsx b/app/(auth)/(tabs)/(home,libraries,search,favorites,watchlists)/series/[id].tsx index 32f5d1cd..cc4b21b9 100644 --- a/app/(auth)/(tabs)/(home,libraries,search,favorites,watchlists)/series/[id].tsx +++ b/app/(auth)/(tabs)/(home,libraries,search,favorites,watchlists)/series/[id].tsx @@ -62,6 +62,7 @@ const page: React.FC = () => { }); }, staleTime: isOffline ? Infinity : 60 * 1000, + refetchInterval: !isOffline && Platform.isTV ? 60 * 1000 : undefined, enabled: isOffline || (!!api && !!user?.Id), }); @@ -117,7 +118,8 @@ const page: React.FC = () => { (a.ParentIndexNumber ?? 0) - (b.ParentIndexNumber ?? 0) || (a.IndexNumber ?? 0) - (b.IndexNumber ?? 0), ), - staleTime: isOffline ? Infinity : 60, + staleTime: isOffline ? Infinity : 60 * 1000, + refetchInterval: !isOffline && Platform.isTV ? 60 * 1000 : undefined, enabled: isOffline || (!!api && !!user?.Id), }); diff --git a/components/home/Home.tv.tsx b/components/home/Home.tv.tsx index 3aab9276..1b182dd4 100644 --- a/components/home/Home.tv.tsx +++ b/components/home/Home.tv.tsx @@ -201,6 +201,7 @@ export const Home = () => { }, enabled: !!api && !!user?.Id, staleTime: 60 * 1000, + refetchInterval: 60 * 1000, }); const userViews = useMemo( diff --git a/components/home/InfiniteScrollingCollectionList.tv.tsx b/components/home/InfiniteScrollingCollectionList.tv.tsx index 38785226..9fdbd0db 100644 --- a/components/home/InfiniteScrollingCollectionList.tv.tsx +++ b/components/home/InfiniteScrollingCollectionList.tv.tsx @@ -211,6 +211,7 @@ export const InfiniteScrollingCollectionList: React.FC = ({ }, initialPageParam: 0, staleTime: 60 * 1000, + refetchInterval: 60 * 1000, refetchOnWindowFocus: false, refetchOnReconnect: true, enabled, diff --git a/components/home/StreamystatsPromotedWatchlists.tv.tsx b/components/home/StreamystatsPromotedWatchlists.tv.tsx index 7b28da1f..59f9c640 100644 --- a/components/home/StreamystatsPromotedWatchlists.tv.tsx +++ b/components/home/StreamystatsPromotedWatchlists.tv.tsx @@ -108,7 +108,8 @@ const WatchlistSection: React.FC = ({ Boolean(settings?.streamyStatsServerUrl) && Boolean(api?.accessToken) && Boolean(user?.Id), - staleTime: 5 * 60 * 1000, + staleTime: 60 * 1000, + refetchInterval: 60 * 1000, refetchOnWindowFocus: false, }); @@ -277,7 +278,8 @@ export const StreamystatsPromotedWatchlists: React.FC< Boolean(api?.accessToken) && Boolean(jellyfinServerId) && Boolean(user?.Id), - staleTime: 5 * 60 * 1000, + staleTime: 60 * 1000, + refetchInterval: 60 * 1000, refetchOnWindowFocus: false, }); diff --git a/components/home/StreamystatsRecommendations.tv.tsx b/components/home/StreamystatsRecommendations.tv.tsx index 095fe35f..79293394 100644 --- a/components/home/StreamystatsRecommendations.tv.tsx +++ b/components/home/StreamystatsRecommendations.tv.tsx @@ -133,7 +133,8 @@ export const StreamystatsRecommendations: React.FC = ({ Boolean(api?.accessToken) && Boolean(jellyfinServerId) && Boolean(user?.Id), - staleTime: 5 * 60 * 1000, + staleTime: 60 * 1000, + refetchInterval: 60 * 1000, refetchOnWindowFocus: false, }); @@ -165,7 +166,8 @@ export const StreamystatsRecommendations: React.FC = ({ }, enabled: Boolean(recommendationIds?.length) && Boolean(api) && Boolean(user?.Id), - staleTime: 5 * 60 * 1000, + staleTime: 60 * 1000, + refetchInterval: 60 * 1000, refetchOnWindowFocus: false, }); diff --git a/components/series/TVSeriesPage.tsx b/components/series/TVSeriesPage.tsx index 69c8148d..c6c57332 100644 --- a/components/series/TVSeriesPage.tsx +++ b/components/series/TVSeriesPage.tsx @@ -293,6 +293,7 @@ export const TVSeriesPage: React.FC = ({ return response.data.Items || []; }, staleTime: isOffline ? Infinity : 60 * 1000, + refetchInterval: !isOffline ? 60 * 1000 : undefined, enabled: isOffline || (!!api && !!user?.Id && !!item.Id), }); @@ -345,7 +346,8 @@ export const TVSeriesPage: React.FC = ({ }); return res.data.Items || []; }, - staleTime: isOffline ? Infinity : 0, + staleTime: isOffline ? Infinity : 60 * 1000, + refetchInterval: !isOffline ? 60 * 1000 : undefined, enabled: isOffline ? !!item.Id && selectedSeasonNumber !== null : !!api && !!user?.Id && !!item.Id && !!selectedSeasonId, diff --git a/hooks/useItemQuery.ts b/hooks/useItemQuery.ts index 370b5f35..d98f6193 100644 --- a/hooks/useItemQuery.ts +++ b/hooks/useItemQuery.ts @@ -2,6 +2,7 @@ import { ItemFields } from "@jellyfin/sdk/lib/generated-client/models"; import { getItemsApi } from "@jellyfin/sdk/lib/utils/api"; import { useQuery } from "@tanstack/react-query"; import { useAtom } from "jotai"; +import { Platform } from "react-native"; import { useDownload } from "@/providers/DownloadProvider"; import { apiAtom, userAtom } from "@/providers/JellyfinProvider"; @@ -49,6 +50,8 @@ export const useItemQuery = ( return response.data.Items?.[0]; }, enabled: !!itemId, + staleTime: isOffline ? Infinity : 60 * 1000, + refetchInterval: !isOffline && Platform.isTV ? 60 * 1000 : undefined, refetchOnMount: true, refetchOnWindowFocus: true, refetchOnReconnect: true,