diff options
| author | Adam <[email protected]> | 2025-12-31 13:12:24 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-31 13:12:31 -0600 |
| commit | 93845db4623f157dff96a3a1ef440e21ab865769 (patch) | |
| tree | 9545ed6d2139e20c53a2c3f32f2b89691b3e7da4 /packages/app/src/pages | |
| parent | 65bc72098b737bee12f388215913808fa1629a4d (diff) | |
| download | opencode-93845db4623f157dff96a3a1ef440e21ab865769.tar.gz opencode-93845db4623f157dff96a3a1ef440e21ab865769.zip | |
fix(desktop): don't show notifs if auto-accepting
Diffstat (limited to 'packages/app/src/pages')
| -rw-r--r-- | packages/app/src/pages/directory-layout.tsx | 10 | ||||
| -rw-r--r-- | packages/app/src/pages/layout.tsx | 39 | ||||
| -rw-r--r-- | packages/app/src/pages/session.tsx | 10 |
3 files changed, 37 insertions, 22 deletions
diff --git a/packages/app/src/pages/directory-layout.tsx b/packages/app/src/pages/directory-layout.tsx index 473dcd8e1..6aac3c384 100644 --- a/packages/app/src/pages/directory-layout.tsx +++ b/packages/app/src/pages/directory-layout.tsx @@ -3,7 +3,7 @@ import { useParams } from "@solidjs/router" import { SDKProvider, useSDK } from "@/context/sdk" import { SyncProvider, useSync } from "@/context/sync" import { LocalProvider } from "@/context/local" -import { PermissionProvider } from "@/context/permission" + import { base64Decode } from "@opencode-ai/util/encode" import { DataProvider } from "@opencode-ai/ui/context" import { iife } from "@opencode-ai/util/iife" @@ -27,11 +27,9 @@ export default function Layout(props: ParentProps) { }) => sdk.client.permission.respond(input) return ( - <PermissionProvider permissions={sync.data.permission} onRespond={respond}> - <DataProvider data={sync.data} directory={directory()} onPermissionRespond={respond}> - <LocalProvider>{props.children}</LocalProvider> - </DataProvider> - </PermissionProvider> + <DataProvider data={sync.data} directory={directory()} onPermissionRespond={respond}> + <LocalProvider>{props.children}</LocalProvider> + </DataProvider> ) })} </SyncProvider> diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index ce753ecc3..d6d24e9ad 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -45,6 +45,7 @@ import { useProviders } from "@/hooks/use-providers" import { showToast, Toast, toaster } from "@opencode-ai/ui/toast" import { useGlobalSDK } from "@/context/global-sdk" import { useNotification } from "@/context/notification" +import { usePermission } from "@/context/permission" import { Binary } from "@opencode-ai/util/binary" import { useDialog } from "@opencode-ai/ui/context/dialog" @@ -92,6 +93,7 @@ export default function Layout(props: ParentProps) { const platform = usePlatform() const server = useServer() const notification = useNotification() + const permission = usePermission() const navigate = useNavigate() const providers = useProviders() const dialog = useDialog() @@ -160,28 +162,41 @@ export default function Layout(props: ParentProps) { }) onMount(() => { - const seenSessions = new Set<string>() const toastBySession = new Map<string, number>() + const alertedAtBySession = new Map<string, number>() + const permissionAlertCooldownMs = 5000 + const unsub = globalSDK.event.listen((e) => { if (e.details?.type !== "permission.updated") return const directory = e.name - const permission = e.details.properties - const currentDir = params.dir ? base64Decode(params.dir) : undefined - const currentSession = params.id + const perm = e.details.properties + if (permission.autoResponds(perm)) return + + const sessionKey = `${directory}:${perm.sessionID}` const [store] = globalSync.child(directory) - const session = store.session.find((s) => s.id === permission.sessionID) + const session = store.session.find((s) => s.id === perm.sessionID) + const sessionTitle = session?.title ?? "New session" const projectName = getFilename(directory) const description = `${sessionTitle} in ${projectName} needs permission` - const href = `/${base64Encode(directory)}/session/${permission.sessionID}` + const href = `/${base64Encode(directory)}/session/${perm.sessionID}` + + const now = Date.now() + const lastAlerted = alertedAtBySession.get(sessionKey) ?? 0 + if (now - lastAlerted < permissionAlertCooldownMs) return + alertedAtBySession.set(sessionKey, now) + void platform.notify("Permission required", description, href) - if (directory === currentDir && permission.sessionID === currentSession) return + const currentDir = params.dir ? base64Decode(params.dir) : undefined + const currentSession = params.id + if (directory === currentDir && perm.sessionID === currentSession) return if (directory === currentDir && session?.parentID === currentSession) return - const sessionKey = `${directory}:${permission.sessionID}` - if (seenSessions.has(sessionKey)) return - seenSessions.add(sessionKey) + const existingToastId = toastBySession.get(sessionKey) + if (existingToastId !== undefined) { + toaster.dismiss(existingToastId) + } const toastId = showToast({ persistent: true, @@ -214,7 +229,7 @@ export default function Layout(props: ParentProps) { if (toastId !== undefined) { toaster.dismiss(toastId) toastBySession.delete(sessionKey) - seenSessions.delete(sessionKey) + alertedAtBySession.delete(sessionKey) } const [store] = globalSync.child(currentDir) const childSessions = store.session.filter((s) => s.parentID === currentSession) @@ -224,7 +239,7 @@ export default function Layout(props: ParentProps) { if (childToastId !== undefined) { toaster.dismiss(childToastId) toastBySession.delete(childKey) - seenSessions.delete(childKey) + alertedAtBySession.delete(childKey) } } }) diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 125dc19d3..1cea23de4 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -556,11 +556,13 @@ export default function Page() { category: "Permissions", disabled: !params.id, onSelect: () => { - if (!params.id) return - permission.toggleAutoAccept(params.id) + const sessionID = params.id + if (!sessionID) return + + permission.toggleAutoAccept(sessionID, sdk.directory) showToast({ - title: permission.isAutoAccepting(params.id) ? "Auto-accepting edits" : "Stopped auto-accepting edits", - description: permission.isAutoAccepting(params.id) + title: permission.isAutoAccepting(sessionID) ? "Auto-accepting edits" : "Stopped auto-accepting edits", + description: permission.isAutoAccepting(sessionID) ? "Edit and write permissions will be automatically approved" : "Edit and write permissions will require approval", }) |
