From cf6ef8f1c4a9a70898cafe10e06ba12192524644 Mon Sep 17 00:00:00 2001 From: Notoriousbrain Date: Tue, 22 Jul 2025 16:44:16 +0530 Subject: [PATCH] fix: removed the media from timeline after its deleted --- apps/web/src/stores/media-store.ts | 40 ++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/apps/web/src/stores/media-store.ts b/apps/web/src/stores/media-store.ts index c4ee5f3e..6eb06e35 100644 --- a/apps/web/src/stores/media-store.ts +++ b/apps/web/src/stores/media-store.ts @@ -183,24 +183,46 @@ export const useMediaStore = create((set, get) => ({ } }, - removeMediaItem: async (projectId, id: string) => { + removeMediaItem: async (projectId: string, id: string) => { const state = get(); const item = state.mediaItems.find((media) => media.id === id); // Cleanup object URLs to prevent memory leaks - if (item && item.url) { + if (item?.url) { URL.revokeObjectURL(item.url); if (item.thumbnailUrl) { URL.revokeObjectURL(item.thumbnailUrl); } } - // Remove from local state immediately + // 1) Remove from local state immediately set((state) => ({ mediaItems: state.mediaItems.filter((media) => media.id !== id), })); - // Remove from persistent storage + // 2) Cascade into the timeline: remove any elements using this media ID + const timeline = useTimelineStore.getState(); + const { + tracks, + removeElementFromTrack, + removeElementFromTrackWithRipple, + rippleEditingEnabled, + } = timeline; + + // Iterate over a snapshot of tracks and their elements + tracks.forEach((track) => { + track.elements.forEach((el) => { + if (el.type === "media" && el.mediaId === id) { + if (rippleEditingEnabled) { + removeElementFromTrackWithRipple(track.id, el.id); + } else { + removeElementFromTrack(track.id, el.id); + } + } + }); + }); + + // 3) Remove from persistent storage try { await storageService.deleteMediaItem(projectId, id); } catch (error) { @@ -219,15 +241,19 @@ export const useMediaStore = create((set, get) => ({ mediaItems.map(async (item) => { if (item.type === "video" && item.file) { try { - const { thumbnailUrl, width, height } = await generateVideoThumbnail(item.file); + const { thumbnailUrl, width, height } = + await generateVideoThumbnail(item.file); return { ...item, thumbnailUrl, width: width || item.width, - height: height || item.height + height: height || item.height, }; } catch (error) { - console.error(`Failed to regenerate thumbnail for video ${item.id}:`, error); + console.error( + `Failed to regenerate thumbnail for video ${item.id}:`, + error + ); return item; } }