55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { useState } from "react";
|
|
import type { ScriptItem } from "~/services/api";
|
|
import type { ScriptsPendingConfirm } from "./ScriptsPendingConfirm";
|
|
|
|
type DeleteActions = {
|
|
deleteScript: (script: ScriptItem) => Promise<void>;
|
|
deleteDataResource: (resourceId: string) => Promise<void>;
|
|
deleteDirectory: (path: string) => Promise<void>;
|
|
closeTab: (
|
|
id: string,
|
|
event?: { stopPropagation: () => void },
|
|
options?: { discardDirty?: boolean },
|
|
) => Promise<boolean>;
|
|
};
|
|
|
|
export function useScriptsPendingConfirm(
|
|
scripts: ScriptItem[],
|
|
actions: DeleteActions,
|
|
) {
|
|
const [pendingConfirm, setPendingConfirm] =
|
|
useState<ScriptsPendingConfirm | null>(null);
|
|
|
|
const requestCloseTab = async (
|
|
scriptId: string,
|
|
event?: { stopPropagation: () => void },
|
|
) => {
|
|
const closed = await actions.closeTab(scriptId, event);
|
|
if (closed) return;
|
|
const name =
|
|
scripts.find((s) => s.script_id === scriptId)?.script_name ?? "该脚本";
|
|
setPendingConfirm({ kind: "close-tab", id: scriptId, name });
|
|
};
|
|
|
|
const handleConfirm = async () => {
|
|
if (!pendingConfirm) return;
|
|
const target = pendingConfirm;
|
|
setPendingConfirm(null);
|
|
if (target.kind === "script") await actions.deleteScript(target.script);
|
|
else if (target.kind === "resource") {
|
|
await actions.deleteDataResource(target.id);
|
|
} else if (target.kind === "directory") {
|
|
await actions.deleteDirectory(target.path);
|
|
} else {
|
|
await actions.closeTab(target.id, undefined, { discardDirty: true });
|
|
}
|
|
};
|
|
|
|
return {
|
|
pendingConfirm,
|
|
setPendingConfirm,
|
|
requestCloseTab,
|
|
handleConfirm,
|
|
};
|
|
}
|