Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/notification-sound.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"notification": patch
"notification-js": patch
---

Added sound support for desktop notifications which was previously only available on mobile platforms.
18 changes: 14 additions & 4 deletions examples/api/src/views/Notifications.svelte
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
<script>
import { sendNotification } from '@tauri-apps/plugin-notification'
export let onMessage
let sound = ''
// send the notification directly
// the backend is responsible for checking the permission
function _sendNotification() {
new Notification('Notification title', {
body: 'This is the notification body'
sendNotification({
title: 'Notification title',
body: 'This is the notification body',
sound: sound || null
})
}
// alternatively, check the permission ourselves
function sendNotification() {
function triggerNotification() {
if (Notification.permission === 'default') {
Notification.requestPermission()
.then(function (response) {
Expand All @@ -29,6 +34,11 @@
}
</script>

<button class="btn" id="notification" on:click={sendNotification}>
<input
class="input grow"
placeholder="Notification sound..."
bind:value={sound}
/>
<button class="btn" id="notification" on:click={triggerNotification}>
Send test notification
</button>
39 changes: 39 additions & 0 deletions plugins/notification/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
8 changes: 7 additions & 1 deletion plugins/notification/guest-js/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
/**
Expand Down
20 changes: 20 additions & 0 deletions plugins/notification/src/desktop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ impl<R: Runtime> crate::NotificationBuilder<R> {
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)?;
Expand Down Expand Up @@ -102,6 +105,8 @@ mod imp {
title: Option<String>,
/// The notification icon.
icon: Option<String>,
/// The notification sound.
sound: Option<String>,
/// The notification identifier
identifier: String,
}
Expand Down Expand Up @@ -136,6 +141,13 @@ mod imp {
self
}

/// Sets the notification sound file.
#[must_use]
pub fn sound(mut self, sound: impl Into<String>) -> Self {
self.sound = Some(sound.into());
self
}

/// Shows the notification.
///
/// # Examples
Expand Down Expand Up @@ -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()?;
Expand Down Expand Up @@ -250,6 +265,7 @@ mod imp {
}
}

/// Shows the notification on Windows 7.
#[cfg(all(windows, feature = "windows7-compat"))]
fn notify_win7<R: tauri::Runtime>(self, app: &tauri::AppHandle<R>) -> crate::Result<()> {
let app_ = app.clone();
Expand All @@ -264,6 +280,10 @@ mod imp {
if let Some(icon) = app_.default_window_icon() {
notification.icon(icon.rgba().to_vec(), icon.width(), icon.height());
}
// Enable sound if specified
if self.sound.is_some() {
notification.sound(true);
}
let _ = notification.show();
});

Expand Down
2 changes: 1 addition & 1 deletion plugins/notification/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ impl<R: Runtime> NotificationBuilder<R> {
self
}

/// The sound resource name. Only available on mobile.
/// The sound resource name for the notification.
pub fn sound(mut self, sound: impl Into<String>) -> Self {
self.data.sound.replace(sound.into());
self
Expand Down
Loading