返回 AiToEarn
useUploadSync.ts
1 /**
2 * 上传结果同步 Hook
3 * 处理上传任务完成后同步 ossUrl 到发布参数
4 */
5
6 import type {
7 UploadCacheItem,
8 UploadTask,
9 } from '@/components/PublishDialog/compoents/PublishManageUpload/usePublishManageUpload.type'
10 import type { PubItem } from '@/components/PublishDialog/publishDialog.type'
11
12 import { useEffect } from 'react'
13
14 interface UseUploadSyncParams {
15 pubListChoosed: PubItem[]
16 tasks: Record<string, UploadTask>
17 md5Cache: Record<string, UploadCacheItem>
18 setPubListChoosed: (list: PubItem[]) => void
19 }
20
21 /**
22 * 上传结果同步 Hook
23 * 监听上传任务完成,将 ossUrl 同步到发布参数中
24 */
25 export function useUploadSync({
26 pubListChoosed,
27 tasks,
28 md5Cache,
29 setPubListChoosed,
30 }: UseUploadSyncParams) {
31 useEffect(() => {
32 // 如果没有选中的账号,直接返回
33 if (pubListChoosed.length === 0) {
34 return
35 }
36
37 let hasChanges = false
38
39 const newPubList = pubListChoosed.map((v) => {
40 const video = v.params.video
41 const images = v.params.images
42 let itemChanged = false
43 let newVideo = video
44 let newImages = images
45
46 // 视频匹配
47 if (video) {
48 // 如果视频本身没有ossUrl,从上传任务中获取
49 if (!video.ossUrl && video.uploadTaskIds?.video) {
50 const task = tasks[video.uploadTaskIds.video]
51 if (task?.md5 && md5Cache[task.md5]?.ossUrl) {
52 itemChanged = true
53 hasChanges = true
54 newVideo = {
55 ...video,
56 ossUrl: md5Cache[task.md5].ossUrl,
57 }
58 }
59 }
60
61 // 如果封面没有ossUrl,从上传任务中获取
62 if (newVideo && !newVideo.cover?.ossUrl && video.uploadTaskIds?.cover) {
63 const task = tasks[video.uploadTaskIds.cover]
64 if (task?.md5 && md5Cache[task.md5]?.ossUrl) {
65 itemChanged = true
66 hasChanges = true
67 newVideo = {
68 ...newVideo,
69 cover: {
70 ...newVideo.cover,
71 ossUrl: md5Cache[task.md5].ossUrl,
72 },
73 }
74 }
75 }
76 }
77
78 // 图片匹配
79 if (images && images.length > 0) {
80 let imagesChanged = false
81 newImages = images.map((img) => {
82 // 只有当图片没有ossUrl且有uploadTaskId时,才从上传任务中获取
83 // AI生成的图片已经有ossUrl,不需要从上传任务获取
84 if (!img.ossUrl && img.uploadTaskId && tasks[img.uploadTaskId]) {
85 const taskMd5 = tasks[img.uploadTaskId].md5
86 if (taskMd5 && md5Cache[taskMd5]?.ossUrl) {
87 imagesChanged = true
88 return { ...img, ossUrl: md5Cache[taskMd5].ossUrl }
89 }
90 }
91 return img
92 })
93
94 if (imagesChanged) {
95 itemChanged = true
96 hasChanges = true
97 }
98 else {
99 // 如果图片没有变化,保持原引用
100 newImages = images
101 }
102 }
103
104 // 只有当该项有变化时才创建新对象
105 if (itemChanged) {
106 return {
107 ...v,
108 params: {
109 ...v.params,
110 video: newVideo,
111 images: newImages,
112 },
113 }
114 }
115
116 return v
117 })
118
119 // 只有在数据真正变化时才更新 state
120 if (hasChanges) {
121 setPubListChoosed(newPubList)
122 }
123 }, [pubListChoosed, md5Cache, tasks, setPubListChoosed])
124 }
125
125 lines TYPESCRIPT