2020-06-26 20:22:56 +00:00
|
|
|
import React from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { Video } from 'expo-av';
|
|
|
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
|
|
import { ScrollView, Text, StyleSheet } from 'react-native';
|
|
|
|
import prettyBytes from 'pretty-bytes';
|
|
|
|
|
|
|
|
import { CustomIcon } from '../../lib/Icons';
|
|
|
|
import { ImageViewer, types } from '../../presentation/ImageViewer';
|
|
|
|
import { themes } from '../../constants/colors';
|
|
|
|
import { useDimensions, useOrientation } from '../../dimensions';
|
|
|
|
import { getHeaderHeight } from '../../containers/Header';
|
|
|
|
import { THUMBS_HEIGHT } from './constants';
|
|
|
|
import sharedStyles from '../Styles';
|
|
|
|
import { allowPreview } from './utils';
|
|
|
|
import I18n from '../../i18n';
|
2021-02-10 13:35:44 +00:00
|
|
|
import { isAndroid } from '../../utils/deviceInfo';
|
2020-06-26 20:22:56 +00:00
|
|
|
|
2020-07-14 16:43:15 +00:00
|
|
|
const MESSAGEBOX_HEIGHT = 56;
|
|
|
|
|
2020-06-26 20:22:56 +00:00
|
|
|
const styles = StyleSheet.create({
|
|
|
|
fileContainer: {
|
|
|
|
alignItems: 'center',
|
|
|
|
justifyContent: 'center'
|
|
|
|
},
|
|
|
|
fileName: {
|
|
|
|
fontSize: 16,
|
|
|
|
marginHorizontal: 10,
|
2020-11-30 21:47:05 +00:00
|
|
|
...sharedStyles.textMedium,
|
|
|
|
...sharedStyles.textAlignCenter
|
2020-06-26 20:22:56 +00:00
|
|
|
},
|
|
|
|
fileSize: {
|
|
|
|
fontSize: 14,
|
|
|
|
...sharedStyles.textRegular
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const IconPreview = React.memo(({
|
|
|
|
iconName, title, description, theme, width, height, danger
|
|
|
|
}) => (
|
|
|
|
<ScrollView
|
|
|
|
style={{ backgroundColor: themes[theme].auxiliaryBackground }}
|
|
|
|
contentContainerStyle={[styles.fileContainer, { width, height }]}
|
|
|
|
>
|
|
|
|
<CustomIcon
|
|
|
|
name={iconName}
|
|
|
|
size={56}
|
|
|
|
color={danger ? themes[theme].dangerColor : themes[theme].tintColor}
|
|
|
|
/>
|
|
|
|
<Text style={[styles.fileName, { color: themes[theme].titleText }]}>{title}</Text>
|
|
|
|
{description ? <Text style={[styles.fileSize, { color: themes[theme].bodyText }]}>{description}</Text> : null}
|
|
|
|
</ScrollView>
|
|
|
|
));
|
|
|
|
|
|
|
|
const Preview = React.memo(({
|
|
|
|
item, theme, isShareExtension, length
|
|
|
|
}) => {
|
|
|
|
const type = item?.mime;
|
|
|
|
const { width, height } = useDimensions();
|
|
|
|
const { isLandscape } = useOrientation();
|
|
|
|
const insets = useSafeAreaInsets();
|
|
|
|
const headerHeight = getHeaderHeight(isLandscape);
|
|
|
|
const thumbsHeight = (length > 1) ? THUMBS_HEIGHT : 0;
|
2020-07-14 16:43:15 +00:00
|
|
|
const calculatedHeight = height - insets.top - insets.bottom - MESSAGEBOX_HEIGHT - thumbsHeight - headerHeight;
|
2020-06-26 20:22:56 +00:00
|
|
|
|
|
|
|
if (item?.canUpload) {
|
2021-02-10 13:35:44 +00:00
|
|
|
// Disable video preview on iOS to save memory
|
|
|
|
if (isAndroid && type?.match(/video/)) {
|
2020-06-26 20:22:56 +00:00
|
|
|
return (
|
2020-07-14 16:43:15 +00:00
|
|
|
<ScrollView style={{ height: calculatedHeight }}>
|
|
|
|
<Video
|
|
|
|
source={{ uri: item.path }}
|
|
|
|
rate={1.0}
|
|
|
|
volume={1.0}
|
|
|
|
isMuted={false}
|
|
|
|
resizeMode={Video.RESIZE_MODE_CONTAIN}
|
|
|
|
isLooping={false}
|
|
|
|
style={{ width, height: calculatedHeight }}
|
|
|
|
useNativeControls
|
|
|
|
/>
|
|
|
|
</ScrollView>
|
2020-06-26 20:22:56 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Disallow preview of images too big in order to prevent memory issues on iOS share extension
|
2021-02-10 13:35:44 +00:00
|
|
|
if (type?.match(/image/)) {
|
|
|
|
if (allowPreview(isShareExtension, item?.size)) {
|
2020-06-26 20:22:56 +00:00
|
|
|
return (
|
|
|
|
<ImageViewer
|
|
|
|
uri={item.path}
|
|
|
|
imageComponentType={isShareExtension ? types.REACT_NATIVE_IMAGE : types.FAST_IMAGE}
|
|
|
|
width={width}
|
|
|
|
height={calculatedHeight}
|
|
|
|
theme={theme}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<IconPreview
|
2020-07-27 19:53:33 +00:00
|
|
|
iconName={type?.match(/image/) ? 'image' : 'attach'}
|
2020-06-26 20:22:56 +00:00
|
|
|
title={item?.filename}
|
|
|
|
description={prettyBytes(item?.size ?? 0)}
|
|
|
|
theme={theme}
|
|
|
|
width={width}
|
|
|
|
height={calculatedHeight}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<IconPreview
|
|
|
|
iconName='warning'
|
|
|
|
title={I18n.t(item?.error)}
|
|
|
|
description={prettyBytes(item?.size ?? 0)}
|
|
|
|
theme={theme}
|
|
|
|
width={width}
|
|
|
|
height={calculatedHeight}
|
|
|
|
danger
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
});
|
|
|
|
Preview.propTypes = {
|
|
|
|
item: PropTypes.object,
|
|
|
|
theme: PropTypes.string,
|
|
|
|
isShareExtension: PropTypes.bool,
|
|
|
|
length: PropTypes.number
|
|
|
|
};
|
|
|
|
|
|
|
|
IconPreview.propTypes = {
|
|
|
|
iconName: PropTypes.string,
|
|
|
|
title: PropTypes.string,
|
|
|
|
description: PropTypes.string,
|
|
|
|
theme: PropTypes.string,
|
|
|
|
width: PropTypes.number,
|
|
|
|
height: PropTypes.number,
|
|
|
|
danger: PropTypes.bool
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Preview;
|