diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx
index 6b92eee3e0..092a5c7967 100644
--- a/src/components/Dialog/index.web.tsx
+++ b/src/components/Dialog/index.web.tsx
@@ -12,6 +12,7 @@ import {useLingui} from '@lingui/react'
import {DismissableLayer} from '@radix-ui/react-dismissable-layer'
import {useFocusGuards} from '@radix-ui/react-focus-guards'
import {FocusScope} from '@radix-ui/react-focus-scope'
+import {RemoveScroll} from 'react-remove-scroll'
import {logger} from '#/logger'
import {useDialogStateControlContext} from '#/state/dialogs'
@@ -103,34 +104,36 @@ export function Outer({
{isOpen && (
-
-
-
+
+
- {children}
+
+
+ {children}
+
-
-
+
+
)}
diff --git a/src/lib/hooks/useWebBodyScrollLock.ts b/src/lib/hooks/useWebBodyScrollLock.ts
deleted file mode 100644
index c63c23b29c..0000000000
--- a/src/lib/hooks/useWebBodyScrollLock.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import {useEffect} from 'react'
-
-import {isWeb} from '#/platform/detection'
-
-let refCount = 0
-
-function incrementRefCount() {
- if (refCount === 0) {
- document.body.style.overflow = 'hidden'
- document.documentElement.style.scrollbarGutter = 'auto'
- }
- refCount++
-}
-
-function decrementRefCount() {
- refCount--
- if (refCount === 0) {
- document.body.style.overflow = ''
- document.documentElement.style.scrollbarGutter = ''
- }
-}
-
-export function useWebBodyScrollLock(isLockActive: boolean) {
- useEffect(() => {
- if (!isWeb || !isLockActive) {
- return
- }
- incrementRefCount()
- return () => decrementRefCount()
- })
-}
diff --git a/src/view/com/lightbox/Lightbox.web.tsx b/src/view/com/lightbox/Lightbox.web.tsx
index f9b147b297..18d68c6c2f 100644
--- a/src/view/com/lightbox/Lightbox.web.tsx
+++ b/src/view/com/lightbox/Lightbox.web.tsx
@@ -15,8 +15,8 @@ import {
} from '@fortawesome/react-native-fontawesome'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
+import {RemoveScroll} from 'react-remove-scroll'
-import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock'
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import {colors, s} from '#/lib/styles'
import {useLightbox, useLightboxControls} from '#/state/lightbox'
@@ -28,7 +28,6 @@ export function Lightbox() {
const {activeLightbox} = useLightbox()
const {closeLightbox} = useLightboxControls()
const isActive = !!activeLightbox
- useWebBodyScrollLock(isActive)
if (!isActive) {
return null
@@ -37,11 +36,13 @@ export function Lightbox() {
const initialIndex = activeLightbox.index
const imgs = activeLightbox.images
return (
-
+
+
+
)
}
diff --git a/src/view/com/modals/Modal.web.tsx b/src/view/com/modals/Modal.web.tsx
index 8d93c21b4d..51660fc2be 100644
--- a/src/view/com/modals/Modal.web.tsx
+++ b/src/view/com/modals/Modal.web.tsx
@@ -1,8 +1,8 @@
import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native'
import Animated, {FadeIn, FadeOut} from 'react-native-reanimated'
+import {RemoveScroll} from 'react-remove-scroll'
import {usePalette} from '#/lib/hooks/usePalette'
-import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock'
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import type {Modal as ModalIface} from '#/state/modals'
import {useModalControls, useModals} from '#/state/modals'
@@ -22,18 +22,17 @@ import * as VerifyEmailModal from './VerifyEmail'
export function ModalsContainer() {
const {isModalActive, activeModals} = useModals()
- useWebBodyScrollLock(isModalActive)
if (!isModalActive) {
return null
}
return (
- <>
+
{activeModals.map((modal, i) => (
))}
- >
+
)
}
diff --git a/src/view/shell/Composer.web.tsx b/src/view/shell/Composer.web.tsx
index 9f407248a3..039ac08858 100644
--- a/src/view/shell/Composer.web.tsx
+++ b/src/view/shell/Composer.web.tsx
@@ -3,8 +3,8 @@ import {StyleSheet, View} from 'react-native'
import {DismissableLayer} from '@radix-ui/react-dismissable-layer'
import {useFocusGuards} from '@radix-ui/react-focus-guards'
import {FocusScope} from '@radix-ui/react-focus-scope'
+import {RemoveScroll} from 'react-remove-scroll'
-import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock'
import {useModals} from '#/state/modals'
import {ComposerOpts, useComposerState} from '#/state/shell/composer'
import {
@@ -20,8 +20,6 @@ export function Composer({}: {winHeight: number}) {
const state = useComposerState()
const isActive = !!state
- useWebBodyScrollLock(isActive)
-
// rendering
// =
@@ -29,7 +27,11 @@ export function Composer({}: {winHeight: number}) {
return
}
- return
+ return (
+
+
+
+ )
}
function Inner({state}: {state: ComposerOpts}) {
diff --git a/src/view/shell/index.web.tsx b/src/view/shell/index.web.tsx
index f554373562..802219d653 100644
--- a/src/view/shell/index.web.tsx
+++ b/src/view/shell/index.web.tsx
@@ -3,10 +3,10 @@ import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useNavigation} from '@react-navigation/native'
+import {RemoveScroll} from 'react-remove-scroll'
import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle'
import {useIntentHandler} from '#/lib/hooks/useIntentHandler'
-import {useWebBodyScrollLock} from '#/lib/hooks/useWebBodyScrollLock'
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
import {NavigationProp} from '#/lib/routes/types'
import {colors} from '#/lib/styles'
@@ -34,7 +34,6 @@ function ShellInner() {
const {_} = useLingui()
const showDrawer = !isDesktop && isDrawerOpen
- useWebBodyScrollLock(showDrawer)
useComposerKeyboardShortcut()
useIntentHandler()
@@ -58,31 +57,33 @@ function ShellInner() {
{showDrawer && (
- {
- // Only close if press happens outside of the drawer
- if (ev.target === ev.currentTarget) {
- setDrawerOpen(false)
- }
- }}
- accessibilityLabel={_(msg`Close navigation footer`)}
- accessibilityHint={_(msg`Closes bottom navigation bar`)}>
-
-
-
+
+ {
+ // Only close if press happens outside of the drawer
+ if (ev.target === ev.currentTarget) {
+ setDrawerOpen(false)
+ }
+ }}
+ accessibilityLabel={_(msg`Close navigation footer`)}
+ accessibilityHint={_(msg`Closes bottom navigation bar`)}>
+
+
+
+
-
-
+
+
)}
>
)