From 71b6718337ec24ce8791ef039c7dd08ced81e974 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Wed, 13 Aug 2025 00:52:19 +0200 Subject: feat: implement mute video tracks --- apps/web/src/components/editor/preview-panel.tsx | 12 +++++++---- .../editor/timeline/timeline-element.tsx | 25 ++++++++++++++-------- 2 files changed, 24 insertions(+), 13 deletions(-) (limited to 'apps/web/src/components') diff --git a/apps/web/src/components/editor/preview-panel.tsx b/apps/web/src/components/editor/preview-panel.tsx index 785162a6..3873ebca 100644 --- a/apps/web/src/components/editor/preview-panel.tsx +++ b/apps/web/src/components/editor/preview-panel.tsx @@ -235,7 +235,7 @@ export function PreviewPanel() { const activeElements: ActiveElement[] = []; // Iterate tracks from bottom to top so topmost track renders last (on top) - ;[...tracks].reverse().forEach((track) => { + [...tracks].reverse().forEach((track) => { track.elements.forEach((element) => { if (element.hidden) return; const elementStart = element.startTime; @@ -436,7 +436,7 @@ export function PreviewPanel() { trimStart={element.trimStart} trimEnd={element.trimEnd} clipDuration={element.duration} - trackMuted={elementData.track.muted} + trackMuted={element.muted || elementData.track.muted} /> ); @@ -462,14 +462,18 @@ export function PreviewPanel() { // Audio elements (no visual representation) if (mediaItem.type === "audio") { return ( -
+
); diff --git a/apps/web/src/components/editor/timeline/timeline-element.tsx b/apps/web/src/components/editor/timeline/timeline-element.tsx index b26a14bb..f2623161 100644 --- a/apps/web/src/components/editor/timeline/timeline-element.tsx +++ b/apps/web/src/components/editor/timeline/timeline-element.tsx @@ -50,6 +50,7 @@ export function TimelineElement({ replaceElementMedia, rippleEditingEnabled, toggleElementHidden, + toggleElementMuted, } = useTimelineStore(); const { currentTime } = usePlaybackStore(); @@ -57,7 +58,7 @@ export function TimelineElement({ element.type === "media" ? mediaItems.find((item) => item.id === element.mediaId) : null; - const isAudio = mediaItem?.type === "audio"; + const hasAudio = mediaItem?.type === "audio" || mediaItem?.type === "video"; const { resizing, handleResizeStart, handleResizeMove, handleResizeEnd } = useTimelineElementResize({ @@ -124,8 +125,12 @@ export function TimelineElement({ } }; - const handleToggleElementHidden = (e: React.MouseEvent) => { + const handleToggleElementContext = (e: React.MouseEvent) => { e.stopPropagation(); + if (hasAudio && element.type === "media") { + toggleElementMuted(track.id, element.id); + return; + } toggleElementHidden(track.id, element.id); }; @@ -246,6 +251,8 @@ export function TimelineElement({ } }; + const isMuted = element.type === "media" ? element.muted === true : false; + return ( @@ -279,9 +286,9 @@ export function TimelineElement({ {renderElementContent()}
- {element.hidden && ( + {(hasAudio ? isMuted : element.hidden) && (
- {isAudio ? ( + {hasAudio ? ( ) : ( @@ -309,9 +316,9 @@ export function TimelineElement({ Split at playhead - - {isAudio ? ( - element.hidden ? ( + + {hasAudio ? ( + isMuted ? ( ) : ( @@ -322,8 +329,8 @@ export function TimelineElement({ )} - {isAudio - ? element.hidden + {hasAudio + ? isMuted ? "Unmute" : "Mute" : element.hidden -- cgit v1.3.1