diff --git a/src/layouts/globalPromptPanel/composerSections/ActionMimicUploadPromptSection.tsx b/src/layouts/globalPromptPanel/composerSections/ActionMimicUploadPromptSection.tsx index 2f89bb0..40edb6a 100644 --- a/src/layouts/globalPromptPanel/composerSections/ActionMimicUploadPromptSection.tsx +++ b/src/layouts/globalPromptPanel/composerSections/ActionMimicUploadPromptSection.tsx @@ -1,8 +1,9 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState, type ChangeEvent } from "react"; -import { Dropdown, Input } from "@arco-design/web-react"; +import { Dropdown, Message } from "@arco-design/web-react"; import { useTranslation } from "react-i18next"; import { nanoid } from "nanoid"; import { getTemplateVideoMaterialList } from "../../../api/api"; +import { uploadComposerImage } from "../composerCommon"; import "./ActionMimicUploadPromptSection.scss"; export type ComposerMediaType = "image" | "video" | "audio"; @@ -103,6 +104,7 @@ export function ActionMimicUploadPromptSection({ const actionMimicUploadInputRef = useRef(null); const [exampleDropdownOpen, setExampleDropdownOpen] = useState(false); const [exampleLoading, setExampleLoading] = useState(false); + const [exampleUploadLoading, setExampleUploadLoading] = useState(false); const [exampleList, setExampleList] = useState([]); const [selectedExampleItem, setSelectedExampleItem] = useState(null); const [customUploadExample, setCustomUploadExample] = useState<{ @@ -135,7 +137,7 @@ export function ActionMimicUploadPromptSection({ useEffect(() => { // 组件卸载时释放临时上传示例的 object URL,避免内存泄漏。 return () => { - if (customUploadExample?.url) { + if (customUploadExample?.url?.startsWith("blob:")) { URL.revokeObjectURL(customUploadExample.url); } }; @@ -219,31 +221,28 @@ export function ActionMimicUploadPromptSection({ const file = evt.target.files?.[0]; evt.target.value = ""; if (!file || !file.type.startsWith("video/")) return; - const duration = await resolveVideoDuration(file); - const videoUrl = URL.createObjectURL(file); - const uploadId = nanoid(); - const formattedDuration = `00:${String(duration).padStart(2, "0")}`; - setCustomUploadExample((prev) => { - if (prev?.url) { - URL.revokeObjectURL(prev.url); - } - return { + setExampleUploadLoading(true); + try { + const [duration, remoteUrl] = await Promise.all([resolveVideoDuration(file), uploadComposerImage(file)]); + const uploadId = nanoid(); + const formattedDuration = `00:${String(duration).padStart(2, "0")}`; + const uploadedItem = { id: uploadId, name: file.name ?? null, - url: videoUrl, + url: remoteUrl, duration, displayDuration: formattedDuration, - type: "用户上传素材", + type: "用户上传素材" as const, }; - }); - setSelectedExampleItem({ - id: uploadId, - name: file.name ?? null, - url: videoUrl, - duration, - displayDuration: formattedDuration, - type: "用户上传素材", - }); + setCustomUploadExample(uploadedItem); + setSelectedExampleItem(uploadedItem); + } catch { + Message.error(t("composer.uploadFailed")); + } finally { + if (isMountedRef.current) { + setExampleUploadLoading(false); + } + } }; const onExampleItemClick = useCallback((item: ActionMimicSelectedItem) => { setSelectedExampleItem(item); @@ -265,7 +264,12 @@ export function ActionMimicUploadPromptSection({

{t("composer.actionMimic.exampleTitle", { defaultValue: "查看示例" })}

- diff --git a/vite.config.mts b/vite.config.mts index e7fe900..728182f 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -24,8 +24,8 @@ export default defineConfig(({ mode }) => { proxy: isDev ? { "/api_client": { - // target: "http://192.168.77.111:8080/", - target: "https://popi.yuanzoo.cn/", + target: "http://192.168.77.111:8080/", + // target: "https://popi.yuanzoo.cn/", secure: false, changeOrigin: true, },