summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/comments.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-12 09:49:14 -0600
committerGitHub <[email protected]>2026-02-12 09:49:14 -0600
commitff4414bb152acfddb5c0eb073c38bedc1df4ae14 (patch)
tree78381c67d21ef6f089647f6b19e7aa2976840dbc /packages/app/src/context/comments.tsx
parent56ad2db02055955f926fda0e4a89055b22ead6f9 (diff)
downloadopencode-ff4414bb152acfddb5c0eb073c38bedc1df4ae14.tar.gz
opencode-ff4414bb152acfddb5c0eb073c38bedc1df4ae14.zip
chore: refactor packages/app files (#13236)
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Frank <[email protected]>
Diffstat (limited to 'packages/app/src/context/comments.tsx')
-rw-r--r--packages/app/src/context/comments.tsx58
1 files changed, 30 insertions, 28 deletions
diff --git a/packages/app/src/context/comments.tsx b/packages/app/src/context/comments.tsx
index a88ea0d86..ecf63e45b 100644
--- a/packages/app/src/context/comments.tsx
+++ b/packages/app/src/context/comments.tsx
@@ -1,4 +1,4 @@
-import { batch, createEffect, createMemo, createRoot, onCleanup } from "solid-js"
+import { batch, createMemo, createRoot, onCleanup } from "solid-js"
import { createStore, reconcile, type SetStoreFunction, type Store } from "solid-js/store"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { useParams } from "@solidjs/router"
@@ -20,6 +20,19 @@ type CommentFocus = { file: string; id: string }
const WORKSPACE_KEY = "__workspace__"
const MAX_COMMENT_SESSIONS = 20
+function sessionKey(dir: string, id: string | undefined) {
+ return `${dir}\n${id ?? WORKSPACE_KEY}`
+}
+
+function decodeSessionKey(key: string) {
+ const split = key.lastIndexOf("\n")
+ if (split < 0) return { dir: key, id: WORKSPACE_KEY }
+ return {
+ dir: key.slice(0, split),
+ id: key.slice(split + 1),
+ }
+}
+
type CommentStore = {
comments: Record<string, LineComment[]>
}
@@ -31,24 +44,24 @@ function aggregate(comments: Record<string, LineComment[]>) {
.sort((a, b) => a.time - b.time)
}
-function insert(items: LineComment[], next: LineComment) {
- const index = items.findIndex((item) => item.time > next.time)
- if (index < 0) return [...items, next]
- return [...items.slice(0, index), next, ...items.slice(index)]
-}
-
function createCommentSessionState(store: Store<CommentStore>, setStore: SetStoreFunction<CommentStore>) {
const [state, setState] = createStore({
focus: null as CommentFocus | null,
active: null as CommentFocus | null,
- all: aggregate(store.comments),
})
+ const all = () => aggregate(store.comments)
+
+ const setRef = (
+ key: "focus" | "active",
+ value: CommentFocus | null | ((value: CommentFocus | null) => CommentFocus | null),
+ ) => setState(key, value)
+
const setFocus = (value: CommentFocus | null | ((value: CommentFocus | null) => CommentFocus | null)) =>
- setState("focus", value)
+ setRef("focus", value)
const setActive = (value: CommentFocus | null | ((value: CommentFocus | null) => CommentFocus | null)) =>
- setState("active", value)
+ setRef("active", value)
const list = (file: string) => store.comments[file] ?? []
@@ -61,7 +74,6 @@ function createCommentSessionState(store: Store<CommentStore>, setStore: SetStor
batch(() => {
setStore("comments", input.file, (items) => [...(items ?? []), next])
- setState("all", (items) => insert(items, next))
setFocus({ file: input.file, id: next.id })
})
@@ -71,15 +83,13 @@ function createCommentSessionState(store: Store<CommentStore>, setStore: SetStor
const remove = (file: string, id: string) => {
batch(() => {
setStore("comments", file, (items) => (items ?? []).filter((item) => item.id !== id))
- setState("all", (items) => items.filter((item) => !(item.file === file && item.id === id)))
- setFocus((current) => (current?.id === id ? null : current))
+ setFocus((current) => (current?.file === file && current.id === id ? null : current))
})
}
const clear = () => {
batch(() => {
setStore("comments", reconcile({}))
- setState("all", [])
setFocus(null)
setActive(null)
})
@@ -87,17 +97,16 @@ function createCommentSessionState(store: Store<CommentStore>, setStore: SetStor
return {
list,
- all: () => state.all,
+ all,
add,
remove,
clear,
focus: () => state.focus,
setFocus,
- clearFocus: () => setFocus(null),
+ clearFocus: () => setRef("focus", null),
active: () => state.active,
setActive,
- clearActive: () => setActive(null),
- reindex: () => setState("all", aggregate(store.comments)),
+ clearActive: () => setRef("active", null),
}
}
@@ -117,11 +126,6 @@ function createCommentSession(dir: string, id: string | undefined) {
)
const session = createCommentSessionState(store, setStore)
- createEffect(() => {
- if (!ready()) return
- session.reindex()
- })
-
return {
ready,
list: session.list,
@@ -145,11 +149,9 @@ export const { use: useComments, provider: CommentsProvider } = createSimpleCont
const params = useParams()
const cache = createScopedCache(
(key) => {
- const split = key.lastIndexOf("\n")
- const dir = split >= 0 ? key.slice(0, split) : key
- const id = split >= 0 ? key.slice(split + 1) : WORKSPACE_KEY
+ const decoded = decodeSessionKey(key)
return createRoot((dispose) => ({
- value: createCommentSession(dir, id === WORKSPACE_KEY ? undefined : id),
+ value: createCommentSession(decoded.dir, decoded.id === WORKSPACE_KEY ? undefined : decoded.id),
dispose,
}))
},
@@ -162,7 +164,7 @@ export const { use: useComments, provider: CommentsProvider } = createSimpleCont
onCleanup(() => cache.clear())
const load = (dir: string, id: string | undefined) => {
- const key = `${dir}\n${id ?? WORKSPACE_KEY}`
+ const key = sessionKey(dir, id)
return cache.get(key).value
}