From 450cc1f9852f27c89312dc7dcb918fd4a2d4ecc1 Mon Sep 17 00:00:00 2001 From: nikitita Date: Mon, 19 Oct 2026 23:37:04 +0200 Subject: [PATCH 1/2] feat: persist threat actor catalog state in sessionStorage --- frontend/src/hooks/Example.tsx | 1 - frontend/src/hooks/useSessionStorage.ts | 45 +++++++++++++++++++ .../src/pages/ThreatActors/ThreatActors.tsx | 15 +++---- 3 files changed, 52 insertions(+), 9 deletions(-) delete mode 100644 frontend/src/hooks/Example.tsx create mode 100644 frontend/src/hooks/useSessionStorage.ts diff --git a/frontend/src/hooks/Example.tsx b/frontend/src/hooks/Example.tsx deleted file mode 100644 index 5943cdc..0000000 --- a/frontend/src/hooks/Example.tsx +++ /dev/null @@ -1 +0,0 @@ -// Just a file to make the folder appear in git. \ No newline at end of file diff --git a/frontend/src/hooks/useSessionStorage.ts b/frontend/src/hooks/useSessionStorage.ts new file mode 100644 index 0000000..f95a790 --- /dev/null +++ b/frontend/src/hooks/useSessionStorage.ts @@ -0,0 +1,45 @@ +import { useState, useEffect } from "react"; + +/** + * Henter en lagret verdi fra sessionStorage. + * Returnerer initialValue dersom verdien ikke finnes eller ikke kan leses. + * + * @param key - Nøkkelen som identifiserer verdien i sessionStorage. + * @param initialValue - Standardverdien dersom ingen lagret verdi finnes. + * @returns Den lagrede verdien eller initialValue. + */ + +function getSavedValue(key: string, initialValue: T): T { + try { + const saved = sessionStorage.getItem(key); + + if (saved === null) return initialValue; + + return JSON.parse(saved) as T; + } catch { + return initialValue; + } +} + +/** + * Custom React-hook som synkroniserer state med sessionStorage. + * Henter en tidligere lagret verdi ved initialisering og lagrer + * automatisk nye verdier når state oppdateres. + * + * @param key - Nøkkelen som brukes i sessionStorage. + * @param initialValue - Startverdien dersom ingen lagret verdi finnes. + * @returns Et state-par [value, setValue], tilsvarende useState. + */ +export function useSessionStorage(key: string, initialValue: T) { + const [value, setValue] = useState(() => getSavedValue(key, initialValue)); + + useEffect(() => { + try { + sessionStorage.setItem(key, JSON.stringify(value)); + } catch { + // Fortsett uten lagring. + } + }, [key, value]); + + return [value, setValue] as const; +} \ No newline at end of file diff --git a/frontend/src/pages/ThreatActors/ThreatActors.tsx b/frontend/src/pages/ThreatActors/ThreatActors.tsx index 6b43380..31b473b 100644 --- a/frontend/src/pages/ThreatActors/ThreatActors.tsx +++ b/frontend/src/pages/ThreatActors/ThreatActors.tsx @@ -8,19 +8,18 @@ import { GET_ALL_THREAT_ACTOR_GRID, GET_THREAT_ACTOR_FILTER_OPTIONS } from "../. import { useState } from "react"; import ThreatActorActiveFilters from "../../components/threatactor/ThreatActorMain/ThreatActorFilter/ThreatActorActiveFilters"; import FeedbackCard from "../../components/feedback/FeedbackCard"; - +import { useSessionStorage } from "../../hooks/useSessionStorage"; function ThreatActor(){ const pageSize = 9; - const [page, setPage] = useState(1); + const [page, setPage] = useSessionStorage("threat-actors:page", 1);; // Search + const [search, setSearch] = useSessionStorage("threat-actors:search", ""); const [searchInput, setSearchInput] = useState(""); - const [search, setSearch] = useState(""); // Filters - const [draftFilters, setDraftFilters] = useState({ ...DEFAULT_FILTERS }); - const [activeFilters, setActiveFilters] = useState({ ...DEFAULT_FILTERS }); - + const [activeFilters, setActiveFilters] = useSessionStorage("threat-actors:filters", { ...DEFAULT_FILTERS }); + const [draftFilters, setDraftFilters] = useState(() => ({ ...activeFilters })); /** * Aktiverer valgte filtre. @@ -130,7 +129,7 @@ function ThreatActor(){ onApply={handleApplyFilters} /> )} - + ) : ( Date: Tue, 20 Oct 2026 12:01:34 +0200 Subject: [PATCH 2/2] fix: restore search input from session storage --- frontend/src/pages/ThreatActors/ThreatActors.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/ThreatActors/ThreatActors.tsx b/frontend/src/pages/ThreatActors/ThreatActors.tsx index 31b473b..1dcb5b0 100644 --- a/frontend/src/pages/ThreatActors/ThreatActors.tsx +++ b/frontend/src/pages/ThreatActors/ThreatActors.tsx @@ -16,7 +16,7 @@ function ThreatActor(){ const [page, setPage] = useSessionStorage("threat-actors:page", 1);; // Search const [search, setSearch] = useSessionStorage("threat-actors:search", ""); - const [searchInput, setSearchInput] = useState(""); + const [searchInput, setSearchInput] = useState(search); // Filters const [activeFilters, setActiveFilters] = useSessionStorage("threat-actors:filters", { ...DEFAULT_FILTERS }); const [draftFilters, setDraftFilters] = useState(() => ({ ...activeFilters }));