diff options
| author | Adam <[email protected]> | 2026-02-12 09:49:14 -0600 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-12 09:49:14 -0600 |
| commit | ff4414bb152acfddb5c0eb073c38bedc1df4ae14 (patch) | |
| tree | 78381c67d21ef6f089647f6b19e7aa2976840dbc /packages/app/src/context/comments.tsx | |
| parent | 56ad2db02055955f926fda0e4a89055b22ead6f9 (diff) | |
| download | opencode-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.tsx | 58 |
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 } |
