import React, { useContext, useState } from 'react'; import { StyleProp, StyleSheet, TextStyle } from 'react-native'; import { dequal } from 'dequal'; import Touchable from './Touchable'; import Markdown from '../markdown'; import { isIOS } from '../../utils/deviceInfo'; import { CustomIcon } from '../../lib/Icons'; import { formatAttachmentUrl } from '../../lib/utils'; import { themes } from '../../constants/colors'; import MessageContext from './Context'; import { fileDownload } from '../../utils/fileDownload'; import EventEmitter from '../../utils/events'; import { LISTENER } from '../Toast'; import I18n from '../../i18n'; import { IAttachment } from '../../definitions/IAttachment'; import RCActivityIndicator from '../ActivityIndicator'; import { TGetCustomEmoji } from '../../definitions/IEmoji'; import { useTheme } from '../../theme'; const SUPPORTED_TYPES = ['video/quicktime', 'video/mp4', ...(isIOS ? [] : ['video/3gp', 'video/mkv'])]; const isTypeSupported = (type: string) => SUPPORTED_TYPES.indexOf(type) !== -1; const styles = StyleSheet.create({ button: { flex: 1, borderRadius: 4, height: 150, marginBottom: 6, alignItems: 'center', justifyContent: 'center' } }); interface IMessageVideo { file: IAttachment; showAttachment?: (file: IAttachment) => void; getCustomEmoji: TGetCustomEmoji; style?: StyleProp[]; isReply?: boolean; } const Video = React.memo( ({ file, showAttachment, getCustomEmoji, style, isReply }: IMessageVideo) => { const { baseUrl, user } = useContext(MessageContext); const [loading, setLoading] = useState(false); const { theme } = useTheme(); if (!baseUrl) { return null; } const onPress = async () => { if (file.video_type && isTypeSupported(file.video_type) && showAttachment) { return showAttachment(file); } if (!isIOS && file.video_url) { const uri = formatAttachmentUrl(file.video_url, user.id, user.token, baseUrl); await downloadVideo(uri); return; } EventEmitter.emit(LISTENER, { message: I18n.t('Unsupported_format') }); }; const downloadVideo = async (uri: string) => { setLoading(true); const fileDownloaded = await fileDownload(uri, file); setLoading(false); if (fileDownloaded) { EventEmitter.emit(LISTENER, { message: I18n.t('saved_to_gallery') }); return; } EventEmitter.emit(LISTENER, { message: I18n.t('error-save-video') }); }; return ( <> {loading ? : } ); }, (prevProps, nextProps) => dequal(prevProps.file, nextProps.file) ); export default Video;