From 568cb65cf32cc02e18bb11d5f32a6e2171ad341a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8C=97=E6=9E=B3?=
<7854742+wang_rumeng@user.noreply.gitee.com>
Date: Mon, 13 Oct 2025 20:19:49 +0800
Subject: [PATCH] =?UTF-8?q?loading=E5=8A=A8=E7=94=BB=E4=BB=A5=E5=8F=8A?=
=?UTF-8?q?=E9=94=99=E8=AF=AF=E5=B1=95=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/layout.tsx | 1 +
components/pages/work-flow/H5MediaViewer.tsx | 34 +-
components/pages/work-flow/RenderLoading.tsx | 448 ++++++++++++++++++
components/pages/work-flow/media-viewer.tsx | 26 +-
components/pages/work-flow/thumbnail-grid.tsx | 17 +-
iconfont/iconfont.css | 23 +
iconfont/iconfont.ttf | Bin 0 -> 2428 bytes
iconfont/iconfont.woff | Bin 0 -> 1664 bytes
iconfont/iconfont.woff2 | Bin 0 -> 1248 bytes
9 files changed, 518 insertions(+), 31 deletions(-)
create mode 100644 components/pages/work-flow/RenderLoading.tsx
create mode 100644 iconfont/iconfont.css
create mode 100644 iconfont/iconfont.ttf
create mode 100644 iconfont/iconfont.woff
create mode 100644 iconfont/iconfont.woff2
diff --git a/app/layout.tsx b/app/layout.tsx
index 9631a78..71bf208 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,5 +1,6 @@
'use client'
import './globals.css';
+import '@/iconfont/iconfont.css';
import { createContext, useContext, useEffect, useState } from 'react';
import { Providers } from '@/components/providers';
import { ConfigProvider, theme } from 'antd';
diff --git a/components/pages/work-flow/H5MediaViewer.tsx b/components/pages/work-flow/H5MediaViewer.tsx
index ec2cc51..3ce95a7 100644
--- a/components/pages/work-flow/H5MediaViewer.tsx
+++ b/components/pages/work-flow/H5MediaViewer.tsx
@@ -14,6 +14,7 @@ import { Drawer } from 'antd';
import { useSearchParams } from 'next/navigation';
import error_image from '@/public/assets/error.webp';
import { showDownloadOptionsModal } from './download-options-modal';
+import RenderLoading from './RenderLoading';
interface H5MediaViewerProps {
/** 任务对象,包含各阶段数据 */
@@ -150,9 +151,10 @@ export function H5MediaViewer({
return [...roles, ...scenes].map(item => ({
url: item?.url as string | undefined,
status: item?.status as number | undefined,
+ type: item?.type as string | undefined,
}));
}
- return [] as Array<{ url?: string; status?: number }>;
+ return [] as Array<{ url?: string; status?: number; type?: string }>;
}, [stage, taskObject.roles?.data, taskObject.scenes?.data]);
// 占位,避免未使用警告
@@ -266,18 +268,19 @@ export function H5MediaViewer({
- {status === 0 && (
-
Generating...
+ {(status === 0 || status === 2) && (
+
)}
- {status === 2 && (
+ {/* {status === 2 && (
Generate failed
- )}
- {status !== 0 && status !== 2 && (
-
Pending
- )}
+ )} */}
)}
@@ -315,15 +318,19 @@ export function H5MediaViewer({
- {status === 0 && (
-
Generating...
+ {(status === 0 || status === 2) && (
+
)}
- {status === 2 && (
+ {/* {status === 2 && (
Generate failed
- )}
+ )} */}
)}
@@ -544,8 +551,9 @@ export function H5MediaViewer({
)}
+
+
+ {/* Vinyl Record Container */}
+
+ {/* Record Half - Top */}
+
+ {/* Record grooves effect */}
+
+
+ {/* Scanner light */}
+
+
+ {/* Center label */}
+
+ {/* Pulsing core */}
+
+
+
+
+ {/* Record Half - Bottom */}
+
+ {/* Record grooves effect */}
+
+
+ {/* Scanner light */}
+
+
+ {/* Center label */}
+
+ {/* Pulsing core */}
+
+
+
+
+
+ {/* Tonearm */}
+
+ {/* Arm */}
+
+
+ {/* Head */}
+
+
+ {/* Pivot */}
+
+
+
+ {/* 加载/失败文案 */}
+
+ {loadingText}
+
+
+ >
+ );
+};
+
+export default RenderLoading;
+
diff --git a/components/pages/work-flow/media-viewer.tsx b/components/pages/work-flow/media-viewer.tsx
index d6ef89a..2c99514 100644
--- a/components/pages/work-flow/media-viewer.tsx
+++ b/components/pages/work-flow/media-viewer.tsx
@@ -18,8 +18,7 @@ import { VideoEditOverlay } from './video-edit/VideoEditOverlay';
import { EditPoint as EditPointType } from './video-edit/types';
import { isVideoModificationEnabled } from '@/lib/server-config';
import { useSearchParams } from 'next/navigation';
-import error_image from '@/public/assets/error.webp';
-import { AspectRatioValue } from '@/components/ChatInputBox/AspectRatioSelector';
+import RenderLoading from './RenderLoading';
interface MediaViewerProps {
taskObject: TaskObject;
@@ -573,14 +572,16 @@ export const MediaViewer = React.memo(function MediaViewer({
{taskObject.videos.data[currentSketchIndex].video_status !== 1 && (
{/* 生成中 */}
- {taskObject.videos.data[currentSketchIndex].video_status === 0 && (
- renderLoading()
+ {(taskObject.videos.data[currentSketchIndex].video_status === 0 || taskObject.videos.data[currentSketchIndex].video_status === 2) && (
+
)}
{/* 生成失败 */}
- {taskObject.videos.data[currentSketchIndex].video_status === 2 && (
+ {/* {taskObject.videos.data[currentSketchIndex].video_status === 2 && (

- {/* 文案 */}
Failed
@@ -588,7 +589,7 @@ export const MediaViewer = React.memo(function MediaViewer({
Violation of security policy. Please modify your prompt and regenerate.
- )}
+ )} */}
)}
@@ -778,14 +779,17 @@ export const MediaViewer = React.memo(function MediaViewer({
}}
>
{/* 状态 */}
- {currentSketch.status === 0 && (
- renderLoading()
+ {(currentSketch.status === 0 || currentSketch.status === 2) && (
+
)}
- {currentSketch.status === 2 && (
+ {/* {currentSketch.status === 2 && (
- )}
+ )} */}
{/* 只在生成过程中或没有分镜图片时使用ProgressiveReveal */}
{currentSketch.status === 1 && (
diff --git a/components/pages/work-flow/thumbnail-grid.tsx b/components/pages/work-flow/thumbnail-grid.tsx
index 4972520..12200c4 100644
--- a/components/pages/work-flow/thumbnail-grid.tsx
+++ b/components/pages/work-flow/thumbnail-grid.tsx
@@ -5,7 +5,6 @@ import { CircleAlert, Film } from 'lucide-react';
import { TaskObject } from '@/api/DTO/movieEdit';
import { getFirstFrame } from '@/utils/tools';
import { AspectRatioValue } from '@/components/ChatInputBox/AspectRatioSelector';
-import error_image from '@/public/assets/error.webp';
interface ThumbnailGridProps {
isDisabledFocus: boolean;
@@ -52,7 +51,7 @@ export function ThumbnailGrid({
const [scrollLeft, setScrollLeft] = useState(0);
const [isFocused, setIsFocused] = useState(false);
- // 监听当前选中索引变化,自动滚动到对应位置
+ // 监听当前选中索引变化,自动滚动到对应位置(居中显示)
useEffect(() => {
if (thumbnailsRef.current) {
const container = thumbnailsRef.current;
@@ -60,9 +59,13 @@ export function ThumbnailGrid({
if (currentSketchIndex >= 0 && currentSketchIndex < thumbnails.length) {
const thumbnail = thumbnails[currentSketchIndex] as HTMLElement;
- const containerLeft = container.getBoundingClientRect().left;
- const thumbnailLeft = thumbnail.getBoundingClientRect().left;
- const scrollPosition = container.scrollLeft + (thumbnailLeft - containerLeft);
+ const containerRect = container.getBoundingClientRect();
+ const thumbnailRect = thumbnail.getBoundingClientRect();
+
+ // 计算滚动位置:将缩略图居中显示
+ const containerCenter = containerRect.width / 2;
+ const thumbnailCenter = thumbnailRect.width / 2;
+ const scrollPosition = container.scrollLeft + (thumbnailRect.left - containerRect.left) - containerCenter + thumbnailCenter;
container.scrollTo({
left: scrollPosition,
@@ -266,7 +269,7 @@ export function ThumbnailGrid({
)}
{taskObject.videos.data[index].video_status === 2 && (
-

+
)}
@@ -340,7 +343,7 @@ export function ThumbnailGrid({
)}
{sketch.status === 2 && (
-

+
)}
{/* 只在生成过程中或没有分镜图片时使用ProgressiveReveal */}
diff --git a/iconfont/iconfont.css b/iconfont/iconfont.css
new file mode 100644
index 0000000..1473cf6
--- /dev/null
+++ b/iconfont/iconfont.css
@@ -0,0 +1,23 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 5039410 */
+ src: url('./iconfont.woff2?t=1760340285776') format('woff2'),
+ url('./iconfont.woff?t=1760340285776') format('woff'),
+ url('./iconfont.ttf?t=1760340285776') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-shipindiushibaojing:before {
+ content: "\e618";
+}
+
+.icon-tudiushi:before {
+ content: "\e717";
+}
+
diff --git a/iconfont/iconfont.ttf b/iconfont/iconfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..624634ef02f04bf6829e8fcf9a52cd689dde85f9
GIT binary patch
literal 2428
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
literal 0
HcmV?d00001
diff --git a/iconfont/iconfont.woff2 b/iconfont/iconfont.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..c68a25ea1892d6a72780552e721fd84e3a8d78a9
GIT binary patch
literal 1248
zcmV<61Rwi%Pew8T0RR9100iIw3jhEB0112m00ff&0RR9100000000000000000000
z0000SR0d!Gg9ZwQM1?*9HUcCA3=0SV1Rw>3X9q|dEC|RRk|ZVCDQ9vxKwY_yR}c^X
zu6^E@WM&ZyOb%rgq5=|TtB75Nt0OX^$0K=Ce?GnU3i;|y!Wdoh^TU_iFE(+Nw|ehH
zPte-6qX*y1Pwt#rE+2i_M#7#-YgahP{m9?To1X?YW!+gC@RTFSNmX2lM&ytXXyfu#Hb0n}G+m#+pXg1Z_l||eD73m`D
z3gCMD`S>j%Y)Pt2_Stf@m;rmwe4kV7?*Ah|ej_9aI69$1#@sV=#@>Gab{1)VE(@(~
zdP}OU6(Q|4_5VMyd}*xD`Hz=~n&{h+G1HpdDTNage5Yh+aR1j)qZ^2s0K{fw^jEg3
zSEvasrK4rO(6OaurF59tfY5Xj`BS8UeLsz3S{Ymqmm9YdtQ-gZqlh-bStkgz>gz}S
zw6!NNbO+%%pgWCXL$MTTq0=hvKnrm`8AC?V_?l7_gJ~0ld^AeTQ7BVMB&u6KK^QhZ
zUNw!+>m9L5ylcowylZlu!6ubig~_=&idr(iG?ABiyU;*WL4OEZ7a}UhMw#8S{V?
z9=z`ChEiS-Ebk*J2Tho$4&ClFWVm}jRK&Nq)s53WJzniFH*cg?)MqQ|ud`M=(M%e?
z!R}OJqgDGk(qZL8`fMj<6-lSDa^bpneNtCC+E&t+Z=PCN-SKz&=>>*#@=pl#xUc>H
zYD!VtQ}NSs+pe8oqo=Gg)X;&EIw3oEI6chx^tE0i7r3?r_6ln4hV6P4m^UH1onCBtqdvMdwi(k6HEo>KNq>vv?=n!6e#-0OXN
zW1qU2(5#OkX)*?~W|Q&4m<^RSi=ozR9kiOGczv5bDhp9sFkK%&=(Yw)r{|D$JH-p*
z0V;z&pw{glT5S#S-P%kK+EYU$Mhv9tA)l$ptTo}7Y6Id-BB?cHT9Bsmn1b;pX4O(D
zl99HHIeHD3fU8)@RwxoI@y|n|s6e$sF(Mkr7^<+E5o?;$c9j^qR04%G2nj