feat(desktop): 收口桌面工作台视觉与活动反馈
This commit is contained in:
@@ -8,9 +8,25 @@ import {
|
||||
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) {
|
||||
@@ -19,17 +35,62 @@ export const pickFilesWithFeedback = async (options: FilePickerOptions = {}): Pr
|
||||
return files;
|
||||
};
|
||||
|
||||
export const saveFileWithFeedback = async (output: FileOutput): Promise<SaveFileResult> => {
|
||||
const result = await saveFile(output);
|
||||
if (result === "cancelled") {
|
||||
ElMessage.info("已取消保存文件");
|
||||
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;
|
||||
}
|
||||
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): Promise<void> => {
|
||||
await openFile(output);
|
||||
ElMessage.success("文件已打开");
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user