summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/notification.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-01-06 16:03:39 -0600
committerAdam <[email protected]>2026-01-20 07:33:44 -0600
commitde3641e8ebfd6d6d0262289136e970b1ddea54b2 (patch)
treeb351a43a08e24c57bec5ddcdc2e851853759a761 /packages/app/src/context/notification.tsx
parent8bcbfd63960120efa3cb770f8e07de1bb57e93b0 (diff)
downloadopencode-de3641e8ebfd6d6d0262289136e970b1ddea54b2.tar.gz
opencode-de3641e8ebfd6d6d0262289136e970b1ddea54b2.zip
wip(app): settings
Diffstat (limited to 'packages/app/src/context/notification.tsx')
-rw-r--r--packages/app/src/context/notification.tsx40
1 files changed, 19 insertions, 21 deletions
diff --git a/packages/app/src/context/notification.tsx b/packages/app/src/context/notification.tsx
index 16b3d306c..8b1088519 100644
--- a/packages/app/src/context/notification.tsx
+++ b/packages/app/src/context/notification.tsx
@@ -4,13 +4,12 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
import { useGlobalSDK } from "./global-sdk"
import { useGlobalSync } from "./global-sync"
import { usePlatform } from "@/context/platform"
+import { useSettings } from "@/context/settings"
import { Binary } from "@opencode-ai/util/binary"
import { base64Encode } from "@opencode-ai/util/encode"
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 { Persist, persisted } from "@/utils/persist"
+import { playSound, soundSrc } from "@/utils/sound"
type NotificationBase = {
directory?: string
@@ -44,19 +43,10 @@ function pruneNotifications(list: Notification[]) {
export const { use: useNotification, provider: NotificationProvider } = createSimpleContext({
name: "Notification",
init: () => {
- let idlePlayer: ReturnType<typeof makeAudioPlayer> | undefined
- let errorPlayer: ReturnType<typeof makeAudioPlayer> | undefined
-
- try {
- idlePlayer = makeAudioPlayer(idleSound)
- errorPlayer = makeAudioPlayer(errorSound)
- } catch (err) {
- console.log("Failed to load audio", err)
- }
-
const globalSDK = useGlobalSDK()
const globalSync = useGlobalSync()
const platform = usePlatform()
+ const settings = useSettings()
const [store, setStore, _, ready] = persisted(
Persist.global("notification", ["notification.v1"]),
@@ -93,16 +83,20 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
const match = Binary.search(syncStore.session, sessionID, (s) => s.id)
const session = match.found ? syncStore.session[match.index] : undefined
if (session?.parentID) break
- try {
- idlePlayer?.play()
- } catch {}
+
+ playSound(soundSrc(settings.sounds.agent()))
+
append({
...base,
type: "turn-complete",
session: sessionID,
})
+
const href = `/${base64Encode(directory)}/session/${sessionID}`
- void platform.notify("Response ready", session?.title ?? sessionID, href)
+ if (settings.notifications.agent()) {
+ void platform.notify("Response ready", session?.title ?? sessionID, href)
+ }
+
break
}
case "session.error": {
@@ -111,9 +105,9 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
const match = sessionID ? Binary.search(syncStore.session, sessionID, (s) => s.id) : undefined
const session = sessionID && match?.found ? syncStore.session[match.index] : undefined
if (session?.parentID) break
- try {
- errorPlayer?.play()
- } catch {}
+
+ playSound(soundSrc(settings.sounds.errors()))
+
const error = "error" in event.properties ? event.properties.error : undefined
append({
...base,
@@ -121,9 +115,13 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
session: sessionID ?? "global",
error,
})
+
const description = session?.title ?? (typeof error === "string" ? error : "An error occurred")
const href = sessionID ? `/${base64Encode(directory)}/session/${sessionID}` : `/${base64Encode(directory)}`
- void platform.notify("Session error", description, href)
+ if (settings.notifications.errors()) {
+ void platform.notify("Session error", description, href)
+ }
+
break
}
}