mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-04-20 15:54:42 +01:00
fix: add favorite to series
This commit is contained in:
@@ -9,9 +9,10 @@ import { RoundButton } from "./RoundButton";
|
||||
|
||||
interface Props extends ViewProps {
|
||||
item: BaseItemDto;
|
||||
type: "item" | "series";
|
||||
}
|
||||
|
||||
export const AddToFavorites: React.FC<Props> = ({ item, ...props }) => {
|
||||
export const AddToFavorites: React.FC<Props> = ({ item, type, ...props }) => {
|
||||
const queryClient = useQueryClient();
|
||||
const [api] = useAtom(apiAtom);
|
||||
const [user] = useAtom(userAtom);
|
||||
@@ -20,6 +21,20 @@ export const AddToFavorites: React.FC<Props> = ({ item, ...props }) => {
|
||||
return item.UserData?.IsFavorite;
|
||||
}, [item.UserData?.IsFavorite]);
|
||||
|
||||
const updateItemInQueries = (newData: Partial<BaseItemDto>) => {
|
||||
queryClient.setQueryData<BaseItemDto | undefined>(
|
||||
[type, item.Id],
|
||||
(old) => {
|
||||
if (!old) return old;
|
||||
return {
|
||||
...old,
|
||||
...newData,
|
||||
UserData: { ...old.UserData, ...newData.UserData },
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
const markFavoriteMutation = useMutation({
|
||||
mutationFn: async () => {
|
||||
if (api && user) {
|
||||
@@ -30,22 +45,22 @@ export const AddToFavorites: React.FC<Props> = ({ item, ...props }) => {
|
||||
}
|
||||
},
|
||||
onMutate: async () => {
|
||||
await queryClient.cancelQueries({ queryKey: ["item", item.Id] });
|
||||
await queryClient.cancelQueries({ queryKey: [type, item.Id] });
|
||||
const previousItem = queryClient.getQueryData<BaseItemDto>([
|
||||
"item",
|
||||
type,
|
||||
item.Id,
|
||||
]);
|
||||
queryClient.setQueryData<BaseItemDto>(["item", item.Id], (old) => ({
|
||||
...old!,
|
||||
UserData: { ...old!.UserData, IsFavorite: true },
|
||||
}));
|
||||
updateItemInQueries({ UserData: { IsFavorite: true } });
|
||||
|
||||
return { previousItem };
|
||||
},
|
||||
onError: (err, variables, context) => {
|
||||
queryClient.setQueryData(["item", item.Id], context?.previousItem);
|
||||
if (context?.previousItem) {
|
||||
queryClient.setQueryData([type, item.Id], context.previousItem);
|
||||
}
|
||||
},
|
||||
onSettled: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ["item", item.Id] });
|
||||
queryClient.invalidateQueries({ queryKey: [type, item.Id] });
|
||||
},
|
||||
});
|
||||
|
||||
@@ -59,22 +74,22 @@ export const AddToFavorites: React.FC<Props> = ({ item, ...props }) => {
|
||||
}
|
||||
},
|
||||
onMutate: async () => {
|
||||
await queryClient.cancelQueries({ queryKey: ["item", item.Id] });
|
||||
await queryClient.cancelQueries({ queryKey: [type, item.Id] });
|
||||
const previousItem = queryClient.getQueryData<BaseItemDto>([
|
||||
"item",
|
||||
type,
|
||||
item.Id,
|
||||
]);
|
||||
queryClient.setQueryData<BaseItemDto>(["item", item.Id], (old) => ({
|
||||
...old!,
|
||||
UserData: { ...old!.UserData, IsFavorite: false },
|
||||
}));
|
||||
updateItemInQueries({ UserData: { IsFavorite: false } });
|
||||
|
||||
return { previousItem };
|
||||
},
|
||||
onError: (err, variables, context) => {
|
||||
queryClient.setQueryData(["item", item.Id], context?.previousItem);
|
||||
if (context?.previousItem) {
|
||||
queryClient.setQueryData([type, item.Id], context.previousItem);
|
||||
}
|
||||
},
|
||||
onSettled: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ["item", item.Id] });
|
||||
queryClient.invalidateQueries({ queryKey: [type, item.Id] });
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ export const ItemContent: React.FC<{ item: BaseItemDto }> = React.memo(
|
||||
<View className="flex flex-row items-center space-x-2">
|
||||
<DownloadSingleItem item={item} size="large" />
|
||||
<PlayedStatus item={item} />
|
||||
<AddToFavorites item={item} />
|
||||
<AddToFavorites item={item} type="item" />
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
|
||||
Reference in New Issue
Block a user