Revert to old modal on android (#4458)
* revert to old modal on android * close alf dialogs before closing composer * Try to fix white area * Use hook * Fix Back button * oops --------- Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
This commit is contained in:
parent
14cddb7ec0
commit
d85c8a0976
6 changed files with 173 additions and 147 deletions
|
@ -8,6 +8,7 @@ import React, {
|
|||
} from 'react'
|
||||
import {
|
||||
ActivityIndicator,
|
||||
BackHandler,
|
||||
Keyboard,
|
||||
LayoutChangeEvent,
|
||||
StyleSheet,
|
||||
|
@ -17,7 +18,7 @@ import {
|
|||
import {
|
||||
KeyboardAvoidingView,
|
||||
KeyboardStickyView,
|
||||
useKeyboardContext,
|
||||
useKeyboardController,
|
||||
} from 'react-native-keyboard-controller'
|
||||
import Animated, {
|
||||
interpolateColor,
|
||||
|
@ -42,6 +43,7 @@ import {LikelyType} from '#/lib/link-meta/link-meta'
|
|||
import {logEvent} from '#/lib/statsig/statsig'
|
||||
import {logger} from '#/logger'
|
||||
import {emitPostCreated} from '#/state/events'
|
||||
import {useModalControls} from '#/state/modals'
|
||||
import {useModals} from '#/state/modals'
|
||||
import {useRequireAltTextEnabled} from '#/state/preferences'
|
||||
import {
|
||||
|
@ -108,9 +110,7 @@ export const ComposePost = observer(function ComposePost({
|
|||
text: initText,
|
||||
imageUris: initImageUris,
|
||||
cancelRef,
|
||||
isModalReady,
|
||||
}: Props & {
|
||||
isModalReady: boolean
|
||||
cancelRef?: React.RefObject<CancelRef>
|
||||
}) {
|
||||
const {currentAccount} = useSession()
|
||||
|
@ -128,11 +128,12 @@ export const ComposePost = observer(function ComposePost({
|
|||
const textInput = useRef<TextInputRef>(null)
|
||||
const discardPromptControl = Prompt.usePromptControl()
|
||||
const {closeAllDialogs} = useDialogStateControlContext()
|
||||
const {closeAllModals} = useModalControls()
|
||||
const t = useTheme()
|
||||
|
||||
// Disable this in the composer to prevent any extra keyboard height being applied.
|
||||
// See https://github.com/bluesky-social/social-app/pull/4399
|
||||
const {setEnabled} = useKeyboardContext()
|
||||
const {setEnabled} = useKeyboardController()
|
||||
React.useEffect(() => {
|
||||
if (!isAndroid) return
|
||||
setEnabled(false)
|
||||
|
@ -180,6 +181,7 @@ export const ComposePost = observer(function ComposePost({
|
|||
const insets = useSafeAreaInsets()
|
||||
const viewStyles = useMemo(
|
||||
() => ({
|
||||
paddingTop: isAndroid ? insets.top : 0,
|
||||
paddingBottom:
|
||||
isAndroid || (isIOS && !isKeyboardVisible) ? insets.bottom : 0,
|
||||
}),
|
||||
|
@ -205,6 +207,26 @@ export const ComposePost = observer(function ComposePost({
|
|||
|
||||
useImperativeHandle(cancelRef, () => ({onPressCancel}))
|
||||
|
||||
// On Android, pressing Back should ask confirmation.
|
||||
useEffect(() => {
|
||||
if (!isAndroid) {
|
||||
return
|
||||
}
|
||||
const backHandler = BackHandler.addEventListener(
|
||||
'hardwareBackPress',
|
||||
() => {
|
||||
if (closeAllDialogs() || closeAllModals()) {
|
||||
return true
|
||||
}
|
||||
onPressCancel()
|
||||
return true
|
||||
},
|
||||
)
|
||||
return () => {
|
||||
backHandler.remove()
|
||||
}
|
||||
}, [onPressCancel, closeAllDialogs, closeAllModals])
|
||||
|
||||
// listen to escape key on desktop web
|
||||
const onEscape = useCallback(
|
||||
(e: KeyboardEvent) => {
|
||||
|
@ -408,37 +430,6 @@ export const ComposePost = observer(function ComposePost({
|
|||
bottomBarAnimatedStyle,
|
||||
} = useAnimatedBorders()
|
||||
|
||||
// Backup focus on android, if the keyboard *still* refuses to show
|
||||
useEffect(() => {
|
||||
if (!isAndroid) return
|
||||
if (!isModalReady) return
|
||||
|
||||
function tryFocus() {
|
||||
if (!Keyboard.isVisible()) {
|
||||
textInput.current?.blur()
|
||||
textInput.current?.focus()
|
||||
}
|
||||
}
|
||||
|
||||
tryFocus()
|
||||
// Retry with enough gap to avoid interrupting the previous attempt.
|
||||
// Unfortunately we don't know which attempt will succeed.
|
||||
const retryInterval = setInterval(tryFocus, 500)
|
||||
|
||||
function stopTrying() {
|
||||
clearInterval(retryInterval)
|
||||
}
|
||||
|
||||
// Deactivate this fallback as soon as anything happens.
|
||||
const sub1 = Keyboard.addListener('keyboardDidShow', stopTrying)
|
||||
const sub2 = Keyboard.addListener('keyboardDidHide', stopTrying)
|
||||
return () => {
|
||||
clearInterval(retryInterval)
|
||||
sub1.remove()
|
||||
sub2.remove()
|
||||
}
|
||||
}, [isModalReady])
|
||||
|
||||
return (
|
||||
<>
|
||||
<KeyboardAvoidingView
|
||||
|
@ -567,11 +558,7 @@ export const ComposePost = observer(function ComposePost({
|
|||
ref={textInput}
|
||||
richtext={richtext}
|
||||
placeholder={selectTextInputPlaceholder}
|
||||
// fixes autofocus on android
|
||||
key={
|
||||
isAndroid ? (isModalReady ? 'ready' : 'animating') : 'static'
|
||||
}
|
||||
autoFocus={isAndroid ? isModalReady : true}
|
||||
autoFocus
|
||||
setRichText={setRichText}
|
||||
onPhotoPasted={onPhotoPasted}
|
||||
onPressPublish={onPressPublish}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue