From 2845476d83fc15a396b15b2c4d9d9191ec7ac409 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Wed, 8 Feb 2023 03:44:37 -0800 Subject: [PATCH] Migrate sidebar playlist to react-window --- .../components/sidebar-playlist-list.tsx | 269 +++++++++--------- .../features/sidebar/components/sidebar.tsx | 1 + 2 files changed, 134 insertions(+), 136 deletions(-) diff --git a/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx b/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx index c463d5ee..326cabc3 100644 --- a/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx +++ b/src/renderer/features/sidebar/components/sidebar-playlist-list.tsx @@ -1,156 +1,153 @@ -import { Group } from '@mantine/core'; -import { useVirtualizer } from '@tanstack/react-virtual'; -import { useRef } from 'react'; +import { useCallback, useMemo } from 'react'; +import { Flex, Group } from '@mantine/core'; import { RiAddBoxFill, RiAddCircleFill, RiPlayFill } from 'react-icons/ri'; import { generatePath } from 'react-router'; import { Link } from 'react-router-dom'; import { LibraryItem } from '/@/renderer/api/types'; -import { Button, NativeScrollArea, Text } from '/@/renderer/components'; +import { Button, Text } from '/@/renderer/components'; import { usePlayQueueAdd } from '/@/renderer/features/player'; import { usePlaylistList } from '/@/renderer/features/playlists'; import { AppRoute } from '/@/renderer/router/routes'; import { Play } from '/@/renderer/types'; +import AutoSizer from 'react-virtualized-auto-sizer'; +import { FixedSizeList, ListChildComponentProps } from 'react-window'; +import { useHideScrollbar } from '/@/renderer/hooks'; interface SidebarPlaylistListProps { data: ReturnType['data']; } -export const SidebarPlaylistList = ({ data }: SidebarPlaylistListProps) => { - const scrollAreaRef = useRef(null); - - const handlePlayQueueAdd = usePlayQueueAdd(); - - const handlePlayPlaylist = (id: string, play: Play) => { - handlePlayQueueAdd?.({ - byItemType: { - id: [id], - type: LibraryItem.PLAYLIST, - }, - play, - }); - }; - - const rowVirtualizer = useVirtualizer({ - count: data?.items?.length || 0, - estimateSize: () => 25, - getScrollElement: () => { - return scrollAreaRef.current; - }, - overscan: 5, - }); - - return ( - ( +
+ -
- {rowVirtualizer.getVirtualItems().map((virtualRow) => ( -
+ + + + + + +
+); + +export const SidebarPlaylistList = ({ data }: SidebarPlaylistListProps) => { + const { isScrollbarHidden, hideScrollbarElementProps } = useHideScrollbar(0); + const handlePlayQueueAdd = usePlayQueueAdd(); + + const handlePlayPlaylist = useCallback( + (id: string, play: Play) => { + handlePlayQueueAdd?.({ + byItemType: { + id: [id], + type: LibraryItem.PLAYLIST, + }, + play, + }); + }, + [handlePlayQueueAdd], + ); + + const memoizedItemData = useMemo(() => { + return { + handlePlay: handlePlayPlaylist, + items: data?.items, + }; + }, [data?.items, handlePlayPlaylist]); + + return ( + + + {({ height, width }) => ( + - - - {data?.items?.[virtualRow.index].name} - - - - - - - -
- ))} -
-
+ {PlaylistRow} + + )} + + ); }; diff --git a/src/renderer/features/sidebar/components/sidebar.tsx b/src/renderer/features/sidebar/components/sidebar.tsx index 1783f73d..aced0f5c 100644 --- a/src/renderer/features/sidebar/components/sidebar.tsx +++ b/src/renderer/features/sidebar/components/sidebar.tsx @@ -171,6 +171,7 @@ export const Sidebar = () => { spacing={0} >