Refactor LightboxFooter props

This commit is contained in:
Dan Abramov
2024-11-02 00:08:31 +00:00
parent 00ff654134
commit ab6877795f
2 changed files with 41 additions and 38 deletions
+2 -9
View File
@@ -2,17 +2,10 @@ import React from 'react'
import type {MeasuredDimensions} from 'react-native-reanimated' import type {MeasuredDimensions} from 'react-native-reanimated'
import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
import {Dimensions} from '#/lib/media/types' import {ImageSource} from '#/view/com/lightbox/ImageViewing/@types'
type ImagesLightboxItem = {
uri: string
thumbUri: string
alt?: string
dimensions: Dimensions | null
}
type Lightbox = { type Lightbox = {
images: ImagesLightboxItem[] images: ImageSource[]
thumbDims: MeasuredDimensions | null thumbDims: MeasuredDimensions | null
index: number index: number
} }
+39 -29
View File
@@ -10,6 +10,7 @@ import {saveImageToMediaLibrary, shareImageModal} from '#/lib/media/manip'
import {colors, s} from '#/lib/styles' import {colors, s} from '#/lib/styles'
import {isIOS} from '#/platform/detection' import {isIOS} from '#/platform/detection'
import {useLightbox, useLightboxControls} from '#/state/lightbox' import {useLightbox, useLightboxControls} from '#/state/lightbox'
import {ImageSource} from '#/view/com/lightbox/ImageViewing/@types'
import {ScrollView} from '#/view/com/util/Views' import {ScrollView} from '#/view/com/util/Views'
import {Button} from '../util/forms/Button' import {Button} from '../util/forms/Button'
import {Text} from '../util/text/Text' import {Text} from '../util/text/Text'
@@ -21,41 +22,15 @@ const SCREEN_HEIGHT = Dimensions.get('window').height
export function Lightbox() { export function Lightbox() {
const {activeLightbox} = useLightbox() const {activeLightbox} = useLightbox()
const {closeLightbox} = useLightboxControls() const {closeLightbox} = useLightboxControls()
const onClose = React.useCallback(() => { const onClose = React.useCallback(() => {
closeLightbox() closeLightbox()
}, [closeLightbox]) }, [closeLightbox])
if (!activeLightbox) {
return null
}
return (
<ImageView
images={activeLightbox.images}
initialImageIndex={activeLightbox.index}
thumbDims={activeLightbox.thumbDims}
visible
onRequestClose={onClose}
renderFooter={index => (
<LightboxFooter
uri={activeLightbox.images[index].uri}
altText={activeLightbox.images[index].alt || ''}
/>
)}
/>
)
}
function LightboxFooter({altText, uri}: {altText?: string; uri: string}) {
const {_} = useLingui() const {_} = useLingui()
const [isAltExpanded, setAltExpanded] = React.useState(false)
const [permissionResponse, requestPermission] = MediaLibrary.usePermissions({ const [permissionResponse, requestPermission] = MediaLibrary.usePermissions({
granularPermissions: ['photo'], granularPermissions: ['photo'],
}) })
const insets = useSafeAreaInsets()
const svMaxHeight = SCREEN_HEIGHT - insets.top - 50
const isMomentumScrolling = React.useRef(false)
const saveImageToAlbumWithToasts = React.useCallback( const saveImageToAlbumWithToasts = React.useCallback(
async (uri: string) => { async (uri: string) => {
if (!permissionResponse || permissionResponse.granted === false) { if (!permissionResponse || permissionResponse.granted === false) {
@@ -75,7 +50,6 @@ function LightboxFooter({altText, uri}: {altText?: string; uri: string}) {
} }
return return
} }
try { try {
await saveImageToMediaLibrary({uri}) await saveImageToMediaLibrary({uri})
Toast.show(_(msg`Saved to your camera roll`)) Toast.show(_(msg`Saved to your camera roll`))
@@ -86,6 +60,42 @@ function LightboxFooter({altText, uri}: {altText?: string; uri: string}) {
[permissionResponse, requestPermission, _], [permissionResponse, requestPermission, _],
) )
if (!activeLightbox) {
return null
}
return (
<ImageView
images={activeLightbox.images}
initialImageIndex={activeLightbox.index}
thumbDims={activeLightbox.thumbDims}
visible
onRequestClose={onClose}
renderFooter={index => (
<LightboxFooter
images={activeLightbox.images}
index={index}
onPressSave={saveImageToAlbumWithToasts}
/>
)}
/>
)
}
function LightboxFooter({
images,
index,
onPressSave,
}: {
images: ImageSource[]
index: number
onPressSave: (uri: string) => void
}) {
const {alt: altText, uri} = images[index]
const [isAltExpanded, setAltExpanded] = React.useState(false)
const insets = useSafeAreaInsets()
const svMaxHeight = SCREEN_HEIGHT - insets.top - 50
const isMomentumScrolling = React.useRef(false)
return ( return (
<ScrollView <ScrollView
style={[ style={[
@@ -131,7 +141,7 @@ function LightboxFooter({altText, uri}: {altText?: string; uri: string}) {
<Button <Button
type="primary-outline" type="primary-outline"
style={styles.footerBtn} style={styles.footerBtn}
onPress={() => saveImageToAlbumWithToasts(uri)}> onPress={() => onPressSave(uri)}>
<FontAwesomeIcon icon={['far', 'floppy-disk']} style={s.white} /> <FontAwesomeIcon icon={['far', 'floppy-disk']} style={s.white} />
<Text type="xl" style={s.white}> <Text type="xl" style={s.white}>
<Trans context="action">Save</Trans> <Trans context="action">Save</Trans>