small refactor

This commit is contained in:
Maze Winther
2025-07-11 00:57:09 +02:00
parent 92d534760d
commit d643a9a277
3 changed files with 17 additions and 3 deletions

View File

@ -1,5 +1,6 @@
"use client"; "use client";
import { useRef } from "react";
import { TimelineTrack } from "@/types/timeline"; import { TimelineTrack } from "@/types/timeline";
import { import {
TIMELINE_CONSTANTS, TIMELINE_CONSTANTS,
@ -18,6 +19,7 @@ interface TimelinePlayheadProps {
tracksScrollRef: React.RefObject<HTMLDivElement>; tracksScrollRef: React.RefObject<HTMLDivElement>;
trackLabelsRef?: React.RefObject<HTMLDivElement>; trackLabelsRef?: React.RefObject<HTMLDivElement>;
timelineRef: React.RefObject<HTMLDivElement>; timelineRef: React.RefObject<HTMLDivElement>;
playheadRef?: React.RefObject<HTMLDivElement>;
} }
export function TimelinePlayhead({ export function TimelinePlayhead({
@ -31,7 +33,10 @@ export function TimelinePlayhead({
tracksScrollRef, tracksScrollRef,
trackLabelsRef, trackLabelsRef,
timelineRef, timelineRef,
playheadRef: externalPlayheadRef,
}: TimelinePlayheadProps) { }: TimelinePlayheadProps) {
const internalPlayheadRef = useRef<HTMLDivElement>(null);
const playheadRef = externalPlayheadRef || internalPlayheadRef;
const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({
currentTime, currentTime,
duration, duration,
@ -40,6 +45,7 @@ export function TimelinePlayhead({
rulerRef, rulerRef,
rulerScrollRef, rulerScrollRef,
tracksScrollRef, tracksScrollRef,
playheadRef,
}); });
// Use timeline container height minus a few pixels for breathing room // Use timeline container height minus a few pixels for breathing room
@ -57,7 +63,8 @@ export function TimelinePlayhead({
return ( return (
<div <div
className="playhead absolute pointer-events-auto z-[100]" ref={playheadRef}
className="absolute pointer-events-auto z-[100]"
style={{ style={{
left: `${leftPosition}px`, left: `${leftPosition}px`,
top: 0, top: 0,
@ -84,6 +91,7 @@ export function useTimelinePlayheadRuler({
rulerRef, rulerRef,
rulerScrollRef, rulerScrollRef,
tracksScrollRef, tracksScrollRef,
playheadRef,
}: Omit<TimelinePlayheadProps, "tracks" | "trackLabelsRef" | "timelineRef">) { }: Omit<TimelinePlayheadProps, "tracks" | "trackLabelsRef" | "timelineRef">) {
const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({ const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({
currentTime, currentTime,
@ -93,6 +101,7 @@ export function useTimelinePlayheadRuler({
rulerRef, rulerRef,
rulerScrollRef, rulerScrollRef,
tracksScrollRef, tracksScrollRef,
playheadRef,
}); });
return { handleRulerMouseDown, isDraggingRuler }; return { handleRulerMouseDown, isDraggingRuler };

View File

@ -124,6 +124,7 @@ export function Timeline() {
const rulerScrollRef = useRef<HTMLDivElement>(null); const rulerScrollRef = useRef<HTMLDivElement>(null);
const tracksScrollRef = useRef<HTMLDivElement>(null); const tracksScrollRef = useRef<HTMLDivElement>(null);
const trackLabelsRef = useRef<HTMLDivElement>(null); const trackLabelsRef = useRef<HTMLDivElement>(null);
const playheadRef = useRef<HTMLDivElement>(null);
const isUpdatingRef = useRef(false); const isUpdatingRef = useRef(false);
const lastRulerSync = useRef(0); const lastRulerSync = useRef(0);
const lastTracksSync = useRef(0); const lastTracksSync = useRef(0);
@ -137,6 +138,7 @@ export function Timeline() {
rulerRef, rulerRef,
rulerScrollRef, rulerScrollRef,
tracksScrollRef, tracksScrollRef,
playheadRef,
}); });
// Timeline content click to seek handler // Timeline content click to seek handler
@ -148,7 +150,7 @@ export function Timeline() {
} }
// Don't seek if clicking on playhead // Don't seek if clicking on playhead
if ((e.target as HTMLElement).closest(".playhead")) { if (playheadRef.current?.contains(e.target as Node)) {
return; return;
} }
@ -880,6 +882,7 @@ export function Timeline() {
tracksScrollRef={tracksScrollRef} tracksScrollRef={tracksScrollRef}
trackLabelsRef={trackLabelsRef} trackLabelsRef={trackLabelsRef}
timelineRef={timelineRef} timelineRef={timelineRef}
playheadRef={playheadRef}
/> />
{/* Timeline Header with Ruler */} {/* Timeline Header with Ruler */}
<div className="flex bg-panel sticky top-0 z-10"> <div className="flex bg-panel sticky top-0 z-10">

View File

@ -8,6 +8,7 @@ interface UseTimelinePlayheadProps {
rulerRef: React.RefObject<HTMLDivElement>; rulerRef: React.RefObject<HTMLDivElement>;
rulerScrollRef: React.RefObject<HTMLDivElement>; rulerScrollRef: React.RefObject<HTMLDivElement>;
tracksScrollRef: React.RefObject<HTMLDivElement>; tracksScrollRef: React.RefObject<HTMLDivElement>;
playheadRef?: React.RefObject<HTMLDivElement>;
} }
export function useTimelinePlayhead({ export function useTimelinePlayhead({
@ -18,6 +19,7 @@ export function useTimelinePlayhead({
rulerRef, rulerRef,
rulerScrollRef, rulerScrollRef,
tracksScrollRef, tracksScrollRef,
playheadRef,
}: UseTimelinePlayheadProps) { }: UseTimelinePlayheadProps) {
// Playhead scrubbing state // Playhead scrubbing state
const [isScrubbing, setIsScrubbing] = useState(false); const [isScrubbing, setIsScrubbing] = useState(false);
@ -48,7 +50,7 @@ export function useTimelinePlayhead({
if (e.button !== 0) return; if (e.button !== 0) return;
// Don't interfere if clicking on the playhead itself // Don't interfere if clicking on the playhead itself
if ((e.target as HTMLElement).closest(".playhead")) return; if (playheadRef?.current?.contains(e.target as Node)) return;
e.preventDefault(); e.preventDefault();
setIsDraggingRuler(true); setIsDraggingRuler(true);