align lightbox behaviour with iOS

This commit is contained in:
Samuel Newman
2024-12-20 19:49:36 +00:00
parent fa639e6c44
commit a72d7736c6
+16 -10
View File
@@ -40,18 +40,19 @@ import {
useSafeAreaFrame, useSafeAreaFrame,
useSafeAreaInsets, useSafeAreaInsets,
} from 'react-native-safe-area-context' } from 'react-native-safe-area-context'
import * as NavigationBar from 'expo-navigation-bar'
import {StatusBar} from 'expo-status-bar' import {StatusBar} from 'expo-status-bar'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {Trans} from '@lingui/macro' import {Trans} from '@lingui/macro'
import {Dimensions} from '#/lib/media/types' import {Dimensions} from '#/lib/media/types'
import {colors, s} from '#/lib/styles' import {colors, s} from '#/lib/styles'
import {isIOS} from '#/platform/detection' import {isAndroid, isIOS} from '#/platform/detection'
import {Lightbox} from '#/state/lightbox' import {Lightbox} from '#/state/lightbox'
import {Button} from '#/view/com/util/forms/Button' import {Button} from '#/view/com/util/forms/Button'
import {Text} from '#/view/com/util/text/Text' import {Text} from '#/view/com/util/text/Text'
import {ScrollView} from '#/view/com/util/Views' import {ScrollView} from '#/view/com/util/Views'
import {ios, useTheme} from '#/alf' import {useTheme} from '#/alf'
import {setNavigationBar} from '#/alf/util/navigationBar' import {setNavigationBar} from '#/alf/util/navigationBar'
import {PlatformInfo} from '../../../../../modules/expo-bluesky-swiss-army' import {PlatformInfo} from '../../../../../modules/expo-bluesky-swiss-army'
import {ImageSource, Transform} from './@types' import {ImageSource, Transform} from './@types'
@@ -60,11 +61,12 @@ import ImageItem from './components/ImageItem/ImageItem'
type Rect = {x: number; y: number; width: number; height: number} type Rect = {x: number; y: number; width: number; height: number}
const EDGE_TO_EDGE = !(Platform.OS === 'android' && Platform.Version < 35)
const PIXEL_RATIO = PixelRatio.get() const PIXEL_RATIO = PixelRatio.get()
const EDGES = const EDGES = EDGE_TO_EDGE
Platform.OS === 'android' && Platform.Version < 35 ? (['left', 'right'] satisfies Edge[]) // iOS or Android 15+, so no top/bottom safe area
? (['top', 'bottom', 'left', 'right'] satisfies Edge[]) : (['top', 'bottom', 'left', 'right'] satisfies Edge[])
: (['left', 'right'] satisfies Edge[]) // iOS or Android 15+, so no top/bottom safe area
const SLOW_SPRING: WithSpringConfig = { const SLOW_SPRING: WithSpringConfig = {
mass: isIOS ? 1.25 : 0.75, mass: isIOS ? 1.25 : 0.75,
@@ -298,10 +300,16 @@ function ImageView({
const t = useTheme() const t = useTheme()
useEffect(() => { useEffect(() => {
setNavigationBar('lightbox', t) setNavigationBar('lightbox', t)
if (isAndroid && EDGE_TO_EDGE && !showControls) {
NavigationBar.setVisibilityAsync('hidden')
}
return () => { return () => {
setNavigationBar('theme', t) setNavigationBar('theme', t)
if (isAndroid && EDGE_TO_EDGE && !showControls) {
NavigationBar.setVisibilityAsync('visible')
}
} }
}, [t]) }, [t, showControls])
return ( return (
<Animated.View style={[styles.container, containerStyle]}> <Animated.View style={[styles.container, containerStyle]}>
@@ -310,9 +318,7 @@ function ImageView({
style="light" style="light"
hideTransitionAnimation="slide" hideTransitionAnimation="slide"
backgroundColor="black" backgroundColor="black"
// hiding causes layout shifts on android, hidden={EDGE_TO_EDGE ? isScaled || !showControls : false}
// so avoid until we add edge-to-edge mode
hidden={ios(isScaled || !showControls)}
/> />
<Animated.View <Animated.View
style={[styles.backdrop, backdropStyle]} style={[styles.backdrop, backdropStyle]}