Refresh playlist list on delete (#134)

This commit is contained in:
jeffvli 2023-07-16 23:23:07 -07:00
parent 37e4940c2e
commit be0792a5c7
10 changed files with 64 additions and 4 deletions

View file

@ -22,6 +22,7 @@ interface BaseGridCardProps {
handlePlayQueueAdd: (options: PlayQueueAddOptions) => void; handlePlayQueueAdd: (options: PlayQueueAddOptions) => void;
itemType: LibraryItem; itemType: LibraryItem;
playButtonBehavior: Play; playButtonBehavior: Play;
resetInfiniteLoaderCache: () => void;
route: CardRoute; route: CardRoute;
}; };
data: any; data: any;
@ -202,6 +203,7 @@ export const DefaultCard = ({
handlePlayQueueAdd={controls.handlePlayQueueAdd} handlePlayQueueAdd={controls.handlePlayQueueAdd}
itemData={data} itemData={data}
itemType={controls.itemType} itemType={controls.itemType}
resetInfiniteLoaderCache={controls.resetInfiniteLoaderCache}
/> />
</ImageContainer> </ImageContainer>
<DetailContainer> <DetailContainer>

View file

@ -7,7 +7,7 @@ import type { PlayQueueAddOptions } from '/@/renderer/types';
import { Play } from '/@/renderer/types'; import { Play } from '/@/renderer/types';
import { usePlayButtonBehavior } from '/@/renderer/store/settings.store'; import { usePlayButtonBehavior } from '/@/renderer/store/settings.store';
import { LibraryItem } from '/@/renderer/api/types'; import { LibraryItem } from '/@/renderer/api/types';
import { useHandleGeneralContextMenu } from '/@/renderer/features/context-menu/hooks/use-handle-context-menu'; import { useHandleGridContextMenu } from '/@/renderer/features/context-menu/hooks/use-handle-context-menu';
import { import {
PLAYLIST_CONTEXT_MENU_ITEMS, PLAYLIST_CONTEXT_MENU_ITEMS,
ALBUM_CONTEXT_MENU_ITEMS, ALBUM_CONTEXT_MENU_ITEMS,
@ -112,6 +112,7 @@ export const GridCardControls = ({
itemType, itemType,
handlePlayQueueAdd, handlePlayQueueAdd,
handleFavorite, handleFavorite,
resetInfiniteLoaderCache,
}: { }: {
handleFavorite: (options: { handleFavorite: (options: {
id: string[]; id: string[];
@ -122,6 +123,7 @@ export const GridCardControls = ({
handlePlayQueueAdd?: (options: PlayQueueAddOptions) => void; handlePlayQueueAdd?: (options: PlayQueueAddOptions) => void;
itemData: any; itemData: any;
itemType: LibraryItem; itemType: LibraryItem;
resetInfiniteLoaderCache: () => void;
}) => { }) => {
const [isFavorite, setIsFavorite] = useState(itemData?.userFavorite); const [isFavorite, setIsFavorite] = useState(itemData?.userFavorite);
const playButtonBehavior = usePlayButtonBehavior(); const playButtonBehavior = usePlayButtonBehavior();
@ -153,13 +155,14 @@ export const GridCardControls = ({
setIsFavorite(!isFavorite); setIsFavorite(!isFavorite);
}; };
const handleContextMenu = useHandleGeneralContextMenu( const handleContextMenu = useHandleGridContextMenu(
itemType, itemType,
itemType === LibraryItem.ALBUM itemType === LibraryItem.ALBUM
? ALBUM_CONTEXT_MENU_ITEMS ? ALBUM_CONTEXT_MENU_ITEMS
: itemType === LibraryItem.PLAYLIST : itemType === LibraryItem.PLAYLIST
? PLAYLIST_CONTEXT_MENU_ITEMS ? PLAYLIST_CONTEXT_MENU_ITEMS
: ARTIST_CONTEXT_MENU_ITEMS, : ARTIST_CONTEXT_MENU_ITEMS,
resetInfiniteLoaderCache,
); );
return ( return (

View file

@ -17,8 +17,11 @@ export const GridCard = memo(({ data, index, style }: ListChildComponentProps) =
handleFavorite, handleFavorite,
route, route,
display, display,
resetInfiniteLoaderCache,
} = data as GridCardData; } = data as GridCardData;
console.log('data', data);
const cards = []; const cards = [];
const startIndex = index * columnCount; const startIndex = index * columnCount;
const stopIndex = Math.min(itemCount - 1, startIndex + columnCount - 1); const stopIndex = Math.min(itemCount - 1, startIndex + columnCount - 1);
@ -41,6 +44,7 @@ export const GridCard = memo(({ data, index, style }: ListChildComponentProps) =
handlePlayQueueAdd, handlePlayQueueAdd,
itemType, itemType,
playButtonBehavior, playButtonBehavior,
resetInfiniteLoaderCache,
route, route,
}} }}
data={itemData[i]} data={itemData[i]}

View file

@ -22,6 +22,7 @@ interface BaseGridCardProps {
handlePlayQueueAdd: (options: PlayQueueAddOptions) => void; handlePlayQueueAdd: (options: PlayQueueAddOptions) => void;
itemType: LibraryItem; itemType: LibraryItem;
playButtonBehavior: Play; playButtonBehavior: Play;
resetInfiniteLoaderCache: () => void;
route: CardRoute; route: CardRoute;
}; };
data: any; data: any;
@ -186,6 +187,7 @@ export const PosterCard = ({
handlePlayQueueAdd={controls.handlePlayQueueAdd} handlePlayQueueAdd={controls.handlePlayQueueAdd}
itemData={data} itemData={data}
itemType={controls.itemType} itemType={controls.itemType}
resetInfiniteLoaderCache={controls.resetInfiniteLoaderCache}
/> />
</ImageContainer> </ImageContainer>
</LinkContainer> </LinkContainer>

View file

@ -22,6 +22,7 @@ const createItemData = memoize(
route, route,
handlePlayQueueAdd, handlePlayQueueAdd,
handleFavorite, handleFavorite,
resetInfiniteLoaderCache,
) => ({ ) => ({
cardRows, cardRows,
columnCount, columnCount,
@ -34,6 +35,7 @@ const createItemData = memoize(
itemHeight, itemHeight,
itemType, itemType,
itemWidth, itemWidth,
resetInfiniteLoaderCache,
route, route,
}), }),
); );
@ -59,6 +61,7 @@ export const VirtualGridWrapper = ({
onScroll, onScroll,
height, height,
width, width,
resetInfiniteLoaderCache,
...rest ...rest
}: Omit<FixedSizeListProps, 'ref' | 'itemSize' | 'children' | 'height' | 'width'> & { }: Omit<FixedSizeListProps, 'ref' | 'itemSize' | 'children' | 'height' | 'width'> & {
cardRows: CardRow<Album | AlbumArtist | Artist>[]; cardRows: CardRow<Album | AlbumArtist | Artist>[];
@ -77,6 +80,7 @@ export const VirtualGridWrapper = ({
itemType: LibraryItem; itemType: LibraryItem;
itemWidth: number; itemWidth: number;
refInstance: Ref<any>; refInstance: Ref<any>;
resetInfiniteLoaderCache: () => void;
route?: CardRoute; route?: CardRoute;
rowCount: number; rowCount: number;
width?: number; width?: number;
@ -94,6 +98,7 @@ export const VirtualGridWrapper = ({
route, route,
handlePlayQueueAdd, handlePlayQueueAdd,
handleFavorite, handleFavorite,
resetInfiniteLoaderCache,
); );
const memoizedOnScroll = createScrollHandler(onScroll); const memoizedOnScroll = createScrollHandler(onScroll);

View file

@ -166,6 +166,12 @@ export const VirtualInfiniteGrid = forwardRef(
infiniteLoaderRef(list); infiniteLoaderRef(list);
listRef.current = list; listRef.current = list;
}} }}
resetInfiniteLoaderCache={() => {
if (loader.current) {
loader.current.resetloadMoreItemsCache(false);
setItemData([]);
}
}}
route={route} route={route}
rowCount={rowCount} rowCount={rowCount}
width={width} width={width}

View file

@ -97,6 +97,7 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
data: [], data: [],
dataNodes: [], dataNodes: [],
menuItems: [], menuItems: [],
resetGridCache: undefined,
tableApi: undefined, tableApi: undefined,
type: LibraryItem.SONG, type: LibraryItem.SONG,
xPos: 0, xPos: 0,
@ -106,7 +107,8 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
const handlePlayQueueAdd = usePlayQueueAdd(); const handlePlayQueueAdd = usePlayQueueAdd();
const openContextMenu = (args: OpenContextMenuProps) => { const openContextMenu = (args: OpenContextMenuProps) => {
const { xPos, yPos, menuItems, data, type, tableApi, dataNodes, context } = args; const { xPos, yPos, menuItems, data, type, tableApi, dataNodes, context, resetGridCache } =
args;
const serverType = data[0]?.serverType || useAuthStore.getState().currentServer?.type; const serverType = data[0]?.serverType || useAuthStore.getState().currentServer?.type;
let validMenuItems = menuItems; let validMenuItems = menuItems;
@ -133,6 +135,7 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
data, data,
dataNodes, dataNodes,
menuItems: validMenuItems, menuItems: validMenuItems,
resetGridCache,
tableApi, tableApi,
type, type,
xPos: calculatedXPos, xPos: calculatedXPos,
@ -214,12 +217,16 @@ export const ContextMenuProvider = ({ children }: ContextMenuProviderProps) => {
toast.success({ toast.success({
message: `Playlist has been deleted`, message: `Playlist has been deleted`,
}); });
ctx.tableApi?.refreshInfiniteCache();
ctx.resetGridCache?.();
}, },
}, },
); );
} }
closeAllModals(); closeAllModals();
}, [ctx.data, deletePlaylistMutation]); }, [ctx, deletePlaylistMutation]);
const openDeletePlaylistModal = useCallback(() => { const openDeletePlaylistModal = useCallback(() => {
openModal({ openModal({

View file

@ -7,6 +7,7 @@ export type OpenContextMenuProps = {
data: any[]; data: any[];
dataNodes?: RowNode[]; dataNodes?: RowNode[];
menuItems: SetContextMenuItems; menuItems: SetContextMenuItems;
resetGridCache?: () => void;
tableApi?: GridOptions['api']; tableApi?: GridOptions['api'];
type: LibraryItem; type: LibraryItem;
xPos: number; xPos: number;

View file

@ -72,3 +72,32 @@ export const useHandleGeneralContextMenu = (
return handleContextMenu; return handleContextMenu;
}; };
export const useHandleGridContextMenu = (
itemType: LibraryItem,
contextMenuItems: SetContextMenuItems,
resetGridCache: () => void,
context?: any,
) => {
const handleContextMenu = (
e: any,
data: Song[] | QueueSong[] | AlbumArtist[] | Artist[] | Album[],
) => {
if (!e) return;
const clickEvent = e as MouseEvent;
clickEvent.preventDefault();
openContextMenu({
context,
data,
dataNodes: undefined,
menuItems: contextMenuItems,
resetGridCache,
type: itemType,
xPos: clickEvent.clientX + 15,
yPos: clickEvent.clientY + 5,
});
};
return handleContextMenu;
};

View file

@ -183,5 +183,6 @@ export type GridCardData = {
itemType: LibraryItem; itemType: LibraryItem;
itemWidth: number; itemWidth: number;
playButtonBehavior: Play; playButtonBehavior: Play;
resetInfiniteLoaderCache: () => void;
route: CardRoute; route: CardRoute;
}; };