[Sheets] [Pt. 13] Keyboard handling (#5586)
Co-authored-by: Eric Bailey <git@esb.lol> Co-authored-by: Samuel Newman <mozzius@protonmail.com>
This commit is contained in:
@@ -28,5 +28,4 @@ export interface BottomSheetViewProps {
|
|||||||
onStateChange?: (
|
onStateChange?: (
|
||||||
event: NativeSyntheticEvent<{state: BottomSheetState}>,
|
event: NativeSyntheticEvent<{state: BottomSheetState}>,
|
||||||
) => void
|
) => void
|
||||||
onAttemptDismiss?: (event: NativeSyntheticEvent<object>) => void
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -175,7 +175,7 @@
|
|||||||
"react-native-get-random-values": "~1.11.0",
|
"react-native-get-random-values": "~1.11.0",
|
||||||
"react-native-image-crop-picker": "0.41.2",
|
"react-native-image-crop-picker": "0.41.2",
|
||||||
"react-native-ios-context-menu": "^1.15.3",
|
"react-native-ios-context-menu": "^1.15.3",
|
||||||
"react-native-keyboard-controller": "^1.12.1",
|
"react-native-keyboard-controller": "^1.14.0",
|
||||||
"react-native-mmkv": "^2.12.2",
|
"react-native-mmkv": "^2.12.2",
|
||||||
"react-native-pager-view": "6.2.3",
|
"react-native-pager-view": "6.2.3",
|
||||||
"react-native-picker-select": "^9.1.3",
|
"react-native-picker-select": "^9.1.3",
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, {useImperativeHandle} from 'react'
|
import React, {useImperativeHandle} from 'react'
|
||||||
import {StyleProp, TextInput, View, ViewStyle} from 'react-native'
|
import {StyleProp, TextInput, View, ViewStyle} from 'react-native'
|
||||||
import {GestureHandlerRootView, ScrollView} from 'react-native-gesture-handler'
|
import {GestureHandlerRootView, ScrollView} from 'react-native-gesture-handler'
|
||||||
|
import {KeyboardAwareScrollView} from 'react-native-keyboard-controller'
|
||||||
import {useSafeAreaInsets} from 'react-native-safe-area-context'
|
import {useSafeAreaInsets} from 'react-native-safe-area-context'
|
||||||
|
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
@@ -162,13 +163,15 @@ export const ScrollableInner = React.forwardRef<ScrollView, DialogInnerProps>(
|
|||||||
const insets = useSafeAreaInsets()
|
const insets = useSafeAreaInsets()
|
||||||
const {nativeSnapPoint} = useDialogContext()
|
const {nativeSnapPoint} = useDialogContext()
|
||||||
return (
|
return (
|
||||||
<ScrollView
|
<KeyboardAwareScrollView
|
||||||
style={[a.px_xl, style]}
|
style={[a.px_xl, style]}
|
||||||
ref={ref}
|
ref={ref}
|
||||||
bounces={nativeSnapPoint === BottomSheetSnapPoint.Full}>
|
bounces={nativeSnapPoint === BottomSheetSnapPoint.Full}
|
||||||
|
bottomOffset={30}
|
||||||
|
ScrollViewComponent={ScrollView}>
|
||||||
{children}
|
{children}
|
||||||
<View style={{height: insets.bottom + a.pt_5xl.paddingTop}} />
|
<View style={{height: insets.bottom + a.pt_5xl.paddingTop}} />
|
||||||
</ScrollView>
|
</KeyboardAwareScrollView>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import React from 'react'
|
|
||||||
import {useKeyboardHandler} from 'react-native-keyboard-controller'
|
|
||||||
import Animated, {
|
|
||||||
useAnimatedStyle,
|
|
||||||
useSharedValue,
|
|
||||||
} from 'react-native-reanimated'
|
|
||||||
|
|
||||||
export function KeyboardControllerPadding({maxHeight}: {maxHeight?: number}) {
|
|
||||||
const keyboardHeight = useSharedValue(0)
|
|
||||||
|
|
||||||
useKeyboardHandler(
|
|
||||||
{
|
|
||||||
onMove: e => {
|
|
||||||
'worklet'
|
|
||||||
|
|
||||||
if (maxHeight && e.height > maxHeight) {
|
|
||||||
keyboardHeight.value = maxHeight
|
|
||||||
} else {
|
|
||||||
keyboardHeight.value = e.height
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
[maxHeight],
|
|
||||||
)
|
|
||||||
|
|
||||||
const animatedStyle = useAnimatedStyle(() => ({
|
|
||||||
height: keyboardHeight.value,
|
|
||||||
}))
|
|
||||||
|
|
||||||
return <Animated.View style={animatedStyle} />
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
export function KeyboardControllerPadding({
|
|
||||||
maxHeight: _,
|
|
||||||
}: {
|
|
||||||
maxHeight?: number
|
|
||||||
}) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
@@ -13,7 +13,6 @@ import {AppBskyLabelerDefs} from '@atproto/api'
|
|||||||
import {atoms as a} from '#/alf'
|
import {atoms as a} from '#/alf'
|
||||||
import * as Dialog from '#/components/Dialog'
|
import * as Dialog from '#/components/Dialog'
|
||||||
import {useDelayedLoading} from '#/components/hooks/useDelayedLoading'
|
import {useDelayedLoading} from '#/components/hooks/useDelayedLoading'
|
||||||
import {useOnKeyboardDidShow} from '#/components/hooks/useOnKeyboard'
|
|
||||||
import {Loader} from '#/components/Loader'
|
import {Loader} from '#/components/Loader'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {SelectLabelerView} from './SelectLabelerView'
|
import {SelectLabelerView} from './SelectLabelerView'
|
||||||
@@ -39,9 +38,6 @@ function ReportDialogInner(props: ReportDialogProps) {
|
|||||||
const isLoading = useDelayedLoading(500, isLabelerLoading)
|
const isLoading = useDelayedLoading(500, isLabelerLoading)
|
||||||
|
|
||||||
const ref = React.useRef<ScrollView>(null)
|
const ref = React.useRef<ScrollView>(null)
|
||||||
useOnKeyboardDidShow(() => {
|
|
||||||
ref.current?.scrollToEnd({animated: true})
|
|
||||||
})
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog.ScrollableInner label={_(msg`Report dialog`)} ref={ref}>
|
<Dialog.ScrollableInner label={_(msg`Report dialog`)} ref={ref}>
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import {CharProgress} from '#/view/com/composer/char-progress/CharProgress'
|
|||||||
import * as Toast from '#/view/com/util/Toast'
|
import * as Toast from '#/view/com/util/Toast'
|
||||||
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
|
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
|
||||||
import * as Dialog from '#/components/Dialog'
|
import * as Dialog from '#/components/Dialog'
|
||||||
import {KeyboardControllerPadding} from '#/components/KeyboardControllerPadding'
|
|
||||||
import {Button, ButtonIcon, ButtonText} from '../Button'
|
import {Button, ButtonIcon, ButtonText} from '../Button'
|
||||||
import {Divider} from '../Divider'
|
import {Divider} from '../Divider'
|
||||||
import {ChevronLeft_Stroke2_Corner0_Rounded as Chevron} from '../icons/Chevron'
|
import {ChevronLeft_Stroke2_Corner0_Rounded as Chevron} from '../icons/Chevron'
|
||||||
@@ -44,7 +43,6 @@ let ReportDialog = ({
|
|||||||
<Dialog.ScrollableInner label={_(msg`Report this message`)}>
|
<Dialog.ScrollableInner label={_(msg`Report this message`)}>
|
||||||
<DialogInner params={params} />
|
<DialogInner params={params} />
|
||||||
<Dialog.Close />
|
<Dialog.Close />
|
||||||
<KeyboardControllerPadding />
|
|
||||||
</Dialog.ScrollableInner>
|
</Dialog.ScrollableInner>
|
||||||
</Dialog.Outer>
|
</Dialog.Outer>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -18099,10 +18099,10 @@ react-native-ios-context-menu@^1.15.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@dominicstop/ts-event-emitter" "^1.1.0"
|
"@dominicstop/ts-event-emitter" "^1.1.0"
|
||||||
|
|
||||||
react-native-keyboard-controller@^1.12.1:
|
react-native-keyboard-controller@^1.14.0:
|
||||||
version "1.12.1"
|
version "1.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-native-keyboard-controller/-/react-native-keyboard-controller-1.12.1.tgz#6de22ed4d060528a0dd25621eeaa7f71772ce35f"
|
resolved "https://registry.yarnpkg.com/react-native-keyboard-controller/-/react-native-keyboard-controller-1.14.0.tgz#f6faaa12b3736a10f4eec4236ed5b0343508b9a1"
|
||||||
integrity sha512-2OpQcesiYsMilrTzgcTafSGexd9UryRQRuHudIcOn0YaqvvzNpnhVZMVuJMH93fJv/iaZYp3138rgUKOdHhtSw==
|
integrity sha512-JW9k2fehFXOpvLWh1YcgyubLodg/HPi6bR11sCZB/BOawf1tnbGnqk967B8XkxDOKHH6mg+z82quCvv8ALh1rg==
|
||||||
|
|
||||||
react-native-mmkv@^2.12.2:
|
react-native-mmkv@^2.12.2:
|
||||||
version "2.12.2"
|
version "2.12.2"
|
||||||
|
|||||||
Reference in New Issue
Block a user