summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src/context
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-17 13:10:57 -0600
committerAdam <[email protected]>2025-12-17 13:11:02 -0600
commit4a3ba58f65d12b4f7c7a97b42a5bb3bc0eb5f88b (patch)
treeabae119fe310b1c73fc0d70d9d0d81985c5def42 /packages/desktop/src/context
parent2a3a8a1ec2d71ae27730226cfac37830c7a5dfd7 (diff)
downloadopencode-4a3ba58f65d12b4f7c7a97b42a5bb3bc0eb5f88b.tar.gz
opencode-4a3ba58f65d12b4f7c7a97b42a5bb3bc0eb5f88b.zip
chore: localStorage -> tauri store
Diffstat (limited to 'packages/desktop/src/context')
-rw-r--r--packages/desktop/src/context/layout.tsx9
-rw-r--r--packages/desktop/src/context/local.tsx7
-rw-r--r--packages/desktop/src/context/notification.tsx9
-rw-r--r--packages/desktop/src/context/platform.tsx4
-rw-r--r--packages/desktop/src/context/prompt.tsx9
-rw-r--r--packages/desktop/src/context/terminal.tsx9
6 files changed, 24 insertions, 23 deletions
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index af71c6a00..01e0bdf52 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -1,10 +1,10 @@
import { createStore, produce } from "solid-js/store"
import { batch, createMemo, onMount } from "solid-js"
import { createSimpleContext } from "@opencode-ai/ui/context"
-import { makePersisted } from "@solid-primitives/storage"
import { useGlobalSync } from "./global-sync"
import { useGlobalSDK } from "./global-sdk"
import { Project } from "@opencode-ai/sdk/v2"
+import { persisted } from "@/utils/persist"
const AVATAR_COLOR_KEYS = ["pink", "mint", "orange", "purple", "cyan", "lime"] as const
export type AvatarColorKey = (typeof AVATAR_COLOR_KEYS)[number]
@@ -32,7 +32,8 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
init: () => {
const globalSdk = useGlobalSDK()
const globalSync = useGlobalSync()
- const [store, setStore] = makePersisted(
+ const [store, setStore, _, ready] = persisted(
+ "layout.v3",
createStore({
projects: [] as { worktree: string; expanded: boolean }[],
sidebar: {
@@ -48,9 +49,6 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
},
sessionTabs: {} as Record<string, SessionTabs>,
}),
- {
- name: "layout.v3",
- },
)
const usedColors = new Set<AvatarColorKey>()
@@ -93,6 +91,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
})
return {
+ ready,
projects: {
list,
open(directory: string) {
diff --git a/packages/desktop/src/context/local.tsx b/packages/desktop/src/context/local.tsx
index b12679210..2ea4de524 100644
--- a/packages/desktop/src/context/local.tsx
+++ b/packages/desktop/src/context/local.tsx
@@ -7,8 +7,8 @@ import { useSDK } from "./sdk"
import { useSync } from "./sync"
import { base64Encode } from "@opencode-ai/util/encode"
import { useProviders } from "@/hooks/use-providers"
-import { makePersisted } from "@solid-primitives/storage"
import { DateTime } from "luxon"
+import { persisted } from "@/utils/persist"
export type LocalFile = FileNode &
Partial<{
@@ -110,7 +110,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
})()
const model = (() => {
- const [store, setStore] = makePersisted(
+ const [store, setStore, _, modelReady] = persisted(
+ "model.v1",
createStore<{
user: (ModelKey & { visibility: "show" | "hide"; favorite?: boolean })[]
recent: ModelKey[]
@@ -118,7 +119,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
user: [],
recent: [],
}),
- { name: "model.v1" },
)
const [ephemeral, setEphemeral] = createStore<{
@@ -242,6 +242,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
}
return {
+ ready: modelReady,
current,
recent,
list,
diff --git a/packages/desktop/src/context/notification.tsx b/packages/desktop/src/context/notification.tsx
index 5ca813448..2b258ebd6 100644
--- a/packages/desktop/src/context/notification.tsx
+++ b/packages/desktop/src/context/notification.tsx
@@ -1,6 +1,5 @@
import { createStore } from "solid-js/store"
import { createSimpleContext } from "@opencode-ai/ui/context"
-import { makePersisted } from "@solid-primitives/storage"
import { useGlobalSDK } from "./global-sdk"
import { useGlobalSync } from "./global-sync"
import { Binary } from "@opencode-ai/util/binary"
@@ -8,6 +7,7 @@ import { EventSessionError } from "@opencode-ai/sdk/v2"
import { makeAudioPlayer } from "@solid-primitives/audio"
import idleSound from "@opencode-ai/ui/audio/staplebops-01.aac"
import errorSound from "@opencode-ai/ui/audio/nope-03.aac"
+import { persisted } from "@/utils/persist"
type NotificationBase = {
directory?: string
@@ -44,13 +44,11 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
const globalSDK = useGlobalSDK()
const globalSync = useGlobalSync()
- const [store, setStore] = makePersisted(
+ const [store, setStore, _, ready] = persisted(
+ "notification.v1",
createStore({
list: [] as Notification[],
}),
- {
- name: "notification.v1",
- },
)
globalSDK.event.listen((e) => {
@@ -101,6 +99,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
})
return {
+ ready,
session: {
all(session: string) {
return store.list.filter((n) => n.session === session)
diff --git a/packages/desktop/src/context/platform.tsx b/packages/desktop/src/context/platform.tsx
index 21be49cbd..92bb2ba15 100644
--- a/packages/desktop/src/context/platform.tsx
+++ b/packages/desktop/src/context/platform.tsx
@@ -1,4 +1,5 @@
import { createSimpleContext } from "@opencode-ai/ui/context"
+import { AsyncStorage, SyncStorage } from "@solid-primitives/storage"
export type Platform = {
/** Platform discriminator */
@@ -15,6 +16,9 @@ export type Platform = {
/** Open a URL in the default browser */
openLink(url: string): void
+
+ /** Storage mechanism, defaults to localStorage */
+ storage?: (name?: string) => SyncStorage | AsyncStorage
}
export const { use: usePlatform, provider: PlatformProvider } = createSimpleContext({
diff --git a/packages/desktop/src/context/prompt.tsx b/packages/desktop/src/context/prompt.tsx
index 2da0a08d5..8d3590cd9 100644
--- a/packages/desktop/src/context/prompt.tsx
+++ b/packages/desktop/src/context/prompt.tsx
@@ -1,9 +1,9 @@
import { createStore } from "solid-js/store"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { batch, createMemo } from "solid-js"
-import { makePersisted } from "@solid-primitives/storage"
import { useParams } from "@solidjs/router"
import { TextSelection } from "./local"
+import { persisted } from "@/utils/persist"
interface PartBase {
content: string
@@ -77,7 +77,8 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext(
const params = useParams()
const name = createMemo(() => `${params.dir}/prompt${params.id ? "/" + params.id : ""}.v1`)
- const [store, setStore] = makePersisted(
+ const [store, setStore, _, ready] = persisted(
+ name(),
createStore<{
prompt: Prompt
cursor?: number
@@ -85,12 +86,10 @@ export const { use: usePrompt, provider: PromptProvider } = createSimpleContext(
prompt: clonePrompt(DEFAULT_PROMPT),
cursor: undefined,
}),
- {
- name: name(),
- },
)
return {
+ ready,
current: createMemo(() => store.prompt),
cursor: createMemo(() => store.cursor),
dirty: createMemo(() => !isPromptEqual(store.prompt, DEFAULT_PROMPT)),
diff --git a/packages/desktop/src/context/terminal.tsx b/packages/desktop/src/context/terminal.tsx
index cf9b5a5b9..6f7c11dea 100644
--- a/packages/desktop/src/context/terminal.tsx
+++ b/packages/desktop/src/context/terminal.tsx
@@ -1,9 +1,9 @@
import { createStore, produce } from "solid-js/store"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { batch, createMemo } from "solid-js"
-import { makePersisted } from "@solid-primitives/storage"
import { useParams } from "@solidjs/router"
import { useSDK } from "./sdk"
+import { persisted } from "@/utils/persist"
export type LocalPTY = {
id: string
@@ -21,19 +21,18 @@ export const { use: useTerminal, provider: TerminalProvider } = createSimpleCont
const params = useParams()
const name = createMemo(() => `${params.dir}/terminal${params.id ? "/" + params.id : ""}.v1`)
- const [store, setStore] = makePersisted(
+ const [store, setStore, _, ready] = persisted(
+ name(),
createStore<{
active?: string
all: LocalPTY[]
}>({
all: [],
}),
- {
- name: name(),
- },
)
return {
+ ready,
all: createMemo(() => Object.values(store.all)),
active: createMemo(() => store.active),
new() {