diff --git a/frontend/src/features/home/model/useGeneratedVideos.ts b/frontend/src/features/home/model/useGeneratedVideos.ts index b3fdf6f..3ca8c39 100644 --- a/frontend/src/features/home/model/useGeneratedVideos.ts +++ b/frontend/src/features/home/model/useGeneratedVideos.ts @@ -12,7 +12,7 @@ interface GeneratedVideo { } interface UseGeneratedVideosOptions { - + storageKey: string; selectedVideoId: string | null; setSelectedVideoId: React.Dispatch>; setGeneratedVideo: React.Dispatch>; @@ -20,7 +20,7 @@ interface UseGeneratedVideosOptions { } export const useGeneratedVideos = ({ - + storageKey, selectedVideoId, setSelectedVideoId, setGeneratedVideo, @@ -45,6 +45,8 @@ export const useGeneratedVideos = ({ if (preferVideoId === "__latest__") { setSelectedVideoId(videos[0].id); setGeneratedVideo(resolveMediaUrl(videos[0].path)); + // 写入跨页面共享标记,让另一个页面也能感知最新生成的视频 + localStorage.setItem(`vigent_${storageKey}_latestGeneratedVideoId`, videos[0].id); } else { const found = videos.find(v => v.id === preferVideoId); if (found) { diff --git a/frontend/src/features/home/model/useHomeController.ts b/frontend/src/features/home/model/useHomeController.ts index 03fd455..626a148 100644 --- a/frontend/src/features/home/model/useHomeController.ts +++ b/frontend/src/features/home/model/useHomeController.ts @@ -361,7 +361,7 @@ export const useHomeController = () => { fetchGeneratedVideos, deleteVideo, } = useGeneratedVideos({ - + storageKey, selectedVideoId, setSelectedVideoId, setGeneratedVideo, diff --git a/frontend/src/features/home/model/useHomePersistence.ts b/frontend/src/features/home/model/useHomePersistence.ts index bf59596..9fde59c 100644 --- a/frontend/src/features/home/model/useHomePersistence.ts +++ b/frontend/src/features/home/model/useHomePersistence.ts @@ -142,7 +142,8 @@ export const useHomePersistence = ({ const savedTitleFontSize = localStorage.getItem(`vigent_${storageKey}_titleFontSize`); const savedSecondaryTitleFontSize = localStorage.getItem(`vigent_${storageKey}_secondaryTitleFontSize`); const savedBgmId = localStorage.getItem(`vigent_${storageKey}_bgmId`); - const savedSelectedVideoId = localStorage.getItem(`vigent_${storageKey}_selectedVideoId`); + const savedSelectedVideoId = localStorage.getItem(`vigent_${storageKey}_latestGeneratedVideoId`) + || localStorage.getItem(`vigent_${storageKey}_selectedVideoId`); const savedSelectedAudioId = localStorage.getItem(`vigent_${storageKey}_selectedAudioId`); const savedBgmVolume = localStorage.getItem(`vigent_${storageKey}_bgmVolume`); const savedEnableBgm = localStorage.getItem(`vigent_${storageKey}_enableBgm`); @@ -205,6 +206,8 @@ export const useHomePersistence = ({ if (savedBgmVolume) setBgmVolume(parseFloat(savedBgmVolume)); if (savedEnableBgm !== null) setEnableBgm(savedEnableBgm === 'true'); if (savedSelectedVideoId) setSelectedVideoId(savedSelectedVideoId); + // 消费后清除跨页面共享标记,避免反复覆盖 + localStorage.removeItem(`vigent_${storageKey}_latestGeneratedVideoId`); if (savedSelectedAudioId) setSelectedAudioId(savedSelectedAudioId); if (savedTitleTopMargin) { diff --git a/frontend/src/features/publish/model/usePublishController.ts b/frontend/src/features/publish/model/usePublishController.ts index f6b10ab..5cb8ded 100644 --- a/frontend/src/features/publish/model/usePublishController.ts +++ b/frontend/src/features/publish/model/usePublishController.ts @@ -83,6 +83,8 @@ export const usePublishController = () => { setVideos(nextVideos); if (nextVideos.length > 0 && autoSelectLatest) { setSelectedVideo(nextVideos[0].id); + // 写入跨页面共享标记,让首页也能感知最新生成的视频 + localStorage.setItem(`vigent_${getStorageKey()}_latestGeneratedVideoId`, nextVideos[0].id); } updatePrefetch({ videos: nextVideos }); } catch (error) { @@ -109,16 +111,23 @@ export const usePublishController = () => { // ---- 视频选择恢复(唯一一个 effect,条件极简) ---- // 等 auth 完成 + videos 有数据 → 恢复一次,之后再也不跑 + // 优先检查跨页面共享标记(最新生成的视频),其次恢复上次选择 useEffect(() => { if (isAuthLoading || videos.length === 0 || videoRestoredRef.current) return; videoRestoredRef.current = true; const key = getStorageKey(); - const saved = localStorage.getItem(`vigent_${key}_publish_selected_video`); - if (saved && videos.some(v => v.id === saved)) { - setSelectedVideo(saved); + const latestId = localStorage.getItem(`vigent_${key}_latestGeneratedVideoId`); + if (latestId && videos.some(v => v.id === latestId)) { + setSelectedVideo(latestId); + localStorage.removeItem(`vigent_${key}_latestGeneratedVideoId`); } else { - setSelectedVideo(videos[0].id); + const saved = localStorage.getItem(`vigent_${key}_publish_selected_video`); + if (saved && videos.some(v => v.id === saved)) { + setSelectedVideo(saved); + } else { + setSelectedVideo(videos[0].id); + } } }, [isAuthLoading, videos, getStorageKey]);