mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Use touch events for mobile review timeline (#10212)
* mobile touch events * rebase * fix scroll mode * clean up deps and remove unneeded useeffect * remove vite
This commit is contained in:
		
							parent
							
								
									c74eb75554
								
							
						
					
					
						commit
						a515697e08
					
				@ -157,23 +157,13 @@ export function EventReviewTimeline({
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }, [isDragging, onHandlebarDraggingChange]);
 | 
					  }, [isDragging, onHandlebarDraggingChange]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					 | 
				
			||||||
    generateSegments();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TODO: touch events for mobile
 | 
					 | 
				
			||||||
    document.addEventListener("mousemove", handleMouseMove);
 | 
					 | 
				
			||||||
    document.addEventListener("mouseup", handleMouseUp);
 | 
					 | 
				
			||||||
    return () => {
 | 
					 | 
				
			||||||
      document.removeEventListener("mousemove", handleMouseMove);
 | 
					 | 
				
			||||||
      document.removeEventListener("mouseup", handleMouseUp);
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    // we know that these deps are correct
 | 
					 | 
				
			||||||
    // eslint-disable-next-line react-hooks/exhaustive-deps
 | 
					 | 
				
			||||||
  }, [generateSegments, timelineStart, handleMouseUp, handleMouseMove]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      ref={timelineRef}
 | 
					      ref={timelineRef}
 | 
				
			||||||
 | 
					      onMouseMove={handleMouseMove}
 | 
				
			||||||
 | 
					      onTouchMove={handleMouseMove}
 | 
				
			||||||
 | 
					      onMouseUp={handleMouseUp}
 | 
				
			||||||
 | 
					      onTouchEnd={handleMouseUp}
 | 
				
			||||||
      className={`relative h-full overflow-y-scroll no-scrollbar bg-secondary ${
 | 
					      className={`relative h-full overflow-y-scroll no-scrollbar bg-secondary ${
 | 
				
			||||||
        isDragging && showHandlebar ? "cursor-grabbing" : "cursor-auto"
 | 
					        isDragging && showHandlebar ? "cursor-grabbing" : "cursor-auto"
 | 
				
			||||||
      }`}
 | 
					      }`}
 | 
				
			||||||
