From 359e4429470516c44f3c4c65e85b1f18d7aa389b Mon Sep 17 00:00:00 2001 From: jeffvli Date: Tue, 25 Nov 2025 01:40:11 -0800 Subject: [PATCH] optimize excessive layout re-rendering due to react-router --- .../item-list/helpers/item-list-controls.ts | 11 +- .../now-playing/routes/now-playing-route.tsx | 14 +- .../sidebar/components/action-bar.tsx | 23 ++- .../sidebar/components/sidebar-item.tsx | 2 +- .../features/sidebar/components/sidebar.tsx | 3 +- src/renderer/layouts/default-layout.tsx | 46 +----- .../layouts/default-layout/main-content.tsx | 7 +- .../layouts/default-layout/right-sidebar.tsx | 137 +++++++----------- .../layouts/mobile-layout/mobile-layout.tsx | 14 +- src/renderer/layouts/responsive-layout.tsx | 60 +++++++- src/renderer/store/auth.store.ts | 10 +- 11 files changed, 166 insertions(+), 161 deletions(-) diff --git a/src/renderer/components/item-list/helpers/item-list-controls.ts b/src/renderer/components/item-list/helpers/item-list-controls.ts index 37e501f71..4f858d16c 100644 --- a/src/renderer/components/item-list/helpers/item-list-controls.ts +++ b/src/renderer/components/item-list/helpers/item-list-controls.ts @@ -1,4 +1,4 @@ -import { useMemo } from 'react'; +import { useEffect, useMemo, useRef } from 'react'; import { useNavigate } from 'react-router'; import { getTitlePath } from '/@/renderer/components/item-list/helpers/get-title-path'; @@ -32,6 +32,11 @@ const itemTypeMapping = { export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs) => { const player = usePlayer(); const navigate = useNavigate(); + const navigateRef = useRef(navigate); + + useEffect(() => { + navigateRef.current = navigate; + }, [navigate]); const { onColumnReordered, onColumnResized, overrides } = args || {}; @@ -202,7 +207,7 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs ) { const path = getTitlePath(itemType, item.id); if (path) { - navigate(path, { state: { item } }); + navigateRef.current(path, { state: { item } }); return; } } @@ -330,7 +335,7 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs ...overrides, }; - }, [onColumnReordered, onColumnResized, overrides, navigate, player]); + }, [onColumnReordered, onColumnResized, overrides, player]); return controls; }; diff --git a/src/renderer/features/now-playing/routes/now-playing-route.tsx b/src/renderer/features/now-playing/routes/now-playing-route.tsx index d0c2c318d..8c5d80ee3 100644 --- a/src/renderer/features/now-playing/routes/now-playing-route.tsx +++ b/src/renderer/features/now-playing/routes/now-playing-route.tsx @@ -1,4 +1,4 @@ -import { useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { ItemListHandle } from '/@/renderer/components/item-list/types'; import { NowPlayingHeader } from '/@/renderer/features/now-playing/components/now-playing-header'; @@ -7,11 +7,23 @@ import { PlayQueueListControls } from '/@/renderer/features/now-playing/componen import { AnimatedPage } from '/@/renderer/features/shared/components/animated-page'; import { LibraryContainer } from '/@/renderer/features/shared/components/library-container'; import { PageErrorBoundary } from '/@/renderer/features/shared/components/page-error-boundary'; +import { useAppStoreActions } from '/@/renderer/store'; import { ItemListKey } from '/@/shared/types/types'; const NowPlayingRoute = () => { const queueRef = useRef(null); const [search, setSearch] = useState(undefined); + const { setSideBar } = useAppStoreActions(); + + useEffect(() => { + // On page enter, set rightExpanded to false + setSideBar({ rightExpanded: false }); + + return () => { + // On page exit, set rightExpanded to true + setSideBar({ rightExpanded: true }); + }; + }, [setSideBar]); return ( diff --git a/src/renderer/features/sidebar/components/action-bar.tsx b/src/renderer/features/sidebar/components/action-bar.tsx index 671b60f35..ce18a0412 100644 --- a/src/renderer/features/sidebar/components/action-bar.tsx +++ b/src/renderer/features/sidebar/components/action-bar.tsx @@ -14,7 +14,6 @@ import { TextInput } from '/@/shared/components/text-input/text-input'; export const ActionBar = () => { const { t } = useTranslation(); - const navigate = useNavigate(); const { open } = useCommandPalette(); return ( @@ -50,15 +49,25 @@ export const ActionBar = () => { - - + ); }; + +const NavigateButtons = () => { + const navigate = useNavigate(); + + return ( + <> + + + + ); +}; diff --git a/src/renderer/features/sidebar/components/sidebar-item.tsx b/src/renderer/features/sidebar/components/sidebar-item.tsx index 02728fd8c..36fb09003 100644 --- a/src/renderer/features/sidebar/components/sidebar-item.tsx +++ b/src/renderer/features/sidebar/components/sidebar-item.tsx @@ -19,10 +19,10 @@ export const SidebarItem = ({ children, className, to, ...props }: SidebarItemPr