style: Prettier 格式化修复
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 30s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m2s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m42s
AI Code Review / AI Code Review (pull_request) Failing after 1m49s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m13s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 2m15s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m1s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m52s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m12s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 9s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Waiting to run
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 21s

This commit is contained in:
小虾前端 Agent
2026-08-18 02:04:02 +08:00
parent 7065c93cd3
commit de8f06058c
5 changed files with 14 additions and 27 deletions
+5 -2
View File
@@ -93,8 +93,11 @@ const GeneratePage: React.FC = () => {
[materialMode, smartSelectedIds, selectedMaterials],
)
const previewAssetsEnabled = currentStep >= 4 && previewAssetIds.length > 0
const { assets: previewAssets, loading: previewAssetsLoading, ready: previewAssetsReady } =
usePreviewAssets(previewAssetIds, previewAssetsEnabled)
const {
assets: previewAssets,
loading: previewAssetsLoading,
ready: previewAssetsReady,
} = usePreviewAssets(previewAssetIds, previewAssetsEnabled)
/* ── 当前模板对象(传给前端预览播放器) ── */
const currentTemplate = useMemo(
@@ -4,11 +4,7 @@
* 替代后端 FFmpeg 渲染预览,实现真正的实时预览
*/
import React, { useMemo, useCallback, useState, useRef, useEffect } from "react"
import {
PlayCircleOutlined,
PauseCircleOutlined,
SoundOutlined,
} from "@ant-design/icons"
import { PlayCircleOutlined, PauseCircleOutlined, SoundOutlined } from "@ant-design/icons"
import type { AssetItem } from "@/api/assets"
import type { EditingTemplate } from "@/api/editing-planner"
import { useSegmentScheduler, type PlaybackSegment } from "../hooks/useSegmentScheduler"
@@ -75,10 +71,7 @@ const FrontendPreviewPlayer: React.FC<FrontendPreviewPlayerProps> = ({
ready,
}) => {
// 构建播放片段
const segments = useMemo(
() => buildPlaybackSegments(assets, template),
[assets, template],
)
const segments = useMemo(() => buildPlaybackSegments(assets, template), [assets, template])
const {
isPlaying,
@@ -149,7 +142,9 @@ const FrontendPreviewPlayer: React.FC<FrontendPreviewPlayerProps> = ({
if (!canPlay) {
return (
<div className="xx-preview-empty">
<PlayCircleOutlined style={{ fontSize: 48, color: "var(--text-tertiary)", marginBottom: 12 }} />
<PlayCircleOutlined
style={{ fontSize: 48, color: "var(--text-tertiary)", marginBottom: 12 }}
/>
<p className="xx-preview-empty-title"></p>
<p className="xx-preview-empty-desc"></p>
</div>
@@ -197,11 +192,7 @@ const FrontendPreviewPlayer: React.FC<FrontendPreviewPlayerProps> = ({
transition: "opacity 0.2s",
}}
>
{isEnded ? (
<PlayCircleOutlined />
) : (
<PlayCircleOutlined />
)}
{isEnded ? <PlayCircleOutlined /> : <PlayCircleOutlined />}
</button>
)}
@@ -165,9 +165,7 @@ export const PreviewVideoPanel: React.FC<PreviewVideoPanelProps> = ({
<div className="xx-generate-preview">
<div className="xx-preview-header">
<h3></h3>
{assetsReady && assets.length > 0 && (
<span className="xx-preview-badge"></span>
)}
{assetsReady && assets.length > 0 && <span className="xx-preview-badge"></span>}
</div>
{/* 加载中 */}
@@ -58,10 +58,7 @@ interface UsePreviewAssetsReturn {
/**
* usePreviewAssets — 加载选中素材的视频文件信息
*/
export function usePreviewAssets(
assetIds: string[],
enabled: boolean,
): UsePreviewAssetsReturn {
export function usePreviewAssets(assetIds: string[], enabled: boolean): UsePreviewAssetsReturn {
const [assets, setAssets] = useState<AssetItem[]>([])
const [loading, setLoading] = useState(false)
const [ready, setReady] = useState(false)
@@ -82,9 +82,7 @@ function buildTimeline(segments: PlaybackSegment[]): number[] {
/**
* useSegmentScheduler — 素材片段调度器
*/
export function useSegmentScheduler(
segments: PlaybackSegment[],
): SegmentSchedulerState {
export function useSegmentScheduler(segments: PlaybackSegment[]): SegmentSchedulerState {
const videoRef = useRef<HTMLVideoElement | null>(null)
const [isPlaying, setIsPlaying] = useState(false)
const [currentTime, setCurrentTime] = useState(0)