fix: add favorite to series

This commit is contained in:
Fredrik Burmester
2025-01-01 18:23:42 +01:00
parent eaffffb2f0
commit 344e0932dc
3 changed files with 38 additions and 23 deletions

View File

@@ -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] });
},
});

View File

@@ -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>