Skip to content

Commit d60d221

Browse files
committed
Enhance version selector caching and state management in Content component
- Introduce content-specific caching for version selector state. - Clear cache when content ID changes to ensure accurate state management. - Update localStorage handling to use dynamic storage keys based on content ID.
1 parent e982a01 commit d60d221

File tree

3 files changed

+53
-21
lines changed

3 files changed

+53
-21
lines changed

xp-archive/client/content/Content.tsx

+14-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { EmptyState } from '@common/shared/EmptyState/EmptyState';
1212
import {
1313
setCachedVersionSelector,
1414
getCachedVersionSelector,
15+
clearCachedVersionSelector,
1516
} from 'client/versionSelector/VersionSelectorCache';
1617

1718
import style from './Content.module.css';
@@ -64,14 +65,24 @@ export const Content = () => {
6465

6566
// Get cached state or initialize
6667
const [versionSelectorCache, setVersionSelectorCache] = useState(() => {
67-
const cache = getCachedVersionSelector();
68+
const cache = getCachedVersionSelector(selectedContentId || '');
6869
return {
6970
component: cache.component,
7071
versions: cache.versions,
7172
isOpen: cache.isOpen,
7273
};
7374
});
7475

76+
// Clear cache when content changes
77+
useEffect(() => {
78+
// When content ID changes, reset the cache for the previous content
79+
return () => {
80+
if (selectedContentId) {
81+
clearCachedVersionSelector(selectedContentId);
82+
}
83+
};
84+
}, [selectedContentId]);
85+
7586
// Update the cache when versions change
7687
useEffect(() => {
7788
if (data?.versions && data.versions.length > 0) {
@@ -143,8 +154,9 @@ export const Content = () => {
143154
}));
144155
}}
145156
onMount={(component) => {
146-
// Cache the rendered component
157+
// Cache the rendered component with the content ID
147158
setCachedVersionSelector(
159+
selectedContentId || '',
148160
component,
149161
versionSelectorCache.versions.length > 0
150162
? versionSelectorCache.versions

xp-archive/client/versionSelector/VersionSelector.tsx

+9-7
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,19 @@ const VersionButton = ({ isSelected, onClick, children }: VersionButtonProps) =>
3434
);
3535

3636
// Storage key for persisting version selector state
37-
const STORAGE_KEY = 'versionSelector_state';
37+
const getStorageKey = (contentId: string) => `versionSelector_state_${contentId}`;
3838

3939
export const VersionSelector = ({ versions, isOpen, onClose, onMount }: Props) => {
4040
const [searchQuery, setSearchQuery] = useState('');
41-
const { setSelectedContentId, selectedVersion, setSelectedVersion } = useAppState();
41+
const { setSelectedContentId, selectedVersion, setSelectedVersion, selectedContentId } =
42+
useAppState();
43+
const storageKey = getStorageKey(selectedContentId || '');
4244

4345
// Load search query from localStorage on mount
4446
useEffect(() => {
4547
if (isOpen) {
4648
try {
47-
const savedState = localStorage.getItem(STORAGE_KEY);
49+
const savedState = localStorage.getItem(storageKey);
4850
if (savedState) {
4951
const { searchQuery: savedQuery } = JSON.parse(savedState);
5052
if (savedQuery) {
@@ -55,14 +57,14 @@ export const VersionSelector = ({ versions, isOpen, onClose, onMount }: Props) =
5557
console.error('Failed to load version selector state', e);
5658
}
5759
}
58-
}, [isOpen]);
60+
}, [isOpen, storageKey]);
5961

6062
// Save state to localStorage when it changes
6163
useEffect(() => {
6264
if (isOpen) {
6365
try {
6466
localStorage.setItem(
65-
STORAGE_KEY,
67+
storageKey,
6668
JSON.stringify({
6769
searchQuery,
6870
selectedVersion,
@@ -72,7 +74,7 @@ export const VersionSelector = ({ versions, isOpen, onClose, onMount }: Props) =
7274
console.error('Failed to save version selector state', e);
7375
}
7476
}
75-
}, [isOpen, searchQuery, selectedVersion]);
77+
}, [isOpen, searchQuery, selectedVersion, storageKey]);
7678

7779
const handleClose = () => {
7880
// Don't clear search query when closing
@@ -87,7 +89,7 @@ export const VersionSelector = ({ versions, isOpen, onClose, onMount }: Props) =
8789
// Save selected version to localStorage
8890
try {
8991
localStorage.setItem(
90-
STORAGE_KEY,
92+
storageKey,
9193
JSON.stringify({
9294
searchQuery,
9395
selectedVersion: versionId,
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,41 @@
11
import React from 'react';
22
import { VersionReference } from 'shared/types';
33

4-
// Global cache for the version selector component
5-
let cachedVersionSelector: React.ReactNode | null = null;
6-
let cachedVersions: VersionReference[] = [];
7-
let cachedIsOpen = false;
4+
// Content-specific cache for the version selector component
5+
const contentCache: Record<
6+
string,
7+
{
8+
component: React.ReactNode | null;
9+
versions: VersionReference[];
10+
isOpen: boolean;
11+
}
12+
> = {};
813

914
export const setCachedVersionSelector = (
15+
contentId: string,
1016
component: React.ReactNode,
1117
versions: VersionReference[],
1218
isOpen: boolean
1319
) => {
14-
cachedVersionSelector = component;
15-
cachedVersions = versions;
16-
cachedIsOpen = isOpen;
20+
contentCache[contentId] = {
21+
component,
22+
versions,
23+
isOpen,
24+
};
1725
};
1826

19-
export const getCachedVersionSelector = () => ({
20-
component: cachedVersionSelector,
21-
versions: cachedVersions,
22-
isOpen: cachedIsOpen,
23-
});
27+
export const getCachedVersionSelector = (contentId: string) => {
28+
return (
29+
contentCache[contentId] || {
30+
component: null,
31+
versions: [],
32+
isOpen: false,
33+
}
34+
);
35+
};
36+
37+
export const clearCachedVersionSelector = (contentId: string) => {
38+
if (contentId in contentCache) {
39+
delete contentCache[contentId];
40+
}
41+
};

0 commit comments

Comments
 (0)