refactor: centralize logic to zustand store
This commit is contained in:
@ -3,7 +3,6 @@
|
|||||||
import { useDragDrop } from "@/hooks/use-drag-drop";
|
import { useDragDrop } from "@/hooks/use-drag-drop";
|
||||||
import { processMediaFiles } from "@/lib/media-processing";
|
import { processMediaFiles } from "@/lib/media-processing";
|
||||||
import { useMediaStore, type MediaItem } from "@/stores/media-store";
|
import { useMediaStore, type MediaItem } from "@/stores/media-store";
|
||||||
import { useTimelineStore } from "@/stores/timeline-store";
|
|
||||||
import { Image, Music, Plus, Upload, Video } from "lucide-react";
|
import { Image, Music, Plus, Upload, Video } from "lucide-react";
|
||||||
import { useEffect, useRef, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
@ -85,25 +84,7 @@ export function MediaView() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove elements automatically when delete media
|
// Media store now handles cascade deletion automatically
|
||||||
const { tracks, removeTrack } = useTimelineStore.getState();
|
|
||||||
tracks.forEach((track) => {
|
|
||||||
const elementsToRemove = track.elements.filter(
|
|
||||||
(element) => element.type === "media" && element.mediaId === id
|
|
||||||
);
|
|
||||||
elementsToRemove.forEach((element) => {
|
|
||||||
useTimelineStore
|
|
||||||
.getState()
|
|
||||||
.removeElementFromTrack(track.id, element.id);
|
|
||||||
});
|
|
||||||
// Only remove track if it becomes empty and has no other elements
|
|
||||||
const updatedTrack = useTimelineStore
|
|
||||||
.getState()
|
|
||||||
.tracks.find((t) => t.id === track.id);
|
|
||||||
if (updatedTrack && updatedTrack.elements.length === 0) {
|
|
||||||
removeTrack(track.id);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
await removeMediaItem(activeProject.id, id);
|
await removeMediaItem(activeProject.id, id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import { storageService } from "@/lib/storage/storage-service";
|
import { storageService } from "@/lib/storage/storage-service";
|
||||||
|
import { useTimelineStore } from "./timeline-store";
|
||||||
|
|
||||||
export type MediaType = "image" | "video" | "audio";
|
export type MediaType = "image" | "video" | "audio";
|
||||||
|
|
||||||
@ -192,6 +193,27 @@ export const useMediaStore = create<MediaStore>((set, get) => ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CASCADE DELETION - Remove timeline elements that use this media
|
||||||
|
const { tracks, removeElementFromTrack, removeTrack } =
|
||||||
|
useTimelineStore.getState();
|
||||||
|
|
||||||
|
tracks.forEach((track) => {
|
||||||
|
const elementsToRemove = track.elements.filter(
|
||||||
|
(element) => element.type === "media" && element.mediaId === id
|
||||||
|
);
|
||||||
|
elementsToRemove.forEach((element) => {
|
||||||
|
removeElementFromTrack(track.id, element.id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Clean up empty tracks after removing elements
|
||||||
|
const updatedTracks = useTimelineStore.getState().tracks;
|
||||||
|
updatedTracks.forEach((track) => {
|
||||||
|
if (track.elements.length === 0) {
|
||||||
|
removeTrack(track.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Remove from local state immediately
|
// Remove from local state immediately
|
||||||
set((state) => ({
|
set((state) => ({
|
||||||
mediaItems: state.mediaItems.filter((media) => media.id !== id),
|
mediaItems: state.mediaItems.filter((media) => media.id !== id),
|
||||||
|
Reference in New Issue
Block a user