Refresh playlist list on delete (#134)
This commit is contained in:
parent
37e4940c2e
commit
be0792a5c7
10 changed files with 64 additions and 4 deletions
|
@ -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>
|
||||||
|
|
|
@ -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 (
|
||||||
|
|
|
@ -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]}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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({
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Reference in a new issue