import { singleton } from 'tsyringe'; import { open, save } from '@tauri-apps/plugin-dialog'; import type { IDialog, OpenDialogOptions, SaveDialogOptions } from '@esengine/editor-core'; export interface ConfirmDialogData { title: string; message: string; confirmText: string; cancelText: string; onConfirm: () => void; onCancel?: () => void; } export interface IDialogExtended extends IDialog { setConfirmCallback(callback: (data: ConfirmDialogData) => void): void; setLocale(locale: string): void; } @singleton() export class TauriDialogService implements IDialogExtended { private showConfirmCallback?: (data: ConfirmDialogData) => void; private locale: string = 'zh'; setConfirmCallback(callback: (data: ConfirmDialogData) => void): void { this.showConfirmCallback = callback; } setLocale(locale: string): void { this.locale = locale; } async openDialog(options: OpenDialogOptions): Promise { const result = await open({ multiple: options.multiple || false, directory: options.directory || false, filters: options.filters, defaultPath: options.defaultPath, title: options.title }); return result; } async saveDialog(options: SaveDialogOptions): Promise { const result = await save({ filters: options.filters, defaultPath: options.defaultPath, title: options.title }); return result; } async showMessage(title: string, messageText: string, type: 'info' | 'warning' | 'error' = 'info'): Promise { console.warn('[TauriDialogService] showMessage not implemented with custom UI, use notification instead'); } async showConfirm(title: string, messageText: string): Promise { return new Promise((resolve) => { if (this.showConfirmCallback) { let resolved = false; const handleResolve = (result: boolean) => { if (!resolved) { resolved = true; resolve(result); } }; const confirmText = this.locale === 'zh' ? '确定' : 'Confirm'; const cancelText = this.locale === 'zh' ? '取消' : 'Cancel'; this.showConfirmCallback({ title, message: messageText, confirmText, cancelText, onConfirm: () => handleResolve(true), onCancel: () => handleResolve(false) }); } else { console.warn('[TauriDialogService] showConfirmCallback not set'); resolve(false); } }); } }