diff options
| author | Adam Malczewski <[email protected]> | 2026-06-22 14:55:45 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-22 14:55:45 +0900 |
| commit | 4b1b920e8bc557a592f505a4619062b1067a233e (patch) | |
| tree | 533a02dc7fca2611f01a6c4eb615c6945db0b176 /src/app/App.test.ts | |
| parent | ce1321eccf24e0923642ae2ef74f6220ecd7f75a (diff) | |
| download | dispatch-web-4b1b920e8bc557a592f505a4619062b1067a233e.tar.gz dispatch-web-4b1b920e8bc557a592f505a4619062b1067a233e.zip | |
feat: persist sidebar layout + open/closed state between refreshes
Sidebar panel layout (which views are open and their order) and the
sidebar open/closed toggle are now persisted to localStorage. Default
layout is just the Model view at the top.
- ViewSidebar accepts an onChange callback that reports panel kinds
- App.svelte creates two createLocalStore instances (dispatch.sidebar.views
+ dispatch.sidebar.open) using the store's storage adapter
- AppStore exposes its storage instance so the shell persists via the
same adapter (test-injectable, not globalThis.localStorage)
- Tests pre-populate fake storage with ["extensions"] for the 4 tests
that need the Extensions view visible
686 tests green. 0 svelte-check warnings (2 pre-existing errors from
missing transport-contract exports, unchanged).
Diffstat (limited to 'src/app/App.test.ts')
| -rw-r--r-- | src/app/App.test.ts | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/app/App.test.ts b/src/app/App.test.ts index d22f84b..6a39296 100644 --- a/src/app/App.test.ts +++ b/src/app/App.test.ts @@ -98,6 +98,12 @@ function createFakeStorage(): Storage { }; } +function createFakeStorageWithViews(views: readonly string[] = ["extensions"]): Storage { + const storage = createFakeStorage(); + storage.setItem("dispatch.sidebar.views", JSON.stringify(views)); + return storage; +} + function sentMessages(ws: FakeSocket) { return ws.sent.map((s) => JSON.parse(s)); } @@ -161,7 +167,7 @@ describe("App component interaction tests", () => { const store = createAppStore({ socketFactory: () => ws, fetchImpl: fakeFetchImpl(), - localStorage: createFakeStorage(), + localStorage: createFakeStorageWithViews(), }); ws.resolveOpen(); @@ -225,7 +231,7 @@ describe("App component interaction tests", () => { const store = createAppStore({ socketFactory: () => ws, fetchImpl: fakeFetchImpl(), - localStorage: createFakeStorage(), + localStorage: createFakeStorageWithViews(), }); ws.resolveOpen(); @@ -345,7 +351,7 @@ describe("App component interaction tests", () => { const store = createAppStore({ socketFactory: () => ws, fetchImpl: fakeFetchImpl(), - localStorage: createFakeStorage(), + localStorage: createFakeStorageWithViews(), }); ws.resolveOpen(); @@ -388,13 +394,13 @@ describe("App component interaction tests", () => { const store = createAppStore({ socketFactory: () => ws, fetchImpl: fakeFetchImpl(), - localStorage: createFakeStorage(), + localStorage: createFakeStorageWithViews(), }); ws.resolveOpen(); render(App, { props: { store } }); - // Extensions is the default view, so the modules table renders immediately. + // Extensions view is pre-populated in the fake storage, so the modules table renders immediately. expect(screen.getByRole("columnheader", { name: "Module" })).toBeInTheDocument(); for (const name of [ "chat", |
