diff --git a/packages/interwovenkit-react/src/data/bridge-form-storage.test.ts b/packages/interwovenkit-react/src/data/bridge-form-storage.test.ts new file mode 100644 index 00000000..cb0cdaf0 --- /dev/null +++ b/packages/interwovenkit-react/src/data/bridge-form-storage.test.ts @@ -0,0 +1,48 @@ +import { clearPersistedBridgeFormValues } from "./bridge-form-storage" +import { LocalStorageKey } from "./constants" + +describe("clearPersistedBridgeFormValues", () => { + const storage = new Map() + + beforeEach(() => { + storage.clear() + vi.stubGlobal("localStorage", { + getItem: (key: string) => storage.get(key) ?? null, + setItem: (key: string, value: string) => { + storage.set(key, value) + }, + removeItem: (key: string) => { + storage.delete(key) + }, + clear: () => { + storage.clear() + }, + }) + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it("removes persisted bridge form values including recipient", () => { + localStorage.setItem(LocalStorageKey.BRIDGE_SRC_CHAIN_ID, "interwoven-1") + localStorage.setItem(LocalStorageKey.BRIDGE_SRC_DENOM, "uinit") + localStorage.setItem(LocalStorageKey.BRIDGE_DST_CHAIN_ID, "initiation-2") + localStorage.setItem(LocalStorageKey.BRIDGE_DST_DENOM, "uusdc") + localStorage.setItem(LocalStorageKey.BRIDGE_QUANTITY, "1") + localStorage.setItem(LocalStorageKey.BRIDGE_SLIPPAGE_PERCENT, "0.5") + localStorage.setItem(LocalStorageKey.BRIDGE_RECIPIENT, "init1recipient") + localStorage.setItem(LocalStorageKey.PUBLIC_KEY, "pubkey") + + clearPersistedBridgeFormValues() + + expect(localStorage.getItem(LocalStorageKey.BRIDGE_SRC_CHAIN_ID)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.BRIDGE_SRC_DENOM)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.BRIDGE_DST_CHAIN_ID)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.BRIDGE_DST_DENOM)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.BRIDGE_QUANTITY)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.BRIDGE_SLIPPAGE_PERCENT)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.BRIDGE_RECIPIENT)).toBeNull() + expect(localStorage.getItem(LocalStorageKey.PUBLIC_KEY)).toBe("pubkey") + }) +}) diff --git a/packages/interwovenkit-react/src/data/bridge-form-storage.ts b/packages/interwovenkit-react/src/data/bridge-form-storage.ts new file mode 100644 index 00000000..81b9412f --- /dev/null +++ b/packages/interwovenkit-react/src/data/bridge-form-storage.ts @@ -0,0 +1,17 @@ +import { LocalStorageKey } from "./constants" + +const BRIDGE_FORM_LOCAL_STORAGE_KEYS = [ + LocalStorageKey.BRIDGE_SRC_CHAIN_ID, + LocalStorageKey.BRIDGE_SRC_DENOM, + LocalStorageKey.BRIDGE_DST_CHAIN_ID, + LocalStorageKey.BRIDGE_DST_DENOM, + LocalStorageKey.BRIDGE_QUANTITY, + LocalStorageKey.BRIDGE_SLIPPAGE_PERCENT, + LocalStorageKey.BRIDGE_RECIPIENT, +] + +export function clearPersistedBridgeFormValues() { + for (const key of BRIDGE_FORM_LOCAL_STORAGE_KEYS) { + localStorage.removeItem(key) + } +} diff --git a/packages/interwovenkit-react/src/data/constants.ts b/packages/interwovenkit-react/src/data/constants.ts index 38e6491c..74b9b762 100644 --- a/packages/interwovenkit-react/src/data/constants.ts +++ b/packages/interwovenkit-react/src/data/constants.ts @@ -31,6 +31,7 @@ export const LocalStorageKey = { BRIDGE_DST_DENOM: `${NAMESPACE}:bridge:dst-denom`, BRIDGE_QUANTITY: `${NAMESPACE}:bridge:quantity`, BRIDGE_SLIPPAGE_PERCENT: `${NAMESPACE}:bridge:slippage-percent`, + BRIDGE_RECIPIENT: `${NAMESPACE}:bridge:recipient`, BRIDGE_ROUTE_TYPE: `${NAMESPACE}:bridge:route-type`, BRIDGE_HISTORY: `${NAMESPACE}:bridge:history`, diff --git a/packages/interwovenkit-react/src/data/ui.ts b/packages/interwovenkit-react/src/data/ui.ts index 93ce6155..602d5e18 100644 --- a/packages/interwovenkit-react/src/data/ui.ts +++ b/packages/interwovenkit-react/src/data/ui.ts @@ -3,7 +3,7 @@ import { atom, useAtom, useSetAtom } from "jotai" import { useAnalyticsTrack } from "@/data/analytics" import { useNavigate, useReset } from "@/lib/router" import { useDeriveWallet } from "@/pages/autosign/data/wallet" -import { LocalStorageKey } from "./constants" +import { clearPersistedBridgeFormValues } from "./bridge-form-storage" const isDrawerOpenAtom = atom(false) const isModalOpenAtom = atom(false) @@ -73,12 +73,6 @@ export function useDisconnect() { clearAllWallets() - // Clear bridge form values on disconnect - localStorage.removeItem(LocalStorageKey.BRIDGE_SRC_CHAIN_ID) - localStorage.removeItem(LocalStorageKey.BRIDGE_SRC_DENOM) - localStorage.removeItem(LocalStorageKey.BRIDGE_DST_CHAIN_ID) - localStorage.removeItem(LocalStorageKey.BRIDGE_DST_DENOM) - localStorage.removeItem(LocalStorageKey.BRIDGE_QUANTITY) - localStorage.removeItem(LocalStorageKey.BRIDGE_SLIPPAGE_PERCENT) + clearPersistedBridgeFormValues() } } diff --git a/packages/interwovenkit-react/src/pages/bridge/BridgeForm.tsx b/packages/interwovenkit-react/src/pages/bridge/BridgeForm.tsx index 025fc5e5..e8ac7e8a 100644 --- a/packages/interwovenkit-react/src/pages/bridge/BridgeForm.tsx +++ b/packages/interwovenkit-react/src/pages/bridge/BridgeForm.tsx @@ -98,6 +98,7 @@ const BridgeForm = () => { localStorage.setItem(LocalStorageKey.BRIDGE_DST_DENOM, dstDenom) localStorage.setItem(LocalStorageKey.BRIDGE_QUANTITY, quantity) localStorage.setItem(LocalStorageKey.BRIDGE_SLIPPAGE_PERCENT, slippagePercent) + localStorage.setItem(LocalStorageKey.BRIDGE_RECIPIENT, recipient) }, [ srcChainId, srcDenom, @@ -105,6 +106,7 @@ const BridgeForm = () => { dstDenom, quantity, slippagePercent, + recipient, isSrcDenomValid, isDstDenomValid, ]) diff --git a/packages/interwovenkit-react/src/pages/bridge/data/form.ts b/packages/interwovenkit-react/src/pages/bridge/data/form.ts index 7a5d6475..9823f9eb 100644 --- a/packages/interwovenkit-react/src/pages/bridge/data/form.ts +++ b/packages/interwovenkit-react/src/pages/bridge/data/form.ts @@ -61,6 +61,7 @@ export function useDefaultValues(): Partial { dstDenom: localStorage.getItem(LocalStorageKey.BRIDGE_DST_DENOM), quantity: localStorage.getItem(LocalStorageKey.BRIDGE_QUANTITY), slippagePercent: localStorage.getItem(LocalStorageKey.BRIDGE_SLIPPAGE_PERCENT), + recipient: localStorage.getItem(LocalStorageKey.BRIDGE_RECIPIENT), }) return {