stream-chat-react-native-core 3.8.1-next.1 → 3.8.2-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/ChannelList/hooks/listeners/useConnectionRecovered.js +3 -1
- package/lib/commonjs/components/ChannelList/hooks/listeners/useConnectionRecovered.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js +8 -1
- package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +25 -25
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +47 -48
- package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/ChannelList/hooks/listeners/useConnectionRecovered.js +3 -1
- package/lib/module/components/ChannelList/hooks/listeners/useConnectionRecovered.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/utils/renderText.js +8 -1
- package/lib/module/components/Message/MessageSimple/utils/renderText.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +25 -25
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/contexts/messageInputContext/MessageInputContext.js +47 -48
- package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/package.json +1 -2
- package/src/components/ChannelList/hooks/listeners/useConnectionRecovered.ts +5 -2
- package/src/components/Message/MessageSimple/utils/renderText.tsx +7 -0
- package/src/components/MessageList/MessageList.tsx +17 -13
- package/src/components/MessageList/__tests__/__snapshots__/MessageList.test.js.snap +1 -39
- package/src/components/Thread/__tests__/__snapshots__/Thread.test.js.snap +1 -39
- package/src/contexts/messageInputContext/MessageInputContext.tsx +29 -30
- package/src/version.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["MessageInputContext.tsx"],"names":["MessageInputContext","React","createContext","MessageInputProvider","children","value","closePicker","openPicker","selectedPicker","setSelectedPicker","client","channel","giphyEnabled","thread","inputBoxRef","sending","asyncIds","setAsyncIds","asyncUploads","setAsyncUploads","giphyActive","setGiphyActive","sendThreadMessageInChannel","setSendThreadMessageInChannel","editing","hasFilePicker","hasImagePicker","initialValue","maxNumberOfFiles","fileUploads","imageUploads","mentionedUsers","numberOfUploads","setFileUploads","setImageUploads","setMentionedUsers","setNumberOfUploads","setShowMoreOptions","setText","showMoreOptions","text","threadId","id","appendText","newText","prevText","isValidMessage","trim","image","state","FileState","UPLOAD_FAILED","UPLOADING","file","onChange","current","keystroke","onChangeText","openCommandsPicker","focus","openMentionsPicker","openAttachmentPicker","length","Keyboard","dismiss","setTimeout","pickFile","closeAttachmentPicker","undefined","toggleAttachmentPicker","onSelectItem","item","prevMentionedUsers","result","cancelled","docs","forEach","doc","mimeType","name","startsWith","uploadNewFile","removeFile","some","prevFileUploads","filter","prevNumberOfUploads","removeImage","prevImageUploads","resetInput","pendingAttachments","sendMessage","clear","attachments","sendImageAsync","prevAsyncIds","UPLOADED","FINISHED","push","fallback","image_url","url","type","asset_url","file_size","size","mime_type","title","updatedMessage","mentioned_users","quoted_message","clearEditingState","updateMessagePromise","editMessage","then","parent_id","quoted_message_id","quotedMessage","show_in_channel","clearQuotedMessageState","_error","setQuotedMessageState","slice","console","log","sendMessageAsync","splice","indexOf","prevAsyncUploads","setInputBoxRef","ref","setInputRef","triggerSettings","autoCompleteTriggerSettings","onMentionSelectItem","updateMessage","uploadFile","newFile","map","fileUpload","response","doDocUploadRequest","uri","sendFile","warn","uploadImage","newImage","match","localUri","source","height","width","compressImageQuality","compressedUri","filename","replace","contentType","doImageUploadRequest","sendImage","res","includes","imageUpload","Object","keys","Promise","all","concat","uploadNewImage","messageInputContext","openFilePicker","useMessageInputContext","withMessageInputContext","Component","WithMessageInputContextComponent","props","displayName"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAYA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AAQA;;;;;;;;;;;;;;;AAmXO,IAAMA,mBAAmB,GAAGC,kBAAMC,aAAN,CAAoB,EAApB,CAA5B;;;;AAEA,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,OAa7B;AAAA,MAJLC,QAIK,QAJLA,QAIK;AAAA,MAHLC,KAGK,QAHLA,KAGK;;AACL,8BACE,0DADF;AAAA,MAAQC,WAAR,yBAAQA,WAAR;AAAA,MAAqBC,UAArB,yBAAqBA,UAArB;AAAA,MAAiCC,cAAjC,yBAAiCA,cAAjC;AAAA,MAAiDC,iBAAjD,yBAAiDA,iBAAjD;;AAEA,wBAAmB,kCAAnB;AAAA,MAAQC,MAAR,mBAAQA,MAAR;;AAEA,2BAAkC,wCAAlC;AAAA,MAAQC,OAAR,sBAAQA,OAAR;AAAA,MAAiBC,YAAjB,sBAAiBA,YAAjB;;AACA,0BAAmB,sCAAnB;AAAA,MAAQC,MAAR,qBAAQA,MAAR;;AAEA,MAAMC,WAAW,GAAG,mBAAyB,IAAzB,CAApB;AACA,MAAMC,OAAO,GAAG,mBAAO,KAAP,CAAhB;;AAEA,kBAAgC,qBAAmB,EAAnB,CAAhC;AAAA;AAAA,MAAOC,QAAP;AAAA,MAAiBC,WAAjB;;AACA,mBAAwC,qBAKrC,EALqC,CAAxC;AAAA;AAAA,MAAOC,YAAP;AAAA,MAAqBC,eAArB;;AAMA,mBAAsC,qBAAS,KAAT,CAAtC;AAAA;AAAA,MAAOC,WAAP;AAAA,MAAoBC,cAApB;;AACA,mBAAoE,qBAAS,KAAT,CAApE;AAAA;AAAA,MAAOC,0BAAP;AAAA,MAAmCC,6BAAnC;;AACA,MAAQC,OAAR,GAAmFnB,KAAnF,CAAQmB,OAAR;AAAA,MAAiBC,aAAjB,GAAmFpB,KAAnF,CAAiBoB,aAAjB;AAAA,MAAgCC,cAAhC,GAAmFrB,KAAnF,CAAgCqB,cAAhC;AAAA,MAAgDC,YAAhD,GAAmFtB,KAAnF,CAAgDsB,YAAhD;AAAA,MAA8DC,gBAA9D,GAAmFvB,KAAnF,CAA8DuB,gBAA9D;;AACA,8BAaI,0DAAsDJ,OAAtD,EAA+DG,YAA/D,CAbJ;AAAA,MACEE,WADF,yBACEA,WADF;AAAA,MAEEC,YAFF,yBAEEA,YAFF;AAAA,MAGEC,cAHF,yBAGEA,cAHF;AAAA,MAIEC,eAJF,yBAIEA,eAJF;AAAA,MAKEC,cALF,yBAKEA,cALF;AAAA,MAMEC,eANF,yBAMEA,eANF;AAAA,MAOEC,iBAPF,yBAOEA,iBAPF;AAAA,MAQEC,kBARF,yBAQEA,kBARF;AAAA,MASEC,kBATF,yBASEA,kBATF;AAAA,MAUEC,OAVF,yBAUEA,OAVF;AAAA,MAWEC,eAXF,yBAWEA,eAXF;AAAA,MAYEC,IAZF,yBAYEA,IAZF;;AAeA,MAAMC,QAAQ,GAAG5B,MAAH,oBAAGA,MAAM,CAAE6B,EAAzB;AACA,wBAAU,YAAM;AACdnB,IAAAA,6BAA6B,CAAC,KAAD,CAA7B;AACD,GAFD,EAEG,CAACkB,QAAD,CAFH;;AAIA,MAAME,UAAU,GAAG,SAAbA,UAAa,CAACC,OAAD,EAAqB;AACtCN,IAAAA,OAAO,CAAC,UAACO,QAAD;AAAA,kBAAiBA,QAAjB,GAA4BD,OAA5B;AAAA,KAAD,CAAP;AACD,GAFD;;AAKA,MAAME,cAAc,GAAG,SAAjBA,cAAiB,GAAM;AAC3B,QAAIN,IAAI,IAAIA,IAAI,CAACO,IAAL,EAAZ,EAAyB;AACvB,aAAO,IAAP;AACD;;AAED,yDAAoBjB,YAApB,wCAAkC;AAAA,UAAvBkB,OAAuB;;AAChC,UAAI,CAACA,OAAD,IAAUA,OAAK,CAACC,KAAN,KAAgBC,iBAAUC,aAAxC,EAAuD;AACrD;AACD;;AACD,UAAIH,OAAK,CAACC,KAAN,KAAgBC,iBAAUE,SAA9B,EAAyC;AAEvC,eAAO,KAAP;AACD;;AAED,aAAO,IAAP;AACD;;AAED,0DAAmBvB,WAAnB,2CAAgC;AAAA,UAArBwB,MAAqB;;AAC9B,UAAI,CAACA,MAAD,IAASA,MAAI,CAACJ,KAAL,KAAeC,iBAAUC,aAAtC,EAAqD;AACnD;AACD;;AACD,UAAIE,MAAI,CAACJ,KAAL,KAAeC,iBAAUE,SAA7B,EAAwC;AAEtC,eAAO,KAAP;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAP;AACD,GA9BD;;AAgCA,MAAME,QAAQ,GAAG,SAAXA,QAAW,CAACV,OAAD,EAAqB;AACpC,QAAI7B,OAAO,CAACwC,OAAZ,EAAqB;AACnB;AACD;;AACDjB,IAAAA,OAAO,CAACM,OAAD,CAAP;;AAEA,QAAIA,OAAO,IAAIjC,OAAf,EAAwB;AACtB,+CAAwBA,OAAO,CAAC6C,SAAR,CAAkB3C,MAAlB,oBAAkBA,MAAM,CAAE6B,EAA1B,CAAxB,EAAuD,oBAAvD;AACD;;AAED,QAAIrC,KAAK,CAACoD,YAAV,EAAwB;AACtBpD,MAAAA,KAAK,CAACoD,YAAN,CAAmBb,OAAnB;AACD;AACF,GAbD;;AAeA,MAAMc,kBAAkB,GAAG,SAArBA,kBAAqB,GAAM;AAC/Bf,IAAAA,UAAU,CAAC,GAAD,CAAV;;AACA,QAAI7B,WAAW,CAACyC,OAAhB,EAAyB;AACvBzC,MAAAA,WAAW,CAACyC,OAAZ,CAAoBI,KAApB;AACD;AACF,GALD;;AAOA,MAAMC,kBAAkB,GAAG,SAArBA,kBAAqB,GAAM;AAC/BjB,IAAAA,UAAU,CAAC,GAAD,CAAV;;AACA,QAAI7B,WAAW,CAACyC,OAAhB,EAAyB;AACvBzC,MAAAA,WAAW,CAACyC,OAAZ,CAAoBI,KAApB;AACD;AACF,GALD;;AAOA,MAAME,oBAAoB,GAAG,SAAvBA,oBAAuB,GAAM;AACjC,QAAInC,cAAc,IAAI,CAACG,WAAW,CAACiC,MAAnC,EAA2C;AACzCC,4BAASC,OAAT;;AACAzD,MAAAA,UAAU;AACVE,MAAAA,iBAAiB,CAAC,QAAD,CAAjB;AAQAwD,MAAAA,UAAU,CAAC1D,UAAD,EAAa,GAAb,CAAV;AACD,KAZD,MAYO,IAAIkB,aAAa,IAAIO,eAAe,GAAGJ,gBAAvC,EAAyD;AAC9DsC,MAAAA,QAAQ;AACT;AACF,GAhBD;;AAkBA,MAAMC,qBAAqB,GAAG,SAAxBA,qBAAwB,GAAM;AAClC1D,IAAAA,iBAAiB,CAAC2D,SAAD,CAAjB;AACA9D,IAAAA,WAAW;AACZ,GAHD;;AAKA,MAAM+D,sBAAsB,GAAG,SAAzBA,sBAAyB,GAAM;AACnC,QAAI7D,cAAJ,EAAoB;AAClB2D,MAAAA,qBAAqB;AACtB,KAFD,MAEO;AACLN,MAAAA,oBAAoB;AACrB;AACF,GAND;;AAQA,MAAMS,YAAY,GAAG,SAAfA,YAAe,CAACC,IAAD,EAA4B;AAC/CpC,IAAAA,iBAAiB,CAAC,UAACqC,kBAAD;AAAA,2DAA4BA,kBAA5B,IAAgDD,IAAI,CAAC7B,EAArD;AAAA,KAAD,CAAjB;AACD,GAFD;;AAIA,MAAMwB,QAAQ;AAAA,gFAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBACXlC,eAAe,IAAI3B,KAAK,CAACuB,gBADd;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,qBAKM,0BAAa;AAChCA,gBAAAA,gBAAgB,EAAEvB,KAAK,CAACuB,gBAAN,GAAyBI;AADX,eAAb,CALN;;AAAA;AAKTyC,cAAAA,MALS;;AAQf,kBAAI,CAACA,MAAM,CAACC,SAAR,IAAqBD,MAAM,CAACE,IAAhC,EAAsC;AACpCF,gBAAAA,MAAM,CAACE,IAAP,CAAYC,OAAZ,CAAoB,UAACC,GAAD,EAAS;AAC3B,sBAAMC,QAAQ,GAAG,uBAAOD,GAAG,CAACE,IAAX,CAAjB;;AAEA,sBAAID,QAAQ,IAAIA,QAAJ,YAAIA,QAAQ,CAAEE,UAAV,CAAqB,QAArB,CAAhB,EAAgD;AAQ9CC,oBAAAA,aAAa,CAACJ,GAAD,CAAb;AACD,mBATD,MASO;AACLI,oBAAAA,aAAa,CAACJ,GAAD,CAAb;AACD;AACF,iBAfD;AAgBD;;AAzBc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAARX,QAAQ;AAAA;AAAA;AAAA,KAAd;;AA4BA,MAAMgB,UAAU,GAAG,SAAbA,UAAa,CAACxC,EAAD,EAAgB;AACjC,QAAIb,WAAW,CAACsD,IAAZ,CAAiB,UAAC9B,IAAD;AAAA,aAAUA,IAAI,CAACX,EAAL,KAAYA,EAAtB;AAAA,KAAjB,CAAJ,EAAgD;AAC9CT,MAAAA,cAAc,CAAC,UAACmD,eAAD;AAAA,eAAqBA,eAAe,CAACC,MAAhB,CAAuB,UAAChC,IAAD;AAAA,iBAAUA,IAAI,CAACX,EAAL,KAAYA,EAAtB;AAAA,SAAvB,CAArB;AAAA,OAAD,CAAd;AACAN,MAAAA,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,eAAyBA,mBAAmB,GAAG,CAA/C;AAAA,OAAD,CAAlB;AACD;AACF,GALD;;AAOA,MAAMC,WAAW,GAAG,SAAdA,WAAc,CAAC7C,EAAD,EAAgB;AAClC,QAAIZ,YAAY,CAACqD,IAAb,CAAkB,UAACnC,KAAD;AAAA,aAAWA,KAAK,CAACN,EAAN,KAAaA,EAAxB;AAAA,KAAlB,CAAJ,EAAmD;AACjDR,MAAAA,eAAe,CAAC,UAACsD,gBAAD;AAAA,eAAsBA,gBAAgB,CAACH,MAAjB,CAAwB,UAACrC,KAAD;AAAA,iBAAWA,KAAK,CAACN,EAAN,KAAaA,EAAxB;AAAA,SAAxB,CAAtB;AAAA,OAAD,CAAf;AACAN,MAAAA,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,eAAyBA,mBAAmB,GAAG,CAA/C;AAAA,OAAD,CAAlB;AACD;AACF,GALD;;AAOA,MAAMG,UAAU,GAAG,SAAbA,UAAa,GAA+C;AAAA,QAA9CC,kBAA8C,uEAAP,EAAO;AAChEzD,IAAAA,cAAc,CAAC,EAAD,CAAd;AACAZ,IAAAA,cAAc,CAAC,KAAD,CAAd;AACAgB,IAAAA,kBAAkB,CAAC,IAAD,CAAlB;AACAH,IAAAA,eAAe,CAAC,EAAD,CAAf;AACAC,IAAAA,iBAAiB,CAAC,EAAD,CAAjB;AACAC,IAAAA,kBAAkB,CAChB,UAACkD,mBAAD;AAAA,aAAyBA,mBAAmB,IAAI,CAAAI,kBAAkB,QAAlB,YAAAA,kBAAkB,CAAE5B,MAApB,KAA8B,CAAlC,CAA5C;AAAA,KADgB,CAAlB;AAGAxB,IAAAA,OAAO,CAAC,EAAD,CAAP;AACD,GAVD;;AAYA,MAAMqD,WAAW;AAAA,gFAAG;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,mBACd5E,OAAO,CAACwC,OADM;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAIlBxC,cAAAA,OAAO,CAACwC,OAAR,GAAkB,IAAlB;AAEMV,cAAAA,QANY,GAMDjC,YAAY,IAAIQ,WAAhB,eAAwCoB,IAAxC,GAAiDA,IANhD;AAAA;AAAA,qBAOZF,OAAO,CAAC,EAAD,CAPK;;AAAA;AAQlB,kBAAIxB,WAAW,CAACyC,OAAhB,EAAyB;AACvBzC,gBAAAA,WAAW,CAACyC,OAAZ,CAAoBqC,KAApB;AACD;;AAEKC,cAAAA,WAZY,GAYE,EAZF;;AAAA,qCAaP7C,OAbO;AAchB,oBAAI,CAACA,OAAD,IAAUA,OAAK,CAACC,KAAN,KAAgBC,iBAAUC,aAAxC,EAAuD;AACrD;AACD;;AAED,oBAAIH,OAAK,CAACC,KAAN,KAAgBC,iBAAUE,SAA9B,EAAyC;AAEvC,sBAAI/C,KAAK,CAACyF,cAAV,EAA0B;AAKxB7E,oBAAAA,WAAW,CAAC,UAAC8E,YAAD;AAAA,2EAAsBA,YAAtB,IAAoC/C,OAAK,CAACN,EAA1C;AAAA,qBAAD,CAAX;AACD,mBAND,MAMO;AACL3B,oBAAAA,OAAO,CAACwC,OAAR,GAAkB,KAAlB;AACA;AAAA,yBAAOjB,OAAO,CAACO,QAAD;AAAd;AACD;AACF;;AAED,oBAAIG,OAAK,CAACC,KAAN,KAAgBC,iBAAU8C,QAA1B,IAAsChD,OAAK,CAACC,KAAN,KAAgBC,iBAAU+C,QAApE,EAA8E;AAC5EJ,kBAAAA,WAAW,CAACK,IAAZ,CAAiB;AACfC,oBAAAA,QAAQ,EAAEnD,OAAK,CAACK,IAAN,CAAW0B,IADN;AAEfqB,oBAAAA,SAAS,EAAEpD,OAAK,CAACqD,GAFF;AAGfC,oBAAAA,IAAI,EAAE;AAHS,mBAAjB;AAKD;AAtCe;;AAAA,2DAaExE,YAbF;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAaPkB,cAAAA,OAbO;AAAA,2BAaPA,OAbO;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,2DAyCCnB,WAzCD;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAyCPwB,cAAAA,MAzCO;;AAAA,oBA0CZ,CAACA,MAAD,IAASA,MAAI,CAACJ,KAAL,KAAeC,iBAAUC,aA1CtB;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,oBA6CZE,MAAI,CAACJ,KAAL,KAAeC,iBAAUE,SA7Cb;AAAA;AAAA;AAAA;;AA+CdrC,cAAAA,OAAO,CAACwC,OAAR,GAAkB,KAAlB;AA/Cc;;AAAA;AAkDhB,kBAAIF,MAAI,CAACJ,KAAL,KAAeC,iBAAU8C,QAAzB,IAAqC3C,MAAI,CAACJ,KAAL,KAAeC,iBAAU+C,QAAlE,EAA4E;AAC1EJ,gBAAAA,WAAW,CAACK,IAAZ,CAAiB;AACfK,kBAAAA,SAAS,EAAElD,MAAI,CAACgD,GADD;AAEfG,kBAAAA,SAAS,EAAEnD,MAAI,CAACA,IAAL,CAAUoD,IAFN;AAGfC,kBAAAA,SAAS,EAAErD,MAAI,CAACA,IAAL,CAAUiD,IAHN;AAIfK,kBAAAA,KAAK,EAAEtD,MAAI,CAACA,IAAL,CAAU0B,IAJF;AAKfuB,kBAAAA,IAAI,EAAE;AALS,iBAAjB;AAOD;;AA1De;AAAA;AAAA;;AAAA;AAAA,oBA8Dd,CAACzD,QAAD,IAAagD,WAAW,CAAC/B,MAAZ,KAAuB,CA9DtB;AAAA;AAAA;AAAA;;AA+DhB/C,cAAAA,OAAO,CAACwC,OAAR,GAAkB,KAAlB;AA/DgB;;AAAA;AAmElB,kBAAIlD,KAAK,CAACmB,OAAN,IAAiB,CAAC,iDAAiBnB,KAAK,CAACmB,OAAvB,CAAtB,EAAuD;AAC/CoF,gBAAAA,cAD+C,iCAEhDvG,KAAK,CAACmB,OAF0C;AAGnDqE,kBAAAA,WAAW,EAAXA,WAHmD;AAInDgB,kBAAAA,eAAe,EAAE9E,cAJkC;AAKnD+E,kBAAAA,cAAc,EAAE1C,SALmC;AAMnD5B,kBAAAA,IAAI,EAAEK;AAN6C;AAUrDxC,gBAAAA,KAAK,CAAC0G,iBAAN;AAEMC,gBAAAA,oBAZ+C,GAYxB3G,KAAK,CAAC4G,WAAN,CAAkBL,cAAlB,EAAkCM,IAAlC,CAAuC7G,KAAK,CAAC0G,iBAA7C,CAZwB;AAarDtB,gBAAAA,UAAU,CAACI,WAAD,CAAV;AACA,yDAAwBmB,oBAAxB,EAA8C,gBAA9C;AAEAjG,gBAAAA,OAAO,CAACwC,OAAR,GAAkB,KAAlB;AACD,eAjBD,MAiBO;AACL,oBAAI;AACFlD,kBAAAA,KAAK,CAACsF,WAAN,CAAkB;AAChBE,oBAAAA,WAAW,EAAXA,WADgB;AAEhBgB,oBAAAA,eAAe,EAAE,sBAAK9E,cAAL,CAFD;AAIhBoF,oBAAAA,SAAS,EAAEtG,MAAF,oBAAEA,MAAM,CAAE6B,EAJH;AAKhB0E,oBAAAA,iBAAiB,EACf,OAAO/G,KAAK,CAACgH,aAAb,KAA+B,SAA/B,GAA2CjD,SAA3C,GAAuD/D,KAAK,CAACgH,aAAN,CAAoB3E,EAN7D;AAOhB4E,oBAAAA,eAAe,EAAEhG,0BAA0B,IAAI8C,SAP/B;AAQhB5B,oBAAAA,IAAI,EAAEK;AARU,mBAAlB;AAWAxC,kBAAAA,KAAK,CAACkH,uBAAN;AACAxG,kBAAAA,OAAO,CAACwC,OAAR,GAAkB,KAAlB;AACAkC,kBAAAA,UAAU,CAACI,WAAD,CAAV;AACD,iBAfD,CAeE,OAAO2B,MAAP,EAAe;AACfzG,kBAAAA,OAAO,CAACwC,OAAR,GAAkB,KAAlB;;AACA,sBAAIlD,KAAK,CAACgH,aAAN,IAAuB,OAAOhH,KAAK,CAACgH,aAAb,KAA+B,SAA1D,EAAqE;AACnEhH,oBAAAA,KAAK,CAACoH,qBAAN,CAA4BpH,KAAK,CAACgH,aAAlC;AACD;;AACD/E,kBAAAA,OAAO,CAACO,QAAQ,CAAC6E,KAAT,CAAe9G,YAAY,IAAIQ,WAAhB,GAA8B,CAA9B,GAAkC,CAAjD,CAAD,CAAP;AACAuG,kBAAAA,OAAO,CAACC,GAAR,CAAY,wBAAZ;AACD;AACF;;AA5GiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAXjC,WAAW;AAAA;AAAA;AAAA,KAAjB;;AA+GA,MAAMkC,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACnF,EAAD,EAAgB;AACvC,QAAMM,KAAK,GAAG9B,YAAY,CAACwB,EAAD,CAA1B;;AACA,QAAI,CAACM,KAAD,IAAUA,KAAK,CAACC,KAAN,KAAgBC,iBAAUC,aAAxC,EAAuD;AACrD;AACD;;AAED,QAAIH,KAAK,CAACC,KAAN,KAAgBC,iBAAU8C,QAA1B,IAAsChD,KAAK,CAACC,KAAN,KAAgBC,iBAAU+C,QAApE,EAA8E;AAC5E,UAAMJ,YAAW,GAAG,CAClB;AACEO,QAAAA,SAAS,EAAEpD,KAAK,CAACqD,GADnB;AAEEC,QAAAA,IAAI,EAAE;AAFR,OADkB,CAApB;;AAOA,UAAI;AACFjG,QAAAA,KAAK,CAACsF,WAAN,CAAkB;AAChBE,UAAAA,WAAW,EAAXA,YADgB;AAEhBgB,UAAAA,eAAe,EAAE,EAFD;AAGhBM,UAAAA,SAAS,EAAEtG,MAAF,oBAAEA,MAAM,CAAE6B,EAHH;AAIhB0E,UAAAA,iBAAiB,EACf,OAAO/G,KAAK,CAACgH,aAAb,KAA+B,SAA/B,GAA2CjD,SAA3C,GAAuD/D,KAAK,CAACgH,aAAN,CAAoB3E,EAL7D;AAMhB4E,UAAAA,eAAe,EAAEhG,0BAA0B,IAAI8C,SAN/B;AAOhB5B,UAAAA,IAAI,EAAE;AAPU,SAAlB;AAUAvB,QAAAA,WAAW,CAAC,UAAC8E,YAAD;AAAA,iBAAkBA,YAAY,CAAC+B,MAAb,CAAoB/B,YAAY,CAACgC,OAAb,CAAqBrF,EAArB,CAApB,EAA8C,CAA9C,CAAlB;AAAA,SAAD,CAAX;AACAvB,QAAAA,eAAe,CAAC,UAAC6G,gBAAD,EAAsB;AACpC,iBAAOA,gBAAgB,CAACtF,EAAD,CAAvB;AACA,iBAAOsF,gBAAP;AACD,SAHc,CAAf;AAKA5F,QAAAA,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,iBAAyBA,mBAAmB,GAAG,CAA/C;AAAA,SAAD,CAAlB;AACD,OAlBD,CAkBE,OAAOkC,MAAP,EAAe;AACfG,QAAAA,OAAO,CAACC,GAAR,CAAY,QAAZ;AACD;AACF;AACF,GApCD;;AAsCA,MAAMK,cAAc,GAAG,SAAjBA,cAAiB,CAACC,GAAD,EAA2B;AAChDpH,IAAAA,WAAW,CAACyC,OAAZ,GAAsB2E,GAAtB;;AACA,QAAI7H,KAAK,CAAC8H,WAAV,EAAuB;AACrB9H,MAAAA,KAAK,CAAC8H,WAAN,CAAkBD,GAAlB;AACD;AACF,GALD;;AAOA,MAAME,eAAe,GAAGzH,OAAO,GAC3BN,KAAK,CAACgI,2BAAN,GACEhI,KAAK,CAACgI,2BAAN,CAAkC;AAChC1H,IAAAA,OAAO,EAAPA,OADgC;AAEhCD,IAAAA,MAAM,EAANA,MAFgC;AAGhC4H,IAAAA,mBAAmB,EAAEhE;AAHW,GAAlC,CADF,GAME,+BAA+C;AAC7C3D,IAAAA,OAAO,EAAPA,OAD6C;AAE7CD,IAAAA,MAAM,EAANA,MAF6C;AAG7C4H,IAAAA,mBAAmB,EAAEhE;AAHwB,GAA/C,CAPyB,GAY1B,EAZL;;AAcA,MAAMiE,aAAa;AAAA,gFAAG;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,kBAEb,iDAAiBlI,KAAK,CAACmB,OAAvB,CAFa;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAGVd,MAAM,CAAC6H,aAAP,+BACDlI,KAAK,CAACmB,OADL;AAEJsF,gBAAAA,cAAc,EAAE1C,SAFZ;AAGJ5B,gBAAAA,IAAI,EAAE5B,YAAY,IAAIQ,WAAhB,eAAwCoB,IAAxC,GAAiDA;AAHnD,iBAHU;;AAAA;AAUlBiD,cAAAA,UAAU;AACVpF,cAAAA,KAAK,CAAC0G,iBAAN;AAXkB;AAAA;;AAAA;AAAA;AAAA;AAalBY,cAAAA,OAAO,CAACC,GAAR;;AAbkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAbW,aAAa;AAAA;AAAA;AAAA,KAAnB;;AAiBA,MAAMC,UAAU;AAAA,gFAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAASC,cAAAA,OAAT,SAASA,OAAT;;AAAA,kBACZA,OADY;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAITpF,cAAAA,IAJS,GAIIoF,OAJJ,CAITpF,IAJS,EAIHX,EAJG,GAII+F,OAJJ,CAIH/F,EAJG;AAAA;AAAA,qBAMXT,cAAc,CAAC,UAACmD,eAAD;AAAA,uBACnBA,eAAe,CAACsD,GAAhB,CAAoB,UAACC,UAAD,EAAgB;AAClC,sBAAIA,UAAU,CAACjG,EAAX,KAAkBA,EAAtB,EAA0B;AACxB,yDACKiG,UADL;AAEE1F,sBAAAA,KAAK,EAAEC,iBAAUE;AAFnB;AAID;;AACD,yBAAOuF,UAAP;AACD,iBARD,CADmB;AAAA,eAAD,CANH;;AAAA;AAkBbC,cAAAA,QAlBa,GAkBF,EAlBE;AAAA;;AAAA,mBAoBXvI,KAAK,CAACwI,kBApBK;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAqBIxI,KAAK,CAACwI,kBAAN,CAAyBxF,IAAzB,EAA+B1C,OAA/B,CArBJ;;AAAA;AAqBbiI,cAAAA,QArBa;AAAA;AAAA;;AAAA;AAAA,oBAsBJjI,OAAO,IAAI0C,IAAI,CAACyF,GAtBZ;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAuBInI,OAAO,CAACoI,QAAR,CAAiB1F,IAAI,CAACyF,GAAtB,EAA2BzF,IAAI,CAAC0B,IAAhC,EAAsC1B,IAAI,CAACiD,IAA3C,CAvBJ;;AAAA;AAuBbsC,cAAAA,QAvBa;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AA0BfjB,cAAAA,OAAO,CAACqB,IAAR;;AACA,kBAAI,CAACP,OAAL,EAAc;AACZrG,gBAAAA,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,yBAAyBA,mBAAmB,GAAG,CAA/C;AAAA,iBAAD,CAAlB;AACD,eAFD,MAEO;AACLrD,gBAAAA,cAAc,CAAC,UAACmD,eAAD;AAAA,yBACbA,eAAe,CAACsD,GAAhB,CAAoB,UAACC,UAAD,EAAgB;AAClC,wBAAIA,UAAU,CAACjG,EAAX,KAAkBA,EAAtB,EAA0B;AACxB,2DACKiG,UADL;AAEE1F,wBAAAA,KAAK,EAAEC,iBAAUC;AAFnB;AAID;;AACD,2BAAOwF,UAAP;AACD,mBARD,CADa;AAAA,iBAAD,CAAd;AAWAvG,gBAAAA,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,yBAAyBA,mBAAmB,GAAG,CAA/C;AAAA,iBAAD,CAAlB;AACD;;AA1Cc;;AAAA;AA8CjBrD,cAAAA,cAAc,CAAC,UAACmD,eAAD;AAAA,uBACbA,eAAe,CAACsD,GAAhB,CAAoB,UAACC,UAAD,EAAgB;AAClC,sBAAIA,UAAU,CAACjG,EAAX,KAAkBA,EAAtB,EAA0B;AACxB,yDACKiG,UADL;AAEE1F,sBAAAA,KAAK,EAAEC,iBAAU8C,QAFnB;AAGEK,sBAAAA,GAAG,EAAEuC,QAAQ,CAACvF;AAHhB;AAKD;;AACD,yBAAOsF,UAAP;AACD,iBATD,CADa;AAAA,eAAD,CAAd;;AA9CiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAVH,UAAU;AAAA;AAAA;AAAA,KAAhB;;AA4DA,MAAMS,WAAW;AAAA,gFAAG;AAAA;;AAAA;AAAA;AAAA;AAAA;AAASC,cAAAA,QAAT,SAASA,QAAT;AAAA,sBACGA,QAAQ,IAAI,EADf,EACV7F,IADU,SACVA,IADU,EACJX,EADI,SACJA,EADI;;AAAA,kBAEbW,IAFa;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAMduF,cAAAA,QANc,GAMH,EANG;AAAA;;AAAA,mBAiBCvF,IAAI,CAACX,EAjBN;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAkBN,8BAAiBW,IAAI,CAACX,EAAtB,CAlBM;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iCAmBZW,IAAI,CAACyF,GAnBO,aAmBZ,UAAUK,KAAV,CAAgB,gBAAhB,CAnBY;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAoBN,8BAAiB9F,IAAI,CAACyF,GAAtB,CApBM;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,6BAqBZzF,IAAI,CAACyF,GArBO;;AAAA;AAAA;;AAAA;AAiBVM,cAAAA,QAjBU;AAuBVN,cAAAA,GAvBU,GAuBJzF,IAAI,CAAC0B,IAAL,IAAaqE,QAAb,IAAyB,EAvBrB;AAAA;AAAA,qBA8Ba/F,IAAI,CAACgG,MAAL,KAAgB,QAAhB,IAC7B,CAAChG,IAAI,CAACiG,MADuB,IAE7B,CAACjG,IAAI,CAACkG,KAFuB,IAG7B,OAAOlJ,KAAK,CAACmJ,oBAAb,KAAsC,QAHT,IAI7BnJ,KAAK,CAACmJ,oBAAN,KAA+B,CAJF,GAKzBV,GALyB,GAMzB,2BAAc;AACZU,gBAAAA,oBAAoB,EAAEnJ,KAAK,CAACmJ,oBADhB;AAEZF,gBAAAA,MAAM,EAAEjG,IAAI,CAACiG,MAFD;AAGZR,gBAAAA,GAAG,EAAHA,GAHY;AAIZS,gBAAAA,KAAK,EAAElG,IAAI,CAACkG;AAJA,eAAd,CApCY;;AAAA;AA8BVE,cAAAA,aA9BU;AA2CVC,cAAAA,QA3CU,GA2CCZ,GAAG,CAACa,OAAJ,CAAY,+CAAZ,EAA6D,EAA7D,CA3CD;AA4CVC,cAAAA,WA5CU,GA4CI,uBAAOF,QAAP,KAAoB,qBA5CxB;;AAAA,mBA8CZrJ,KAAK,CAACwJ,oBA9CM;AAAA;AAAA;AAAA;;AAAA;AAAA,qBA+CGxJ,KAAK,CAACwJ,oBAAN,CAA2BxG,IAA3B,EAAiC1C,OAAjC,CA/CH;;AAAA;AA+CdiI,cAAAA,QA/Cc;AAAA;AAAA;;AAAA;AAAA,oBAgDLa,aAAa,IAAI9I,OAhDZ;AAAA;AAAA;AAAA;;AAAA,mBAiDVN,KAAK,CAACyF,cAjDI;AAAA;AAAA;AAAA;;AAkDZnF,cAAAA,OAAO,CAACmJ,SAAR,CAAkBL,aAAlB,EAAiCrF,SAAjC,EAA4CwF,WAA5C,EAAyD1C,IAAzD,CAA8D,UAAC6C,GAAD,EAAS;AACrE,oBAAI/I,QAAQ,CAACgJ,QAAT,CAAkBtH,EAAlB,CAAJ,EAA2B;AAEzBvB,kBAAAA,eAAe,CAAC,UAAC6G,gBAAD,EAAsB;AACpCA,oBAAAA,gBAAgB,CAACtF,EAAD,CAAhB,iCACKsF,gBAAgB,CAACtF,EAAD,CADrB;AAEEO,sBAAAA,KAAK,EAAEC,iBAAU8C,QAFnB;AAGEK,sBAAAA,GAAG,EAAE0D,GAAG,CAAC1G;AAHX;AAKA,2BAAO2E,gBAAP;AACD,mBAPc,CAAf;AAQD,iBAVD,MAUO;AACL9F,kBAAAA,eAAe,CAAC,UAACsD,gBAAD;AAAA,2BACdA,gBAAgB,CAACkD,GAAjB,CAAqB,UAACuB,WAAD,EAAiB;AACpC,0BAAIA,WAAW,CAACvH,EAAZ,KAAmBA,EAAvB,EAA2B;AACzB,6DACKuH,WADL;AAEEhH,0BAAAA,KAAK,EAAEC,iBAAU8C,QAFnB;AAGEK,0BAAAA,GAAG,EAAE0D,GAAG,CAAC1G;AAHX;AAKD;;AACD,6BAAO4G,WAAP;AACD,qBATD,CADc;AAAA,mBAAD,CAAf;AAYD;AACF,eAzBD;AAlDY;AAAA;;AAAA;AAAA;AAAA,qBA6EKtJ,OAAO,CAACmJ,SAAR,CAAkBL,aAAlB,EAAiCrF,SAAjC,EAA4CwF,WAA5C,CA7EL;;AAAA;AA6EZhB,cAAAA,QA7EY;;AAAA;AAiFhB,kBAAIsB,MAAM,CAACC,IAAP,CAAYvB,QAAZ,EAAsB9E,MAA1B,EAAkC;AAChC5B,gBAAAA,eAAe,CAAC,UAACsD,gBAAD;AAAA,yBACdA,gBAAgB,CAACkD,GAAjB,CAAqB,UAACuB,WAAD,EAAiB;AACpC,wBAAIA,WAAW,CAACvH,EAAZ,KAAmBA,EAAvB,EAA2B;AACzB,2DACKuH,WADL;AAEEhH,wBAAAA,KAAK,EAAEC,iBAAU8C,QAFnB;AAGEK,wBAAAA,GAAG,EAAEuC,QAAQ,CAACvF;AAHhB;AAKD;;AACD,2BAAO4G,WAAP;AACD,mBATD,CADc;AAAA,iBAAD,CAAf;AAYD;;AA9Fe;AAAA;;AAAA;AAAA;AAAA;AAgGhBtC,cAAAA,OAAO,CAACqB,IAAR;;AACA,kBAAIE,QAAJ,EAAc;AACZhH,gBAAAA,eAAe,CAAC,UAACsD,gBAAD;AAAA,yBACdA,gBAAgB,CAACkD,GAAjB,CAAqB,UAACuB,WAAD,EAAiB;AACpC,wBAAIA,WAAW,CAACvH,EAAZ,KAAmBA,EAAvB,EAA2B;AACzB,2DACKuH,WADL;AAEEhH,wBAAAA,KAAK,EAAEC,iBAAUC;AAFnB;AAID;;AACD,2BAAO8G,WAAP;AACD,mBARD,CADc;AAAA,iBAAD,CAAf;AAWD;;AACD7H,cAAAA,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,uBAAyBA,mBAAmB,GAAG,CAA/C;AAAA,eAAD,CAAlB;AA9GgB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAX2D,WAAW;AAAA;AAAA;AAAA,KAAjB;;AAoHA,MAAMhE,aAAa;AAAA,iFAAG,kBAAO5B,IAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AAMdX,cAAAA,EANc,GAMT,8BANS;AAOdoC,cAAAA,QAPc,GAOH,uBAAOzB,IAAI,CAAC0B,IAAZ,CAPG;AAQd0D,cAAAA,OARc,GAQJ;AACdpF,gBAAAA,IAAI,gCAAOA,IAAP;AAAaiD,kBAAAA,IAAI,EAAExB,QAAQ,KAAIzB,IAAJ,oBAAIA,IAAI,CAAEiD,IAAV;AAA3B,kBADU;AAEd5D,gBAAAA,EAAE,EAAFA,EAFc;AAGdO,gBAAAA,KAAK,EAAEC,iBAAUE;AAHH,eARI;AAAA;AAAA,qBAadgH,OAAO,CAACC,GAAR,CAAY,CAChBpI,cAAc,CAAC,UAACmD,eAAD;AAAA,uBAAqBA,eAAe,CAACkF,MAAhB,CAAuB,CAAC7B,OAAD,CAAvB,CAArB;AAAA,eAAD,CADE,EAEhBrG,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,uBAAyBA,mBAAmB,GAAG,CAA/C;AAAA,eAAD,CAFF,CAAZ,CAbc;;AAAA;AAkBpBkD,cAAAA,UAAU,CAAC;AAAEC,gBAAAA,OAAO,EAAPA;AAAF,eAAD,CAAV;;AAlBoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAbxD,aAAa;AAAA;AAAA;AAAA,KAAnB;;AAqBA,MAAMsF,cAAc;AAAA,iFAAG,kBAAOvH,KAAP;AAAA;AAAA;AAAA;AAAA;AAAA;AACfN,cAAAA,EADe,GACV,8BADU;AAEfwG,cAAAA,QAFe,GAEJ;AACf7F,gBAAAA,IAAI,EAAEL,KADS;AAEfN,gBAAAA,EAAE,EAAFA,EAFe;AAGfO,gBAAAA,KAAK,EAAEC,iBAAUE;AAHF,eAFI;AAAA;AAAA,qBAOfgH,OAAO,CAACC,GAAR,CAAY,CAChBnI,eAAe,CAAC,UAACsD,gBAAD;AAAA,uBAAsBA,gBAAgB,CAAC8E,MAAjB,CAAwB,CAACpB,QAAD,CAAxB,CAAtB;AAAA,eAAD,CADC,EAEhB9G,kBAAkB,CAAC,UAACkD,mBAAD;AAAA,uBAAyBA,mBAAmB,GAAG,CAA/C;AAAA,eAAD,CAFF,CAAZ,CAPe;;AAAA;AAYrB2D,cAAAA,WAAW,CAAC;AAAEC,gBAAAA,QAAQ,EAARA;AAAF,eAAD,CAAX;;AAZqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAAdqB,cAAc;AAAA;AAAA;AAAA,KAApB;;AAeA,MAAMC,mBAAmB,GAAG;AAC1B7H,IAAAA,UAAU,EAAVA,UAD0B;AAE1B3B,IAAAA,QAAQ,EAARA,QAF0B;AAG1BE,IAAAA,YAAY,EAAZA,YAH0B;AAI1BiD,IAAAA,qBAAqB,EAArBA,qBAJ0B;AAK1BtC,IAAAA,WAAW,EAAXA,WAL0B;AAM1BT,IAAAA,WAAW,EAAXA,WAN0B;AAO1BU,IAAAA,YAAY,EAAZA,YAP0B;AAQ1BhB,IAAAA,WAAW,EAAXA,WAR0B;AAS1BgC,IAAAA,cAAc,EAAdA,cAT0B;AAU1Bf,IAAAA,cAAc,EAAdA,cAV0B;AAW1BC,IAAAA,eAAe,EAAfA,eAX0B;AAY1BsB,IAAAA,QAAQ,EAARA,QAZ0B;AAa1BgB,IAAAA,YAAY,EAAZA,YAb0B;AAc1BT,IAAAA,oBAAoB,EAApBA,oBAd0B;AAe1BH,IAAAA,kBAAkB,EAAlBA,kBAf0B;AAgB1B+G,IAAAA,cAAc,EAAEvG,QAhBU;AAiB1BN,IAAAA,kBAAkB,EAAlBA,kBAjB0B;AAkB1BM,IAAAA,QAAQ,EAARA,QAlB0B;AAmB1BgB,IAAAA,UAAU,EAAVA,UAnB0B;AAoB1BK,IAAAA,WAAW,EAAXA,WApB0B;AAqB1BE,IAAAA,UAAU,EAAVA,UArB0B;AAsB1BjF,IAAAA,cAAc,EAAdA,cAtB0B;AAuB1BO,IAAAA,OAAO,EAAPA,OAvB0B;AAwB1B8G,IAAAA,gBAAgB,EAAhBA,gBAxB0B;AAyB1BvG,IAAAA,0BAA0B,EAA1BA,0BAzB0B;AA0B1BL,IAAAA,WAAW,EAAXA,WA1B0B;AA2B1BE,IAAAA,eAAe,EAAfA,eA3B0B;AA4B1Bc,IAAAA,cAAc,EAAdA,cA5B0B;AA6B1BZ,IAAAA,cAAc,EAAdA,cA7B0B;AA8B1Ba,IAAAA,eAAe,EAAfA,eA9B0B;AA+B1B+F,IAAAA,cAAc,EAAdA,cA/B0B;AAgC1B9F,IAAAA,iBAAiB,EAAjBA,iBAhC0B;AAiC1BC,IAAAA,kBAAkB,EAAlBA,kBAjC0B;AAkC1Bb,IAAAA,6BAA6B,EAA7BA,6BAlC0B;AAmC1Bc,IAAAA,kBAAkB,EAAlBA,kBAnC0B;AAoC1BC,IAAAA,OAAO,EAAPA,OApC0B;AAqC1BC,IAAAA,eAAe,EAAfA,eArC0B;AAsC1BC,IAAAA,IAAI,EAAJA,IAtC0B;AAuC1B3B,IAAAA,MAAM,EAANA,MAvC0B;AAwC1BwD,IAAAA,sBAAsB,EAAtBA,sBAxC0B;AAyC1B+D,IAAAA,eAAe,EAAfA,eAzC0B;AA0C1BG,IAAAA,aAAa,EAAbA,aA1C0B;AA2C1BC,IAAAA,UAAU,EAAVA,UA3C0B;AA4C1BS,IAAAA,WAAW,EAAXA,WA5C0B;AA6C1BhE,IAAAA,aAAa,EAAbA,aA7C0B;AA8C1BsF,IAAAA,cAAc,EAAdA;AA9C0B,KA+CvBlK,KA/CuB;AAgD1BsF,IAAAA,WAAW,EAAXA;AAhD0B,KAA5B;AAmDA,SACE,gCAAC,mBAAD,CAAqB,QAArB;AACE,IAAA,KAAK,EAAE6E,mBADT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAGGpK,QAHH,CADF;AAOD,CA1pBM;;;;AA4pBA,IAAMsK,sBAAsB,GAAG,SAAzBA,sBAAyB;AAAA,SASpC,uBAAW1K,mBAAX,CAToC;AAAA,CAA/B;;;;AAwBA,IAAM2K,uBAAuB,GAAG,SAA1BA,uBAA0B,CAUrCC,SAVqC,EAW6C;AAClF,MAAMC,gCAAgC,GAAG,SAAnCA,gCAAmC,CACvCC,KADuC,EAEpC;AACH,QAAMN,mBAAmB,GAAGE,sBAAsB,EAAlD;AAEA,WAAO,gCAAC,SAAD,gCAAgBI,KAAhB,EAAiCN,mBAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAP;AACD,GAND;;AAOAK,EAAAA,gCAAgC,CAACE,WAAjC,+BAAyE,oCACvEH,SADuE,CAAzE;AAGA,SAAOC,gCAAP;AACD,CAvBM","sourcesContent":["import React, { PropsWithChildren, useContext, useEffect, useRef, useState } from 'react';\nimport { Keyboard } from 'react-native';\nimport uniq from 'lodash/uniq';\nimport { lookup } from 'mime-types';\nimport {\n Attachment,\n logChatPromiseExecution,\n SendFileAPIResponse,\n StreamChat,\n Message as StreamMessage,\n UserFilters,\n UserOptions,\n UserResponse,\n UserSort,\n} from 'stream-chat';\n\nimport { useCreateMessageInputContext } from './hooks/useCreateMessageInputContext';\nimport { isEditingBoolean, useMessageDetailsForState } from './hooks/useMessageDetailsForState';\n\nimport { useAttachmentPickerContext } from '../attachmentPickerContext/AttachmentPickerContext';\nimport { useChatContext } from '../chatContext/ChatContext';\nimport { ChannelContextValue, useChannelContext } from '../channelContext/ChannelContext';\nimport { useThreadContext } from '../threadContext/ThreadContext';\nimport { getDisplayName } from '../utils/getDisplayName';\n\nimport {\n ACITriggerSettings,\n ACITriggerSettingsParams,\n FileState,\n generateRandomId,\n TriggerSettings,\n} from '../../utils/utils';\n\nimport { Asset, compressImage, getLocalAssetUri, pickDocument } from '../../native';\n\nimport type { TextInput, TextInputProps } from 'react-native';\n\nimport type { AttachButtonProps } from '../../components/MessageInput/AttachButton';\nimport type { CommandsButtonProps } from '../../components/MessageInput/CommandsButton';\nimport type { FileUploadPreviewProps } from '../../components/MessageInput/FileUploadPreview';\nimport type { ImageUploadPreviewProps } from '../../components/MessageInput/ImageUploadPreview';\nimport type { InputButtonsProps } from '../../components/MessageInput/InputButtons';\nimport type { MessageInputProps } from '../../components/MessageInput/MessageInput';\nimport type { MoreOptionsButtonProps } from '../../components/MessageInput/MoreOptionsButton';\nimport type { SendButtonProps } from '../../components/MessageInput/SendButton';\nimport type { UploadProgressIndicatorProps } from '../../components/MessageInput/UploadProgressIndicator';\nimport type { MessageType } from '../../components/MessageList/hooks/useMessageList';\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../types/types';\n\nexport type FileUpload = {\n file: {\n name: string;\n size?: number | string;\n type?: string;\n uri?: string;\n };\n id: string;\n state: string;\n url?: string;\n};\n\nexport type ImageUpload = {\n file: Partial<Asset> & {\n name?: string;\n };\n id: string;\n state: string;\n url?: string;\n};\n\nexport type InputConfig = {\n maxMessageLength?: number;\n uploadsEnabled?: boolean;\n};\n\nexport type MentionAllAppUsersQuery<Us extends DefaultUserType> = {\n filters?: UserFilters<Us>;\n options?: UserOptions;\n sort?: UserSort<Us>;\n};\n\nexport type LocalMessageInputContext<\n At extends UnknownType = DefaultAttachmentType,\n Co extends string = DefaultCommandType,\n Us extends UnknownType = DefaultUserType,\n> = {\n appendText: (newText: string) => void;\n asyncIds: string[];\n asyncUploads: {\n [key: string]: {\n state: string;\n url: string;\n };\n };\n closeAttachmentPicker: () => void;\n /**\n * An array of file objects which are set for upload. It has the following structure:\n *\n * ```json\n * [\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_1\",\n * \"state\": \"uploading\" // or \"finished\",\n * \"url\": \"https://url1.com\",\n * },\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_2\",\n * \"state\": \"uploading\" // or \"finished\",\n * \"url\": \"https://url1.com\",\n * },\n * ]\n * ```\n *\n */\n fileUploads: FileUpload[];\n giphyActive: boolean;\n /**\n * An array of image objects which are set for upload. It has the following structure:\n *\n * ```json\n * [\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_1\",\n * \"state\": \"uploading\" // or \"finished\",\n * },\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_2\",\n * \"state\": \"uploading\" // or \"finished\",\n * },\n * ]\n * ```\n *\n */\n imageUploads: ImageUpload[];\n inputBoxRef: React.MutableRefObject<TextInput | null>;\n isValidMessage: () => boolean;\n mentionedUsers: string[];\n numberOfUploads: number;\n onChange: (newText: string) => void;\n onSelectItem: (item: UserResponse<Us>) => void;\n openAttachmentPicker: () => void;\n openCommandsPicker: () => void;\n openFilePicker: () => void;\n openMentionsPicker: () => void;\n pickFile: () => Promise<void>;\n /**\n * Function for removing a file from the upload preview\n *\n * @param id string ID of file in `fileUploads` object in state of MessageInput\n */\n removeFile: (id: string) => void;\n /**\n * Function for removing an image from the upload preview\n *\n * @param id string ID of image in `imageUploads` object in state of MessageInput\n */\n removeImage: (id: string) => void;\n resetInput: (pendingAttachments?: Attachment<At>[]) => void;\n selectedPicker: string | undefined;\n sending: React.MutableRefObject<boolean>;\n sendMessage: () => Promise<void>;\n sendMessageAsync: (id: string) => void;\n sendThreadMessageInChannel: boolean;\n setAsyncIds: React.Dispatch<React.SetStateAction<string[]>>;\n setAsyncUploads: React.Dispatch<\n React.SetStateAction<{\n [key: string]: {\n state: string;\n url: string;\n };\n }>\n >;\n setFileUploads: React.Dispatch<React.SetStateAction<FileUpload[]>>;\n setGiphyActive: React.Dispatch<React.SetStateAction<boolean>>;\n setImageUploads: React.Dispatch<React.SetStateAction<ImageUpload[]>>;\n /**\n * Ref callback to set reference on input box\n */\n setInputBoxRef: (ref: TextInput | null) => void;\n setMentionedUsers: React.Dispatch<React.SetStateAction<string[]>>;\n setNumberOfUploads: React.Dispatch<React.SetStateAction<number>>;\n setSendThreadMessageInChannel: React.Dispatch<React.SetStateAction<boolean>>;\n setShowMoreOptions: React.Dispatch<React.SetStateAction<boolean>>;\n setText: React.Dispatch<React.SetStateAction<string>>;\n showMoreOptions: boolean;\n /**\n * Text value of the TextInput\n */\n text: string;\n toggleAttachmentPicker: () => void;\n /**\n * Mapping of input triggers to the outputs to be displayed by the AutoCompleteInput\n */\n triggerSettings: TriggerSettings<Co, Us>;\n updateMessage: () => Promise<void>;\n /** Function for attempting to upload a file */\n uploadFile: ({ newFile }: { newFile: FileUpload }) => Promise<void>;\n /** Function for attempting to upload an image */\n uploadImage: ({ newImage }: { newImage: ImageUpload }) => Promise<void>;\n uploadNewFile: (file: {\n name: string;\n size?: number | string;\n type?: string;\n uri?: string;\n }) => Promise<void>;\n uploadNewImage: (image: Partial<Asset>) => Promise<void>;\n};\n\nexport type InputMessageInputContextValue<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = {\n /**\n * Custom UI component for attach button.\n *\n * Defaults to and accepts same props as: [AttachButton](https://getstream.github.io/stream-chat-react-native/v3/#attachbutton)\n */\n AttachButton: React.ComponentType<AttachButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n clearEditingState: () => void;\n clearQuotedMessageState: () => void;\n /**\n * Custom UI component for commands button.\n *\n * Defaults to and accepts same props as: [CommandsButton](https://getstream.github.io/stream-chat-react-native/v3/#commandsbutton)\n */\n CommandsButton: React.ComponentType<CommandsButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n editing: boolean | MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n editMessage: StreamChat<At, Ch, Co, Ev, Me, Re, Us>['updateMessage'];\n /**\n * Custom UI component for FileUploadPreview.\n * Defaults to and accepts same props as: https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/FileUploadPreview.tsx\n */\n FileUploadPreview: React.ComponentType<FileUploadPreviewProps<At, Ch, Co, Ev, Me, Re, Us>>;\n /** When false, CommandsButton will be hidden */\n hasCommands: boolean;\n /** When false, FileSelectorIcon will be hidden */\n hasFilePicker: boolean;\n /** When false, ImageSelectorIcon will be hidden */\n hasImagePicker: boolean;\n /**\n * Custom UI component for ImageUploadPreview.\n * Defaults to and accepts same props as: https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/ImageUploadPreview.tsx\n */\n ImageUploadPreview: React.ComponentType<ImageUploadPreviewProps<At, Ch, Co, Ev, Me, Re, Us>>;\n /** Limit on allowed number of files to attach at a time. */\n maxNumberOfFiles: number;\n /**\n * Custom UI component for more options button.\n *\n * Defaults to and accepts same props as: [MoreOptionsButton](https://getstream.github.io/stream-chat-react-native/v3/#moreoptionsbutton)\n */\n MoreOptionsButton: React.ComponentType<MoreOptionsButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n /** Limit on the number of lines in the text input before scrolling */\n numberOfLines: number;\n quotedMessage: boolean | MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n /**\n * Custom UI component for send button.\n *\n * Defaults to and accepts same props as: [SendButton](https://getstream.github.io/stream-chat-react-native/v3/#sendbutton)\n */\n SendButton: React.ComponentType<SendButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n sendImageAsync: boolean;\n sendMessage: (message: Partial<StreamMessage<At, Me, Us>>) => Promise<void>;\n setQuotedMessageState: (message: MessageType<At, Ch, Co, Ev, Me, Re, Us>) => void;\n /**\n * Custom UI component to render checkbox with text (\"Also send to channel\") in Thread's input box.\n * When ticked, message will also be sent in parent channel.\n */\n ShowThreadMessageInChannelButton: React.ComponentType<{\n threadList?: boolean;\n }>;\n /**\n * Custom UI component to render upload progress indicator on attachment preview.\n *\n * **Default** [UploadProgressIndicator](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/UploadProgressIndicator.tsx)\n */\n UploadProgressIndicator: React.ComponentType<UploadProgressIndicatorProps>;\n /**\n * Additional props for underlying TextInput component. These props will be forwarded as it is to TextInput component.\n *\n * @see See https://reactnative.dev/docs/textinput#reference\n */\n additionalTextInputProps?: TextInputProps;\n /** Max number of suggestions to display in autocomplete list. Defaults to 10. */\n autoCompleteSuggestionsLimit?: number;\n /**\n * Mapping of input triggers to the outputs to be displayed by the AutoCompleteInput\n */\n autoCompleteTriggerSettings?: (\n settings: ACITriggerSettingsParams<At, Ch, Co, Ev, Me, Re, Us>,\n ) => TriggerSettings<Co, Us>;\n /**\n * Compress image with quality (from 0 to 1, where 1 is best quality).\n * On iOS, values larger than 0.8 don't produce a noticeable quality increase in most images,\n * while a value of 0.8 will reduce the file size by about half or less compared to a value of 1.\n * Image picker defaults to 0.8 for iOS and 1 for Android\n */\n compressImageQuality?: number;\n /**\n * Override file upload request\n *\n * @param file File object - { uri: '', name: '' }\n * @param channel Current channel object\n *\n * @overrideType Function\n */\n doDocUploadRequest?: (\n file: {\n name: string;\n size?: string | number;\n type?: string;\n uri?: string;\n },\n channel: ChannelContextValue<At, Ch, Co, Ev, Me, Re, Us>['channel'],\n ) => Promise<SendFileAPIResponse>;\n /**\n * Override image upload request\n *\n * @param file File object - { uri: '' }\n * @param channel Current channel object\n *\n * @overrideType Function\n */\n doImageUploadRequest?: (\n file: {\n name?: string;\n uri?: string;\n },\n channel: ChannelContextValue<At, Ch, Co, Ev, Me, Re, Us>['channel'],\n ) => Promise<SendFileAPIResponse>;\n /** Initial value to set on input */\n initialValue?: string;\n /**\n * Custom UI component for AutoCompleteInput.\n * Has access to all of [MessageInputContext](https://github.com/GetStream/stream-chat-react-native/blob/master/src/contexts/messageInputContext/MessageInputContext.tsx)\n */\n Input?: React.ComponentType<\n Omit<MessageInputProps<At, Ch, Co, Ev, Me, Re, Us>, 'Input'> &\n InputButtonsProps<At, Ch, Co, Ev, Me, Re, Us> & {\n getUsers: () => UserResponse<Us>[];\n }\n >;\n /**\n * Custom UI component to override buttons on left side of input box\n * Defaults to [InputButtons](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/InputButtons.tsx),\n * which contain following components/buttons:\n *\n * - AttachButton\n * - CommandsButtom\n *\n * You have access to following prop functions:\n *\n * - closeAttachmentPicker\n * - openAttachmentPicker\n * - openCommandsPicker\n * - toggleAttachmentPicker\n */\n InputButtons?: React.ComponentType<InputButtonsProps<At, Ch, Co, Ev, Me, Re, Us>>;\n mentionAllAppUsersEnabled?: boolean;\n /** Object containing filters/sort/options overrides for an @mention user query */\n mentionAllAppUsersQuery?: MentionAllAppUsersQuery<Us>;\n /**\n * Callback that is called when the text input's text changes. Changed text is passed as a single string argument to the callback handler.\n */\n onChangeText?: (newText: string) => void;\n /**\n * ref for input setter function\n *\n * @param ref [Ref object](https://reactjs.org/docs/refs-and-the-dom.html) for underling `TextInput` component.\n *\n * @overrideType Function\n */\n setInputRef?: (ref: TextInput | null) => void;\n} & InputConfig;\n\nexport type MessageInputContextValue<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = LocalMessageInputContext<At, Co, Us> &\n Omit<InputMessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'sendMessage'>;\n\nexport const MessageInputContext = React.createContext({} as MessageInputContextValue);\n\nexport const MessageInputProvider = <\n At extends DefaultAttachmentType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>({\n children,\n value,\n}: PropsWithChildren<{\n value: InputMessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>;\n}>) => {\n const { closePicker, openPicker, selectedPicker, setSelectedPicker } =\n useAttachmentPickerContext();\n const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n const { channel, giphyEnabled } = useChannelContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { thread } = useThreadContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n const inputBoxRef = useRef<TextInput | null>(null);\n const sending = useRef(false);\n\n const [asyncIds, setAsyncIds] = useState<string[]>([]);\n const [asyncUploads, setAsyncUploads] = useState<{\n [key: string]: {\n state: string;\n url: string;\n };\n }>({});\n const [giphyActive, setGiphyActive] = useState(false);\n const [sendThreadMessageInChannel, setSendThreadMessageInChannel] = useState(false);\n const { editing, hasFilePicker, hasImagePicker, initialValue, maxNumberOfFiles } = value;\n const {\n fileUploads,\n imageUploads,\n mentionedUsers,\n numberOfUploads,\n setFileUploads,\n setImageUploads,\n setMentionedUsers,\n setNumberOfUploads,\n setShowMoreOptions,\n setText,\n showMoreOptions,\n text,\n } = useMessageDetailsForState<At, Ch, Co, Ev, Me, Re, Us>(editing, initialValue);\n\n const threadId = thread?.id;\n useEffect(() => {\n setSendThreadMessageInChannel(false);\n }, [threadId]);\n\n const appendText = (newText: string) => {\n setText((prevText) => `${prevText}${newText}`);\n };\n\n /** Checks if the message is valid or not. Accordingly we can enable/disable send button */\n const isValidMessage = () => {\n if (text && text.trim()) {\n return true;\n }\n\n for (const image of imageUploads) {\n if (!image || image.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n if (image.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n return false;\n }\n\n return true;\n }\n\n for (const file of fileUploads) {\n if (!file || file.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n if (file.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n return false;\n }\n\n return true;\n }\n\n return false;\n };\n\n const onChange = (newText: string) => {\n if (sending.current) {\n return;\n }\n setText(newText);\n\n if (newText && channel) {\n logChatPromiseExecution(channel.keystroke(thread?.id), 'start typing event');\n }\n\n if (value.onChangeText) {\n value.onChangeText(newText);\n }\n };\n\n const openCommandsPicker = () => {\n appendText('/');\n if (inputBoxRef.current) {\n inputBoxRef.current.focus();\n }\n };\n\n const openMentionsPicker = () => {\n appendText('@');\n if (inputBoxRef.current) {\n inputBoxRef.current.focus();\n }\n };\n\n const openAttachmentPicker = () => {\n if (hasImagePicker && !fileUploads.length) {\n Keyboard.dismiss();\n openPicker();\n setSelectedPicker('images');\n /**\n * TODO: Remove this, this is the result of\n * the bottom sheet now having some keyboard\n * handling baked in, creating an issue when\n * we call dismiss and open in short order.\n * https://github.com/gorhom/react-native-bottom-sheet/issues/446\n */\n setTimeout(openPicker, 600);\n } else if (hasFilePicker && numberOfUploads < maxNumberOfFiles) {\n pickFile();\n }\n };\n\n const closeAttachmentPicker = () => {\n setSelectedPicker(undefined);\n closePicker();\n };\n\n const toggleAttachmentPicker = () => {\n if (selectedPicker) {\n closeAttachmentPicker();\n } else {\n openAttachmentPicker();\n }\n };\n\n const onSelectItem = (item: UserResponse<Us>) => {\n setMentionedUsers((prevMentionedUsers) => [...prevMentionedUsers, item.id]);\n };\n\n const pickFile = async () => {\n if (numberOfUploads >= value.maxNumberOfFiles) {\n return;\n }\n\n const result = await pickDocument({\n maxNumberOfFiles: value.maxNumberOfFiles - numberOfUploads,\n });\n if (!result.cancelled && result.docs) {\n result.docs.forEach((doc) => {\n const mimeType = lookup(doc.name);\n\n if (mimeType && mimeType?.startsWith('image/')) {\n /**\n * TODO: The current tight coupling of images to the image\n * picker does not allow images picked from the file picker\n * to be rendered in a preview via the uploadNewImage call.\n * This should be updated alongside allowing image a file\n * uploads together.\n */\n uploadNewFile(doc);\n } else {\n uploadNewFile(doc);\n }\n });\n }\n };\n\n const removeFile = (id: string) => {\n if (fileUploads.some((file) => file.id === id)) {\n setFileUploads((prevFileUploads) => prevFileUploads.filter((file) => file.id !== id));\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n }\n };\n\n const removeImage = (id: string) => {\n if (imageUploads.some((image) => image.id === id)) {\n setImageUploads((prevImageUploads) => prevImageUploads.filter((image) => image.id !== id));\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n }\n };\n\n const resetInput = (pendingAttachments: Attachment<At>[] = []) => {\n setFileUploads([]);\n setGiphyActive(false);\n setShowMoreOptions(true);\n setImageUploads([]);\n setMentionedUsers([]);\n setNumberOfUploads(\n (prevNumberOfUploads) => prevNumberOfUploads - (pendingAttachments?.length || 0),\n );\n setText('');\n };\n\n const sendMessage = async () => {\n if (sending.current) {\n return;\n }\n sending.current = true;\n\n const prevText = giphyEnabled && giphyActive ? `/giphy ${text}` : text;\n await setText('');\n if (inputBoxRef.current) {\n inputBoxRef.current.clear();\n }\n\n const attachments = [] as Attachment<At>[];\n for (const image of imageUploads) {\n if (!image || image.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n\n if (image.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n if (value.sendImageAsync) {\n /**\n * If user hit send before image uploaded, push ID into a queue to later\n * be matched with the successful CDN response\n */\n setAsyncIds((prevAsyncIds) => [...prevAsyncIds, image.id]);\n } else {\n sending.current = false;\n return setText(prevText);\n }\n }\n\n if (image.state === FileState.UPLOADED || image.state === FileState.FINISHED) {\n attachments.push({\n fallback: image.file.name,\n image_url: image.url,\n type: 'image',\n } as Attachment<At>);\n }\n }\n\n for (const file of fileUploads) {\n if (!file || file.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n if (file.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n sending.current = false;\n return;\n }\n if (file.state === FileState.UPLOADED || file.state === FileState.FINISHED) {\n attachments.push({\n asset_url: file.url,\n file_size: file.file.size,\n mime_type: file.file.type,\n title: file.file.name,\n type: 'file',\n } as Attachment<At>);\n }\n }\n\n // Disallow sending message if its empty.\n if (!prevText && attachments.length === 0) {\n sending.current = false;\n return;\n }\n\n if (value.editing && !isEditingBoolean(value.editing)) {\n const updatedMessage = {\n ...value.editing,\n attachments,\n mentioned_users: mentionedUsers,\n quoted_message: undefined,\n text: prevText,\n } as Parameters<StreamChat<At, Ch, Co, Ev, Me, Re, Us>['updateMessage']>[0];\n\n // TODO: Remove this line and show an error when submit fails\n value.clearEditingState();\n\n const updateMessagePromise = value.editMessage(updatedMessage).then(value.clearEditingState);\n resetInput(attachments);\n logChatPromiseExecution(updateMessagePromise, 'update message');\n\n sending.current = false;\n } else {\n try {\n value.sendMessage({\n attachments,\n mentioned_users: uniq(mentionedUsers),\n /** Parent message id - in case of thread */\n parent_id: thread?.id,\n quoted_message_id:\n typeof value.quotedMessage === 'boolean' ? undefined : value.quotedMessage.id,\n show_in_channel: sendThreadMessageInChannel || undefined,\n text: prevText,\n } as unknown as StreamMessage<At, Me, Us>);\n\n value.clearQuotedMessageState();\n sending.current = false;\n resetInput(attachments);\n } catch (_error) {\n sending.current = false;\n if (value.quotedMessage && typeof value.quotedMessage !== 'boolean') {\n value.setQuotedMessageState(value.quotedMessage);\n }\n setText(prevText.slice(giphyEnabled && giphyActive ? 7 : 0)); // 7 because of '/giphy ' length\n console.log('Failed to send message');\n }\n }\n };\n\n const sendMessageAsync = (id: string) => {\n const image = asyncUploads[id];\n if (!image || image.state === FileState.UPLOAD_FAILED) {\n return;\n }\n\n if (image.state === FileState.UPLOADED || image.state === FileState.FINISHED) {\n const attachments = [\n {\n image_url: image.url,\n type: 'image',\n },\n ] as StreamMessage<At, Me, Us>['attachments'];\n\n try {\n value.sendMessage({\n attachments,\n mentioned_users: [],\n parent_id: thread?.id,\n quoted_message_id:\n typeof value.quotedMessage === 'boolean' ? undefined : value.quotedMessage.id,\n show_in_channel: sendThreadMessageInChannel || undefined,\n text: '',\n } as unknown as Partial<StreamMessage<At, Me, Us>>);\n\n setAsyncIds((prevAsyncIds) => prevAsyncIds.splice(prevAsyncIds.indexOf(id), 1));\n setAsyncUploads((prevAsyncUploads) => {\n delete prevAsyncUploads[id];\n return prevAsyncUploads;\n });\n\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n } catch (_error) {\n console.log('Failed');\n }\n }\n };\n\n const setInputBoxRef = (ref: TextInput | null) => {\n inputBoxRef.current = ref;\n if (value.setInputRef) {\n value.setInputRef(ref);\n }\n };\n\n const triggerSettings = channel\n ? value.autoCompleteTriggerSettings\n ? value.autoCompleteTriggerSettings({\n channel,\n client,\n onMentionSelectItem: onSelectItem,\n })\n : ACITriggerSettings<At, Ch, Co, Ev, Me, Re, Us>({\n channel,\n client,\n onMentionSelectItem: onSelectItem,\n })\n : ({} as TriggerSettings<Co, Us>);\n\n const updateMessage = async () => {\n try {\n if (!isEditingBoolean(value.editing)) {\n await client.updateMessage({\n ...value.editing,\n quoted_message: undefined,\n text: giphyEnabled && giphyActive ? `/giphy ${text}` : text,\n } as Parameters<StreamChat<At, Ch, Co, Ev, Me, Re, Us>['updateMessage']>[0]);\n }\n\n resetInput();\n value.clearEditingState();\n } catch (error) {\n console.log(error);\n }\n };\n\n const uploadFile = async ({ newFile }: { newFile: FileUpload }) => {\n if (!newFile) {\n return;\n }\n const { file, id } = newFile;\n\n await setFileUploads((prevFileUploads) =>\n prevFileUploads.map((fileUpload) => {\n if (fileUpload.id === id) {\n return {\n ...fileUpload,\n state: FileState.UPLOADING,\n };\n }\n return fileUpload;\n }),\n );\n\n let response = {} as SendFileAPIResponse;\n try {\n if (value.doDocUploadRequest) {\n response = await value.doDocUploadRequest(file, channel);\n } else if (channel && file.uri) {\n response = await channel.sendFile(file.uri, file.name, file.type);\n }\n } catch (error) {\n console.warn(error);\n if (!newFile) {\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n } else {\n setFileUploads((prevFileUploads) =>\n prevFileUploads.map((fileUpload) => {\n if (fileUpload.id === id) {\n return {\n ...fileUpload,\n state: FileState.UPLOAD_FAILED,\n };\n }\n return fileUpload;\n }),\n );\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n }\n return;\n }\n\n setFileUploads((prevFileUploads) =>\n prevFileUploads.map((fileUpload) => {\n if (fileUpload.id === id) {\n return {\n ...fileUpload,\n state: FileState.UPLOADED,\n url: response.file,\n };\n }\n return fileUpload;\n }),\n );\n };\n\n const uploadImage = async ({ newImage }: { newImage: ImageUpload }) => {\n const { file, id } = newImage || {};\n if (!file) {\n return;\n }\n\n let response = {} as SendFileAPIResponse;\n\n try {\n /**\n * Expo now uses the assets-library which is also how remote\n * native files are presented. We now return a file id from Expo\n * only, if that file id exits we call getLocalAssetUri to download\n * the asset for expo before uploading it. We do the same for native\n * if the uri includes assets-library, this uses the CameraRoll.save\n * function to also create a local uri.\n */\n const localUri = file.id\n ? await getLocalAssetUri(file.id)\n : file.uri?.match(/assets-library/)\n ? await getLocalAssetUri(file.uri)\n : file.uri;\n\n const uri = file.name || localUri || '';\n /**\n * We skip compression if:\n * - the file is from the camera as that should already be compressed\n * - the file has not height/width value to maintain for compression\n * - the compressImageQuality number is not present or is 1 (meaning no compression)\n */\n const compressedUri = await (file.source === 'camera' ||\n !file.height ||\n !file.width ||\n typeof value.compressImageQuality !== 'number' ||\n value.compressImageQuality === 1\n ? uri\n : compressImage({\n compressImageQuality: value.compressImageQuality,\n height: file.height,\n uri,\n width: file.width,\n }));\n\n const filename = uri.replace(/^(file:\\/\\/|content:\\/\\/|assets-library:\\/\\/)/, '');\n const contentType = lookup(filename) || 'multipart/form-data';\n\n if (value.doImageUploadRequest) {\n response = await value.doImageUploadRequest(file, channel);\n } else if (compressedUri && channel) {\n if (value.sendImageAsync) {\n channel.sendImage(compressedUri, undefined, contentType).then((res) => {\n if (asyncIds.includes(id)) {\n // Evaluates to true if user hit send before image successfully uploaded\n setAsyncUploads((prevAsyncUploads) => {\n prevAsyncUploads[id] = {\n ...prevAsyncUploads[id],\n state: FileState.UPLOADED,\n url: res.file,\n };\n return prevAsyncUploads;\n });\n } else {\n setImageUploads((prevImageUploads) =>\n prevImageUploads.map((imageUpload) => {\n if (imageUpload.id === id) {\n return {\n ...imageUpload,\n state: FileState.UPLOADED,\n url: res.file,\n };\n }\n return imageUpload;\n }),\n );\n }\n });\n } else {\n response = await channel.sendImage(compressedUri, undefined, contentType);\n }\n }\n\n if (Object.keys(response).length) {\n setImageUploads((prevImageUploads) =>\n prevImageUploads.map((imageUpload) => {\n if (imageUpload.id === id) {\n return {\n ...imageUpload,\n state: FileState.UPLOADED,\n url: response.file,\n };\n }\n return imageUpload;\n }),\n );\n }\n } catch (error) {\n console.warn(error);\n if (newImage) {\n setImageUploads((prevImageUploads) =>\n prevImageUploads.map((imageUpload) => {\n if (imageUpload.id === id) {\n return {\n ...imageUpload,\n state: FileState.UPLOAD_FAILED,\n };\n }\n return imageUpload;\n }),\n );\n }\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n\n return;\n }\n };\n\n const uploadNewFile = async (file: {\n name: string;\n size?: number | string;\n type?: string;\n uri?: string;\n }) => {\n const id = generateRandomId();\n const mimeType = lookup(file.name);\n const newFile = {\n file: { ...file, type: mimeType || file?.type },\n id,\n state: FileState.UPLOADING,\n };\n await Promise.all([\n setFileUploads((prevFileUploads) => prevFileUploads.concat([newFile])),\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads + 1),\n ]);\n\n uploadFile({ newFile });\n };\n\n const uploadNewImage = async (image: Partial<Asset>) => {\n const id = generateRandomId();\n const newImage = {\n file: image,\n id,\n state: FileState.UPLOADING,\n };\n await Promise.all([\n setImageUploads((prevImageUploads) => prevImageUploads.concat([newImage])),\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads + 1),\n ]);\n\n uploadImage({ newImage });\n };\n\n const messageInputContext = useCreateMessageInputContext({\n appendText,\n asyncIds,\n asyncUploads,\n closeAttachmentPicker,\n fileUploads,\n giphyActive,\n imageUploads,\n inputBoxRef,\n isValidMessage,\n mentionedUsers,\n numberOfUploads,\n onChange,\n onSelectItem,\n openAttachmentPicker,\n openCommandsPicker,\n openFilePicker: pickFile,\n openMentionsPicker,\n pickFile,\n removeFile,\n removeImage,\n resetInput,\n selectedPicker,\n sending,\n sendMessageAsync,\n sendThreadMessageInChannel,\n setAsyncIds,\n setAsyncUploads,\n setFileUploads,\n setGiphyActive,\n setImageUploads,\n setInputBoxRef,\n setMentionedUsers,\n setNumberOfUploads,\n setSendThreadMessageInChannel,\n setShowMoreOptions,\n setText,\n showMoreOptions,\n text,\n thread,\n toggleAttachmentPicker,\n triggerSettings,\n updateMessage,\n uploadFile,\n uploadImage,\n uploadNewFile,\n uploadNewImage,\n ...value,\n sendMessage, // overriding the originally passed in sendMessage\n });\n\n return (\n <MessageInputContext.Provider\n value={messageInputContext as unknown as MessageInputContextValue}\n >\n {children}\n </MessageInputContext.Provider>\n );\n};\n\nexport const useMessageInputContext = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>() =>\n useContext(MessageInputContext) as unknown as MessageInputContextValue<\n At,\n Ch,\n Co,\n Ev,\n Me,\n Re,\n Us\n >;\n\n/**\n * Typescript currently does not support partial inference so if MessageInputContext\n * typing is desired while using the HOC withMessageInputContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withMessageInputContext = <\n P extends UnknownType,\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n Component: React.ComponentType<P>,\n): React.FC<Omit<P, keyof MessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>>> => {\n const WithMessageInputContextComponent = (\n props: Omit<P, keyof MessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>>,\n ) => {\n const messageInputContext = useMessageInputContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n return <Component {...(props as P)} {...messageInputContext} />;\n };\n WithMessageInputContextComponent.displayName = `WithMessageInputContext${getDisplayName(\n Component,\n )}`;\n return WithMessageInputContextComponent;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["MessageInputContext.tsx"],"names":["MIME_TYPE_OCTET_STREAM","MessageInputContext","React","createContext","MessageInputProvider","children","value","closePicker","openPicker","selectedPicker","setSelectedPicker","client","channel","giphyEnabled","thread","inputBoxRef","sending","asyncIds","setAsyncIds","asyncUploads","setAsyncUploads","giphyActive","setGiphyActive","sendThreadMessageInChannel","setSendThreadMessageInChannel","editing","hasFilePicker","hasImagePicker","initialValue","maxNumberOfFiles","fileUploads","imageUploads","mentionedUsers","numberOfUploads","setFileUploads","setImageUploads","setMentionedUsers","setNumberOfUploads","setShowMoreOptions","setText","showMoreOptions","text","threadId","id","appendText","newText","prevText","isValidMessage","trim","image","state","FileState","UPLOAD_FAILED","UPLOADING","file","onChange","current","keystroke","onChangeText","openCommandsPicker","focus","openMentionsPicker","openAttachmentPicker","length","Keyboard","dismiss","setTimeout","pickFile","closeAttachmentPicker","undefined","toggleAttachmentPicker","onSelectItem","item","prevMentionedUsers","result","cancelled","docs","forEach","doc","uploadNewFile","removeFile","some","prevFileUploads","filter","prevNumberOfUploads","removeImage","prevImageUploads","resetInput","pendingAttachments","sendMessage","clear","attachments","sendImageAsync","prevAsyncIds","UPLOADED","FINISHED","push","fallback","name","image_url","url","type","startsWith","asset_url","file_size","size","mime_type","title","updatedMessage","mentioned_users","quoted_message","clearEditingState","updateMessagePromise","editMessage","then","parent_id","quoted_message_id","quotedMessage","show_in_channel","clearQuotedMessageState","_error","setQuotedMessageState","slice","console","log","sendMessageAsync","splice","indexOf","prevAsyncUploads","setInputBoxRef","ref","setInputRef","triggerSettings","autoCompleteTriggerSettings","onMentionSelectItem","updateMessage","uploadFile","newFile","map","fileUpload","response","doDocUploadRequest","uri","sendFile","warn","uploadImage","newImage","match","localUri","source","height","width","compressImageQuality","compressedUri","doImageUploadRequest","sendImage","res","includes","imageUpload","Object","keys","Promise","all","concat","uploadNewImage","messageInputContext","openFilePicker","useMessageInputContext","withMessageInputContext","Component","WithMessageInputContextComponent","props","displayName"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren, useContext, useEffect, useRef, useState } from 'react';\nimport { Keyboard } from 'react-native';\nimport uniq from 'lodash/uniq';\nimport {\n Attachment,\n logChatPromiseExecution,\n SendFileAPIResponse,\n StreamChat,\n Message as StreamMessage,\n UserFilters,\n UserOptions,\n UserResponse,\n UserSort,\n} from 'stream-chat';\n\nimport { useCreateMessageInputContext } from './hooks/useCreateMessageInputContext';\nimport { isEditingBoolean, useMessageDetailsForState } from './hooks/useMessageDetailsForState';\n\nimport { useAttachmentPickerContext } from '../attachmentPickerContext/AttachmentPickerContext';\nimport { useChatContext } from '../chatContext/ChatContext';\nimport { ChannelContextValue, useChannelContext } from '../channelContext/ChannelContext';\nimport { useThreadContext } from '../threadContext/ThreadContext';\nimport { getDisplayName } from '../utils/getDisplayName';\n\nimport {\n ACITriggerSettings,\n ACITriggerSettingsParams,\n FileState,\n generateRandomId,\n TriggerSettings,\n} from '../../utils/utils';\n\nimport { Asset, compressImage, getLocalAssetUri, pickDocument } from '../../native';\n\nimport type { TextInput, TextInputProps } from 'react-native';\n\nimport type { AttachButtonProps } from '../../components/MessageInput/AttachButton';\nimport type { CommandsButtonProps } from '../../components/MessageInput/CommandsButton';\nimport type { FileUploadPreviewProps } from '../../components/MessageInput/FileUploadPreview';\nimport type { ImageUploadPreviewProps } from '../../components/MessageInput/ImageUploadPreview';\nimport type { InputButtonsProps } from '../../components/MessageInput/InputButtons';\nimport type { MessageInputProps } from '../../components/MessageInput/MessageInput';\nimport type { MoreOptionsButtonProps } from '../../components/MessageInput/MoreOptionsButton';\nimport type { SendButtonProps } from '../../components/MessageInput/SendButton';\nimport type { UploadProgressIndicatorProps } from '../../components/MessageInput/UploadProgressIndicator';\nimport type { MessageType } from '../../components/MessageList/hooks/useMessageList';\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../types/types';\n\nconst MIME_TYPE_OCTET_STREAM = 'application/octet-stream';\n\nexport type FileUpload = {\n file: {\n name: string;\n size?: number | string;\n type?: string;\n uri?: string;\n };\n id: string;\n state: string;\n url?: string;\n};\n\nexport type ImageUpload = {\n file: Partial<Asset> & {\n name?: string;\n };\n id: string;\n state: string;\n url?: string;\n};\n\nexport type InputConfig = {\n maxMessageLength?: number;\n uploadsEnabled?: boolean;\n};\n\nexport type MentionAllAppUsersQuery<Us extends DefaultUserType> = {\n filters?: UserFilters<Us>;\n options?: UserOptions;\n sort?: UserSort<Us>;\n};\n\nexport type LocalMessageInputContext<\n At extends UnknownType = DefaultAttachmentType,\n Co extends string = DefaultCommandType,\n Us extends UnknownType = DefaultUserType,\n> = {\n appendText: (newText: string) => void;\n asyncIds: string[];\n asyncUploads: {\n [key: string]: {\n state: string;\n url: string;\n };\n };\n closeAttachmentPicker: () => void;\n /**\n * An array of file objects which are set for upload. It has the following structure:\n *\n * ```json\n * [\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_1\",\n * \"state\": \"uploading\" // or \"finished\",\n * \"url\": \"https://url1.com\",\n * },\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_2\",\n * \"state\": \"uploading\" // or \"finished\",\n * \"url\": \"https://url1.com\",\n * },\n * ]\n * ```\n *\n */\n fileUploads: FileUpload[];\n giphyActive: boolean;\n /**\n * An array of image objects which are set for upload. It has the following structure:\n *\n * ```json\n * [\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_1\",\n * \"state\": \"uploading\" // or \"finished\",\n * },\n * {\n * \"file\": // File object,\n * \"id\": \"randomly_generated_temp_id_2\",\n * \"state\": \"uploading\" // or \"finished\",\n * },\n * ]\n * ```\n *\n */\n imageUploads: ImageUpload[];\n inputBoxRef: React.MutableRefObject<TextInput | null>;\n isValidMessage: () => boolean;\n mentionedUsers: string[];\n numberOfUploads: number;\n onChange: (newText: string) => void;\n onSelectItem: (item: UserResponse<Us>) => void;\n openAttachmentPicker: () => void;\n openCommandsPicker: () => void;\n openFilePicker: () => void;\n openMentionsPicker: () => void;\n pickFile: () => Promise<void>;\n /**\n * Function for removing a file from the upload preview\n *\n * @param id string ID of file in `fileUploads` object in state of MessageInput\n */\n removeFile: (id: string) => void;\n /**\n * Function for removing an image from the upload preview\n *\n * @param id string ID of image in `imageUploads` object in state of MessageInput\n */\n removeImage: (id: string) => void;\n resetInput: (pendingAttachments?: Attachment<At>[]) => void;\n selectedPicker: string | undefined;\n sending: React.MutableRefObject<boolean>;\n sendMessage: () => Promise<void>;\n sendMessageAsync: (id: string) => void;\n sendThreadMessageInChannel: boolean;\n setAsyncIds: React.Dispatch<React.SetStateAction<string[]>>;\n setAsyncUploads: React.Dispatch<\n React.SetStateAction<{\n [key: string]: {\n state: string;\n url: string;\n };\n }>\n >;\n setFileUploads: React.Dispatch<React.SetStateAction<FileUpload[]>>;\n setGiphyActive: React.Dispatch<React.SetStateAction<boolean>>;\n setImageUploads: React.Dispatch<React.SetStateAction<ImageUpload[]>>;\n /**\n * Ref callback to set reference on input box\n */\n setInputBoxRef: (ref: TextInput | null) => void;\n setMentionedUsers: React.Dispatch<React.SetStateAction<string[]>>;\n setNumberOfUploads: React.Dispatch<React.SetStateAction<number>>;\n setSendThreadMessageInChannel: React.Dispatch<React.SetStateAction<boolean>>;\n setShowMoreOptions: React.Dispatch<React.SetStateAction<boolean>>;\n setText: React.Dispatch<React.SetStateAction<string>>;\n showMoreOptions: boolean;\n /**\n * Text value of the TextInput\n */\n text: string;\n toggleAttachmentPicker: () => void;\n /**\n * Mapping of input triggers to the outputs to be displayed by the AutoCompleteInput\n */\n triggerSettings: TriggerSettings<Co, Us>;\n updateMessage: () => Promise<void>;\n /** Function for attempting to upload a file */\n uploadFile: ({ newFile }: { newFile: FileUpload }) => Promise<void>;\n /** Function for attempting to upload an image */\n uploadImage: ({ newImage }: { newImage: ImageUpload }) => Promise<void>;\n uploadNewFile: (file: {\n name: string;\n size?: number | string;\n type?: string;\n uri?: string;\n }) => Promise<void>;\n uploadNewImage: (image: Partial<Asset>) => Promise<void>;\n};\n\nexport type InputMessageInputContextValue<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = {\n /**\n * Custom UI component for attach button.\n *\n * Defaults to and accepts same props as: [AttachButton](https://getstream.github.io/stream-chat-react-native/v3/#attachbutton)\n */\n AttachButton: React.ComponentType<AttachButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n clearEditingState: () => void;\n clearQuotedMessageState: () => void;\n /**\n * Custom UI component for commands button.\n *\n * Defaults to and accepts same props as: [CommandsButton](https://getstream.github.io/stream-chat-react-native/v3/#commandsbutton)\n */\n CommandsButton: React.ComponentType<CommandsButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n editing: boolean | MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n editMessage: StreamChat<At, Ch, Co, Ev, Me, Re, Us>['updateMessage'];\n /**\n * Custom UI component for FileUploadPreview.\n * Defaults to and accepts same props as: https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/FileUploadPreview.tsx\n */\n FileUploadPreview: React.ComponentType<FileUploadPreviewProps<At, Ch, Co, Ev, Me, Re, Us>>;\n /** When false, CommandsButton will be hidden */\n hasCommands: boolean;\n /** When false, FileSelectorIcon will be hidden */\n hasFilePicker: boolean;\n /** When false, ImageSelectorIcon will be hidden */\n hasImagePicker: boolean;\n /**\n * Custom UI component for ImageUploadPreview.\n * Defaults to and accepts same props as: https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/ImageUploadPreview.tsx\n */\n ImageUploadPreview: React.ComponentType<ImageUploadPreviewProps<At, Ch, Co, Ev, Me, Re, Us>>;\n /** Limit on allowed number of files to attach at a time. */\n maxNumberOfFiles: number;\n /**\n * Custom UI component for more options button.\n *\n * Defaults to and accepts same props as: [MoreOptionsButton](https://getstream.github.io/stream-chat-react-native/v3/#moreoptionsbutton)\n */\n MoreOptionsButton: React.ComponentType<MoreOptionsButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n /** Limit on the number of lines in the text input before scrolling */\n numberOfLines: number;\n quotedMessage: boolean | MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n /**\n * Custom UI component for send button.\n *\n * Defaults to and accepts same props as: [SendButton](https://getstream.github.io/stream-chat-react-native/v3/#sendbutton)\n */\n SendButton: React.ComponentType<SendButtonProps<At, Ch, Co, Ev, Me, Re, Us>>;\n sendImageAsync: boolean;\n sendMessage: (message: Partial<StreamMessage<At, Me, Us>>) => Promise<void>;\n setQuotedMessageState: (message: MessageType<At, Ch, Co, Ev, Me, Re, Us>) => void;\n /**\n * Custom UI component to render checkbox with text (\"Also send to channel\") in Thread's input box.\n * When ticked, message will also be sent in parent channel.\n */\n ShowThreadMessageInChannelButton: React.ComponentType<{\n threadList?: boolean;\n }>;\n /**\n * Custom UI component to render upload progress indicator on attachment preview.\n *\n * **Default** [UploadProgressIndicator](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/UploadProgressIndicator.tsx)\n */\n UploadProgressIndicator: React.ComponentType<UploadProgressIndicatorProps>;\n /**\n * Additional props for underlying TextInput component. These props will be forwarded as it is to TextInput component.\n *\n * @see See https://reactnative.dev/docs/textinput#reference\n */\n additionalTextInputProps?: TextInputProps;\n /** Max number of suggestions to display in autocomplete list. Defaults to 10. */\n autoCompleteSuggestionsLimit?: number;\n /**\n * Mapping of input triggers to the outputs to be displayed by the AutoCompleteInput\n */\n autoCompleteTriggerSettings?: (\n settings: ACITriggerSettingsParams<At, Ch, Co, Ev, Me, Re, Us>,\n ) => TriggerSettings<Co, Us>;\n /**\n * Compress image with quality (from 0 to 1, where 1 is best quality).\n * On iOS, values larger than 0.8 don't produce a noticeable quality increase in most images,\n * while a value of 0.8 will reduce the file size by about half or less compared to a value of 1.\n * Image picker defaults to 0.8 for iOS and 1 for Android\n */\n compressImageQuality?: number;\n /**\n * Override file upload request\n *\n * @param file File object - { uri: '', name: '' }\n * @param channel Current channel object\n *\n * @overrideType Function\n */\n doDocUploadRequest?: (\n file: {\n name: string;\n size?: string | number;\n type?: string;\n uri?: string;\n },\n channel: ChannelContextValue<At, Ch, Co, Ev, Me, Re, Us>['channel'],\n ) => Promise<SendFileAPIResponse>;\n /**\n * Override image upload request\n *\n * @param file File object - { uri: '' }\n * @param channel Current channel object\n *\n * @overrideType Function\n */\n doImageUploadRequest?: (\n file: {\n name?: string;\n uri?: string;\n },\n channel: ChannelContextValue<At, Ch, Co, Ev, Me, Re, Us>['channel'],\n ) => Promise<SendFileAPIResponse>;\n /** Initial value to set on input */\n initialValue?: string;\n /**\n * Custom UI component for AutoCompleteInput.\n * Has access to all of [MessageInputContext](https://github.com/GetStream/stream-chat-react-native/blob/master/src/contexts/messageInputContext/MessageInputContext.tsx)\n */\n Input?: React.ComponentType<\n Omit<MessageInputProps<At, Ch, Co, Ev, Me, Re, Us>, 'Input'> &\n InputButtonsProps<At, Ch, Co, Ev, Me, Re, Us> & {\n getUsers: () => UserResponse<Us>[];\n }\n >;\n /**\n * Custom UI component to override buttons on left side of input box\n * Defaults to [InputButtons](https://github.com/GetStream/stream-chat-react-native/blob/master/src/components/MessageInput/InputButtons.tsx),\n * which contain following components/buttons:\n *\n * - AttachButton\n * - CommandsButtom\n *\n * You have access to following prop functions:\n *\n * - closeAttachmentPicker\n * - openAttachmentPicker\n * - openCommandsPicker\n * - toggleAttachmentPicker\n */\n InputButtons?: React.ComponentType<InputButtonsProps<At, Ch, Co, Ev, Me, Re, Us>>;\n mentionAllAppUsersEnabled?: boolean;\n /** Object containing filters/sort/options overrides for an @mention user query */\n mentionAllAppUsersQuery?: MentionAllAppUsersQuery<Us>;\n /**\n * Callback that is called when the text input's text changes. Changed text is passed as a single string argument to the callback handler.\n */\n onChangeText?: (newText: string) => void;\n /**\n * ref for input setter function\n *\n * @param ref [Ref object](https://reactjs.org/docs/refs-and-the-dom.html) for underling `TextInput` component.\n *\n * @overrideType Function\n */\n setInputRef?: (ref: TextInput | null) => void;\n} & InputConfig;\n\nexport type MessageInputContextValue<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = LocalMessageInputContext<At, Co, Us> &\n Omit<InputMessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'sendMessage'>;\n\nexport const MessageInputContext = React.createContext({} as MessageInputContextValue);\n\nexport const MessageInputProvider = <\n At extends DefaultAttachmentType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>({\n children,\n value,\n}: PropsWithChildren<{\n value: InputMessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>;\n}>) => {\n const { closePicker, openPicker, selectedPicker, setSelectedPicker } =\n useAttachmentPickerContext();\n const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n const { channel, giphyEnabled } = useChannelContext<At, Ch, Co, Ev, Me, Re, Us>();\n const { thread } = useThreadContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n const inputBoxRef = useRef<TextInput | null>(null);\n const sending = useRef(false);\n\n const [asyncIds, setAsyncIds] = useState<string[]>([]);\n const [asyncUploads, setAsyncUploads] = useState<{\n [key: string]: {\n state: string;\n url: string;\n };\n }>({});\n const [giphyActive, setGiphyActive] = useState(false);\n const [sendThreadMessageInChannel, setSendThreadMessageInChannel] = useState(false);\n const { editing, hasFilePicker, hasImagePicker, initialValue, maxNumberOfFiles } = value;\n const {\n fileUploads,\n imageUploads,\n mentionedUsers,\n numberOfUploads,\n setFileUploads,\n setImageUploads,\n setMentionedUsers,\n setNumberOfUploads,\n setShowMoreOptions,\n setText,\n showMoreOptions,\n text,\n } = useMessageDetailsForState<At, Ch, Co, Ev, Me, Re, Us>(editing, initialValue);\n\n const threadId = thread?.id;\n useEffect(() => {\n setSendThreadMessageInChannel(false);\n }, [threadId]);\n\n const appendText = (newText: string) => {\n setText((prevText) => `${prevText}${newText}`);\n };\n\n /** Checks if the message is valid or not. Accordingly we can enable/disable send button */\n const isValidMessage = () => {\n if (text && text.trim()) {\n return true;\n }\n\n for (const image of imageUploads) {\n if (!image || image.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n if (image.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n return false;\n }\n\n return true;\n }\n\n for (const file of fileUploads) {\n if (!file || file.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n if (file.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n return false;\n }\n\n return true;\n }\n\n return false;\n };\n\n const onChange = (newText: string) => {\n if (sending.current) {\n return;\n }\n setText(newText);\n\n if (newText && channel) {\n logChatPromiseExecution(channel.keystroke(thread?.id), 'start typing event');\n }\n\n if (value.onChangeText) {\n value.onChangeText(newText);\n }\n };\n\n const openCommandsPicker = () => {\n appendText('/');\n if (inputBoxRef.current) {\n inputBoxRef.current.focus();\n }\n };\n\n const openMentionsPicker = () => {\n appendText('@');\n if (inputBoxRef.current) {\n inputBoxRef.current.focus();\n }\n };\n\n const openAttachmentPicker = () => {\n if (hasImagePicker && !fileUploads.length) {\n Keyboard.dismiss();\n openPicker();\n setSelectedPicker('images');\n /**\n * TODO: Remove this, this is the result of\n * the bottom sheet now having some keyboard\n * handling baked in, creating an issue when\n * we call dismiss and open in short order.\n * https://github.com/gorhom/react-native-bottom-sheet/issues/446\n */\n setTimeout(openPicker, 600);\n } else if (hasFilePicker && numberOfUploads < maxNumberOfFiles) {\n pickFile();\n }\n };\n\n const closeAttachmentPicker = () => {\n setSelectedPicker(undefined);\n closePicker();\n };\n\n const toggleAttachmentPicker = () => {\n if (selectedPicker) {\n closeAttachmentPicker();\n } else {\n openAttachmentPicker();\n }\n };\n\n const onSelectItem = (item: UserResponse<Us>) => {\n setMentionedUsers((prevMentionedUsers) => [...prevMentionedUsers, item.id]);\n };\n\n const pickFile = async () => {\n if (numberOfUploads >= value.maxNumberOfFiles) {\n return;\n }\n\n const result = await pickDocument({\n maxNumberOfFiles: value.maxNumberOfFiles - numberOfUploads,\n });\n if (!result.cancelled && result.docs) {\n result.docs.forEach((doc) => {\n /**\n * TODO: The current tight coupling of images to the image\n * picker does not allow images picked from the file picker\n * to be rendered in a preview via the uploadNewImage call.\n * This should be updated alongside allowing image a file\n * uploads together.\n */\n uploadNewFile(doc);\n });\n }\n };\n\n const removeFile = (id: string) => {\n if (fileUploads.some((file) => file.id === id)) {\n setFileUploads((prevFileUploads) => prevFileUploads.filter((file) => file.id !== id));\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n }\n };\n\n const removeImage = (id: string) => {\n if (imageUploads.some((image) => image.id === id)) {\n setImageUploads((prevImageUploads) => prevImageUploads.filter((image) => image.id !== id));\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n }\n };\n\n const resetInput = (pendingAttachments: Attachment<At>[] = []) => {\n setFileUploads([]);\n setGiphyActive(false);\n setShowMoreOptions(true);\n setImageUploads([]);\n setMentionedUsers([]);\n setNumberOfUploads(\n (prevNumberOfUploads) => prevNumberOfUploads - (pendingAttachments?.length || 0),\n );\n setText('');\n };\n\n const sendMessage = async () => {\n if (sending.current) {\n return;\n }\n sending.current = true;\n\n const prevText = giphyEnabled && giphyActive ? `/giphy ${text}` : text;\n await setText('');\n if (inputBoxRef.current) {\n inputBoxRef.current.clear();\n }\n\n const attachments = [] as Attachment<At>[];\n for (const image of imageUploads) {\n if (!image || image.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n\n if (image.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n if (value.sendImageAsync) {\n /**\n * If user hit send before image uploaded, push ID into a queue to later\n * be matched with the successful CDN response\n */\n setAsyncIds((prevAsyncIds) => [...prevAsyncIds, image.id]);\n } else {\n sending.current = false;\n return setText(prevText);\n }\n }\n\n if (image.state === FileState.UPLOADED || image.state === FileState.FINISHED) {\n attachments.push({\n fallback: image.file.name,\n image_url: image.url,\n type: 'image',\n } as Attachment<At>);\n }\n }\n\n for (const file of fileUploads) {\n if (!file || file.state === FileState.UPLOAD_FAILED) {\n continue;\n }\n if (file.state === FileState.UPLOADING) {\n // TODO: show error to user that they should wait until image is uploaded\n sending.current = false;\n return;\n }\n if (file.state === FileState.UPLOADED || file.state === FileState.FINISHED) {\n if (file.file.type?.startsWith('image/')) {\n attachments.push({\n fallback: file.file.name,\n image_url: file.url,\n type: 'image',\n } as Attachment<At>);\n } else {\n attachments.push({\n asset_url: file.url,\n file_size: file.file.size,\n mime_type: file.file.type,\n title: file.file.name,\n type: 'file',\n } as Attachment<At>);\n }\n }\n }\n\n // Disallow sending message if its empty.\n if (!prevText && attachments.length === 0) {\n sending.current = false;\n return;\n }\n\n if (value.editing && !isEditingBoolean(value.editing)) {\n const updatedMessage = {\n ...value.editing,\n attachments,\n mentioned_users: mentionedUsers,\n quoted_message: undefined,\n text: prevText,\n } as Parameters<StreamChat<At, Ch, Co, Ev, Me, Re, Us>['updateMessage']>[0];\n\n // TODO: Remove this line and show an error when submit fails\n value.clearEditingState();\n\n const updateMessagePromise = value.editMessage(updatedMessage).then(value.clearEditingState);\n resetInput(attachments);\n logChatPromiseExecution(updateMessagePromise, 'update message');\n\n sending.current = false;\n } else {\n try {\n value.sendMessage({\n attachments,\n mentioned_users: uniq(mentionedUsers),\n /** Parent message id - in case of thread */\n parent_id: thread?.id,\n quoted_message_id:\n typeof value.quotedMessage === 'boolean' ? undefined : value.quotedMessage.id,\n show_in_channel: sendThreadMessageInChannel || undefined,\n text: prevText,\n } as unknown as StreamMessage<At, Me, Us>);\n\n value.clearQuotedMessageState();\n sending.current = false;\n resetInput(attachments);\n } catch (_error) {\n sending.current = false;\n if (value.quotedMessage && typeof value.quotedMessage !== 'boolean') {\n value.setQuotedMessageState(value.quotedMessage);\n }\n setText(prevText.slice(giphyEnabled && giphyActive ? 7 : 0)); // 7 because of '/giphy ' length\n console.log('Failed to send message');\n }\n }\n };\n\n const sendMessageAsync = (id: string) => {\n const image = asyncUploads[id];\n if (!image || image.state === FileState.UPLOAD_FAILED) {\n return;\n }\n\n if (image.state === FileState.UPLOADED || image.state === FileState.FINISHED) {\n const attachments = [\n {\n image_url: image.url,\n type: 'image',\n },\n ] as StreamMessage<At, Me, Us>['attachments'];\n\n try {\n value.sendMessage({\n attachments,\n mentioned_users: [],\n parent_id: thread?.id,\n quoted_message_id:\n typeof value.quotedMessage === 'boolean' ? undefined : value.quotedMessage.id,\n show_in_channel: sendThreadMessageInChannel || undefined,\n text: '',\n } as unknown as Partial<StreamMessage<At, Me, Us>>);\n\n setAsyncIds((prevAsyncIds) => prevAsyncIds.splice(prevAsyncIds.indexOf(id), 1));\n setAsyncUploads((prevAsyncUploads) => {\n delete prevAsyncUploads[id];\n return prevAsyncUploads;\n });\n\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n } catch (_error) {\n console.log('Failed');\n }\n }\n };\n\n const setInputBoxRef = (ref: TextInput | null) => {\n inputBoxRef.current = ref;\n if (value.setInputRef) {\n value.setInputRef(ref);\n }\n };\n\n const triggerSettings = channel\n ? value.autoCompleteTriggerSettings\n ? value.autoCompleteTriggerSettings({\n channel,\n client,\n onMentionSelectItem: onSelectItem,\n })\n : ACITriggerSettings<At, Ch, Co, Ev, Me, Re, Us>({\n channel,\n client,\n onMentionSelectItem: onSelectItem,\n })\n : ({} as TriggerSettings<Co, Us>);\n\n const updateMessage = async () => {\n try {\n if (!isEditingBoolean(value.editing)) {\n await client.updateMessage({\n ...value.editing,\n quoted_message: undefined,\n text: giphyEnabled && giphyActive ? `/giphy ${text}` : text,\n } as Parameters<StreamChat<At, Ch, Co, Ev, Me, Re, Us>['updateMessage']>[0]);\n }\n\n resetInput();\n value.clearEditingState();\n } catch (error) {\n console.log(error);\n }\n };\n\n const uploadFile = async ({ newFile }: { newFile: FileUpload }) => {\n if (!newFile) {\n return;\n }\n const { file, id } = newFile;\n\n await setFileUploads((prevFileUploads) =>\n prevFileUploads.map((fileUpload) => {\n if (fileUpload.id === id) {\n return {\n ...fileUpload,\n state: FileState.UPLOADING,\n };\n }\n return fileUpload;\n }),\n );\n\n let response = {} as SendFileAPIResponse;\n try {\n if (value.doDocUploadRequest) {\n response = await value.doDocUploadRequest(file, channel);\n } else if (channel && file.uri) {\n response = await channel.sendFile(file.uri, file.name, MIME_TYPE_OCTET_STREAM);\n }\n } catch (error) {\n console.warn(error);\n if (!newFile) {\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n } else {\n setFileUploads((prevFileUploads) =>\n prevFileUploads.map((fileUpload) => {\n if (fileUpload.id === id) {\n return {\n ...fileUpload,\n state: FileState.UPLOAD_FAILED,\n };\n }\n return fileUpload;\n }),\n );\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n }\n return;\n }\n\n setFileUploads((prevFileUploads) =>\n prevFileUploads.map((fileUpload) => {\n if (fileUpload.id === id) {\n return {\n ...fileUpload,\n state: FileState.UPLOADED,\n url: response.file,\n };\n }\n return fileUpload;\n }),\n );\n };\n\n const uploadImage = async ({ newImage }: { newImage: ImageUpload }) => {\n const { file, id } = newImage || {};\n if (!file) {\n return;\n }\n\n let response = {} as SendFileAPIResponse;\n\n try {\n /**\n * Expo now uses the assets-library which is also how remote\n * native files are presented. We now return a file id from Expo\n * only, if that file id exits we call getLocalAssetUri to download\n * the asset for expo before uploading it. We do the same for native\n * if the uri includes assets-library, this uses the CameraRoll.save\n * function to also create a local uri.\n */\n const localUri = file.id\n ? await getLocalAssetUri(file.id)\n : file.uri?.match(/assets-library/)\n ? await getLocalAssetUri(file.uri)\n : file.uri;\n\n const uri = file.name || localUri || '';\n /**\n * We skip compression if:\n * - the file is from the camera as that should already be compressed\n * - the file has not height/width value to maintain for compression\n * - the compressImageQuality number is not present or is 1 (meaning no compression)\n */\n const compressedUri = await (file.source === 'camera' ||\n !file.height ||\n !file.width ||\n typeof value.compressImageQuality !== 'number' ||\n value.compressImageQuality === 1\n ? uri\n : compressImage({\n compressImageQuality: value.compressImageQuality,\n height: file.height,\n uri,\n width: file.width,\n }));\n\n if (value.doImageUploadRequest) {\n response = await value.doImageUploadRequest(file, channel);\n } else if (compressedUri && channel) {\n if (value.sendImageAsync) {\n channel.sendImage(compressedUri, undefined, MIME_TYPE_OCTET_STREAM).then((res) => {\n if (asyncIds.includes(id)) {\n // Evaluates to true if user hit send before image successfully uploaded\n setAsyncUploads((prevAsyncUploads) => {\n prevAsyncUploads[id] = {\n ...prevAsyncUploads[id],\n state: FileState.UPLOADED,\n url: res.file,\n };\n return prevAsyncUploads;\n });\n } else {\n setImageUploads((prevImageUploads) =>\n prevImageUploads.map((imageUpload) => {\n if (imageUpload.id === id) {\n return {\n ...imageUpload,\n state: FileState.UPLOADED,\n url: res.file,\n };\n }\n return imageUpload;\n }),\n );\n }\n });\n } else {\n response = await channel.sendImage(compressedUri, undefined, MIME_TYPE_OCTET_STREAM);\n }\n }\n\n if (Object.keys(response).length) {\n setImageUploads((prevImageUploads) =>\n prevImageUploads.map((imageUpload) => {\n if (imageUpload.id === id) {\n return {\n ...imageUpload,\n state: FileState.UPLOADED,\n url: response.file,\n };\n }\n return imageUpload;\n }),\n );\n }\n } catch (error) {\n console.warn(error);\n if (newImage) {\n setImageUploads((prevImageUploads) =>\n prevImageUploads.map((imageUpload) => {\n if (imageUpload.id === id) {\n return {\n ...imageUpload,\n state: FileState.UPLOAD_FAILED,\n };\n }\n return imageUpload;\n }),\n );\n }\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads - 1);\n\n return;\n }\n };\n\n const uploadNewFile = async (file: {\n name: string;\n size?: number | string;\n type?: string;\n uri?: string;\n }) => {\n const id = generateRandomId();\n const newFile = {\n file: { ...file, type: MIME_TYPE_OCTET_STREAM },\n id,\n state: FileState.UPLOADING,\n };\n await Promise.all([\n setFileUploads((prevFileUploads) => prevFileUploads.concat([newFile])),\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads + 1),\n ]);\n\n uploadFile({ newFile });\n };\n\n const uploadNewImage = async (image: Partial<Asset>) => {\n const id = generateRandomId();\n const newImage = {\n file: image,\n id,\n state: FileState.UPLOADING,\n };\n await Promise.all([\n setImageUploads((prevImageUploads) => prevImageUploads.concat([newImage])),\n setNumberOfUploads((prevNumberOfUploads) => prevNumberOfUploads + 1),\n ]);\n\n uploadImage({ newImage });\n };\n\n const messageInputContext = useCreateMessageInputContext({\n appendText,\n asyncIds,\n asyncUploads,\n closeAttachmentPicker,\n fileUploads,\n giphyActive,\n imageUploads,\n inputBoxRef,\n isValidMessage,\n mentionedUsers,\n numberOfUploads,\n onChange,\n onSelectItem,\n openAttachmentPicker,\n openCommandsPicker,\n openFilePicker: pickFile,\n openMentionsPicker,\n pickFile,\n removeFile,\n removeImage,\n resetInput,\n selectedPicker,\n sending,\n sendMessageAsync,\n sendThreadMessageInChannel,\n setAsyncIds,\n setAsyncUploads,\n setFileUploads,\n setGiphyActive,\n setImageUploads,\n setInputBoxRef,\n setMentionedUsers,\n setNumberOfUploads,\n setSendThreadMessageInChannel,\n setShowMoreOptions,\n setText,\n showMoreOptions,\n text,\n thread,\n toggleAttachmentPicker,\n triggerSettings,\n updateMessage,\n uploadFile,\n uploadImage,\n uploadNewFile,\n uploadNewImage,\n ...value,\n sendMessage, // overriding the originally passed in sendMessage\n });\n\n return (\n <MessageInputContext.Provider\n value={messageInputContext as unknown as MessageInputContextValue}\n >\n {children}\n </MessageInputContext.Provider>\n );\n};\n\nexport const useMessageInputContext = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>() =>\n useContext(MessageInputContext) as unknown as MessageInputContextValue<\n At,\n Ch,\n Co,\n Ev,\n Me,\n Re,\n Us\n >;\n\n/**\n * Typescript currently does not support partial inference so if MessageInputContext\n * typing is desired while using the HOC withMessageInputContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withMessageInputContext = <\n P extends UnknownType,\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n Component: React.ComponentType<P>,\n): React.FC<Omit<P, keyof MessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>>> => {\n const WithMessageInputContextComponent = (\n props: Omit<P, keyof MessageInputContextValue<At, Ch, Co, Ev, Me, Re, Us>>,\n ) => {\n const messageInputContext = useMessageInputContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n return <Component {...(props as P)} {...messageInputContext} />;\n };\n WithMessageInputContextComponent.displayName = `WithMessageInputContext${getDisplayName(\n Component,\n )}`;\n return WithMessageInputContextComponent;\n};\n"]}
|
package/lib/module/version.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stream-chat-react-native-core",
|
|
3
3
|
"description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
|
|
4
|
-
"version": "3.8.
|
|
4
|
+
"version": "3.8.2-next.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"company": "Stream.io Inc",
|
|
7
7
|
"name": "Stream.io Inc"
|
|
@@ -77,7 +77,6 @@
|
|
|
77
77
|
"i18next": "20.2.4",
|
|
78
78
|
"lodash-es": "4.17.21",
|
|
79
79
|
"metro-react-native-babel-preset": "0.66.0",
|
|
80
|
-
"mime-types": "2.1.30",
|
|
81
80
|
"path": "0.12.7",
|
|
82
81
|
"react-art": "^17.0.2",
|
|
83
82
|
"react-native-markdown-package": "1.8.1",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect } from 'react';
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
2
|
|
|
3
3
|
import { useChatContext } from '../../../../contexts/chatContext/ChatContext';
|
|
4
4
|
|
|
@@ -32,9 +32,12 @@ export const useConnectionRecovered = <
|
|
|
32
32
|
}: Parameters) => {
|
|
33
33
|
const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();
|
|
34
34
|
|
|
35
|
+
const refRefreshList = useRef(refreshList);
|
|
36
|
+
refRefreshList.current = refreshList;
|
|
37
|
+
|
|
35
38
|
useEffect(() => {
|
|
36
39
|
const handleEvent = () => {
|
|
37
|
-
|
|
40
|
+
refRefreshList.current();
|
|
38
41
|
setForceUpdate((count) => count + 1);
|
|
39
42
|
};
|
|
40
43
|
|
|
@@ -349,8 +349,8 @@ const MessageListWithContext = <
|
|
|
349
349
|
const [lastReceivedId, setLastReceivedId] = useState(getLastReceivedMessage(messageList)?.id);
|
|
350
350
|
const [scrollToBottomButtonVisible, setScrollToBottomButtonVisible] = useState(false);
|
|
351
351
|
|
|
352
|
-
const [stickyHeaderDate, setStickyHeaderDate] = useState<Date>(
|
|
353
|
-
const stickyHeaderDateRef = useRef
|
|
352
|
+
const [stickyHeaderDate, setStickyHeaderDate] = useState<Date | undefined>();
|
|
353
|
+
const stickyHeaderDateRef = useRef<Date | undefined>();
|
|
354
354
|
/**
|
|
355
355
|
* channel.lastRead throws error if the channel is not initialized.
|
|
356
356
|
*/
|
|
@@ -396,7 +396,7 @@ const MessageListWithContext = <
|
|
|
396
396
|
lastItem?.item?.created_at &&
|
|
397
397
|
!lastItem.item.deleted_at &&
|
|
398
398
|
typeof lastItem.item.created_at !== 'string' &&
|
|
399
|
-
lastItem.item.created_at.toDateString() !== stickyHeaderDateRef.current
|
|
399
|
+
lastItem.item.created_at.toDateString() !== stickyHeaderDateRef.current?.toDateString()
|
|
400
400
|
) {
|
|
401
401
|
stickyHeaderDateRef.current = lastItem.item.created_at;
|
|
402
402
|
setStickyHeaderDate(lastItem.item.created_at);
|
|
@@ -819,11 +819,14 @@ const MessageListWithContext = <
|
|
|
819
819
|
}, [imageString, numberOfMessagesWithImages, threadExists, threadList]);
|
|
820
820
|
|
|
821
821
|
const stickyHeaderFormatDate =
|
|
822
|
-
stickyHeaderDate
|
|
823
|
-
const tStickyHeaderDate = tDateTimeParser(stickyHeaderDate);
|
|
824
|
-
const stickyHeaderDateToRender =
|
|
825
|
-
|
|
826
|
-
|
|
822
|
+
stickyHeaderDate?.getFullYear() === new Date().getFullYear() ? 'MMM D' : 'MMM D, YYYY';
|
|
823
|
+
const tStickyHeaderDate = stickyHeaderDate ? tDateTimeParser(stickyHeaderDate) : null;
|
|
824
|
+
const stickyHeaderDateToRender =
|
|
825
|
+
tStickyHeaderDate === null
|
|
826
|
+
? null
|
|
827
|
+
: isDayOrMoment(tStickyHeaderDate)
|
|
828
|
+
? tStickyHeaderDate.format(stickyHeaderFormatDate)
|
|
829
|
+
: new Date(tStickyHeaderDate).toDateString();
|
|
827
830
|
|
|
828
831
|
const dismissImagePicker = () => {
|
|
829
832
|
if (!hasMoved && selectedPicker) {
|
|
@@ -890,11 +893,12 @@ const MessageListWithContext = <
|
|
|
890
893
|
{!loading && (
|
|
891
894
|
<>
|
|
892
895
|
<View style={styles.stickyHeader}>
|
|
893
|
-
{
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
896
|
+
{stickyHeaderDateToRender &&
|
|
897
|
+
(StickyHeader ? (
|
|
898
|
+
<StickyHeader dateString={stickyHeaderDateToRender} />
|
|
899
|
+
) : messageListLengthAfterUpdate ? (
|
|
900
|
+
<DateHeader dateString={stickyHeaderDateToRender} />
|
|
901
|
+
) : null)}
|
|
898
902
|
</View>
|
|
899
903
|
{!disableTypingIndicator && TypingIndicator && typingEventsEnabled !== false && (
|
|
900
904
|
<TypingIndicatorContainer>
|
|
@@ -896,45 +896,7 @@ exports[`MessageList should render the message list and match snapshot 1`] = `
|
|
|
896
896
|
"top": 0,
|
|
897
897
|
}
|
|
898
898
|
}
|
|
899
|
-
|
|
900
|
-
<View
|
|
901
|
-
style={
|
|
902
|
-
Array [
|
|
903
|
-
Object {
|
|
904
|
-
"alignItems": "center",
|
|
905
|
-
"alignSelf": "center",
|
|
906
|
-
"borderRadius": 8,
|
|
907
|
-
"height": 16,
|
|
908
|
-
"justifyContent": "center",
|
|
909
|
-
"marginTop": 8,
|
|
910
|
-
"paddingHorizontal": 8,
|
|
911
|
-
},
|
|
912
|
-
Object {
|
|
913
|
-
"backgroundColor": "#00000099",
|
|
914
|
-
},
|
|
915
|
-
Object {},
|
|
916
|
-
]
|
|
917
|
-
}
|
|
918
|
-
>
|
|
919
|
-
<Text
|
|
920
|
-
style={
|
|
921
|
-
Array [
|
|
922
|
-
Object {
|
|
923
|
-
"fontSize": 12,
|
|
924
|
-
"textAlign": "center",
|
|
925
|
-
"textAlignVertical": "center",
|
|
926
|
-
},
|
|
927
|
-
Object {
|
|
928
|
-
"color": "#FFFFFF",
|
|
929
|
-
},
|
|
930
|
-
Object {},
|
|
931
|
-
]
|
|
932
|
-
}
|
|
933
|
-
>
|
|
934
|
-
Sep 3
|
|
935
|
-
</Text>
|
|
936
|
-
</View>
|
|
937
|
-
</View>
|
|
899
|
+
/>
|
|
938
900
|
<View
|
|
939
901
|
style={
|
|
940
902
|
Array [
|
|
@@ -858,45 +858,7 @@ exports[`Thread should match thread snapshot 1`] = `
|
|
|
858
858
|
"top": 0,
|
|
859
859
|
}
|
|
860
860
|
}
|
|
861
|
-
|
|
862
|
-
<View
|
|
863
|
-
style={
|
|
864
|
-
Array [
|
|
865
|
-
Object {
|
|
866
|
-
"alignItems": "center",
|
|
867
|
-
"alignSelf": "center",
|
|
868
|
-
"borderRadius": 8,
|
|
869
|
-
"height": 16,
|
|
870
|
-
"justifyContent": "center",
|
|
871
|
-
"marginTop": 8,
|
|
872
|
-
"paddingHorizontal": 8,
|
|
873
|
-
},
|
|
874
|
-
Object {
|
|
875
|
-
"backgroundColor": "#00000099",
|
|
876
|
-
},
|
|
877
|
-
Object {},
|
|
878
|
-
]
|
|
879
|
-
}
|
|
880
|
-
>
|
|
881
|
-
<Text
|
|
882
|
-
style={
|
|
883
|
-
Array [
|
|
884
|
-
Object {
|
|
885
|
-
"fontSize": 12,
|
|
886
|
-
"textAlign": "center",
|
|
887
|
-
"textAlignVertical": "center",
|
|
888
|
-
},
|
|
889
|
-
Object {
|
|
890
|
-
"color": "#FFFFFF",
|
|
891
|
-
},
|
|
892
|
-
Object {},
|
|
893
|
-
]
|
|
894
|
-
}
|
|
895
|
-
>
|
|
896
|
-
Sep 3
|
|
897
|
-
</Text>
|
|
898
|
-
</View>
|
|
899
|
-
</View>
|
|
861
|
+
/>
|
|
900
862
|
<View
|
|
901
863
|
style={
|
|
902
864
|
Array [
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React, { PropsWithChildren, useContext, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { Keyboard } from 'react-native';
|
|
3
3
|
import uniq from 'lodash/uniq';
|
|
4
|
-
import { lookup } from 'mime-types';
|
|
5
4
|
import {
|
|
6
5
|
Attachment,
|
|
7
6
|
logChatPromiseExecution,
|
|
@@ -56,6 +55,8 @@ import type {
|
|
|
56
55
|
UnknownType,
|
|
57
56
|
} from '../../types/types';
|
|
58
57
|
|
|
58
|
+
const MIME_TYPE_OCTET_STREAM = 'application/octet-stream';
|
|
59
|
+
|
|
59
60
|
export type FileUpload = {
|
|
60
61
|
file: {
|
|
61
62
|
name: string;
|
|
@@ -569,20 +570,14 @@ export const MessageInputProvider = <
|
|
|
569
570
|
});
|
|
570
571
|
if (!result.cancelled && result.docs) {
|
|
571
572
|
result.docs.forEach((doc) => {
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
* uploads together.
|
|
581
|
-
*/
|
|
582
|
-
uploadNewFile(doc);
|
|
583
|
-
} else {
|
|
584
|
-
uploadNewFile(doc);
|
|
585
|
-
}
|
|
573
|
+
/**
|
|
574
|
+
* TODO: The current tight coupling of images to the image
|
|
575
|
+
* picker does not allow images picked from the file picker
|
|
576
|
+
* to be rendered in a preview via the uploadNewImage call.
|
|
577
|
+
* This should be updated alongside allowing image a file
|
|
578
|
+
* uploads together.
|
|
579
|
+
*/
|
|
580
|
+
uploadNewFile(doc);
|
|
586
581
|
});
|
|
587
582
|
}
|
|
588
583
|
};
|
|
@@ -664,13 +659,21 @@ export const MessageInputProvider = <
|
|
|
664
659
|
return;
|
|
665
660
|
}
|
|
666
661
|
if (file.state === FileState.UPLOADED || file.state === FileState.FINISHED) {
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
}
|
|
662
|
+
if (file.file.type?.startsWith('image/')) {
|
|
663
|
+
attachments.push({
|
|
664
|
+
fallback: file.file.name,
|
|
665
|
+
image_url: file.url,
|
|
666
|
+
type: 'image',
|
|
667
|
+
} as Attachment<At>);
|
|
668
|
+
} else {
|
|
669
|
+
attachments.push({
|
|
670
|
+
asset_url: file.url,
|
|
671
|
+
file_size: file.file.size,
|
|
672
|
+
mime_type: file.file.type,
|
|
673
|
+
title: file.file.name,
|
|
674
|
+
type: 'file',
|
|
675
|
+
} as Attachment<At>);
|
|
676
|
+
}
|
|
674
677
|
}
|
|
675
678
|
}
|
|
676
679
|
|
|
@@ -823,7 +826,7 @@ export const MessageInputProvider = <
|
|
|
823
826
|
if (value.doDocUploadRequest) {
|
|
824
827
|
response = await value.doDocUploadRequest(file, channel);
|
|
825
828
|
} else if (channel && file.uri) {
|
|
826
|
-
response = await channel.sendFile(file.uri, file.name,
|
|
829
|
+
response = await channel.sendFile(file.uri, file.name, MIME_TYPE_OCTET_STREAM);
|
|
827
830
|
}
|
|
828
831
|
} catch (error) {
|
|
829
832
|
console.warn(error);
|
|
@@ -903,14 +906,11 @@ export const MessageInputProvider = <
|
|
|
903
906
|
width: file.width,
|
|
904
907
|
}));
|
|
905
908
|
|
|
906
|
-
const filename = uri.replace(/^(file:\/\/|content:\/\/|assets-library:\/\/)/, '');
|
|
907
|
-
const contentType = lookup(filename) || 'multipart/form-data';
|
|
908
|
-
|
|
909
909
|
if (value.doImageUploadRequest) {
|
|
910
910
|
response = await value.doImageUploadRequest(file, channel);
|
|
911
911
|
} else if (compressedUri && channel) {
|
|
912
912
|
if (value.sendImageAsync) {
|
|
913
|
-
channel.sendImage(compressedUri, undefined,
|
|
913
|
+
channel.sendImage(compressedUri, undefined, MIME_TYPE_OCTET_STREAM).then((res) => {
|
|
914
914
|
if (asyncIds.includes(id)) {
|
|
915
915
|
// Evaluates to true if user hit send before image successfully uploaded
|
|
916
916
|
setAsyncUploads((prevAsyncUploads) => {
|
|
@@ -937,7 +937,7 @@ export const MessageInputProvider = <
|
|
|
937
937
|
}
|
|
938
938
|
});
|
|
939
939
|
} else {
|
|
940
|
-
response = await channel.sendImage(compressedUri, undefined,
|
|
940
|
+
response = await channel.sendImage(compressedUri, undefined, MIME_TYPE_OCTET_STREAM);
|
|
941
941
|
}
|
|
942
942
|
}
|
|
943
943
|
|
|
@@ -983,9 +983,8 @@ export const MessageInputProvider = <
|
|
|
983
983
|
uri?: string;
|
|
984
984
|
}) => {
|
|
985
985
|
const id = generateRandomId();
|
|
986
|
-
const mimeType = lookup(file.name);
|
|
987
986
|
const newFile = {
|
|
988
|
-
file: { ...file, type:
|
|
987
|
+
file: { ...file, type: MIME_TYPE_OCTET_STREAM },
|
|
989
988
|
id,
|
|
990
989
|
state: FileState.UPLOADING,
|
|
991
990
|
};
|
package/src/version.json
CHANGED