From b039f764618a0cd1e657d8450ef30991d97f2582 Mon Sep 17 00:00:00 2001 From: Marcus Date: Sun, 25 Jan 2026 11:50:17 +0100 Subject: [PATCH 1/5] feat: reduce rerendering on document switch --- .../PdfMultiViewer/PdfMultiViewer.tsx | 7 +- .../PdfMultiViewer/PdfMultiViewerView.tsx | 131 +++++++++++++----- .../PdfMultiViewer/usePdfMultiViewer.ts | 35 +++-- src/components/PdfRenderer/PdfRenderer.tsx | 4 +- .../PdfRenderer/PdfRendererView.tsx | 61 ++++---- 5 files changed, 160 insertions(+), 78 deletions(-) diff --git a/src/components/PdfMultiViewer/PdfMultiViewer.tsx b/src/components/PdfMultiViewer/PdfMultiViewer.tsx index 5f30db1..44538c9 100644 --- a/src/components/PdfMultiViewer/PdfMultiViewer.tsx +++ b/src/components/PdfMultiViewer/PdfMultiViewer.tsx @@ -1,3 +1,4 @@ +import { useMemo } from 'react'; import '@/components/PdfMultiViewer/PdfMultiViewer.css'; import PdfMultiViewerView from '@/components/PdfMultiViewer/PdfMultiViewerView'; import { @@ -23,6 +24,8 @@ type Props = { pdfs: PdfSource[]; } & Partial; +const DEFAULT_I18N_DATA: I18nData = { loading: 'Loading...', pages: 'Pages' }; + const PdfMultiViewer = ({ pdfs, autoZoom = true, @@ -31,7 +34,7 @@ const PdfMultiViewer = ({ lazyLoad = true, initialLoadIndex, startIndex = '0', - i18nData = { loading: 'Loading...', pages: 'Pages' }, + i18nData = DEFAULT_I18N_DATA, workerSrc, }: Props) => { const { @@ -53,7 +56,7 @@ const PdfMultiViewer = ({ workerSrc, }); - const iconStyles = buildIconStyles(icons); + const iconStyles = useMemo(() => buildIconStyles(icons), [icons]); return ( void; }; +type ListProps = { + activeIndex: string; + files: PdfFile[]; + i18nData: I18nData; + listVisible: boolean; + overlayMode: boolean; + onSelectPdf: (nextIndex: string, file: PdfFile) => () => void; +}; + +type ListItemProps = { + file: PdfFile; + i18nData: I18nData; + index: number; + isActive: boolean; + onSelectPdf: (nextIndex: string, file: PdfFile) => () => void; +}; + +const PdfMultiViewerListItem = memo( + ({ file, i18nData, index, isActive, onSelectPdf }: ListItemProps) => { + const handleSelect = useMemo( + () => onSelectPdf(String(index), file), + [file, index, onSelectPdf], + ); + const isLoading = Boolean(file.isLoading && !file.pdfProxy); + + return ( +
  • + +
  • + ); + }, +); + +PdfMultiViewerListItem.displayName = 'PdfMultiViewerListItem'; + +const PdfMultiViewerList = memo( + ({ + activeIndex, + files, + i18nData, + listVisible, + overlayMode, + onSelectPdf, + }: ListProps) => ( +
      + {files.map((file, index) => ( + + ))} +
    + ), +); + +PdfMultiViewerList.displayName = 'PdfMultiViewerList'; + const PdfMultiViewerView = ({ activeIndex, autoZoom, @@ -56,43 +142,14 @@ const PdfMultiViewerView = ({