diff --git a/src/screens/anime/watch/hooks/use-brightness-gesture.ts b/src/screens/anime/watch/hooks/use-brightness-gesture.ts index 2cc9044..1713c72 100644 --- a/src/screens/anime/watch/hooks/use-brightness-gesture.ts +++ b/src/screens/anime/watch/hooks/use-brightness-gesture.ts @@ -13,6 +13,7 @@ const clamp = (value: number, min: number, max: number) => { const WIDTH_PERCENT = 0.6; const HEIGHT_PERCENT = 0.85; +const MIN_DISTANCE = 20; const useBrightnessGesture = () => { const brightnessSlider = useAtomValue(brightnessSliderAtom); @@ -27,6 +28,8 @@ const useBrightnessGesture = () => { moveTouchY: 0, finalValue: 1, isShown: false, + initialY: NaN, + shouldMoveFreely: false, }); const brightnessPan = Gesture.Pan() @@ -34,11 +37,14 @@ const useBrightnessGesture = () => { const initialBrightness = brightnessSlider.getBrightness(); refs.value.actualInitialBrightness = initialBrightness; + refs.value.initialY = NaN; + refs.value.shouldMoveFreely = false; if (event.x > screenSize.width - screenSize.width * WIDTH_PERCENT) return; if (event.y < screenSize.height * (1 - HEIGHT_PERCENT)) return; if (event.y > screenSize.height * HEIGHT_PERCENT) return; + refs.value.initialY = event.y; refs.value.sliderHeight = brightnessSlider.getHeight(); refs.value.baseValue = event.y; refs.value.initialBrightness = initialBrightness; @@ -50,6 +56,16 @@ const useBrightnessGesture = () => { if (event.y < screenSize.height * (1 - HEIGHT_PERCENT)) return; if (event.y > screenSize.height * HEIGHT_PERCENT) return; + if (!refs.value.shouldMoveFreely) { + if ( + isNaN(refs.value.initialY) || + Math.abs(event.y - refs.value.initialY) < MIN_DISTANCE + ) + return; + } + + refs.value.shouldMoveFreely = true; + if (!refs.value.isShown) { brightnessSlider.show(); refs.value.isShown = true; @@ -83,16 +99,24 @@ const useBrightnessGesture = () => { brightnessSlider.setAnimationValue(refs.value.finalValue); }) - .onFinalize(() => { - if (refs.value.finalValue !== refs.value.actualInitialBrightness) { - runOnJS(brightnessSlider.setBrightness)(refs.value.finalValue); - } - + .onFinalize((event) => { brightnessSlider.hide(); refs.value.isShown = false; + + if (!refs.value.shouldMoveFreely) { + if ( + isNaN(refs.value.initialY) || + Math.abs(event.y - refs.value.initialY) < MIN_DISTANCE + ) + return; + } + + if (refs.value.finalValue !== refs.value.actualInitialBrightness) { + runOnJS(brightnessSlider.setBrightness)(refs.value.finalValue); + } }) - .minDistance(20); + .minDistance(MIN_DISTANCE); return brightnessPan; }; diff --git a/src/screens/anime/watch/hooks/use-volume-gesture.ts b/src/screens/anime/watch/hooks/use-volume-gesture.ts index 8453b42..0cf3461 100644 --- a/src/screens/anime/watch/hooks/use-volume-gesture.ts +++ b/src/screens/anime/watch/hooks/use-volume-gesture.ts @@ -13,6 +13,7 @@ const clamp = (value: number, min: number, max: number) => { const WIDTH_PERCENT = 0.6; const HEIGHT_PERCENT = 0.85; +const MIN_DISTANCE = 20; const useVolumeGesture = () => { const volumeSlider = useAtomValue(volumeSliderAtom); @@ -27,6 +28,8 @@ const useVolumeGesture = () => { moveTouchY: 0, finalValue: 1, isShown: false, + initialY: NaN, + shouldMoveFreely: false, }); const volumePan = Gesture.Pan() @@ -34,11 +37,14 @@ const useVolumeGesture = () => { const initialVolume = volumeSlider.getVolume() ?? 1; refs.value.actualInitialVolume = initialVolume; + refs.value.initialY = NaN; + refs.value.shouldMoveFreely = false; if (event.x < screenSize.width * WIDTH_PERCENT) return; if (event.y < screenSize.height * (1 - HEIGHT_PERCENT)) return; if (event.y > screenSize.height * HEIGHT_PERCENT) return; + refs.value.initialY = event.y; refs.value.sliderHeight = volumeSlider.getHeight(); refs.value.baseValue = event.y; refs.value.initialVolume = initialVolume; @@ -49,6 +55,16 @@ const useVolumeGesture = () => { if (event.y < screenSize.height * (1 - HEIGHT_PERCENT)) return; if (event.y > screenSize.height * HEIGHT_PERCENT) return; + if (!refs.value.shouldMoveFreely) { + if ( + isNaN(refs.value.initialY) || + Math.abs(event.y - refs.value.initialY) < MIN_DISTANCE + ) + return; + } + + refs.value.shouldMoveFreely = true; + if (!refs.value.isShown) { volumeSlider.show(); refs.value.isShown = true; @@ -76,16 +92,24 @@ const useVolumeGesture = () => { volumeSlider.setAnimationValue(refs.value.finalValue); }) - .onFinalize(() => { - if (refs.value.finalValue !== refs.value.actualInitialVolume) { - runOnJS(volumeSlider.setVolume)(refs.value.finalValue); - } - + .onFinalize((event) => { volumeSlider.hide(); refs.value.isShown = false; + + if (!refs.value.shouldMoveFreely) { + if ( + isNaN(refs.value.initialY) || + Math.abs(event.y - refs.value.initialY) < MIN_DISTANCE + ) + return; + } + + if (refs.value.finalValue !== refs.value.actualInitialVolume) { + runOnJS(volumeSlider.setVolume)(refs.value.finalValue); + } }) - .minDistance(20); + .minDistance(MIN_DISTANCE); return volumePan; };