feat: store the local settings

This commit is contained in:
Henry Li
2026-01-16 09:55:02 +08:00
parent cad12068ef
commit 3a62deb3fd
5 changed files with 86 additions and 12 deletions

View File

@@ -17,11 +17,8 @@ import {
WorkspaceFooter,
} from "@/components/workspace/workspace-container";
import { getLangGraphClient } from "@/core/api";
import type {
AgentThread,
AgentThreadContext,
AgentThreadState,
} from "@/core/threads";
import { useLocalSettings } from "@/core/settings";
import type { AgentThread, AgentThreadState } from "@/core/threads";
import { titleOfThread } from "@/core/threads/utils";
import { uuid } from "@/core/utils/uuid";
@@ -36,11 +33,8 @@ export default function ChatPage() {
[threadIdFromPath],
);
const [threadId, setThreadId] = useState<string | null>(null);
const [threadContext, setThreadContext] = useState<AgentThreadContext>({
thread_id: "",
model: "deepseek-v3.2",
thinking_enabled: true,
});
const { threadContext, setThreadContext } = useLocalSettings();
useEffect(() => {
if (threadIdFromPath !== "new") {
setThreadId(threadIdFromPath);

View File

@@ -49,8 +49,8 @@ export function InputBox({
}: Omit<ComponentProps<typeof PromptInput>, "onSubmit"> & {
assistantId?: string | null;
status?: ChatStatus;
context: AgentThreadContext;
onContextChange?: (context: AgentThreadContext) => void;
context: Omit<AgentThreadContext, "thread_id">;
onContextChange?: (context: Omit<AgentThreadContext, "thread_id">) => void;
onSubmit?: (message: PromptInputMessage) => void;
onStop?: () => void;
}) {

View File

@@ -0,0 +1,34 @@
import { useCallback, useState } from "react";
import { useEffect } from "react";
import type { AgentThreadContext } from "../threads";
import {
DEFAULT_LOCAL_SETTINGS,
getLocalSettings,
updateContextOfLocalSettings,
} from "./local";
export function useLocalSettings() {
const [mounted, setMounted] = useState(false);
const [threadContextState, setThreadContextState] = useState<
Omit<AgentThreadContext, "thread_id">
>(DEFAULT_LOCAL_SETTINGS.context);
useEffect(() => {
if (!mounted) {
setThreadContextState(getLocalSettings().context);
}
setMounted(true);
}, [mounted]);
const setThreadContext = useCallback(
(context: Omit<AgentThreadContext, "thread_id">) => {
setThreadContextState(context);
updateContextOfLocalSettings(context);
},
[],
);
return {
threadContext: threadContextState,
setThreadContext,
};
}

View File

@@ -0,0 +1,2 @@
export * from "./hooks";
export * from "./local";

View File

@@ -0,0 +1,44 @@
import type { AgentThreadContext } from "../threads";
export const DEFAULT_LOCAL_SETTINGS: LocalSettings = {
context: {
model: "deepseek-v3.2",
thinking_enabled: true,
},
};
const LOCAL_SETTINGS_KEY = "deerflow.local-settings";
export interface LocalSettings {
context: Omit<AgentThreadContext, "thread_id">;
}
export function getLocalSettings(): LocalSettings {
if (typeof window === "undefined") {
return DEFAULT_LOCAL_SETTINGS;
}
const json = localStorage.getItem(LOCAL_SETTINGS_KEY);
try {
if (json) {
return JSON.parse(json);
}
} catch {}
return DEFAULT_LOCAL_SETTINGS;
}
export function saveLocalSettings(settings: LocalSettings) {
localStorage.setItem(LOCAL_SETTINGS_KEY, JSON.stringify(settings));
}
export function updateContextOfLocalSettings(
context: LocalSettings["context"],
) {
const settings = getLocalSettings();
saveLocalSettings({
...settings,
context: {
...settings.context,
...context,
},
});
}