@@ -49,7 +49,7 @@ import {
4949 useTranslationContext ,
5050} from '../../contexts/translationContext/TranslationContext' ;
5151
52- import { triggerHaptic } from '../../native' ;
52+ import { isImageMediaLibraryAvailable , triggerHaptic } from '../../native' ;
5353import type { Asset , DefaultStreamChatGenerics } from '../../types/types' ;
5454import { AutoCompleteInput } from '../AutoCompleteInput/AutoCompleteInput' ;
5555
@@ -118,7 +118,6 @@ type MessageInputPropsWithContext<
118118 | 'FileUploadPreview'
119119 | 'fileUploads'
120120 | 'giphyActive'
121- | 'hasImagePicker'
122121 | 'ImageUploadPreview'
123122 | 'imageUploads'
124123 | 'Input'
@@ -185,7 +184,6 @@ const MessageInputWithContext = <
185184 FileUploadPreview,
186185 fileUploads,
187186 giphyActive,
188- hasImagePicker,
189187 ImageUploadPreview,
190188 imageUploads,
191189 Input,
@@ -349,46 +347,71 @@ const MessageInputWithContext = <
349347 imagesToRemove . forEach ( ( image ) => removeImage ( image . id ) ) ;
350348 } ;
351349
350+ const uploadFilesHandler = async ( ) => {
351+ const fileToUpload = selectedFiles . find ( ( selectedFile ) => {
352+ const uploadedFile = fileUploads . find (
353+ ( fileUpload ) =>
354+ fileUpload . file . uri === selectedFile . uri || fileUpload . url === selectedFile . uri ,
355+ ) ;
356+ return ! uploadedFile ;
357+ } ) ;
358+ if ( fileToUpload ) await uploadNewFile ( fileToUpload ) ;
359+ } ;
360+
361+ const removeFilesHandler = ( ) => {
362+ const filesToRemove = fileUploads . filter (
363+ ( fileUpload ) =>
364+ ! selectedFiles . find (
365+ ( selectedFile ) =>
366+ selectedFile . uri === fileUpload . file . uri || selectedFile . uri === fileUpload . url ,
367+ ) ,
368+ ) ;
369+ filesToRemove . forEach ( ( file ) => removeFile ( file . id ) ) ;
370+ } ;
371+
372+ /**
373+ * When a user selects or deselects an image in the image picker using media library.
374+ */
352375 useEffect ( ( ) => {
353- if ( imagesForInput ) {
354- if ( selectedImagesLength > imageUploadsLength ) {
355- /** User selected an image in bottom sheet attachment picker */
356- uploadImagesHandler ( ) ;
357- } else {
358- /** User de-selected an image in bottom sheet attachment picker */
359- removeImagesHandler ( ) ;
376+ const uploadOrRemoveImage = async ( ) => {
377+ if ( imagesForInput ) {
378+ if ( selectedImagesLength > imageUploadsLength ) {
379+ /** User selected an image in bottom sheet attachment picker */
380+ await uploadImagesHandler ( ) ;
381+ } else {
382+ /** User de-selected an image in bottom sheet attachment picker */
383+ removeImagesHandler ( ) ;
384+ }
360385 }
361- }
386+ } ;
387+ // If image picker is not available, don't do anything
388+ if ( ! isImageMediaLibraryAvailable ( ) ) return ;
389+ uploadOrRemoveImage ( ) ;
362390 // eslint-disable-next-line react-hooks/exhaustive-deps
363391 } , [ selectedImagesLength ] ) ;
364392
393+ /**
394+ * When a user selects or deselects a video in the image picker using media library.
395+ */
365396 useEffect ( ( ) => {
366- if ( selectedFilesLength > fileUploadsLength ) {
367- /** User selected a video in bottom sheet attachment picker */
368- const fileToUpload = selectedFiles . find ( ( selectedFile ) => {
369- const uploadedFile = fileUploads . find (
370- ( fileUpload ) =>
371- fileUpload . file . uri === selectedFile . uri || fileUpload . url === selectedFile . uri ,
372- ) ;
373- return ! uploadedFile ;
374- } ) ;
375- if ( fileToUpload ) uploadNewFile ( fileToUpload ) ;
376- } else {
377- /** User de-selected a video in bottom sheet attachment picker */
378- const filesToRemove = fileUploads . filter (
379- ( fileUpload ) =>
380- ! selectedFiles . find (
381- ( selectedFile ) =>
382- selectedFile . uri === fileUpload . file . uri || selectedFile . uri === fileUpload . url ,
383- ) ,
384- ) ;
385- filesToRemove . forEach ( ( file ) => removeFile ( file . id ) ) ;
386- }
397+ const uploadOrRemoveFile = async ( ) => {
398+ if ( selectedFilesLength > fileUploadsLength ) {
399+ /** User selected a video in bottom sheet attachment picker */
400+ await uploadFilesHandler ( ) ;
401+ } else {
402+ /** User de-selected a video in bottom sheet attachment picker */
403+ removeFilesHandler ( ) ;
404+ }
405+ } ;
406+ uploadOrRemoveFile ( ) ;
387407 // eslint-disable-next-line react-hooks/exhaustive-deps
388408 } , [ selectedFilesLength ] ) ;
389409
410+ /**
411+ * This is for image attachments selected from attachment picker.
412+ */
390413 useEffect ( ( ) => {
391- if ( imagesForInput && hasImagePicker ) {
414+ if ( imagesForInput && isImageMediaLibraryAvailable ( ) ) {
392415 if ( imageUploadsLength < selectedImagesLength ) {
393416 // /** User removed some image from seleted images within ImageUploadPreview. */
394417 const updatedSelectedImages = selectedImages . filter ( ( selectedImage ) => {
@@ -401,9 +424,7 @@ const MessageInputWithContext = <
401424 setSelectedImages ( updatedSelectedImages ) ;
402425 } else if ( imageUploadsLength > selectedImagesLength ) {
403426 /**
404- * User is editing some message which contains image attachments OR
405- * image attachment is added from custom image picker (other than the default bottomsheet image picker)
406- * using `uploadNewImage` function from `MessageInputContext`.
427+ * User is editing some message which contains image attachments.
407428 **/
408429 setSelectedImages (
409430 imageUploads
@@ -418,10 +439,13 @@ const MessageInputWithContext = <
418439 }
419440 }
420441 // eslint-disable-next-line react-hooks/exhaustive-deps
421- } , [ imageUploadsLength , hasImagePicker ] ) ;
442+ } , [ imageUploadsLength ] ) ;
422443
444+ /**
445+ * This is for video attachments selected from attachment picker.
446+ */
423447 useEffect ( ( ) => {
424- if ( hasImagePicker ) {
448+ if ( isImageMediaLibraryAvailable ( ) ) {
425449 if ( fileUploadsLength < selectedFilesLength ) {
426450 /** User removed some video from seleted files within ImageUploadPreview. */
427451 const updatedSelectedFiles = selectedFiles . filter ( ( selectedFile ) => {
@@ -434,9 +458,7 @@ const MessageInputWithContext = <
434458 setSelectedFiles ( updatedSelectedFiles ) ;
435459 } else if ( fileUploadsLength > selectedFilesLength ) {
436460 /**
437- * User is editing some message which contains video attachments OR
438- * video attachment is added from custom image picker (other than the default bottom-sheet image picker)
439- * using `uploadNewFile` function from `MessageInputContext`.
461+ * User is editing some message which contains video attachments.
440462 **/
441463 setSelectedFiles (
442464 fileUploads . map ( ( fileUpload ) => ( {
@@ -450,9 +472,10 @@ const MessageInputWithContext = <
450472 }
451473 }
452474 // eslint-disable-next-line react-hooks/exhaustive-deps
453- } , [ fileUploadsLength , hasImagePicker ] ) ;
475+ } , [ fileUploadsLength ] ) ;
454476
455477 const editingExists = ! ! editing ;
478+
456479 useEffect ( ( ) => {
457480 if ( editing && inputBoxRef . current ) {
458481 inputBoxRef . current . focus ( ) ;
@@ -1036,7 +1059,6 @@ export const MessageInput = <
10361059 FileUploadPreview,
10371060 fileUploads,
10381061 giphyActive,
1039- hasImagePicker,
10401062 ImageUploadPreview,
10411063 imageUploads,
10421064 Input,
@@ -1117,7 +1139,6 @@ export const MessageInput = <
11171139 FileUploadPreview,
11181140 fileUploads,
11191141 giphyActive,
1120- hasImagePicker,
11211142 ImageUploadPreview,
11221143 imageUploads,
11231144 Input,
0 commit comments