Refactor LightboxFooter props
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user