From 62779191cc73c52081e710d9cc8d9342d167b268 Mon Sep 17 00:00:00 2001 From: thejuggernaut01 Date: Wed, 25 Mar 2026 12:11:43 +0100 Subject: [PATCH 1/2] refactor: Switch from localStorage to sessionStorage for migration configurations and implement cleanup on component unmount. --- client/src/pages/ConfigPage.tsx | 12 +++++++++++- client/src/pages/MigrationPage.tsx | 14 ++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/client/src/pages/ConfigPage.tsx b/client/src/pages/ConfigPage.tsx index 4d78d07..9906ddf 100644 --- a/client/src/pages/ConfigPage.tsx +++ b/client/src/pages/ConfigPage.tsx @@ -1,3 +1,4 @@ +import { useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { DatabaseConfigForm } from "@/components/DatabaseConfigForm"; import api from "@/lib/api"; @@ -8,6 +9,15 @@ export function ConfigPage() { const { dbType } = useParams<{ dbType: string }>(); const navigate = useNavigate(); + // Clear draft data when navigating away from the config page + useEffect(() => { + return () => { + if (dbType) { + sessionStorage.removeItem(`db_mover_draft_${dbType}`); + } + }; + }, [dbType]); + const handleStartCopy = async (config: { sourceUri: string; targetUri: string; @@ -23,7 +33,7 @@ export function ConfigPage() { const { jobId } = res.data; // Store migration config for retry functionality - localStorage.setItem( + sessionStorage.setItem( `migration_${jobId}`, JSON.stringify({ type: "copy", diff --git a/client/src/pages/MigrationPage.tsx b/client/src/pages/MigrationPage.tsx index 6c0c2ee..4959b4a 100644 --- a/client/src/pages/MigrationPage.tsx +++ b/client/src/pages/MigrationPage.tsx @@ -24,7 +24,7 @@ export function MigrationPage() { try { // Get stored migration config - const storedConfig = localStorage.getItem(`migration_${jobId}`); + const storedConfig = sessionStorage.getItem(`migration_${jobId}`); if (!storedConfig) { toast.error("Retry failed", { description: @@ -40,7 +40,7 @@ export function MigrationPage() { const newJobId = res.data.jobId; // Store config for new job - localStorage.setItem(`migration_${newJobId}`, JSON.stringify(config)); + sessionStorage.setItem(`migration_${newJobId}`, JSON.stringify(config)); // Navigate to new migration page navigate(`/migration/${newJobId}`); @@ -84,6 +84,16 @@ export function MigrationPage() { return () => { es.close(); + + // Clean up session storage when navigating away + if (jobId) { + const storedConfig = sessionStorage.getItem(`migration_${jobId}`); + if (storedConfig) { + const { dbType: storedDbType } = JSON.parse(storedConfig); + sessionStorage.removeItem(`db_mover_draft_${storedDbType}`); + } + sessionStorage.removeItem(`migration_${jobId}`); + } }; }, [jobId]); From 821e3fd09ea0b790bc0915fc06e83008b7b89e61 Mon Sep 17 00:00:00 2001 From: thejuggernaut01 Date: Fri, 27 Mar 2026 10:00:39 +0100 Subject: [PATCH 2/2] resolve comments --- client/src/pages/ConfigPage.tsx | 6 +++++- client/src/pages/MigrationPage.tsx | 29 +++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/client/src/pages/ConfigPage.tsx b/client/src/pages/ConfigPage.tsx index 9906ddf..56c6d57 100644 --- a/client/src/pages/ConfigPage.tsx +++ b/client/src/pages/ConfigPage.tsx @@ -13,7 +13,11 @@ export function ConfigPage() { useEffect(() => { return () => { if (dbType) { - sessionStorage.removeItem(`db_mover_draft_${dbType}`); + try { + sessionStorage.removeItem(`db_mover_draft_${dbType}`); + } catch { + // Ignore storage access errors (e.g. when storage is blocked) + } } }; }, [dbType]); diff --git a/client/src/pages/MigrationPage.tsx b/client/src/pages/MigrationPage.tsx index 4959b4a..9493750 100644 --- a/client/src/pages/MigrationPage.tsx +++ b/client/src/pages/MigrationPage.tsx @@ -38,9 +38,12 @@ export function MigrationPage() { // Start new migration with same config const res = await api.post("/migrate/start", config); const newJobId = res.data.jobId; - - // Store config for new job - sessionStorage.setItem(`migration_${newJobId}`, JSON.stringify(config)); + try { + // Store config for new job + sessionStorage.setItem(`migration_${newJobId}`, JSON.stringify(config)); + } catch (error) { + // Ignore storage access errors (e.g. when storage is blocked) + } // Navigate to new migration page navigate(`/migration/${newJobId}`); @@ -87,12 +90,22 @@ export function MigrationPage() { // Clean up session storage when navigating away if (jobId) { - const storedConfig = sessionStorage.getItem(`migration_${jobId}`); - if (storedConfig) { - const { dbType: storedDbType } = JSON.parse(storedConfig); - sessionStorage.removeItem(`db_mover_draft_${storedDbType}`); + try { + const storedConfig = sessionStorage.getItem(`migration_${jobId}`); + if (storedConfig) { + const parsedConfig = JSON.parse(storedConfig); + const storedDbType = + typeof parsedConfig?.dbType === "string" + ? parsedConfig.dbType.trim() + : ""; + if (storedDbType) { + sessionStorage.removeItem(`db_mover_draft_${storedDbType}`); + } + } + sessionStorage.removeItem(`migration_${jobId}`); + } catch (storageError) { + console.error("Error cleaning up migration storage", storageError); } - sessionStorage.removeItem(`migration_${jobId}`); } }; }, [jobId]);