diff --git a/website/src/components/SearchPage/SearchFullUI.tsx b/website/src/components/SearchPage/SearchFullUI.tsx index 32643636cd..84fd0dfdd5 100644 --- a/website/src/components/SearchPage/SearchFullUI.tsx +++ b/website/src/components/SearchPage/SearchFullUI.tsx @@ -89,6 +89,7 @@ export const InnerSearchFullUI = ({ const { state, + setState, previewedSeqId, setPreviewedSeqId, previewHalfScreen, @@ -106,6 +107,50 @@ export const InnerSearchFullUI = ({ setAColumnVisibility, } = useSearchPageState({ initialQueryDict, schema, hiddenFieldValues, filterSchema, referenceGenomesInfo }); + const isEmptyQueryState = (q: QueryState | null) => q === null || Object.keys(q).length === 0; + const sessionQueryKey = `${organism}SearchPageQuery`; + + const restorableQuery: QueryState | null = useMemo(() => { + // On mount, check if sessionStorage has a query to restore + // sessionStorage is undefined during server-side rendering + if (typeof sessionStorage !== 'undefined') { + const queryValue = sessionStorage.getItem(sessionQueryKey); + if (queryValue) { + try { + return JSON.parse(queryValue) as QueryState; + } catch { + return null; + } + } + } + return null; + }, []); + + const [showSessionQueryRestore, setShowSessionQueryRestore] = useState(false); + useEffect(() => { + // Show the restore button if the state is empty and there's a query that can be restored + const isSessionQueryRestorable = isEmptyQueryState(state) && !isEmptyQueryState(restorableQuery); + if (isSessionQueryRestorable) setShowSessionQueryRestore(true); + }, []); + + useEffect(() => { + // Update sessionStorage with the new state + if (typeof sessionStorage !== 'undefined') { + if (!isEmptyQueryState(state)) sessionStorage.setItem(sessionQueryKey, JSON.stringify(state)); + else sessionStorage.removeItem(sessionQueryKey); + } + + // If the state is no longer empty, hide the restore button + if (!isEmptyQueryState(state)) setShowSessionQueryRestore(false); + }, [state]); + + const restoreSessionQuery = () => { + if (restorableQuery) { + setState(restorableQuery); + setShowSessionQueryRestore(false); + } + }; + const searchVisibilities = useMemo(() => { return getFieldVisibilitiesFromQuery(schema, state); }, [schema, state]); @@ -317,6 +362,17 @@ export const InnerSearchFullUI = ({