import React from 'react'; import { FlatList, Image, StyleSheet, TouchableOpacity, View } from 'react-native'; import { UploadProgressIndicator } from './UploadProgressIndicator'; import { ImageUpload, MessageInputContextValue, useMessageInputContext, } from '../../contexts/messageInputContext/MessageInputContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; import { Close } from '../../icons/Close'; import { FileState, ProgressIndicatorTypes } from '../../utils/utils'; import type { DefaultAttachmentType, DefaultChannelType, DefaultCommandType, DefaultEventType, DefaultMessageType, DefaultReactionType, DefaultUserType, UnknownType, } from '../../types/types'; const IMAGE_PREVIEW_SIZE = 100; const styles = StyleSheet.create({ dismiss: { borderRadius: 24, position: 'absolute', right: 8, top: 8, }, flatList: { paddingBottom: 12 }, itemContainer: { flexDirection: 'row', height: IMAGE_PREVIEW_SIZE, marginLeft: 8, }, upload: { borderRadius: 10, height: IMAGE_PREVIEW_SIZE, width: IMAGE_PREVIEW_SIZE, }, }); type ImageUploadPreviewPropsWithContext< At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, > = Pick< MessageInputContextValue, 'imageUploads' | 'removeImage' | 'uploadImage' >; export type ImageUploadPreviewProps< At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, > = Partial>; const ImageUploadPreviewWithContext = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( props: ImageUploadPreviewPropsWithContext, ) => { const { imageUploads, removeImage, uploadImage } = props; const { theme: { colors: { overlay_dark, white }, messageInput: { imageUploadPreview: { dismiss, flatList, itemContainer, upload }, }, }, } = useTheme(); const renderItem = ({ index, item }: { index: number; item: ImageUpload }) => ( { uploadImage({ newImage: item }); }} active={item.state !== FileState.UPLOADED && item.state !== FileState.FINISHED} style={styles.upload} type={ item.state === FileState.UPLOADING ? ProgressIndicatorTypes.IN_PROGRESS : item.state === FileState.UPLOAD_FAILED ? ProgressIndicatorTypes.RETRY : undefined } > { removeImage(item.id); }} style={[styles.dismiss, { backgroundColor: overlay_dark }, dismiss]} testID='remove-image-upload-preview' > ); return imageUploads.length > 0 ? ( ({ index, length: IMAGE_PREVIEW_SIZE + 8, offset: (IMAGE_PREVIEW_SIZE + 8) * index, })} horizontal keyExtractor={(item) => item.id} renderItem={renderItem} style={[styles.flatList, flatList]} /> ) : null; }; const areEqual = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( prevProps: ImageUploadPreviewPropsWithContext, nextProps: ImageUploadPreviewPropsWithContext, ) => { const { imageUploads: prevImageUploads } = prevProps; const { imageUploads: nextImageUploads } = nextProps; return ( prevImageUploads.length === nextImageUploads.length && prevImageUploads.every( (prevImageUpload, index) => prevImageUpload.state === nextImageUploads[index].state, ) ); }; const MemoizedImageUploadPreviewWithContext = React.memo( ImageUploadPreviewWithContext, areEqual, ) as typeof ImageUploadPreviewWithContext; /** * UI Component to preview the images set for upload */ export const ImageUploadPreview = < At extends UnknownType = DefaultAttachmentType, Ch extends UnknownType = DefaultChannelType, Co extends string = DefaultCommandType, Ev extends UnknownType = DefaultEventType, Me extends UnknownType = DefaultMessageType, Re extends UnknownType = DefaultReactionType, Us extends UnknownType = DefaultUserType, >( props: ImageUploadPreviewProps, ) => { const { imageUploads, removeImage, uploadImage } = useMessageInputContext(); return ( ); }; ImageUploadPreview.displayName = 'ImageUploadPreview{messageInput{imageUploadPreview}}';