mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at no-pointer-events 84 lines 2.1 kB view raw
1import {useEffect, useRef, useMemo, ForwardedRef} from 'react' 2import {Platform, findNodeHandle} from 'react-native' 3import type {ScrollView} from 'react-native' 4import {mergeRefs} from 'lib/merge-refs' 5 6type Props<Scrollable extends ScrollView = ScrollView> = { 7 cursor?: string 8 outerRef?: ForwardedRef<Scrollable> 9} 10 11export function useDraggableScroll<Scrollable extends ScrollView = ScrollView>({ 12 outerRef, 13 cursor = 'grab', 14}: Props<Scrollable> = {}) { 15 const ref = useRef<Scrollable>(null) 16 17 useEffect(() => { 18 if (Platform.OS !== 'web' || !ref.current) { 19 return 20 } 21 const slider = findNodeHandle(ref.current) as unknown as HTMLDivElement 22 if (!slider) { 23 return 24 } 25 let isDragging = false 26 let isMouseDown = false 27 let startX = 0 28 let scrollLeft = 0 29 30 const mouseDown = (e: MouseEvent) => { 31 isMouseDown = true 32 startX = e.pageX - slider.offsetLeft 33 scrollLeft = slider.scrollLeft 34 35 slider.style.cursor = cursor 36 } 37 38 const mouseUp = () => { 39 if (isDragging) { 40 slider.addEventListener('click', e => e.stopPropagation(), {once: true}) 41 } 42 43 isMouseDown = false 44 isDragging = false 45 slider.style.cursor = 'default' 46 } 47 48 const mouseMove = (e: MouseEvent) => { 49 if (!isMouseDown) { 50 return 51 } 52 53 // Require n pixels momement before start of drag (3 in this case ) 54 const x = e.pageX - slider.offsetLeft 55 if (Math.abs(x - startX) < 3) { 56 return 57 } 58 59 isDragging = true 60 e.preventDefault() 61 const walk = x - startX 62 slider.scrollLeft = scrollLeft - walk 63 } 64 65 slider.addEventListener('mousedown', mouseDown) 66 window.addEventListener('mouseup', mouseUp) 67 window.addEventListener('mousemove', mouseMove) 68 69 return () => { 70 slider.removeEventListener('mousedown', mouseDown) 71 window.removeEventListener('mouseup', mouseUp) 72 window.removeEventListener('mousemove', mouseMove) 73 } 74 }, [cursor]) 75 76 const refs = useMemo( 77 () => mergeRefs(outerRef ? [ref, outerRef] : [ref]), 78 [ref, outerRef], 79 ) 80 81 return { 82 refs, 83 } 84}