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