summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-12 15:03:02 -0600
committerAdam <[email protected]>2026-02-12 15:03:05 -0600
commit4e0f509e7b7d84395a541bdfa658f6c98f588221 (patch)
tree45912ad3c9b0d9cc532fa4d72fe20938a1273090 /packages/app/src
parentff3b174c423d89b39ee8154863840e48c8aac371 (diff)
downloadopencode-4e0f509e7b7d84395a541bdfa658f6c98f588221.tar.gz
opencode-4e0f509e7b7d84395a541bdfa658f6c98f588221.zip
feat(app): option to turn off sound effects
Diffstat (limited to 'packages/app/src')
-rw-r--r--packages/app/src/components/settings-general.tsx69
-rw-r--r--packages/app/src/context/notification.tsx8
-rw-r--r--packages/app/src/context/settings.tsx21
-rw-r--r--packages/app/src/pages/layout.tsx4
4 files changed, 78 insertions, 24 deletions
diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx
index c673cab80..439f542bb 100644
--- a/packages/app/src/components/settings-general.tsx
+++ b/packages/app/src/components/settings-general.tsx
@@ -306,39 +306,66 @@ export const SettingsGeneral: Component = () => {
title={language.t("settings.general.sounds.agent.title")}
description={language.t("settings.general.sounds.agent.description")}
>
- <Select
- data-action="settings-sounds-agent"
- {...soundSelectProps(
- () => settings.sounds.agent(),
- (id) => settings.sounds.setAgent(id),
- )}
- />
+ <div class="flex items-center gap-2">
+ <div data-action="settings-sounds-agent-enabled">
+ <Switch
+ checked={settings.sounds.agentEnabled()}
+ onChange={(checked) => settings.sounds.setAgentEnabled(checked)}
+ />
+ </div>
+ <Select
+ disabled={!settings.sounds.agentEnabled()}
+ data-action="settings-sounds-agent"
+ {...soundSelectProps(
+ () => settings.sounds.agent(),
+ (id) => settings.sounds.setAgent(id),
+ )}
+ />
+ </div>
</SettingsRow>
<SettingsRow
title={language.t("settings.general.sounds.permissions.title")}
description={language.t("settings.general.sounds.permissions.description")}
>
- <Select
- data-action="settings-sounds-permissions"
- {...soundSelectProps(
- () => settings.sounds.permissions(),
- (id) => settings.sounds.setPermissions(id),
- )}
- />
+ <div class="flex items-center gap-2">
+ <div data-action="settings-sounds-permissions-enabled">
+ <Switch
+ checked={settings.sounds.permissionsEnabled()}
+ onChange={(checked) => settings.sounds.setPermissionsEnabled(checked)}
+ />
+ </div>
+ <Select
+ disabled={!settings.sounds.permissionsEnabled()}
+ data-action="settings-sounds-permissions"
+ {...soundSelectProps(
+ () => settings.sounds.permissions(),
+ (id) => settings.sounds.setPermissions(id),
+ )}
+ />
+ </div>
</SettingsRow>
<SettingsRow
title={language.t("settings.general.sounds.errors.title")}
description={language.t("settings.general.sounds.errors.description")}
>
- <Select
- data-action="settings-sounds-errors"
- {...soundSelectProps(
- () => settings.sounds.errors(),
- (id) => settings.sounds.setErrors(id),
- )}
- />
+ <div class="flex items-center gap-2">
+ <div data-action="settings-sounds-errors-enabled">
+ <Switch
+ checked={settings.sounds.errorsEnabled()}
+ onChange={(checked) => settings.sounds.setErrorsEnabled(checked)}
+ />
+ </div>
+ <Select
+ disabled={!settings.sounds.errorsEnabled()}
+ data-action="settings-sounds-errors"
+ {...soundSelectProps(
+ () => settings.sounds.errors(),
+ (id) => settings.sounds.setErrors(id),
+ )}
+ />
+ </div>
</SettingsRow>
</div>
</div>
diff --git a/packages/app/src/context/notification.tsx b/packages/app/src/context/notification.tsx
index bf880d115..04bc2fdaa 100644
--- a/packages/app/src/context/notification.tsx
+++ b/packages/app/src/context/notification.tsx
@@ -233,7 +233,9 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
if (!session) return
if (session.parentID) return
- playSound(soundSrc(settings.sounds.agent()))
+ if (settings.sounds.agentEnabled()) {
+ playSound(soundSrc(settings.sounds.agent()))
+ }
append({
directory,
@@ -260,7 +262,9 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
if (meta.disposed) return
if (session?.parentID) return
- playSound(soundSrc(settings.sounds.errors()))
+ if (settings.sounds.errorsEnabled()) {
+ playSound(soundSrc(settings.sounds.errors()))
+ }
const error = "error" in event.properties ? event.properties.error : undefined
append({
diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx
index a8efb1eac..d72d4ceb1 100644
--- a/packages/app/src/context/settings.tsx
+++ b/packages/app/src/context/settings.tsx
@@ -10,8 +10,11 @@ export interface NotificationSettings {
}
export interface SoundSettings {
+ agentEnabled: boolean
agent: string
+ permissionsEnabled: boolean
permissions: string
+ errorsEnabled: boolean
errors: string
}
@@ -57,8 +60,11 @@ const defaultSettings: Settings = {
errors: false,
},
sounds: {
+ agentEnabled: true,
agent: "staplebops-01",
+ permissionsEnabled: true,
permissions: "staplebops-02",
+ errorsEnabled: true,
errors: "nope-03",
},
}
@@ -168,14 +174,29 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
},
},
sounds: {
+ agentEnabled: withFallback(() => store.sounds?.agentEnabled, defaultSettings.sounds.agentEnabled),
+ setAgentEnabled(value: boolean) {
+ setStore("sounds", "agentEnabled", value)
+ },
agent: withFallback(() => store.sounds?.agent, defaultSettings.sounds.agent),
setAgent(value: string) {
setStore("sounds", "agent", value)
},
+ permissionsEnabled: withFallback(
+ () => store.sounds?.permissionsEnabled,
+ defaultSettings.sounds.permissionsEnabled,
+ ),
+ setPermissionsEnabled(value: boolean) {
+ setStore("sounds", "permissionsEnabled", value)
+ },
permissions: withFallback(() => store.sounds?.permissions, defaultSettings.sounds.permissions),
setPermissions(value: string) {
setStore("sounds", "permissions", value)
},
+ errorsEnabled: withFallback(() => store.sounds?.errorsEnabled, defaultSettings.sounds.errorsEnabled),
+ setErrorsEnabled(value: boolean) {
+ setStore("sounds", "errorsEnabled", value)
+ },
errors: withFallback(() => store.sounds?.errors, defaultSettings.sounds.errors),
setErrors(value: string) {
setStore("sounds", "errors", value)
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 5f001177f..7eb064f42 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -388,7 +388,9 @@ export default function Layout(props: ParentProps) {
alertedAtBySession.set(sessionKey, now)
if (e.details.type === "permission.asked") {
- playSound(soundSrc(settings.sounds.permissions()))
+ if (settings.sounds.permissionsEnabled()) {
+ playSound(soundSrc(settings.sounds.permissions()))
+ }
if (settings.notifications.permissions()) {
void platform.notify(title, description, href)
}