* experimenting... Signed-off-by: BestCodes <106822363+The-Best-Codes@users.noreply.github.com> * omit unconfirmed fact from .changes Signed-off-by: BestCodes <106822363+The-Best-Codes@users.noreply.github.com> * fix(notification): send untracked Linux notifications on the shared connection Holding notify-rust's handle with `on_close` blocked an async runtime worker until the server closed the notification, and opened a D-Bus connection per notification. Since GNOME keeps notifications in its tray, a handful of them could stall every async task of the app. Send every notification on the connection the plugin already keeps open for its action listener instead: it keeps the sender's name alive for GNOME at the cost of a single connection and thread, and the listener runs the `on_close` callbacks. * fix(notification): offer `on_close` on the BSDs too The BSDs share the D-Bus implementation with Linux, including the GNOME issue, so gate `NotificationBuilder::on_close` like the rest of that implementation and document when the callback runs. * fix(notification): run `on_close` without the tracker lock held The callback ran on the listener thread while the guard of the callback map was alive, and a panic in it ended that thread, which then reported no action of any notification for the rest of the app's life. Take the callback out of the map before running it and contain its panics. * fix(notification): use the covector package names in the change files `tauri-plugin-notification` and `@tauri-apps/plugin-notification` are not packages of .changes/config.json, so covector refused the change file. Use `notification` and `notification-js`, and record the new `on_close` API as a feature of its own. Also let `on_close` take an `FnOnce`, since it runs at most once. --------- Signed-off-by: BestCodes <106822363+The-Best-Codes@users.noreply.github.com> Co-authored-by: Lucas Nogueira <lucas@tauri.app>
Send message notifications (brief auto-expiring OS window element) to your user. Can also be used with the Notification Web API.
| Platform | Supported |
|---|---|
| Linux | ✓ |
| Windows | ✓ |
| macOS | ✓ |
| Android | ✓ |
| iOS | ✓ |
Install
This plugin requires a Rust version of at least 1.90
There are three general methods of installation that we can recommend.
- Use crates.io and npm (easiest, and requires you to trust that our publishing pipeline worked)
- Pull sources directly from Github using git tags / revision hashes (most secure)
- Git submodule install this repo in your tauri project and then use file protocol to ingest the source (most secure, but inconvenient to use)
Install the Core plugin by adding the following to your Cargo.toml file:
src-tauri/Cargo.toml
[dependencies]
tauri-plugin-notification = "2.0.0"
# alternatively with Git:
tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
You can install the JavaScript Guest bindings using your preferred JavaScript package manager:
pnpm add @tauri-apps/plugin-notification
# or
npm add @tauri-apps/plugin-notification
# or
yarn add @tauri-apps/plugin-notification
Usage
First you need to register the core plugin with Tauri:
src-tauri/src/lib.rs
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_notification::init())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
Then you need to add the permissions to your capabilities file:
src-tauri/capabilities/main.json
{
...
"permissions": [
...
"notification:default"
],
...
}
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
import {
isPermissionGranted,
requestPermission,
sendNotification
} from '@tauri-apps/plugin-notification'
async function checkPermission() {
if (!(await isPermissionGranted())) {
return (await requestPermission()) === 'granted'
}
return true
}
export async function enqueueNotification(title, body) {
if (!(await checkPermission())) {
return
}
sendNotification({ title, body })
}
Notification with Sound
You can add sound to your notifications on all platforms (desktop and mobile):
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.
Partners
|
|
For the complete list of sponsors please visit our website and Open Collective.
License
Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy.
MIT or MIT/Apache 2.0 where applicable.
