瀏覽代碼

Fix issue #4941: [Bug]: Browser tab does not reset after starting a new session (#4945)

Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
OpenHands 1 年之前
父節點
當前提交
c555611d58
共有 2 個文件被更改,包括 55 次插入1 次删除
  1. 40 0
      frontend/__tests__/clear-session.test.ts
  2. 15 1
      frontend/src/utils/clear-session.ts

+ 40 - 0
frontend/__tests__/clear-session.test.ts

@@ -0,0 +1,40 @@
+import { describe, it, expect, beforeEach, vi } from "vitest";
+import { clearSession } from "../src/utils/clear-session";
+import store from "../src/store";
+import { initialState as browserInitialState } from "../src/state/browserSlice";
+
+describe("clearSession", () => {
+  beforeEach(() => {
+    // Mock localStorage
+    const localStorageMock = {
+      getItem: vi.fn(),
+      setItem: vi.fn(),
+      removeItem: vi.fn(),
+      clear: vi.fn(),
+    };
+    vi.stubGlobal("localStorage", localStorageMock);
+
+    // Set initial browser state to non-default values
+    store.dispatch({
+      type: "browser/setUrl",
+      payload: "https://example.com",
+    });
+    store.dispatch({
+      type: "browser/setScreenshotSrc",
+      payload: "base64screenshot",
+    });
+  });
+
+  it("should clear localStorage and reset browser state", () => {
+    clearSession();
+
+    // Verify localStorage items were removed
+    expect(localStorage.removeItem).toHaveBeenCalledWith("token");
+    expect(localStorage.removeItem).toHaveBeenCalledWith("repo");
+
+    // Verify browser state was reset
+    const state = store.getState();
+    expect(state.browser.url).toBe(browserInitialState.url);
+    expect(state.browser.screenshotSrc).toBe(browserInitialState.screenshotSrc);
+  });
+});

+ 15 - 1
frontend/src/utils/clear-session.ts

@@ -1,7 +1,21 @@
+import store from "#/store";
+import { initialState as browserInitialState } from "#/state/browserSlice";
+
 /**
- * Clear the session data from the local storage. This will remove the token and repo
+ * Clear the session data from the local storage and reset relevant Redux state
  */
 export const clearSession = () => {
+  // Clear local storage
   localStorage.removeItem("token");
   localStorage.removeItem("repo");
+
+  // Reset browser state to initial values
+  store.dispatch({
+    type: "browser/setUrl",
+    payload: browserInitialState.url,
+  });
+  store.dispatch({
+    type: "browser/setScreenshotSrc",
+    payload: browserInitialState.screenshotSrc,
+  });
 };