summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMax Stevens <[email protected]>2026-01-08 18:06:06 +0100
committerGitHub <[email protected]>2026-01-08 11:06:06 -0600
commit4d09c5618e094dff521444e218632ea964936ba7 (patch)
tree078ee92d436d008c72eb07b0cd64d996d6211f0a
parentadae0d185340b9650a3d9680abc7a2cfd6fc3345 (diff)
downloadopencode-4d09c5618e094dff521444e218632ea964936ba7.tar.gz
opencode-4d09c5618e094dff521444e218632ea964936ba7.zip
refactor: session settings simplification (#7342)
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/kv.tsx2
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx58
2 files changed, 21 insertions, 39 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/context/kv.tsx b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
index 24a9a5544..e0844ba5a 100644
--- a/packages/opencode/src/cli/cmd/tui/context/kv.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
@@ -26,7 +26,7 @@ export const { use: useKV, provider: KVProvider } = createSimpleContext({
return ready()
},
signal<T>(name: string, defaultValue: T) {
- if (!kvStore[name]) setKvStore(name, defaultValue)
+ if (kvStore[name] === undefined) setKvStore(name, defaultValue)
return [
function () {
return result.get(name)
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index 659892b17..0561e5eac 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -1,4 +1,5 @@
import {
+ batch,
createContext,
createEffect,
createMemo,
@@ -52,7 +53,6 @@ import { useDialog } from "../../ui/dialog"
import { TodoItem } from "../../component/todo-item"
import { DialogMessage } from "./dialog-message"
import type { PromptInfo } from "../../component/prompt/history"
-import { iife } from "@/util/iife"
import { DialogConfirm } from "@tui/ui/dialog-confirm"
import { DialogTimeline } from "./dialog-timeline"
import { DialogForkFromTimeline } from "./dialog-fork-from-timeline"
@@ -136,23 +136,25 @@ export function Session() {
})
const dimensions = useTerminalDimensions()
- const [sidebar, setSidebar] = createSignal<"show" | "hide" | "auto">(kv.get("sidebar", "auto"))
+ const [sidebar, setSidebar] = kv.signal<"auto" | "hide">("sidebar", "hide")
+ const [sidebarOpen, setSidebarOpen] = createSignal(false)
const [conceal, setConceal] = createSignal(true)
- const [showThinking, setShowThinking] = createSignal(kv.get("thinking_visibility", true))
- const [showTimestamps, setShowTimestamps] = createSignal(kv.get("timestamps", "hide") === "show")
- const [showDetails, setShowDetails] = createSignal(kv.get("tool_details_visibility", true))
- const [showAssistantMetadata, setShowAssistantMetadata] = createSignal(kv.get("assistant_metadata_visibility", true))
- const [showScrollbar, setShowScrollbar] = createSignal(kv.get("scrollbar_visible", false))
+ const [showThinking, setShowThinking] = kv.signal("thinking_visibility", true)
+ const [timestamps, setTimestamps] = kv.signal<"hide" | "show">("timestamps", "hide")
+ const [showDetails, setShowDetails] = kv.signal("tool_details_visibility", true)
+ const [showAssistantMetadata, setShowAssistantMetadata] = kv.signal("assistant_metadata_visibility", true)
+ const [showScrollbar, setShowScrollbar] = kv.signal("scrollbar_visible", false)
const [diffWrapMode, setDiffWrapMode] = createSignal<"word" | "none">("word")
- const [animationsEnabled, setAnimationsEnabled] = createSignal(kv.get("animations_enabled", true))
+ const [animationsEnabled, setAnimationsEnabled] = kv.signal("animations_enabled", true)
const wide = createMemo(() => dimensions().width > 120)
const sidebarVisible = createMemo(() => {
if (session()?.parentID) return false
- if (sidebar() === "show") return true
+ if (sidebarOpen()) return true
if (sidebar() === "auto" && wide()) return true
return false
})
+ const showTimestamps = createMemo(() => timestamps() === "show")
const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4)
const scrollAcceleration = createMemo(() => {
@@ -453,13 +455,11 @@ export function Session() {
keybind: "sidebar_toggle",
category: "Session",
onSelect: (dialog) => {
- setSidebar((prev) => {
- if (prev === "auto") return sidebarVisible() ? "hide" : "show"
- if (prev === "show") return "hide"
- return "show"
+ batch(() => {
+ const isVisible = sidebarVisible()
+ setSidebar(() => (isVisible ? "hide" : "auto"))
+ setSidebarOpen(!isVisible)
})
- if (sidebar() === "show") kv.set("sidebar", "auto")
- if (sidebar() === "hide") kv.set("sidebar", "hide")
dialog.clear()
},
},
@@ -478,11 +478,7 @@ export function Session() {
value: "session.toggle.timestamps",
category: "Session",
onSelect: (dialog) => {
- setShowTimestamps((prev) => {
- const next = !prev
- kv.set("timestamps", next ? "show" : "hide")
- return next
- })
+ setTimestamps((prev) => (prev === "show" ? "hide" : "show"))
dialog.clear()
},
},
@@ -491,11 +487,7 @@ export function Session() {
value: "session.toggle.thinking",
category: "Session",
onSelect: (dialog) => {
- setShowThinking((prev) => {
- const next = !prev
- kv.set("thinking_visibility", next)
- return next
- })
+ setShowThinking((prev) => !prev)
dialog.clear()
},
},
@@ -514,9 +506,7 @@ export function Session() {
keybind: "tool_details",
category: "Session",
onSelect: (dialog) => {
- const newValue = !showDetails()
- setShowDetails(newValue)
- kv.set("tool_details_visibility", newValue)
+ setShowDetails((prev) => !prev)
dialog.clear()
},
},
@@ -526,11 +516,7 @@ export function Session() {
keybind: "scrollbar_toggle",
category: "Session",
onSelect: (dialog) => {
- setShowScrollbar((prev) => {
- const next = !prev
- kv.set("scrollbar_visible", next)
- return next
- })
+ setShowScrollbar((prev) => !prev)
dialog.clear()
},
},
@@ -539,11 +525,7 @@ export function Session() {
value: "session.toggle.animations",
category: "Session",
onSelect: (dialog) => {
- setAnimationsEnabled((prev) => {
- const next = !prev
- kv.set("animations_enabled", next)
- return next
- })
+ setAnimationsEnabled((prev) => !prev)
dialog.clear()
},
},