small refactor
This commit is contained in:
@ -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 };
|
||||||
|
@ -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">
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user