@@ -23,6 +23,10 @@ import {
2323 useSuggestionsContext ,
2424} from '../../contexts/suggestionsContext/SuggestionsContext' ;
2525import { useTheme } from '../../contexts/themeContext/ThemeContext' ;
26+ import {
27+ ThreadContextValue ,
28+ useThreadContext ,
29+ } from '../../contexts/threadContext/ThreadContext' ;
2630import {
2731 TranslationContextValue ,
2832 useTranslationContext ,
@@ -150,6 +154,7 @@ type MessageInputPropsWithContext<
150154 SuggestionsContextValue < Co , Us > ,
151155 'componentType' | 'suggestions' | 'suggestionsTitle'
152156 > &
157+ Pick < ThreadContextValue , 'thread' > &
153158 Pick < TranslationContextValue , 't' > & {
154159 threadList ?: boolean ;
155160 } ;
@@ -200,6 +205,7 @@ const MessageInputWithContext = <
200205 suggestions,
201206 suggestionsTitle,
202207 t,
208+ thread,
203209 threadList,
204210 uploadNewImage,
205211 watchers,
@@ -260,54 +266,85 @@ const MessageInputWithContext = <
260266 return closeAttachmentPicker ;
261267 } , [ ] ) ;
262268
263- const selectedImagesLength = selectedImages . length ;
264- const imageUploadsLength = imageUploads . length ;
269+ const [ hasResetImages , setHasResetImages ] = useState ( false ) ;
270+ const selectedImagesLength = hasResetImages ? selectedImages . length : 0 ;
271+ const imageUploadsLength = hasResetImages ? imageUploads . length : 0 ;
272+ const imagesForInput = ( ! ! thread && ! ! threadList ) || ( ! thread && ! threadList ) ;
273+
274+ useEffect ( ( ) => {
275+ setSelectedImages ( [ ] ) ;
276+ if ( imageUploads . length ) {
277+ imageUploads . forEach ( ( image ) => removeImage ( image . id ) ) ;
278+ }
279+ return ( ) => setSelectedImages ( [ ] ) ;
280+ } , [ ] ) ;
281+
282+ useEffect ( ( ) => {
283+ if (
284+ hasResetImages === false &&
285+ imageUploadsLength === 0 &&
286+ selectedImagesLength === 0
287+ ) {
288+ setHasResetImages ( true ) ;
289+ }
290+ } , [ imageUploadsLength , selectedImagesLength ] ) ;
291+
265292 useEffect ( ( ) => {
266- if ( selectedImagesLength > imageUploadsLength ) {
267- const imagesToUpload = selectedImages . filter ( ( selectedImage ) => {
268- const uploadedImage = imageUploads . find (
293+ if ( imagesForInput === false && imageUploads . length ) {
294+ imageUploads . forEach ( ( image ) => removeImage ( image . id ) ) ;
295+ }
296+ } , [ imagesForInput ] ) ;
297+
298+ useEffect ( ( ) => {
299+ if ( imagesForInput ) {
300+ if ( selectedImagesLength > imageUploadsLength ) {
301+ const imagesToUpload = selectedImages . filter ( ( selectedImage ) => {
302+ const uploadedImage = imageUploads . find (
303+ ( imageUpload ) =>
304+ imageUpload . file . uri === selectedImage . uri ||
305+ imageUpload . url === selectedImage . uri ,
306+ ) ;
307+ return ! uploadedImage ;
308+ } ) ;
309+ imagesToUpload . forEach ( ( image ) => uploadNewImage ( image ) ) ;
310+ } else if ( selectedImagesLength < imageUploadsLength ) {
311+ const imagesToRemove = imageUploads . filter (
269312 ( imageUpload ) =>
270- imageUpload . file . uri === selectedImage . uri ||
271- imageUpload . url === selectedImage . uri ,
313+ ! selectedImages . find (
314+ ( selectedImage ) =>
315+ selectedImage . uri === imageUpload . file . uri ||
316+ selectedImage . uri === imageUpload . url ,
317+ ) ,
272318 ) ;
273- return ! uploadedImage ;
274- } ) ;
275- imagesToUpload . forEach ( ( image ) => uploadNewImage ( image ) ) ;
276- } else if ( selectedImagesLength < imageUploadsLength ) {
277- const imagesToRemove = imageUploads . filter (
278- ( imageUpload ) =>
279- ! selectedImages . find (
280- ( selectedImage ) =>
281- selectedImage . uri === imageUpload . file . uri ||
282- selectedImage . uri === imageUpload . url ,
283- ) ,
284- ) ;
285- imagesToRemove . forEach ( ( image ) => removeImage ( image . id ) ) ;
319+ imagesToRemove . forEach ( ( image ) => removeImage ( image . id ) ) ;
320+ }
286321 }
287322 } , [ selectedImagesLength ] ) ;
288323
289324 useEffect ( ( ) => {
290- if ( imageUploadsLength < selectedImagesLength ) {
291- const updatedSelectedImages = selectedImages . filter ( ( selectedImage ) => {
292- const uploadedImage = imageUploads . find (
293- ( imageUpload ) =>
294- imageUpload . file . uri === selectedImage . uri ||
295- imageUpload . url === selectedImage . uri ,
325+ if ( imagesForInput ) {
326+ if ( imageUploadsLength < selectedImagesLength ) {
327+ const updatedSelectedImages = selectedImages . filter ( ( selectedImage ) => {
328+ const uploadedImage = imageUploads . find (
329+ ( imageUpload ) =>
330+ imageUpload . file . uri === selectedImage . uri ||
331+ imageUpload . url === selectedImage . uri ,
332+ ) ;
333+ return uploadedImage ;
334+ } ) ;
335+ setSelectedImages ( updatedSelectedImages ) ;
336+ } else if ( imageUploadsLength > selectedImagesLength ) {
337+ setSelectedImages (
338+ imageUploads
339+ . map ( ( imageUpload ) => ( {
340+ height : imageUpload . file . height ,
341+ source : imageUpload . file . source ,
342+ uri : imageUpload . url ,
343+ width : imageUpload . file . width ,
344+ } ) )
345+ . filter ( Boolean ) as Asset [ ] ,
296346 ) ;
297- return uploadedImage ;
298- } ) ;
299- setSelectedImages ( updatedSelectedImages ) ;
300- } else if ( imageUploadsLength > selectedImagesLength ) {
301- setSelectedImages (
302- imageUploads
303- . map ( ( imageUpload ) => ( {
304- height : imageUpload . file . height ,
305- source : imageUpload . file . source ,
306- uri : imageUpload . url ,
307- width : imageUpload . file . width ,
308- } ) )
309- . filter ( Boolean ) as Asset [ ] ,
310- ) ;
347+ }
311348 }
312349 } , [ imageUploadsLength ] ) ;
313350
@@ -592,6 +629,7 @@ const areEqual = <
592629 suggestions : prevSuggestions ,
593630 suggestionsTitle : prevSuggestionsTitle ,
594631 t : prevT ,
632+ thread : prevThread ,
595633 threadList : prevThreadList ,
596634 } = prevProps ;
597635 const {
@@ -610,6 +648,7 @@ const areEqual = <
610648 suggestions : nextSuggestions ,
611649 suggestionsTitle : nextSuggestionsTitle ,
612650 t : nextT ,
651+ thread : nextThread ,
613652 threadList : nextThreadList ,
614653 } = nextProps ;
615654
@@ -676,6 +715,12 @@ const areEqual = <
676715 const suggestionsTitleEqual = prevSuggestionsTitle === nextSuggestionsTitle ;
677716 if ( ! suggestionsTitleEqual ) return false ;
678717
718+ const threadEqual =
719+ prevThread ?. id === nextThread ?. id &&
720+ prevThread ?. text === nextThread ?. text &&
721+ prevThread ?. reply_count === nextThread ?. reply_count ;
722+ if ( ! threadEqual ) return false ;
723+
679724 const threadListEqual = prevThreadList === nextThreadList ;
680725 if ( ! threadListEqual ) return false ;
681726
@@ -767,6 +812,8 @@ export const MessageInput = <
767812 suggestionsTitle,
768813 } = useSuggestionsContext < Co , Us > ( ) ;
769814
815+ const { thread } = useThreadContext < At , Ch , Co , Ev , Me , Re , Us > ( ) ;
816+
770817 const { t } = useTranslationContext ( ) ;
771818
772819 return (
@@ -807,6 +854,7 @@ export const MessageInput = <
807854 suggestions,
808855 suggestionsTitle,
809856 t,
857+ thread,
810858 uploadNewImage,
811859 watchers,
812860 } }
0 commit comments