Files
UHD_Media_Tool/apps/web/app/components/browser/resource-download.tsx
T

86 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { BrowserResourceResult, BrowserSessionView } from "@umt/contracts";
import { Download, Settings2 } from "lucide-react";
import { useState } from "react";
import { Link } from "react-router";
import { toast } from "sonner";
import { useSubmitRelease } from "~/api/releases.ts";
import { ManualDownloadDialog } from "~/components/downloads/manual-download-dialog.tsx";
import { Button } from "~/components/ui/button.tsx";
import { workbenchResource } from "~/components/workbench/download-dialog.tsx";
import { apiData, errorMessage } from "~/lib/api.ts";
/** 控件位于 iframe/截图外;直接解析当前详情页并交给共同手动下载入口。 */
export function ResourceDownload({ session }: { session: BrowserSessionView }) {
const [busy, setBusy] = useState(false);
const [resource, setResource] = useState<BrowserResourceResult | null>(null);
const [open, setOpen] = useState(false);
const [unrecognized, setUnrecognized] = useState(false);
const [planId, setPlanId] = useState<string | null>(null);
const submit = useSubmitRelease();
const prepare = async (options: boolean) => {
setBusy(true);
try {
const r = await apiData<BrowserResourceResult>("/browser/sessions/{id}/resource", {
method: "POST",
pathParams: { id: session.id },
body: {},
});
setResource(r);
setUnrecognized(false);
if (options) setOpen(true);
else {
const result = await submit.mutateAsync({
sourceReleaseId: r.release.id,
importMode: "normal",
replacementAssetIds: [],
});
if (result.requiresConfirmation) {
setUnrecognized(true);
setOpen(true);
} else if (result.submitted) {
setPlanId(result.plan?.id ?? null);
toast.success("已提交下载");
} else toast.warning(result.rejected.map((v) => v.message).join(";") || "没有提交");
}
} catch (e) {
toast.error(errorMessage(e));
} finally {
setBusy(false);
}
};
return (
<>
<div className="flex flex-wrap items-center gap-2">
<Button size="sm" disabled={busy || session.controller === "closed"} onClick={() => void prepare(false)}>
<Download />
{busy ? "提交中…" : "下载当前资源"}
</Button>
<Button
size="sm"
variant="outline"
disabled={busy || session.controller === "closed"}
onClick={() => void prepare(true)}
>
<Settings2 />
下载选项
</Button>
{planId ? (
<Link className="text-caption underline" to={`/console/downloads?plan=${planId}`}>
查看下载任务
</Link>
) : null}
</div>
{resource ? (
<ManualDownloadDialog
key={resource.release.id}
resource={workbenchResource(resource.release)}
open={open}
onOpenChange={setOpen}
initialUnrecognized={unrecognized}
submit={(options) => submit.mutateAsync({ ...options, sourceReleaseId: resource.release.id })}
/>
) : null}
</>
);
}