diff --git a/components/ItemContent.tsx b/components/ItemContent.tsx index 070b02e2..6fc86e49 100644 --- a/components/ItemContent.tsx +++ b/components/ItemContent.tsx @@ -35,6 +35,7 @@ import { ItemTechnicalDetails } from "./ItemTechnicalDetails"; import { MediaSourceSheet } from "./MediaSourceSheet"; import { MoreMoviesWithActor } from "./MoreMoviesWithActor"; import { PlayInRemoteSessionButton } from "./PlayInRemoteSession"; +import { RefreshMetadata } from "./RefreshMetadata"; import { TrackSheet } from "./TrackSheet"; const Chromecast = !Platform.isTV ? require("./Chromecast") : null; @@ -115,7 +116,10 @@ export const ItemContent: React.FC = React.memo( )} {user?.Policy?.IsAdministrator && ( - + <> + + + )} @@ -132,7 +136,10 @@ export const ItemContent: React.FC = React.memo( )} {user?.Policy?.IsAdministrator && ( - + <> + + + )} diff --git a/components/RefreshMetadata.tsx b/components/RefreshMetadata.tsx new file mode 100644 index 00000000..9f07f7ee --- /dev/null +++ b/components/RefreshMetadata.tsx @@ -0,0 +1,37 @@ +import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; +import type { FC } from "react"; +import { Platform, View, type ViewProps } from "react-native"; +import { RoundButton } from "@/components/RoundButton"; +import { useRefreshMetadata } from "@/hooks/useRefreshMetadata"; + +interface Props extends ViewProps { + item: BaseItemDto; +} + +export const RefreshMetadata: FC = ({ item, ...props }) => { + const { refreshMetadata, isRefreshing } = useRefreshMetadata(item); + + if (Platform.OS === "ios") { + return ( + + + + ); + } + + return ( + + + + ); +}; diff --git a/hooks/useRefreshMetadata.ts b/hooks/useRefreshMetadata.ts new file mode 100644 index 00000000..598f9d47 --- /dev/null +++ b/hooks/useRefreshMetadata.ts @@ -0,0 +1,40 @@ +import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client"; +import { getItemRefreshApi } from "@jellyfin/sdk/lib/utils/api"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { useAtom } from "jotai"; +import { toast } from "sonner-native"; +import { apiAtom } from "@/providers/JellyfinProvider"; + +export const useRefreshMetadata = (item: BaseItemDto) => { + const queryClient = useQueryClient(); + const [api] = useAtom(apiAtom); + const type = "item"; + + const refreshMetadataMutation = useMutation({ + mutationFn: async () => { + if (api && item.Id) { + await getItemRefreshApi(api).refreshItem({ + itemId: item.Id, + }); + } + }, + onSuccess: () => { + toast.success("Metadata refresh triggered"); + queryClient.invalidateQueries({ queryKey: [type, item.Id] }); + }, + onError: (error) => { + console.error("Failed to refresh metadata:", error); + toast.error("Failed to refresh metadata"); + }, + }); + + const refreshMetadata = () => { + refreshMetadataMutation.mutate(); + }; + + return { + refreshMetadata, + isRefreshing: refreshMetadataMutation.isPending, + refreshMetadataMutation, + }; +};