2024-03-04 19:42:51 +03:00
|
|
|
import { ReactNode, RefObject } from "react";
|
|
|
|
|
|
|
|
|
|
export type ReviewTimelineProps = {
|
|
|
|
|
timelineRef: RefObject<HTMLDivElement>;
|
2024-03-10 16:23:36 +03:00
|
|
|
handlebarRef: RefObject<HTMLDivElement>;
|
2024-03-04 19:42:51 +03:00
|
|
|
handlebarTimeRef: RefObject<HTMLDivElement>;
|
|
|
|
|
handleMouseMove: (
|
|
|
|
|
e:
|
|
|
|
|
| React.MouseEvent<HTMLDivElement, MouseEvent>
|
|
|
|
|
| React.TouchEvent<HTMLDivElement>,
|
|
|
|
|
) => void;
|
|
|
|
|
handleMouseUp: (
|
|
|
|
|
e:
|
|
|
|
|
| React.MouseEvent<HTMLDivElement, MouseEvent>
|
|
|
|
|
| React.TouchEvent<HTMLDivElement>,
|
|
|
|
|
) => void;
|
|
|
|
|
handleMouseDown: (
|
|
|
|
|
e:
|
|
|
|
|
| React.MouseEvent<HTMLDivElement, MouseEvent>
|
|
|
|
|
| React.TouchEvent<HTMLDivElement>,
|
|
|
|
|
) => void;
|
|
|
|
|
segmentDuration: number;
|
|
|
|
|
showHandlebar: boolean;
|
|
|
|
|
isDragging: boolean;
|
|
|
|
|
children: ReactNode;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function ReviewTimeline({
|
|
|
|
|
timelineRef,
|
2024-03-10 16:23:36 +03:00
|
|
|
handlebarRef,
|
2024-03-04 19:42:51 +03:00
|
|
|
handlebarTimeRef,
|
|
|
|
|
handleMouseMove,
|
|
|
|
|
handleMouseUp,
|
|
|
|
|
handleMouseDown,
|
|
|
|
|
segmentDuration,
|
|
|
|
|
showHandlebar = false,
|
|
|
|
|
isDragging,
|
|
|
|
|
children,
|
|
|
|
|
}: ReviewTimelineProps) {
|
|
|
|
|
return (
|
|
|
|
|
<div
|
|
|
|
|
ref={timelineRef}
|
|
|
|
|
onMouseMove={handleMouseMove}
|
|
|
|
|
onTouchMove={handleMouseMove}
|
|
|
|
|
onMouseUp={handleMouseUp}
|
|
|
|
|
onTouchEnd={handleMouseUp}
|
2024-03-07 00:35:10 +03:00
|
|
|
className={`relative h-full overflow-y-auto no-scrollbar bg-secondary ${
|
2024-03-04 19:42:51 +03:00
|
|
|
isDragging && showHandlebar ? "cursor-grabbing" : "cursor-auto"
|
|
|
|
|
}`}
|
|
|
|
|
>
|
|
|
|
|
<div className="flex flex-col">{children}</div>
|
|
|
|
|
{showHandlebar && (
|
2024-03-10 16:23:36 +03:00
|
|
|
<div
|
|
|
|
|
className="absolute left-0 top-0 z-20 w-full"
|
|
|
|
|
role="scrollbar"
|
|
|
|
|
ref={handlebarRef}
|
|
|
|
|
>
|
2024-03-04 19:42:51 +03:00
|
|
|
<div
|
|
|
|
|
className="flex items-center justify-center touch-none select-none"
|
|
|
|
|
onMouseDown={handleMouseDown}
|
|
|
|
|
onTouchStart={handleMouseDown}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
className={`relative w-full ${
|
|
|
|
|
isDragging ? "cursor-grabbing" : "cursor-grab"
|
|
|
|
|
}`}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
className={`bg-destructive rounded-full mx-auto ${
|
2024-03-07 00:35:10 +03:00
|
|
|
segmentDuration < 60 ? "w-12 md:w-20" : "w-12 md:w-16"
|
2024-03-04 19:42:51 +03:00
|
|
|
} h-5 flex items-center justify-center`}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
ref={handlebarTimeRef}
|
|
|
|
|
className="text-white text-[8px] md:text-xs z-10"
|
|
|
|
|
></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="absolute h-1 w-full bg-destructive top-1/2 transform -translate-y-1/2"></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default ReviewTimeline;
|