import { ElMessage } from "element-plus"; import { clientRuntime, openFile, pickFiles, saveFile, type FileOutput, type FilePickerOptions, type SaveFileResult, } from "../runtime"; import { finishDesktopActivity, startDesktopActivity, updateDesktopActivity } from "../session/desktopActivityCenter"; const selectedFilesMessage = (count: number) => (count > 1 ? `已选择 ${count} 个文件` : "已选择 1 个文件"); type FileSaveActivityKind = "download" | "export"; export interface FileTaskFeedbackOptions { activityId?: string; kind?: FileSaveActivityKind; title?: string; pendingDetail?: string; completedDetail?: string; cancelledDetail?: string; } const desktopFileActivitiesEnabled = () => clientRuntime.capabilities().nativeFiles; const defaultSaveTitle = (kind: FileSaveActivityKind) => (kind === "export" ? "导出文件" : "保存文件"); export const pickFilesWithFeedback = async (options: FilePickerOptions = {}): Promise => { const files = await pickFiles(options); if (files.length) { ElMessage.success(selectedFilesMessage(files.length)); } return files; }; export const saveFileWithFeedback = async ( output: FileOutput, options: FileTaskFeedbackOptions = {}, ): Promise => { const kind = options.kind || "download"; if (!desktopFileActivitiesEnabled()) { const result = await saveFile(output); if (result === "cancelled") { ElMessage.info("已取消保存文件"); return result; } ElMessage.success(clientRuntime.capabilities().nativeFiles ? "文件已保存" : "文件下载已开始"); return result; } const activityId = options.activityId || startDesktopActivity({ kind, title: options.title || defaultSaveTitle(kind), detail: options.pendingDetail || "等待选择保存位置", }); updateDesktopActivity(activityId, { detail: options.pendingDetail || "等待选择保存位置", progress: 70 }); try { const result = await saveFile(output); if (result === "cancelled") { finishDesktopActivity(activityId, "cancelled", { detail: options.cancelledDetail || "已取消保存" }); return result; } finishDesktopActivity(activityId, "completed", { detail: options.completedDetail || "文件已保存" }); return result; } catch (error) { finishDesktopActivity(activityId, "failed", { detail: "文件保存失败" }); throw error; } }; export const openFileWithFeedback = async ( output: FileOutput, options: Omit = {}, ): Promise => { if (!desktopFileActivitiesEnabled()) { await openFile(output); ElMessage.success("文件已打开"); return; } const activityId = options.activityId || startDesktopActivity({ kind: "open", title: options.title || "打开文件", detail: options.pendingDetail || "正在准备文件", }); updateDesktopActivity(activityId, { detail: options.pendingDetail || "正在准备文件", progress: 70 }); try { await openFile(output); finishDesktopActivity(activityId, "completed", { detail: options.completedDetail || "已交给系统打开" }); } catch (error) { finishDesktopActivity(activityId, "failed", { detail: "文件打开失败" }); throw error; } };