import React, {useCallback, useEffect, useState} from 'react' import { Image, TouchableOpacity, TouchableWithoutFeedback, StyleSheet, View, Pressable, } from 'react-native' import {observer} from 'mobx-react-lite' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {useStores} from 'state/index' import * as models from 'state/models/ui/shell' import {colors, s} from 'lib/styles' import ImageDefaultHeader from './ImageViewing/components/ImageDefaultHeader' import {Text} from '../util/text/Text' import {useLingui} from '@lingui/react' import {msg} from '@lingui/macro' interface Img { uri: string alt?: string } export const Lightbox = observer(function Lightbox() { const store = useStores() const onClose = useCallback(() => store.shell.closeLightbox(), [store.shell]) if (!store.shell.isLightboxActive) { return null } const activeLightbox = store.shell.activeLightbox const initialIndex = activeLightbox instanceof models.ImagesLightbox ? activeLightbox.index : 0 let imgs: Img[] | undefined if (activeLightbox instanceof models.ProfileImageLightbox) { const opts = activeLightbox if (opts.profileView.avatar) { imgs = [{uri: opts.profileView.avatar}] } } else if (activeLightbox instanceof models.ImagesLightbox) { const opts = activeLightbox imgs = opts.images } if (!imgs) { return null } return ( ) }) function LightboxInner({ imgs, initialIndex = 0, onClose, }: { imgs: Img[] initialIndex: number onClose: () => void }) { const {_} = useLingui() const [index, setIndex] = useState(initialIndex) const [isAltExpanded, setAltExpanded] = useState(false) const canGoLeft = index >= 1 const canGoRight = index < imgs.length - 1 const onPressLeft = useCallback(() => { if (canGoLeft) { setIndex(index - 1) } }, [index, canGoLeft]) const onPressRight = useCallback(() => { if (canGoRight) { setIndex(index + 1) } }, [index, canGoRight]) const onKeyDown = useCallback( (e: KeyboardEvent) => { if (e.key === 'Escape') { onClose() } else if (e.key === 'ArrowLeft') { onPressLeft() } else if (e.key === 'ArrowRight') { onPressRight() } }, [onClose, onPressLeft, onPressRight], ) useEffect(() => { window.addEventListener('keydown', onKeyDown) return () => window.removeEventListener('keydown', onKeyDown) }, [onKeyDown]) return ( {canGoLeft && ( )} {canGoRight && ( )} {imgs[index].alt ? ( { setAltExpanded(!isAltExpanded) }}> {imgs[index].alt} ) : null} ) } const styles = StyleSheet.create({ mask: { position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: '#000c', }, imageCenterer: { flex: 1, alignItems: 'center', justifyContent: 'center', }, image: { width: '100%', height: '100%', resizeMode: 'contain', }, icon: { color: colors.white, }, closeBtn: { position: 'absolute', top: 10, right: 10, }, btn: { position: 'absolute', backgroundColor: '#000', width: 50, height: 50, justifyContent: 'center', alignItems: 'center', borderRadius: 25, }, leftBtn: { left: 30, top: '50%', }, rightBtn: { position: 'absolute', right: 30, top: '50%', }, footer: { paddingHorizontal: 32, paddingVertical: 24, backgroundColor: colors.black, }, })