From 3f21f39584897c7d37f6321b214dbfd09197ed98 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 1 Mar 2026 23:22:25 +0800 Subject: [PATCH] refactor(dialog): handle `okLabel` in js side (#3295) * refactor(dialog): handle `okLabel` in js side * Allow unused instead of `cfg(desktop)` --- examples/api/src/views/Dialog.svelte | 2 +- plugins/dialog/api-iife.js | 2 +- plugins/dialog/guest-js/index.ts | 9 +++++-- plugins/dialog/src/commands.rs | 38 ++++++++-------------------- plugins/dialog/src/lib.rs | 4 +-- 5 files changed, 22 insertions(+), 33 deletions(-) diff --git a/examples/api/src/views/Dialog.svelte b/examples/api/src/views/Dialog.svelte index fb6bae49f..7e89e36ff 100644 --- a/examples/api/src/views/Dialog.svelte +++ b/examples/api/src/views/Dialog.svelte @@ -43,7 +43,7 @@ } async function msg() { - await message("Tauri is awesome!"); + await message("Tauri is awesome!").then((res) => onMessage(res)); } async function msgCustom(result) { diff --git a/plugins/dialog/api-iife.js b/plugins/dialog/api-iife.js index 30bc8c91d..d82e4234f 100644 --- a/plugins/dialog/api-iife.js +++ b/plugins/dialog/api-iife.js @@ -1 +1 @@ -if("__TAURI__"in window){var __TAURI_PLUGIN_DIALOG__=function(n){"use strict";async function e(n,e={},t){return window.__TAURI_INTERNALS__.invoke(n,e,t)}function t(n){if(void 0!==n)return"string"==typeof n?n:"ok"in n&&"cancel"in n?{OkCancelCustom:[n.ok,n.cancel]}:"yes"in n&&"no"in n&&"cancel"in n?{YesNoCancelCustom:[n.yes,n.no,n.cancel]}:"ok"in n?{OkCustom:n.ok}:void 0}async function o(n,o){return await e("plugin:dialog|message",{message:n,title:o?.title,kind:o?.kind,okButtonLabel:o?.okLabel,buttons:t(o?.buttons)})}return"function"==typeof SuppressedError&&SuppressedError,n.ask=async function(n,e){const t="string"==typeof e?{title:e}:e,i=t?.okLabel||t?.cancelLabel,a=t?.okLabel??"Yes";return await o(n,{title:t?.title,kind:t?.kind,buttons:i?{ok:a,cancel:t.cancelLabel??"No"}:"YesNo"})===a},n.confirm=async function(n,e){const t="string"==typeof e?{title:e}:e,i=t?.okLabel||t?.cancelLabel,a=t?.okLabel??"Ok";return await o(n,{title:t?.title,kind:t?.kind,buttons:i?{ok:a,cancel:t.cancelLabel??"Cancel"}:"OkCancel"})===a},n.message=async function(n,e){return o(n,"string"==typeof e?{title:e}:e)},n.open=async function(n={}){return"object"==typeof n&&Object.freeze(n),await e("plugin:dialog|open",{options:n})},n.save=async function(n={}){return"object"==typeof n&&Object.freeze(n),await e("plugin:dialog|save",{options:n})},n}({});Object.defineProperty(window.__TAURI__,"dialog",{value:__TAURI_PLUGIN_DIALOG__})} +if("__TAURI__"in window){var __TAURI_PLUGIN_DIALOG__=function(n){"use strict";async function e(n,e={},t){return window.__TAURI_INTERNALS__.invoke(n,e,t)}function t(n){if(void 0!==n)return"string"==typeof n?n:"ok"in n&&"cancel"in n?{OkCancelCustom:[n.ok,n.cancel]}:"yes"in n&&"no"in n&&"cancel"in n?{YesNoCancelCustom:[n.yes,n.no,n.cancel]}:"ok"in n?{OkCustom:n.ok}:void 0}async function o(n,o){return await e("plugin:dialog|message",{message:n,title:o?.title,kind:o?.kind,buttons:t(o?.buttons)})}return"function"==typeof SuppressedError&&SuppressedError,n.ask=async function(n,e){const t="string"==typeof e?{title:e}:e,i=t?.okLabel||t?.cancelLabel,a=t?.okLabel??"Yes";return await o(n,{title:t?.title,kind:t?.kind,buttons:i?{ok:a,cancel:t.cancelLabel??"No"}:"YesNo"})===a},n.confirm=async function(n,e){const t="string"==typeof e?{title:e}:e,i=t?.okLabel||t?.cancelLabel,a=t?.okLabel??"Ok";return await o(n,{title:t?.title,kind:t?.kind,buttons:i?{ok:a,cancel:t.cancelLabel??"Cancel"}:"OkCancel"})===a},n.message=async function(n,e){const t="string"==typeof e?{title:e}:e;return t&&!t.buttons&&t.okLabel&&(t.buttons={ok:t.okLabel}),o(n,t)},n.open=async function(n={}){return"object"==typeof n&&Object.freeze(n),await e("plugin:dialog|open",{options:n})},n.save=async function(n={}){return"object"==typeof n&&Object.freeze(n),await e("plugin:dialog|save",{options:n})},n}({});Object.defineProperty(window.__TAURI__,"dialog",{value:__TAURI_PLUGIN_DIALOG__})} diff --git a/plugins/dialog/guest-js/index.ts b/plugins/dialog/guest-js/index.ts index f51a4f9f7..90d6b26ae 100644 --- a/plugins/dialog/guest-js/index.ts +++ b/plugins/dialog/guest-js/index.ts @@ -405,12 +405,14 @@ async function save(options: SaveDialogOptions = {}): Promise { */ export type MessageDialogResult = 'Yes' | 'No' | 'Ok' | 'Cancel' | (string & {}) -async function messageCommand(message: string, options?: MessageDialogOptions) { +async function messageCommand( + message: string, + options?: Omit +) { return await invoke('plugin:dialog|message', { message, title: options?.title, kind: options?.kind, - okButtonLabel: options?.okLabel, buttons: buttonsToRust(options?.buttons) }) } @@ -437,6 +439,9 @@ async function message( options?: string | MessageDialogOptions ): Promise { const opts = typeof options === 'string' ? { title: options } : options + if (opts && !opts.buttons && opts.okLabel) { + opts.buttons = { ok: opts.okLabel } + } return messageCommand(message, opts) } diff --git a/plugins/dialog/src/commands.rs b/plugins/dialog/src/commands.rs index eb2932a44..2564a1aa0 100644 --- a/plugins/dialog/src/commands.rs +++ b/plugins/dialog/src/commands.rs @@ -9,8 +9,8 @@ use tauri::{command, Manager, Runtime, State, Window}; use tauri_plugin_fs::FsExt; use crate::{ - Dialog, FileAccessMode, FileDialogBuilder, FilePath, MessageDialogBuilder, - MessageDialogButtons, MessageDialogKind, MessageDialogResult, PickerMode, Result, + Dialog, FileAccessMode, FileDialogBuilder, FilePath, MessageDialogButtons, MessageDialogKind, + MessageDialogResult, PickerMode, Result, }; #[derive(Serialize)] @@ -258,17 +258,20 @@ pub(crate) async fn save( Ok(path.map(|p| p.simplified())) } -fn message_dialog( - #[allow(unused_variables)] window: Window, +#[command] +pub(crate) async fn message( + #[allow(unused)] window: Window, dialog: State<'_, Dialog>, title: Option, message: String, kind: Option, - buttons: MessageDialogButtons, -) -> MessageDialogBuilder { + buttons: Option, +) -> Result { let mut builder = dialog.message(message); - builder = builder.buttons(buttons); + if let Some(buttons) = buttons { + builder = builder.buttons(buttons); + } if let Some(title) = title { builder = builder.title(title); @@ -283,24 +286,5 @@ fn message_dialog( builder = builder.kind(kind); } - builder -} - -#[command] -pub(crate) async fn message( - window: Window, - dialog: State<'_, Dialog>, - title: Option, - message: String, - kind: Option, - ok_button_label: Option, - buttons: Option, -) -> Result { - let buttons = buttons.unwrap_or(if let Some(ok_button_label) = ok_button_label { - MessageDialogButtons::OkCustom(ok_button_label) - } else { - MessageDialogButtons::Ok - }); - - Ok(message_dialog(window, dialog, title, message, kind, buttons).blocking_show_with_result()) + Ok(builder.blocking_show_with_result()) } diff --git a/plugins/dialog/src/lib.rs b/plugins/dialog/src/lib.rs index 7f8a9d571..5d0c40726 100644 --- a/plugins/dialog/src/lib.rs +++ b/plugins/dialog/src/lib.rs @@ -247,8 +247,8 @@ impl MessageDialogBuilder { dialog, title: title.into(), message: message.into(), - kind: Default::default(), - buttons: Default::default(), + kind: MessageDialogKind::default(), + buttons: MessageDialogButtons::default(), #[cfg(desktop)] parent: None, }