diff --git a/.changes/notification-sound.md b/.changes/notification-sound.md new file mode 100644 index 0000000000..be864bea96 --- /dev/null +++ b/.changes/notification-sound.md @@ -0,0 +1,6 @@ +--- +"notification": patch +"notification-js": patch +--- + +Added sound support for desktop notifications which was previously only available on mobile platforms. diff --git a/examples/api/src/views/Notifications.svelte b/examples/api/src/views/Notifications.svelte index e01d57fcd2..11273fdc33 100644 --- a/examples/api/src/views/Notifications.svelte +++ b/examples/api/src/views/Notifications.svelte @@ -1,16 +1,21 @@ - diff --git a/plugins/notification/README.md b/plugins/notification/README.md index b42d6f2f17..e17efe028f 100644 --- a/plugins/notification/README.md +++ b/plugins/notification/README.md @@ -95,6 +95,45 @@ export async function enqueueNotification(title, body) { } ``` +### Notification with Sound + +You can add sound to your notifications on all platforms (desktop and mobile): + +```javascript +import { sendNotification } from '@tauri-apps/plugin-notification' +import { platform } from '@tauri-apps/api/os' + +// Basic notification with sound +sendNotification({ + title: 'New Message', + body: 'You have a new message', + sound: 'notification.wav' // Path to sound file +}) + +// Platform-specific sounds +async function sendPlatformSpecificNotification() { + const platformName = platform() + + let soundPath + if (platformName === 'darwin') { + // On macOS: use system sounds or sound files in the app bundle + soundPath = 'Ping' // macOS system sound + } else if (platformName === 'linux') { + // On Linux: use XDG theme sounds or file paths + soundPath = 'message-new-instant' // XDG theme sound + } else { + // On Windows: use file paths + soundPath = 'notification.wav' + } + + sendNotification({ + title: 'Platform-specific Notification', + body: 'This notification uses platform-specific sound', + sound: soundPath + }) +} +``` + ## Contributing PRs accepted. Please make sure to read the Contributing Guide before making a pull request. diff --git a/plugins/notification/guest-js/index.ts b/plugins/notification/guest-js/index.ts index 9f81a1e185..685c60c203 100644 --- a/plugins/notification/guest-js/index.ts +++ b/plugins/notification/guest-js/index.ts @@ -71,7 +71,13 @@ interface Options { */ groupSummary?: boolean /** - * The sound resource name. Only available on mobile. + * The sound resource name or file path for the notification. + * + * Platform specific behavior: + * - On macOS: use system sounds (e.g., "Ping", "Blow") or sound files in the app bundle + * - On Linux: use XDG theme sounds (e.g., "message-new-instant") or file paths + * - On Windows: use file paths to sound files (.wav format) + * - On Mobile: use resource names */ sound?: string /** diff --git a/plugins/notification/src/desktop.rs b/plugins/notification/src/desktop.rs index 47279225ac..4ceb83088b 100644 --- a/plugins/notification/src/desktop.rs +++ b/plugins/notification/src/desktop.rs @@ -39,6 +39,9 @@ impl crate::NotificationBuilder { if let Some(icon) = self.data.icon { notification = notification.icon(icon); } + if let Some(sound) = self.data.sound { + notification = notification.sound(sound); + } #[cfg(feature = "windows7-compat")] { notification.notify(&self.app)?; @@ -102,6 +105,8 @@ mod imp { title: Option, /// The notification icon. icon: Option, + /// The notification sound. + sound: Option, /// The notification identifier identifier: String, } @@ -136,6 +141,13 @@ mod imp { self } + /// Sets the notification sound file. + #[must_use] + pub fn sound(mut self, sound: impl Into) -> Self { + self.sound = Some(sound.into()); + self + } + /// Shows the notification. /// /// # Examples @@ -177,6 +189,9 @@ mod imp { } else { notification.auto_icon(); } + if let Some(sound) = self.sound { + notification.sound_name(&sound); + } #[cfg(windows)] { let exe = tauri::utils::platform::current_exe()?; @@ -250,6 +265,7 @@ mod imp { } } + /// Shows the notification on Windows 7. #[cfg(all(windows, feature = "windows7-compat"))] fn notify_win7(self, app: &tauri::AppHandle) -> crate::Result<()> { let app_ = app.clone(); diff --git a/plugins/notification/src/lib.rs b/plugins/notification/src/lib.rs index 9ca33d63aa..8b79c87306 100644 --- a/plugins/notification/src/lib.rs +++ b/plugins/notification/src/lib.rs @@ -132,7 +132,7 @@ impl NotificationBuilder { self } - /// The sound resource name. Only available on mobile. + /// The sound resource name for the notification. pub fn sound(mut self, sound: impl Into) -> Self { self.data.sound.replace(sound.into()); self