@@ -2,41 +2,38 @@ import React from 'react';
22
33import { Alert , ImageBackground , StyleSheet , Text , View } from 'react-native' ;
44
5- import { AttachmentPickerContextValue } from '../../../contexts/attachmentPickerContext/AttachmentPickerContext' ;
5+ import { FileReference , isLocalImageAttachment , isLocalVideoAttachment } from 'stream-chat' ;
6+
7+ import { useAttachmentManagerState } from '../../../contexts/messageInputContext/hooks/useAttachmentManagerState' ;
8+ import { useMessageComposer } from '../../../contexts/messageInputContext/hooks/useMessageComposer' ;
9+ import { useMessageInputContext } from '../../../contexts/messageInputContext/MessageInputContext' ;
610import { useTheme } from '../../../contexts/themeContext/ThemeContext' ;
711import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext' ;
812import { useViewport } from '../../../hooks/useViewport' ;
913import { Recorder } from '../../../icons' ;
1014import type { File } from '../../../types/types' ;
1115import { getDurationLabelFromDuration } from '../../../utils/utils' ;
1216import { BottomSheetTouchableOpacity } from '../../BottomSheetCompatibility/BottomSheetTouchableOpacity' ;
13- type AttachmentPickerItemType = Pick <
14- AttachmentPickerContextValue ,
15- 'selectedFiles' | 'setSelectedFiles' | 'setSelectedImages' | 'selectedImages' | 'maxNumberOfFiles'
16- > & {
17+
18+ type AttachmentPickerItemType = {
1719 asset : File ;
1820 ImageOverlaySelectedComponent : React . ComponentType ;
19- numberOfUploads : number ;
20- selected : boolean ;
2121 numberOfAttachmentPickerImageColumns ?: number ;
2222} ;
23- type AttachmentImageProps = Omit < AttachmentPickerItemType , 'setSelectedFiles' | 'selectedFiles' > ;
2423
25- type AttachmentVideoProps = Omit < AttachmentPickerItemType , 'setSelectedImages' | 'selectedImages' > ;
26-
27- const AttachmentVideo = ( props : AttachmentVideoProps ) => {
28- const {
29- asset,
30- ImageOverlaySelectedComponent,
31- maxNumberOfFiles,
32- numberOfAttachmentPickerImageColumns,
33- numberOfUploads,
34- selected,
35- selectedFiles,
36- setSelectedFiles,
37- } = props ;
24+ const AttachmentVideo = ( props : AttachmentPickerItemType ) => {
25+ const { asset, ImageOverlaySelectedComponent, numberOfAttachmentPickerImageColumns } = props ;
3826 const { vw } = useViewport ( ) ;
3927 const { t } = useTranslationContext ( ) ;
28+ const messageComposer = useMessageComposer ( ) ;
29+ const { uploadNewFile } = useMessageInputContext ( ) ;
30+ const { attachmentManager } = messageComposer ;
31+ const { attachments, availableUploadSlots } = useAttachmentManagerState ( ) ;
32+ const videoUploads = attachments . filter ( ( attachment ) => isLocalVideoAttachment ( attachment ) ) ;
33+
34+ const selected = videoUploads . some (
35+ ( attachment ) => ( attachment . localMetadata . file as FileReference ) . uri === asset . uri ,
36+ ) ;
4037
4138 const {
4239 theme : {
@@ -51,22 +48,20 @@ const AttachmentVideo = (props: AttachmentVideoProps) => {
5148
5249 const size = vw ( 100 ) / ( numberOfAttachmentPickerImageColumns || 3 ) - 2 ;
5350
54- const updateSelectedFiles = ( ) => {
55- if ( numberOfUploads >= maxNumberOfFiles ) {
56- Alert . alert ( t ( 'Maximum number of files reached' ) ) ;
57- return ;
58- }
59- setSelectedFiles ( [ ...selectedFiles , asset ] ) ;
60- } ;
61-
62- const onPressVideo = ( ) => {
51+ const onPressVideo = async ( ) => {
6352 if ( selected ) {
64- setSelectedFiles ( ( files ) =>
65- // `id` is available for Expo MediaLibrary while Cameraroll doesn't share id therefore we use `uri`
66- files . filter ( ( file ) => file . uri !== uri ) ,
53+ const attachment = videoUploads . find (
54+ ( attachment ) => ( attachment . localMetadata . file as FileReference ) . uri === uri ,
6755 ) ;
56+ if ( attachment ) {
57+ attachmentManager . removeAttachments ( [ attachment . localMetadata . id ] ) ;
58+ }
6859 } else {
69- updateSelectedFiles ( ) ;
60+ if ( ! availableUploadSlots ) {
61+ Alert . alert ( t ( 'Maximum number of files reached' ) ) ;
62+ return ;
63+ }
64+ await uploadNewFile ( asset ) ;
7065 }
7166 } ;
7267
@@ -101,44 +96,43 @@ const AttachmentVideo = (props: AttachmentVideoProps) => {
10196 ) ;
10297} ;
10398
104- const AttachmentImage = ( props : AttachmentImageProps ) => {
105- const {
106- asset,
107- ImageOverlaySelectedComponent,
108- maxNumberOfFiles,
109- numberOfAttachmentPickerImageColumns,
110- numberOfUploads,
111- selected,
112- selectedImages,
113- setSelectedImages,
114- } = props ;
99+ const AttachmentImage = ( props : AttachmentPickerItemType ) => {
100+ const { asset, ImageOverlaySelectedComponent, numberOfAttachmentPickerImageColumns } = props ;
115101 const {
116102 theme : {
117103 attachmentPicker : { image, imageOverlay } ,
118104 colors : { overlay } ,
119105 } ,
120106 } = useTheme ( ) ;
121107 const { vw } = useViewport ( ) ;
122- const { t } = useTranslationContext ( ) ;
108+ const { uploadNewImage } = useMessageInputContext ( ) ;
109+ const messageComposer = useMessageComposer ( ) ;
110+ const { attachmentManager } = messageComposer ;
111+ const { attachments, availableUploadSlots } = useAttachmentManagerState ( ) ;
112+ const imageUploads = attachments . filter ( ( attachment ) => isLocalImageAttachment ( attachment ) ) ;
113+
114+ const selected = imageUploads . some (
115+ ( attachment ) => attachment . localMetadata . previewUri === asset . uri ,
116+ ) ;
123117
124118 const size = vw ( 100 ) / ( numberOfAttachmentPickerImageColumns || 3 ) - 2 ;
125119
126120 const { uri } = asset ;
127121
128- const updateSelectedImages = ( ) => {
129- if ( numberOfUploads >= maxNumberOfFiles ) {
130- Alert . alert ( t ( 'Maximum number of files reached' ) ) ;
131- return ;
132- }
133- setSelectedImages ( [ ...selectedImages , asset ] ) ;
134- } ;
135-
136- const onPressImage = ( ) => {
122+ const onPressImage = async ( ) => {
137123 if ( selected ) {
138- // `id` is available for Expo MediaLibrary while Cameraroll doesn't share id therefore we use `uri`
139- setSelectedImages ( ( images ) => images . filter ( ( image ) => image . uri !== uri ) ) ;
124+ const attachment = imageUploads . find (
125+ ( attachment ) => attachment . localMetadata . previewUri === uri ,
126+ ) ;
127+ if ( attachment ) {
128+ await attachmentManager . removeAttachments ( [ attachment . localMetadata . id ] ) ;
129+ }
140130 } else {
141- updateSelectedImages ( ) ;
131+ if ( ! availableUploadSlots ) {
132+ Alert . alert ( 'Maximum number of files reached' ) ;
133+ return ;
134+ }
135+ await uploadNewImage ( asset ) ;
142136 }
143137 } ;
144138
@@ -166,18 +160,7 @@ const AttachmentImage = (props: AttachmentImageProps) => {
166160} ;
167161
168162export const renderAttachmentPickerItem = ( { item } : { item : AttachmentPickerItemType } ) => {
169- const {
170- asset,
171- ImageOverlaySelectedComponent,
172- maxNumberOfFiles,
173- numberOfAttachmentPickerImageColumns,
174- numberOfUploads,
175- selected,
176- selectedFiles,
177- selectedImages,
178- setSelectedFiles,
179- setSelectedImages,
180- } = item ;
163+ const { asset, ImageOverlaySelectedComponent, numberOfAttachmentPickerImageColumns } = item ;
181164
182165 /**
183166 * Expo Media Library - Result of asset type
@@ -192,12 +175,7 @@ export const renderAttachmentPickerItem = ({ item }: { item: AttachmentPickerIte
192175 < AttachmentVideo
193176 asset = { asset }
194177 ImageOverlaySelectedComponent = { ImageOverlaySelectedComponent }
195- maxNumberOfFiles = { maxNumberOfFiles }
196178 numberOfAttachmentPickerImageColumns = { numberOfAttachmentPickerImageColumns }
197- numberOfUploads = { numberOfUploads }
198- selected = { selected }
199- selectedFiles = { selectedFiles }
200- setSelectedFiles = { setSelectedFiles }
201179 />
202180 ) ;
203181 }
@@ -206,12 +184,7 @@ export const renderAttachmentPickerItem = ({ item }: { item: AttachmentPickerIte
206184 < AttachmentImage
207185 asset = { asset }
208186 ImageOverlaySelectedComponent = { ImageOverlaySelectedComponent }
209- maxNumberOfFiles = { maxNumberOfFiles }
210187 numberOfAttachmentPickerImageColumns = { numberOfAttachmentPickerImageColumns }
211- numberOfUploads = { numberOfUploads }
212- selected = { selected }
213- selectedImages = { selectedImages }
214- setSelectedImages = { setSelectedImages }
215188 />
216189 ) ;
217190} ;
0 commit comments