summaryrefslogtreecommitdiffhomepage
path: root/src/features/layout/store.svelte.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-09-06 15:43:37 +0900
committerAdam Malczewski <[email protected]>2026-09-06 15:43:37 +0900
commitb117dba1cd1fa80e1b0c18bae487dc632f4005ae (patch)
tree5c76f3133ce07595d28fc904133bf0b060b13daf /src/features/layout/store.svelte.ts
parentd39cce17765c809cef4555c9640d12ed171cf4af (diff)
downloaddispatch-web-b117dba1cd1fa80e1b0c18bae487dc632f4005ae.tar.gz
dispatch-web-b117dba1cd1fa80e1b0c18bae487dc632f4005ae.zip
feat(layout): re-probe the layout when the workspace's plugin states change
The backend now activates layout providers PER WORKSPACE (the workspace's per-workspace enablement state picks the ONE active layout plugin), so toggling a layout plugin in the workspace plugins modal changes which tree serves the workspace. The modal's toggle now refreshes the layout so the newly-enabled provider's tree (or the no-provider degrade) lands without a reload: - WorkspaceLayoutPort gains refresh(workspaceId) — the modal calls it after every state write (an attempted write re-probes either way: the probe is the idempotent catch-up; a refused write changed nothing, so it re-syncs the same tree). - App.svelte wires the port to the layout store's new onWorkspacePluginsChanged(workspaceId) — a guarded re-probe that only fires for the ACTIVE workspace (another workspace's toggle is picked up by its own probe on switch, exactly like the other §2.6 triggers). The per-workspace tree resolution itself is backend-side; the marker renderer, the probe triggers, and the WS push filtering are unchanged. Verification: typecheck (svelte-check 0 errors) / test (1528) / check / build all green.
Diffstat (limited to 'src/features/layout/store.svelte.ts')
-rw-r--r--src/features/layout/store.svelte.ts27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/features/layout/store.svelte.ts b/src/features/layout/store.svelte.ts
index 5fdf100..29e2fa1 100644
--- a/src/features/layout/store.svelte.ts
+++ b/src/features/layout/store.svelte.ts
@@ -7,9 +7,11 @@ import { migrationTree } from "./logic/migration";
* `LayoutHttp` edge (the plugins-store pattern). Owns the ACTIVE workspace's
* tree and the provider lifecycle:
*
- * - **Provider probe triggers** — boot, every workspace switch, and every
- * `extensions-changed` (a provider enabled/disabled mid-session starts/
- * stops serving; the probe picks it up without a reload).
+ * - **Provider probe triggers** — boot, every workspace switch, every
+ * `extensions-changed`, and every change to the ACTIVE workspace's
+ * per-workspace plugin state (a layout plugin enabled/disabled in the
+ * workspace plugins modal starts/stops serving; the probe picks it up
+ * without a reload).
* - **No-provider mode** — a 404 (or network failure) keeps the tree on its
* local default; edits still work but are EPHEMERAL (in-memory only —
* D-L4 retired the localStorage write path); logged once, no error UI.
@@ -66,6 +68,15 @@ export interface LayoutStore {
resetToDefault(workspaceId: string): Promise<string | null>;
/** Multi-client coherence (§11): re-probe on `extensions-changed`. */
onExtensionsChanged(): void;
+ /**
+ * The active workspace's PER-WORKSPACE PLUGIN STATE changed (the workspace
+ * plugins modal toggled a layout plugin's enablement — the per-workspace
+ * activation rule): re-probe so the newly-enabled provider's tree (or the
+ * no-provider degrade) lands without a reload. A NON-active workspace's
+ * toggle is ignored — its tree is fetched on its next probe (workspace
+ * switch); there is nothing to re-render here.
+ */
+ onWorkspacePluginsChanged(workspaceId: string): void;
}
export interface LayoutStoreOptions {
@@ -291,5 +302,15 @@ export function createLayoutStore(opts: LayoutStoreOptions): LayoutStore {
// migration path. Staying silent keeps the degrade quiet.
});
},
+
+ onWorkspacePluginsChanged(workspaceId) {
+ // The per-workspace activation rule: only the ACTIVE workspace's tree
+ // can change what is rendered here — another workspace's toggle is
+ // picked up by its own probe (boot/workspace-switch/§2.6 triggers).
+ if (workspaceId !== activeWorkspaceId) return;
+ void runProbe(activeWorkspaceId, false).catch(() => {
+ // Same quiet-degrade guard as onExtensionsChanged.
+ });
+ },
};
}