import React from 'react'; import { Video } from 'expo-av'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { ScrollView, StyleSheet, Text } from 'react-native'; import prettyBytes from 'pretty-bytes'; import { CustomIcon } from '../../lib/Icons'; import { ImageViewer, types } from '../../presentation/ImageViewer'; import { useDimensions, useOrientation } from '../../dimensions'; import { getHeaderHeight } from '../../containers/Header'; import sharedStyles from '../Styles'; import I18n from '../../i18n'; import { isAndroid } from '../../utils/deviceInfo'; import { allowPreview } from './utils'; import { IAttachment, IUseDimensions } from './interfaces'; import { THUMBS_HEIGHT } from './constants'; import { TSupportedThemes } from '../../theme'; import { themes } from '../../lib/constants'; const MESSAGEBOX_HEIGHT = 56; const styles = StyleSheet.create({ fileContainer: { alignItems: 'center', justifyContent: 'center' }, fileName: { fontSize: 16, marginHorizontal: 10, ...sharedStyles.textMedium, ...sharedStyles.textAlignCenter }, fileSize: { fontSize: 14, ...sharedStyles.textRegular } }); interface IIconPreview { iconName: string; title: string; description?: string; theme: TSupportedThemes; width: number; height: number; danger?: boolean; } const IconPreview = React.memo(({ iconName, title, description, theme, width, height, danger }: IIconPreview) => ( {title} {description ? {description} : null} )); interface IPreview { item: IAttachment; theme: TSupportedThemes; isShareExtension: boolean; length: number; } const Preview = React.memo(({ item, theme, isShareExtension, length }: IPreview) => { const type = item?.mime; const { width, height } = useDimensions() as IUseDimensions; const { isLandscape } = useOrientation(); const insets = useSafeAreaInsets(); const headerHeight = getHeaderHeight(isLandscape); const thumbsHeight = length > 1 ? THUMBS_HEIGHT : 0; const calculatedHeight = height - insets.top - insets.bottom - MESSAGEBOX_HEIGHT - thumbsHeight - headerHeight; if (item?.canUpload) { // Disable video preview on iOS to save memory if (isAndroid && type?.match(/video/)) { return ( ); } // Disallow preview of images too big in order to prevent memory issues on iOS share extension if (type?.match(/image/)) { if (allowPreview(isShareExtension, item?.size)) { return ( ); } } return ( ); } return ( ); }); export default Preview;