fix: delete only selected clip from timeline

This commit is contained in:
Sompalkar
2025-06-23 14:43:12 +05:30
parent 56efb55a0f
commit 9abb502919
4 changed files with 3842 additions and 179 deletions

View File

@ -15,6 +15,7 @@ export interface TimelineTrack {
name: string;
type: "video" | "audio" | "effects";
clips: TimelineClip[];
muted?: boolean;
}
interface TimelineStore {
@ -41,6 +42,7 @@ interface TimelineStore {
clipId: string,
startTime: number
) => void;
toggleTrackMute: (trackId: string) => void;
// Computed values
getTotalDuration: () => number;
@ -55,6 +57,7 @@ export const useTimelineStore = create<TimelineStore>((set, get) => ({
name: `${type.charAt(0).toUpperCase() + type.slice(1)} Track`,
type,
clips: [],
muted: false,
};
set((state) => ({
tracks: [...state.tracks, newTrack],
@ -125,8 +128,6 @@ export const useTimelineStore = create<TimelineStore>((set, get) => ({
});
},
updateClipTrim: (trackId, clipId, trimStart, trimEnd) => {
set((state) => ({
tracks: state.tracks.map((track) =>
@ -134,9 +135,7 @@ export const useTimelineStore = create<TimelineStore>((set, get) => ({
? {
...track,
clips: track.clips.map((clip) =>
clip.id === clipId
? { ...clip, trimStart, trimEnd }
: clip
clip.id === clipId ? { ...clip, trimStart, trimEnd } : clip
),
}
: track
@ -151,9 +150,7 @@ export const useTimelineStore = create<TimelineStore>((set, get) => ({
? {
...track,
clips: track.clips.map((clip) =>
clip.id === clipId
? { ...clip, startTime }
: clip
clip.id === clipId ? { ...clip, startTime } : clip
),
}
: track
@ -161,13 +158,22 @@ export const useTimelineStore = create<TimelineStore>((set, get) => ({
}));
},
toggleTrackMute: (trackId) => {
set((state) => ({
tracks: state.tracks.map((track) =>
track.id === trackId ? { ...track, muted: !track.muted } : track
),
}));
},
getTotalDuration: () => {
const { tracks } = get();
if (tracks.length === 0) return 0;
const trackEndTimes = tracks.map((track) =>
track.clips.reduce((maxEnd, clip) => {
const clipEnd = clip.startTime + clip.duration - clip.trimStart - clip.trimEnd;
const clipEnd =
clip.startTime + clip.duration - clip.trimStart - clip.trimEnd;
return Math.max(maxEnd, clipEnd);
}, 0)
);