mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
import { useEffect, useState } from "react";
|
|
import { timelineTimeToSnappedPixels } from "@/lib/timeline";
|
|
import { TIMELINE_TRACK_LABELS_COLUMN_WIDTH_PX } from "@/components/editor/panels/timeline/layout";
|
|
interface UseSnapIndicatorPositionParams {
|
|
snapPoint: { time: number } | null;
|
|
zoomLevel: number;
|
|
timelineRef: React.RefObject<HTMLDivElement | null>;
|
|
tracksScrollRef: React.RefObject<HTMLDivElement | null>;
|
|
}
|
|
|
|
interface SnapIndicatorPosition {
|
|
leftPosition: number;
|
|
topPosition: number;
|
|
height: number;
|
|
}
|
|
|
|
export function useSnapIndicatorPosition({
|
|
snapPoint,
|
|
zoomLevel,
|
|
timelineRef,
|
|
tracksScrollRef,
|
|
}: UseSnapIndicatorPositionParams): SnapIndicatorPosition {
|
|
const [scrollLeft, setScrollLeft] = useState(0);
|
|
|
|
useEffect(() => {
|
|
const tracksViewport = tracksScrollRef.current;
|
|
|
|
if (!tracksViewport) return;
|
|
|
|
const handleScroll = () => {
|
|
setScrollLeft(tracksViewport.scrollLeft);
|
|
};
|
|
|
|
setScrollLeft(tracksViewport.scrollLeft);
|
|
|
|
tracksViewport.addEventListener("scroll", handleScroll);
|
|
return () => tracksViewport.removeEventListener("scroll", handleScroll);
|
|
}, [tracksScrollRef]);
|
|
|
|
const timelineContainerHeight = timelineRef.current?.offsetHeight || 400;
|
|
const totalHeight = timelineContainerHeight - 8; // 8px padding from edges
|
|
|
|
const timelinePosition = timelineTimeToSnappedPixels({
|
|
time: snapPoint?.time ?? 0,
|
|
zoomLevel,
|
|
});
|
|
const leftPosition =
|
|
TIMELINE_TRACK_LABELS_COLUMN_WIDTH_PX + timelinePosition - scrollLeft;
|
|
|
|
return {
|
|
leftPosition,
|
|
topPosition: 0,
|
|
height: totalHeight,
|
|
};
|
|
}
|