Files
kandev/apps/web/lib/ws/handlers/users.ts
T
2026-06-14 22:33:34 +01:00

47 lines
2.3 KiB
TypeScript

import type { StoreApi } from "zustand";
import type { AppState } from "@/lib/state/store";
import type { WsHandlers } from "@/lib/ws/handlers/types";
import {
parseChangesPanelLayout,
parseSystemMetricsDisplay,
parseVoiceMode,
} from "@/lib/ssr/user-settings";
export function registerUsersHandlers(store: StoreApi<AppState>): WsHandlers {
return {
"user.settings.updated": (message) => {
store.setState((state) => ({
...state,
userSettings: {
...state.userSettings,
// Preserve workspaceId, workflowId, and repositoryIds — these are navigation state
// controlled by SSR and explicit user actions, not WebSocket broadcasts.
// Overwriting them here causes redirect loops / filter resets when the broadcast
// arrives with a stale workspace/workflow/repo from a previous commit.
preferredShell: message.payload.preferred_shell || null,
defaultEditorId: message.payload.default_editor_id || null,
enablePreviewOnClick: message.payload.enable_preview_on_click ?? false,
chatSubmitKey: (message.payload.chat_submit_key as "enter" | "cmd_enter") ?? "cmd_enter",
reviewAutoMarkOnScroll: message.payload.review_auto_mark_on_scroll ?? true,
showReleaseNotification: message.payload.show_release_notification ?? true,
releaseNotesLastSeenVersion:
(message.payload.release_notes_last_seen_version as string) || null,
lspAutoStartLanguages: message.payload.lsp_auto_start_languages ?? [],
lspAutoInstallLanguages: message.payload.lsp_auto_install_languages ?? [],
savedLayouts: message.payload.saved_layouts ?? [],
defaultUtilityAgentId: message.payload.default_utility_agent_id || null,
keyboardShortcuts: message.payload.keyboard_shortcuts ?? {},
terminalLinkBehavior:
message.payload.terminal_link_behavior === "browser_panel"
? "browser_panel"
: "new_tab",
changesPanelLayout: parseChangesPanelLayout(message.payload.changes_panel_layout),
systemMetricsDisplay: parseSystemMetricsDisplay(message.payload.system_metrics_display),
voiceMode: parseVoiceMode(message.payload.voice_mode),
loaded: true,
},
}));
},
};
}