mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-02-11 06:42:23 +00:00
Compare commits
2 Commits
renovate/p
...
fix/refres
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a16d73688f | ||
|
|
ac0d3fcb86 |
@@ -35,6 +35,7 @@ import { MediaListSection } from "@/components/medialists/MediaListSection";
|
|||||||
import { Colors } from "@/constants/Colors";
|
import { Colors } from "@/constants/Colors";
|
||||||
import useRouter from "@/hooks/useAppRouter";
|
import useRouter from "@/hooks/useAppRouter";
|
||||||
import { useNetworkStatus } from "@/hooks/useNetworkStatus";
|
import { useNetworkStatus } from "@/hooks/useNetworkStatus";
|
||||||
|
import { useRefetchHomeOnForeground } from "@/hooks/useRefetchHomeOnForeground";
|
||||||
import { useInvalidatePlaybackProgressCache } from "@/hooks/useRevalidatePlaybackProgressCache";
|
import { useInvalidatePlaybackProgressCache } from "@/hooks/useRevalidatePlaybackProgressCache";
|
||||||
import { useDownload } from "@/providers/DownloadProvider";
|
import { useDownload } from "@/providers/DownloadProvider";
|
||||||
import { useIntroSheet } from "@/providers/IntroSheetProvider";
|
import { useIntroSheet } from "@/providers/IntroSheetProvider";
|
||||||
@@ -107,6 +108,9 @@ export const Home = () => {
|
|||||||
prevIsConnected.current = isConnected;
|
prevIsConnected.current = isConnected;
|
||||||
}, [isConnected, invalidateCache]);
|
}, [isConnected, invalidateCache]);
|
||||||
|
|
||||||
|
// Refresh home data on mount (cold start) and when app returns to foreground
|
||||||
|
useRefetchHomeOnForeground();
|
||||||
|
|
||||||
const hasDownloads = useMemo(() => {
|
const hasDownloads = useMemo(() => {
|
||||||
if (Platform.isTV) return false;
|
if (Platform.isTV) return false;
|
||||||
return downloadedItems.length > 0;
|
return downloadedItems.length > 0;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import { MediaListSection } from "@/components/medialists/MediaListSection";
|
|||||||
import { Colors } from "@/constants/Colors";
|
import { Colors } from "@/constants/Colors";
|
||||||
import useRouter from "@/hooks/useAppRouter";
|
import useRouter from "@/hooks/useAppRouter";
|
||||||
import { useNetworkStatus } from "@/hooks/useNetworkStatus";
|
import { useNetworkStatus } from "@/hooks/useNetworkStatus";
|
||||||
|
import { useRefetchHomeOnForeground } from "@/hooks/useRefetchHomeOnForeground";
|
||||||
import { useInvalidatePlaybackProgressCache } from "@/hooks/useRevalidatePlaybackProgressCache";
|
import { useInvalidatePlaybackProgressCache } from "@/hooks/useRevalidatePlaybackProgressCache";
|
||||||
import { useDownload } from "@/providers/DownloadProvider";
|
import { useDownload } from "@/providers/DownloadProvider";
|
||||||
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
import { apiAtom, userAtom } from "@/providers/JellyfinProvider";
|
||||||
@@ -67,8 +68,7 @@ export const HomeWithCarousel = () => {
|
|||||||
const api = useAtomValue(apiAtom);
|
const api = useAtomValue(apiAtom);
|
||||||
const user = useAtomValue(userAtom);
|
const user = useAtomValue(userAtom);
|
||||||
const insets = useSafeAreaInsets();
|
const insets = useSafeAreaInsets();
|
||||||
const [_loading, setLoading] = useState(false);
|
const { settings } = useSettings();
|
||||||
const { settings, refreshStreamyfinPluginSettings } = useSettings();
|
|
||||||
const headerOverlayOffset = Platform.isTV ? 0 : 60;
|
const headerOverlayOffset = Platform.isTV ? 0 : 60;
|
||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
const animatedScrollRef = useAnimatedRef<Animated.ScrollView>();
|
const animatedScrollRef = useAnimatedRef<Animated.ScrollView>();
|
||||||
@@ -91,6 +91,9 @@ export const HomeWithCarousel = () => {
|
|||||||
prevIsConnected.current = isConnected;
|
prevIsConnected.current = isConnected;
|
||||||
}, [isConnected, invalidateCache]);
|
}, [isConnected, invalidateCache]);
|
||||||
|
|
||||||
|
// Refresh home data on mount (cold start) and when app returns to foreground
|
||||||
|
useRefetchHomeOnForeground();
|
||||||
|
|
||||||
const hasDownloads = useMemo(() => {
|
const hasDownloads = useMemo(() => {
|
||||||
if (Platform.isTV) return false;
|
if (Platform.isTV) return false;
|
||||||
return downloadedItems.length > 0;
|
return downloadedItems.length > 0;
|
||||||
@@ -178,13 +181,6 @@ export const HomeWithCarousel = () => {
|
|||||||
);
|
);
|
||||||
}, [userViews]);
|
}, [userViews]);
|
||||||
|
|
||||||
const _refetch = async () => {
|
|
||||||
setLoading(true);
|
|
||||||
await refreshStreamyfinPluginSettings();
|
|
||||||
await invalidateCache();
|
|
||||||
setLoading(false);
|
|
||||||
};
|
|
||||||
|
|
||||||
const createCollectionConfig = useCallback(
|
const createCollectionConfig = useCallback(
|
||||||
(
|
(
|
||||||
title: string,
|
title: string,
|
||||||
|
|||||||
@@ -37,7 +37,18 @@ export const ItemPeopleSections: React.FC<Props> = ({ item, ...props }) => {
|
|||||||
return { ...item, People: people } as BaseItemDto;
|
return { ...item, People: people } as BaseItemDto;
|
||||||
}, [item, people]);
|
}, [item, people]);
|
||||||
|
|
||||||
const topPeople = useMemo(() => people.slice(0, 3), [people]);
|
const topPeople = useMemo(() => {
|
||||||
|
const seen = new Set<string>();
|
||||||
|
const unique: BaseItemPerson[] = [];
|
||||||
|
for (const person of people) {
|
||||||
|
if (person.Id && !seen.has(person.Id)) {
|
||||||
|
seen.add(person.Id);
|
||||||
|
unique.push(person);
|
||||||
|
}
|
||||||
|
if (unique.length >= 3) break;
|
||||||
|
}
|
||||||
|
return unique;
|
||||||
|
}, [people]);
|
||||||
|
|
||||||
const renderActorSection = useCallback(
|
const renderActorSection = useCallback(
|
||||||
(person: BaseItemPerson, idx: number, total: number) => {
|
(person: BaseItemPerson, idx: number, total: number) => {
|
||||||
|
|||||||
32
hooks/useRefetchHomeOnForeground.ts
Normal file
32
hooks/useRefetchHomeOnForeground.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
|
import { useEffect } from "react";
|
||||||
|
import { AppState } from "react-native";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refetches active home queries on mount (cold start) and whenever
|
||||||
|
* the app returns to the foreground from background.
|
||||||
|
*/
|
||||||
|
export function useRefetchHomeOnForeground() {
|
||||||
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// On mount (cold start), use cancelRefetch: false so we don't cancel
|
||||||
|
// an in-flight initial fetch that React Query already started.
|
||||||
|
queryClient.refetchQueries(
|
||||||
|
{ queryKey: ["home"], type: "active" },
|
||||||
|
{ cancelRefetch: false },
|
||||||
|
);
|
||||||
|
|
||||||
|
const subscription = AppState.addEventListener("change", (state) => {
|
||||||
|
if (state === "active") {
|
||||||
|
// On foreground return, force a fresh refetch
|
||||||
|
queryClient.refetchQueries(
|
||||||
|
{ queryKey: ["home"], type: "active" },
|
||||||
|
{ cancelRefetch: true },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => subscription.remove();
|
||||||
|
}, [queryClient]);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user