Merge pull request #571 from Fallenbagel/fix-local-watchlist-page-item-removal
fix: ensure watchlist updates are immediately reflected
This commit is contained in:
@@ -19,6 +19,7 @@ type ListViewProps = {
|
|||||||
isLoading?: boolean;
|
isLoading?: boolean;
|
||||||
isReachingEnd?: boolean;
|
isReachingEnd?: boolean;
|
||||||
onScrollBottom: () => void;
|
onScrollBottom: () => void;
|
||||||
|
mutateParent?: () => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ListView = ({
|
const ListView = ({
|
||||||
@@ -28,6 +29,7 @@ const ListView = ({
|
|||||||
onScrollBottom,
|
onScrollBottom,
|
||||||
isReachingEnd,
|
isReachingEnd,
|
||||||
plexItems,
|
plexItems,
|
||||||
|
mutateParent,
|
||||||
}: ListViewProps) => {
|
}: ListViewProps) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
useVerticalScroll(onScrollBottom, !isLoading && !isEmpty && !isReachingEnd);
|
useVerticalScroll(onScrollBottom, !isLoading && !isEmpty && !isReachingEnd);
|
||||||
@@ -48,6 +50,7 @@ const ListView = ({
|
|||||||
type={title.mediaType}
|
type={title.mediaType}
|
||||||
isAddedToWatchlist={true}
|
isAddedToWatchlist={true}
|
||||||
canExpand
|
canExpand
|
||||||
|
mutateParent={mutateParent}
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ const DiscoverWatchlist = () => {
|
|||||||
titles,
|
titles,
|
||||||
fetchMore,
|
fetchMore,
|
||||||
error,
|
error,
|
||||||
|
mutate,
|
||||||
} = useDiscover<WatchlistItem>(
|
} = useDiscover<WatchlistItem>(
|
||||||
`/api/v1/${
|
`/api/v1/${
|
||||||
router.pathname.startsWith('/profile')
|
router.pathname.startsWith('/profile')
|
||||||
@@ -76,6 +77,7 @@ const DiscoverWatchlist = () => {
|
|||||||
}
|
}
|
||||||
isReachingEnd={isReachingEnd}
|
isReachingEnd={isReachingEnd}
|
||||||
onScrollBottom={fetchMore}
|
onScrollBottom={fetchMore}
|
||||||
|
mutateParent={mutate}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export interface TmdbTitleCardProps {
|
|||||||
type: 'movie' | 'tv';
|
type: 'movie' | 'tv';
|
||||||
canExpand?: boolean;
|
canExpand?: boolean;
|
||||||
isAddedToWatchlist?: boolean;
|
isAddedToWatchlist?: boolean;
|
||||||
|
mutateParent?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
|
const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
|
||||||
@@ -25,6 +26,7 @@ const TmdbTitleCard = ({
|
|||||||
type,
|
type,
|
||||||
canExpand,
|
canExpand,
|
||||||
isAddedToWatchlist = false,
|
isAddedToWatchlist = false,
|
||||||
|
mutateParent,
|
||||||
}: TmdbTitleCardProps) => {
|
}: TmdbTitleCardProps) => {
|
||||||
const { hasPermission } = useUser();
|
const { hasPermission } = useUser();
|
||||||
|
|
||||||
@@ -71,6 +73,7 @@ const TmdbTitleCard = ({
|
|||||||
year={title.releaseDate}
|
year={title.releaseDate}
|
||||||
mediaType={'movie'}
|
mediaType={'movie'}
|
||||||
canExpand={canExpand}
|
canExpand={canExpand}
|
||||||
|
mutateParent={mutateParent}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<TitleCard
|
<TitleCard
|
||||||
@@ -87,6 +90,7 @@ const TmdbTitleCard = ({
|
|||||||
year={title.firstAirDate}
|
year={title.firstAirDate}
|
||||||
mediaType={'tv'}
|
mediaType={'tv'}
|
||||||
canExpand={canExpand}
|
canExpand={canExpand}
|
||||||
|
mutateParent={mutateParent}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ interface TitleCardProps {
|
|||||||
canExpand?: boolean;
|
canExpand?: boolean;
|
||||||
inProgress?: boolean;
|
inProgress?: boolean;
|
||||||
isAddedToWatchlist?: number | boolean;
|
isAddedToWatchlist?: number | boolean;
|
||||||
|
mutateParent?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
@@ -61,6 +62,7 @@ const TitleCard = ({
|
|||||||
isAddedToWatchlist = false,
|
isAddedToWatchlist = false,
|
||||||
inProgress = false,
|
inProgress = false,
|
||||||
canExpand = false,
|
canExpand = false,
|
||||||
|
mutateParent,
|
||||||
}: TitleCardProps) => {
|
}: TitleCardProps) => {
|
||||||
const isTouch = useIsTouch();
|
const isTouch = useIsTouch();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
@@ -148,6 +150,9 @@ const TitleCard = ({
|
|||||||
} finally {
|
} finally {
|
||||||
setIsUpdating(false);
|
setIsUpdating(false);
|
||||||
mutate('/api/v1/discover/watchlist');
|
mutate('/api/v1/discover/watchlist');
|
||||||
|
if (mutateParent) {
|
||||||
|
mutateParent();
|
||||||
|
}
|
||||||
setToggleWatchlist((prevState) => !prevState);
|
setToggleWatchlist((prevState) => !prevState);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ interface DiscoverResult<T, S> {
|
|||||||
error: unknown;
|
error: unknown;
|
||||||
titles: T[];
|
titles: T[];
|
||||||
firstResultData?: BaseSearchResult<T> & S;
|
firstResultData?: BaseSearchResult<T> & S;
|
||||||
|
mutate?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const extraEncodes: [RegExp, string][] = [
|
const extraEncodes: [RegExp, string][] = [
|
||||||
@@ -54,7 +55,7 @@ const useDiscover = <
|
|||||||
{ hideAvailable = true } = {}
|
{ hideAvailable = true } = {}
|
||||||
): DiscoverResult<T, S> => {
|
): DiscoverResult<T, S> => {
|
||||||
const settings = useSettings();
|
const settings = useSettings();
|
||||||
const { data, error, size, setSize, isValidating } = useSWRInfinite<
|
const { data, error, size, setSize, isValidating, mutate } = useSWRInfinite<
|
||||||
BaseSearchResult<T> & S
|
BaseSearchResult<T> & S
|
||||||
>(
|
>(
|
||||||
(pageIndex: number, previousPageData) => {
|
(pageIndex: number, previousPageData) => {
|
||||||
@@ -119,6 +120,7 @@ const useDiscover = <
|
|||||||
error,
|
error,
|
||||||
titles,
|
titles,
|
||||||
firstResultData: data?.[0],
|
firstResultData: data?.[0],
|
||||||
|
mutate,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user