fix: await onDropMedia, fix stale closure deps, surface errors in TrackLane

- Import ActionResult type from @openreel/core
- onDropMedia prop type now returns Promise<ActionResult> | void
- handleDrop now awaits onDropMedia so failures are visible
- Replace silent catch with console.error + toast.error on failure
- Add allTracks, playheadPosition, snapSettings to handleDrop useCallback deps
  to fix stale closure bug (calculateSnap was using stale snap/track state)
This commit is contained in:
Zac Gaetano 2026-05-19 11:12:09 -04:00
parent 76e6568ac6
commit aec55fea83

View file

@ -5,6 +5,7 @@ import type {
ShapeClip, ShapeClip,
SVGClip, SVGClip,
StickerClip, StickerClip,
ActionResult,
} from "@openreel/core"; } from "@openreel/core";
import { ClipComponent } from "./ClipComponent"; import { ClipComponent } from "./ClipComponent";
import { TextClipComponent } from "./TextClipComponent"; import { TextClipComponent } from "./TextClipComponent";
@ -28,7 +29,7 @@ interface TrackLaneProps {
trackHeights: Map<string, number>; trackHeights: Map<string, number>;
timelineRef: React.RefObject<HTMLDivElement>; timelineRef: React.RefObject<HTMLDivElement>;
onSelectClip: (clipId: string, addToSelection: boolean) => void; onSelectClip: (clipId: string, addToSelection: boolean) => void;
onDropMedia: (trackId: string, mediaId: string, startTime: number) => void; onDropMedia: (trackId: string, mediaId: string, startTime: number) => Promise<ActionResult> | void;
onMoveClip: ( onMoveClip: (
clipId: string, clipId: string,
newStartTime: number, newStartTime: number,
@ -178,13 +179,18 @@ export const TrackLane: React.FC<TrackLaneProps> = ({
snapSettings, snapSettings,
pixelsPerSecond, pixelsPerSecond,
); );
onDropMedia(track.id, data.mediaId, snapResult.time); const result = await onDropMedia(track.id, data.mediaId, snapResult.time);
if (result && !result.success) {
console.error("[TrackLane] Failed to add clip:", result.error);
toast.error("Failed to add clip", result.error?.message ?? "");
}
} }
} catch { } catch (err) {
// Silently ignore parse errors console.error("[TrackLane] Drop error:", err);
toast.error("Failed to add clip", String(err));
} }
}, },
[track.id, track.name, pixelsPerSecond, scrollX, onDropMedia], [track.id, track.name, pixelsPerSecond, scrollX, onDropMedia, allTracks, playheadPosition, snapSettings],
); );
const handleResizeStart = useCallback( const handleResizeStart = useCallback(