@ -181,13 +171,16 @@ export function EventReviewTimeline({
 | 
				
			|||||||
      <div className="flex flex-col">{segments}</div>
 | 
					      <div className="flex flex-col">{segments}</div>
 | 
				
			||||||
      {showHandlebar && (
 | 
					      {showHandlebar && (
 | 
				
			||||||
        <div className={`absolute left-0 top-0 z-20 w-full `} role="scrollbar">
 | 
					        <div className={`absolute left-0 top-0 z-20 w-full `} role="scrollbar">
 | 
				
			||||||
          <div className={`flex items-center justify-center `}>
 | 
					          <div
 | 
				
			||||||
 | 
					            className="flex items-center justify-center touch-none select-none"
 | 
				
			||||||
 | 
					            onMouseDown={handleMouseDown}
 | 
				
			||||||
 | 
					            onTouchStart={handleMouseDown}
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
            <div
 | 
					            <div
 | 
				
			||||||
              ref={scrollTimeRef}
 | 
					              ref={scrollTimeRef}
 | 
				
			||||||
              className={`relative w-full ${
 | 
					              className={`relative w-full ${
 | 
				
			||||||
                isDragging ? "cursor-grabbing" : "cursor-grab"
 | 
					                isDragging ? "cursor-grabbing" : "cursor-grab"
 | 
				
			||||||
              }`}
 | 
					              }`}
 | 
				
			||||||
              onMouseDown={handleMouseDown}
 | 
					 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div
 | 
					              <div
 | 
				
			||||||
                className={`bg-destructive rounded-full mx-auto ${
 | 
					                className={`bg-destructive rounded-full mx-auto ${
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import { useCallback, useEffect } from "react";
 | 
					import { useCallback, useEffect } from "react";
 | 
				
			||||||
import scrollIntoView from "scroll-into-view-if-needed";
 | 
					import scrollIntoView from "scroll-into-view-if-needed";
 | 
				
			||||||
 | 
					import { isMobile } from "react-device-detect";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type DragHandlerProps = {
 | 
					type DragHandlerProps = {
 | 
				
			||||||
  contentRef: React.RefObject<HTMLElement>;
 | 
					  contentRef: React.RefObject<HTMLElement>;
 | 
				
			||||||
@ -34,7 +35,9 @@ function useDraggableHandler({
 | 
				
			|||||||
  setIsDragging,
 | 
					  setIsDragging,
 | 
				
			||||||
}: DragHandlerProps) {
 | 
					}: DragHandlerProps) {
 | 
				
			||||||
  const handleMouseDown = useCallback(
 | 
					  const handleMouseDown = useCallback(
 | 
				
			||||||
    (e: React.MouseEvent<HTMLDivElement>) => {
 | 
					    (
 | 
				
			||||||
 | 
					      e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
      e.preventDefault();
 | 
					      e.preventDefault();
 | 
				
			||||||
      e.stopPropagation();
 | 
					      e.stopPropagation();
 | 
				
			||||||
      setIsDragging(true);
 | 
					      setIsDragging(true);
 | 
				
			||||||
@ -43,7 +46,9 @@ function useDraggableHandler({
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const handleMouseUp = useCallback(
 | 
					  const handleMouseUp = useCallback(
 | 
				
			||||||
    (e: MouseEvent) => {
 | 
					    (
 | 
				
			||||||
 | 
					      e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
      e.preventDefault();
 | 
					      e.preventDefault();
 | 
				
			||||||
      e.stopPropagation();
 | 
					      e.stopPropagation();
 | 
				
			||||||
      if (isDragging) {
 | 
					      if (isDragging) {
 | 
				
			||||||
@ -91,7 +96,9 @@ function useDraggableHandler({
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const handleMouseMove = useCallback(
 | 
					  const handleMouseMove = useCallback(
 | 
				
			||||||
    (e: MouseEvent) => {
 | 
					    (
 | 
				
			||||||
 | 
					      e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>,
 | 
				
			||||||
 | 
					    ) => {
 | 
				
			||||||
      if (
 | 
					      if (
 | 
				
			||||||
        !contentRef.current ||
 | 
					        !contentRef.current ||
 | 
				
			||||||
        !timelineRef.current ||
 | 
					        !timelineRef.current ||
 | 
				
			||||||
@ -100,10 +107,17 @@ function useDraggableHandler({
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let clientY;
 | 
				
			||||||
 | 
					      if (isMobile && e.nativeEvent instanceof TouchEvent) {
 | 
				
			||||||
 | 
					        clientY = e.nativeEvent.touches[0].clientY;
 | 
				
			||||||
 | 
					      } else if (e.nativeEvent instanceof MouseEvent) {
 | 
				
			||||||
 | 
					        clientY = e.nativeEvent.clientY;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      e.preventDefault();
 | 
					      e.preventDefault();
 | 
				
			||||||
      e.stopPropagation();
 | 
					      e.stopPropagation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (showHandlebar && isDragging) {
 | 
					      if (showHandlebar && isDragging && clientY) {
 | 
				
			||||||
        const {
 | 
					        const {
 | 
				
			||||||
          scrollHeight: timelineHeight,
 | 
					          scrollHeight: timelineHeight,
 | 
				
			||||||
          clientHeight: visibleTimelineHeight,
 | 
					          clientHeight: visibleTimelineHeight,
 | 
				
			||||||
@ -120,7 +134,7 @@ function useDraggableHandler({
 | 
				
			|||||||
          visibleTimelineHeight - timelineTop + parentScrollTop,
 | 
					          visibleTimelineHeight - timelineTop + parentScrollTop,
 | 
				
			||||||
          Math.max(
 | 
					          Math.max(
 | 
				
			||||||
            segmentHeight + scrolled,
 | 
					            segmentHeight + scrolled,
 | 
				
			||||||
            e.clientY - timelineTop + parentScrollTop,
 | 
					            clientY - timelineTop + parentScrollTop,
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user