Skip to content

Commit 2f276e0

Browse files
committed
Implement version selector state persistence and URL updates in Content component
1 parent 6375072 commit 2f276e0

File tree

2 files changed

+94
-10
lines changed

2 files changed

+94
-10
lines changed

xp-archive/client/content/Content.tsx

+41-7
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ const getDefaultView = (isWebpage: boolean, hasAttachment: boolean): ViewVariant
1818
return undefined;
1919
};
2020

21-
const updateContentUrl = (nodeId: string, locale: string, versionId?: string) => {
22-
const newUrl = `${xpArchiveConfig.basePath}/${nodeId}/${locale}/${versionId ?? ''}`;
23-
window.history.pushState({}, '', newUrl);
24-
};
21+
// Storage key for persisting version selector state
22+
const STORAGE_KEY = 'versionSelector_state';
2523

2624
export const Content = () => {
2725
const { selectedContentId, selectedLocale, selectedVersion, setSelectedVersion } =
@@ -44,11 +42,13 @@ export const Content = () => {
4442

4543
useEffect(() => {
4644
if (selectedVersion) {
47-
updateContentUrl(selectedContentId ?? '', selectedLocale, selectedVersion);
45+
const newUrl = `${xpArchiveConfig.basePath}/${selectedContentId}/${selectedLocale}/${selectedVersion}`;
46+
window.history.replaceState({}, '', newUrl);
4847
} else if (data?.versions?.[0]) {
4948
const latestVersionId = data.versions[0].versionId;
5049
setSelectedVersion(latestVersionId);
51-
updateContentUrl(selectedContentId ?? '', selectedLocale, latestVersionId);
50+
const newUrl = `${xpArchiveConfig.basePath}/${selectedContentId}/${selectedLocale}/${latestVersionId}`;
51+
window.history.replaceState({}, '', newUrl);
5252
}
5353
}, [data, selectedContentId, selectedLocale, selectedVersion]);
5454

@@ -57,7 +57,41 @@ export const Content = () => {
5757
const [selectedView, setSelectedView] = useState<ViewVariant | undefined>(
5858
getDefaultView(isWebpage, hasAttachment)
5959
);
60-
const [isVersionPanelOpen, setIsVersionPanelOpen] = useState(false);
60+
61+
// Initialize version panel state from localStorage
62+
const [isVersionPanelOpen, setIsVersionPanelOpen] = useState(() => {
63+
try {
64+
const savedState = localStorage.getItem(STORAGE_KEY);
65+
if (savedState) {
66+
const { keepOpen } = JSON.parse(savedState);
67+
return !!keepOpen;
68+
}
69+
} catch (e) {
70+
console.error('Failed to load version selector state', e);
71+
}
72+
return false;
73+
});
74+
75+
// Check localStorage when data changes to see if we should keep panel open
76+
useEffect(() => {
77+
if (data) {
78+
try {
79+
const savedState = localStorage.getItem(STORAGE_KEY);
80+
if (savedState) {
81+
const { keepOpen } = JSON.parse(savedState);
82+
if (keepOpen) {
83+
setIsVersionPanelOpen(true);
84+
// Clear the keepOpen flag after opening
85+
const updatedState = JSON.parse(savedState);
86+
updatedState.keepOpen = false;
87+
localStorage.setItem(STORAGE_KEY, JSON.stringify(updatedState));
88+
}
89+
}
90+
} catch (e) {
91+
console.error('Failed to load version selector state', e);
92+
}
93+
}
94+
}, [data]);
6195

6296
useEffect(() => {
6397
setSelectedView(getDefaultView(isWebpage, hasAttachment));

xp-archive/client/versionSelector/VersionSelector.tsx

+53-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, { useState, useEffect } from 'react';
22
import { Heading, Button, Search } from '@navikt/ds-react';
33
import { VersionReference } from 'shared/types';
44
import { formatTimestamp } from '@common/shared/timestamp';
@@ -32,20 +32,70 @@ const VersionButton = ({ isSelected, onClick, children }: VersionButtonProps) =>
3232
</Button>
3333
);
3434

35+
// Storage key for persisting version selector state
36+
const STORAGE_KEY = 'versionSelector_state';
37+
3538
export const VersionSelector = ({ versions, isOpen, onClose }: Props) => {
3639
const [searchQuery, setSearchQuery] = useState('');
3740
const { setSelectedContentId, selectedVersion, setSelectedVersion } = useAppState();
3841

42+
// Load search query from localStorage on mount
43+
useEffect(() => {
44+
if (isOpen) {
45+
try {
46+
const savedState = localStorage.getItem(STORAGE_KEY);
47+
if (savedState) {
48+
const { searchQuery: savedQuery } = JSON.parse(savedState);
49+
if (savedQuery) {
50+
setSearchQuery(savedQuery);
51+
}
52+
}
53+
} catch (e) {
54+
console.error('Failed to load version selector state', e);
55+
}
56+
}
57+
}, [isOpen]);
58+
59+
// Save state to localStorage when it changes
60+
useEffect(() => {
61+
if (isOpen) {
62+
try {
63+
localStorage.setItem(
64+
STORAGE_KEY,
65+
JSON.stringify({
66+
searchQuery,
67+
selectedVersion,
68+
})
69+
);
70+
} catch (e) {
71+
console.error('Failed to save version selector state', e);
72+
}
73+
}
74+
}, [isOpen, searchQuery, selectedVersion]);
75+
3976
const handleClose = () => {
40-
setSearchQuery('');
77+
// Don't clear search query when closing
4178
onClose();
4279
};
4380

4481
const selectVersion = (versionId: string) => {
4582
const nodeId = versions.find((v) => v.versionId === versionId)?.nodeId;
4683
if (nodeId) setSelectedContentId(nodeId);
4784
setSelectedVersion(versionId);
48-
handleClose();
85+
86+
// Save selected version to localStorage
87+
try {
88+
localStorage.setItem(
89+
STORAGE_KEY,
90+
JSON.stringify({
91+
searchQuery,
92+
selectedVersion: versionId,
93+
keepOpen: true, // Flag to keep panel open
94+
})
95+
);
96+
} catch (e) {
97+
console.error('Failed to save version selection', e);
98+
}
4999
};
50100

51101
const filteredVersions = versions.filter((version) =>

0 commit comments

Comments
 (0)