Skip to content

Commit b172c93

Browse files
committed
Refactor VersionSelector and SlidePanel components to improve performance and state management. Introduced useCallback for event handlers in VersionSelector and implemented local state caching for children in SlidePanel to prevent unnecessary re-renders.
1 parent aa75034 commit b172c93

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

xp-archive/client/versionSelector/SlidePanel/SlidePanel.tsx

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useRef } from 'react';
1+
import React, { useEffect, useRef, useState } from 'react';
22
import { createPortal } from 'react-dom';
33
import style from './SlidePanel.module.css';
44

@@ -10,6 +10,15 @@ type SlidePanelProps = {
1010

1111
export const SlidePanel = ({ isOpen, onClose, children }: SlidePanelProps) => {
1212
const dialogRef = useRef<HTMLDialogElement>(null);
13+
// Keep a local copy of children to prevent unmounting
14+
const [cachedChildren, setCachedChildren] = useState<React.ReactNode>(children);
15+
16+
// Update cached children only when isOpen changes from false to true
17+
useEffect(() => {
18+
if (isOpen) {
19+
setCachedChildren(children);
20+
}
21+
}, [isOpen, children]);
1322

1423
useEffect(() => {
1524
const dialog = dialogRef.current;
@@ -22,8 +31,7 @@ export const SlidePanel = ({ isOpen, onClose, children }: SlidePanelProps) => {
2231
}
2332
}, [isOpen]);
2433

25-
if (!isOpen) return null;
26-
34+
// Always render the dialog, but control its visibility with the dialog API
2735
return createPortal(
2836
<dialog
2937
ref={dialogRef}
@@ -37,7 +45,10 @@ export const SlidePanel = ({ isOpen, onClose, children }: SlidePanelProps) => {
3745
onClick={onClose}
3846
aria-label="Close version selector"
3947
/>
40-
<div className={style.panel}>{children}</div>
48+
<div className={style.panel}>
49+
{/* Always use the cached children */}
50+
{cachedChildren}
51+
</div>
4152
</dialog>,
4253
document.body
4354
);

xp-archive/client/versionSelector/VersionSelector.tsx

+14-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, { useState, useCallback } from 'react';
22
import { Heading, Button, Search } from '@navikt/ds-react';
33
import { VersionReference } from 'shared/types';
44
import { formatTimestamp } from '@common/shared/timestamp';
@@ -36,15 +36,21 @@ export const VersionSelector = ({ versions, isOpen, onClose }: Props) => {
3636
const [searchQuery, setSearchQuery] = useState('');
3737
const { setSelectedVersion, selectedVersion } = useAppState();
3838

39-
const handleClose = () => {
39+
const handleClose = useCallback(() => {
4040
setSearchQuery('');
4141
onClose();
42-
};
42+
}, [onClose]);
4343

44-
const selectVersion = (versionId: string) => {
45-
// Just update the state, don't modify the URL here
46-
setSelectedVersion(versionId);
47-
};
44+
const selectVersion = useCallback(
45+
(versionId: string) => {
46+
setSelectedVersion(versionId);
47+
},
48+
[setSelectedVersion]
49+
);
50+
51+
const handleSearchChange = useCallback((value: string) => {
52+
setSearchQuery(value);
53+
}, []);
4854

4955
const filteredVersions = versions.filter((version) =>
5056
formatTimestamp(version.timestamp).toLowerCase().includes(searchQuery.toLowerCase())
@@ -59,7 +65,7 @@ export const VersionSelector = ({ versions, isOpen, onClose }: Props) => {
5965
label="Søk i versjoner"
6066
variant="simple"
6167
value={searchQuery}
62-
onChange={setSearchQuery}
68+
onChange={handleSearchChange}
6369
className={style.search}
6470
/>
6571
<div className={style.versionList}>

0 commit comments

Comments
 (0)