97 lines
3.2 KiB
TypeScript
97 lines
3.2 KiB
TypeScript
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<File[]> => {
|
|
const files = await pickFiles(options);
|
|
if (files.length) {
|
|
ElMessage.success(selectedFilesMessage(files.length));
|
|
}
|
|
return files;
|
|
};
|
|
|
|
export const saveFileWithFeedback = async (
|
|
output: FileOutput,
|
|
options: FileTaskFeedbackOptions = {},
|
|
): Promise<SaveFileResult> => {
|
|
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<FileTaskFeedbackOptions, "kind"> = {},
|
|
): Promise<void> => {
|
|
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;
|
|
}
|
|
};
|