stream-chat-react-native-core 5.0.0-offline-support.15 → 5.0.0
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/Attachment/FileAttachment.js +16 -7
- package/lib/commonjs/components/Attachment/FileAttachment.js.map +1 -1
- package/lib/commonjs/components/Attachment/Gallery.js +4 -2
- package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
- package/lib/commonjs/components/Attachment/utils/getGiphyMimeType.js +15 -0
- package/lib/commonjs/components/Attachment/utils/getGiphyMimeType.js.map +1 -0
- package/lib/commonjs/components/Channel/Channel.js +1 -1
- package/lib/commonjs/components/Channel/Channel.js.map +1 -1
- package/lib/commonjs/components/ChannelList/hooks/listeners/useNewMessage.js +16 -4
- package/lib/commonjs/components/ChannelList/hooks/listeners/useNewMessage.js.map +1 -1
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js +1 -1
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/ChannelPreview.js +10 -6
- package/lib/commonjs/components/ChannelPreview/ChannelPreview.js.map +1 -1
- package/lib/commonjs/components/ImageGallery/ImageGallery.js +23 -21
- package/lib/commonjs/components/ImageGallery/ImageGallery.js.map +1 -1
- package/lib/commonjs/components/Message/Message.js +6 -6
- package/lib/commonjs/components/Message/Message.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js +7 -3
- package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js +1 -1
- package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js.map +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js +1 -1
- package/lib/commonjs/components/MessageList/MessageList.js.map +1 -1
- package/lib/commonjs/mock-builders/event/messageNew.js +2 -0
- package/lib/commonjs/mock-builders/event/messageNew.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/Attachment/FileAttachment.js +16 -7
- package/lib/module/components/Attachment/FileAttachment.js.map +1 -1
- package/lib/module/components/Attachment/Gallery.js +4 -2
- package/lib/module/components/Attachment/Gallery.js.map +1 -1
- package/lib/module/components/Attachment/utils/getGiphyMimeType.js +15 -0
- package/lib/module/components/Attachment/utils/getGiphyMimeType.js.map +1 -0
- package/lib/module/components/Channel/Channel.js +1 -1
- package/lib/module/components/Channel/Channel.js.map +1 -1
- package/lib/module/components/ChannelList/hooks/listeners/useNewMessage.js +16 -4
- package/lib/module/components/ChannelList/hooks/listeners/useNewMessage.js.map +1 -1
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +1 -1
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreview.js +10 -6
- package/lib/module/components/ChannelPreview/ChannelPreview.js.map +1 -1
- package/lib/module/components/ImageGallery/ImageGallery.js +23 -21
- package/lib/module/components/ImageGallery/ImageGallery.js.map +1 -1
- package/lib/module/components/Message/Message.js +6 -6
- package/lib/module/components/Message/Message.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageTextContainer.js +7 -3
- package/lib/module/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/utils/renderText.js +1 -1
- package/lib/module/components/Message/MessageSimple/utils/renderText.js.map +1 -1
- package/lib/module/components/MessageList/MessageList.js +1 -1
- package/lib/module/components/MessageList/MessageList.js.map +1 -1
- package/lib/module/mock-builders/event/messageNew.js +2 -0
- package/lib/module/mock-builders/event/messageNew.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/Attachment/utils/getGiphyMimeType.d.ts +6 -0
- package/lib/typescript/components/Message/Message.d.ts +9 -3
- package/package.json +3 -3
- package/src/components/Attachment/FileAttachment.tsx +3 -0
- package/src/components/Attachment/Gallery.tsx +3 -1
- package/src/components/Attachment/utils/getGiphyMimeType.ts +13 -0
- package/src/components/Channel/Channel.tsx +1 -1
- package/src/components/ChannelList/__tests__/ChannelList.test.js +28 -0
- package/src/components/ChannelList/hooks/listeners/useNewMessage.ts +18 -5
- package/src/components/ChannelList/hooks/usePaginatedChannels.ts +1 -1
- package/src/components/ChannelPreview/ChannelPreview.tsx +6 -3
- package/src/components/ImageGallery/ImageGallery.tsx +2 -1
- package/src/components/Message/Message.tsx +9 -1
- package/src/components/Message/MessageSimple/MessageTextContainer.tsx +22 -2
- package/src/components/Message/MessageSimple/utils/renderText.tsx +1 -1
- package/src/components/MessageList/MessageList.tsx +1 -1
- package/src/mock-builders/event/messageNew.js +2 -0
- package/src/version.json +1 -1
|
@@ -23,11 +23,23 @@ var useNewMessage = function useNewMessage(_ref) {
|
|
|
23
23
|
(0, _react.useEffect)(function () {
|
|
24
24
|
var handleEvent = function handleEvent(event) {
|
|
25
25
|
setChannels(function (channels) {
|
|
26
|
-
if (!lockChannelOrder && event.cid) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
cid: event.cid
|
|
26
|
+
if (!lockChannelOrder && event.cid && event.channel_type && event.channel_id) {
|
|
27
|
+
var targetChannelIndex = channels.findIndex(function (c) {
|
|
28
|
+
return c.cid === event.cid;
|
|
30
29
|
});
|
|
30
|
+
|
|
31
|
+
if (targetChannelIndex >= 0) {
|
|
32
|
+
return (0, _utils.moveChannelUp)({
|
|
33
|
+
channels: channels,
|
|
34
|
+
cid: event.cid
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
var channel = client.channel(event.channel_type, event.channel_id);
|
|
39
|
+
|
|
40
|
+
if (channel.initialized) {
|
|
41
|
+
return [channel].concat((0, _toConsumableArray2["default"])(channels));
|
|
42
|
+
}
|
|
31
43
|
}
|
|
32
44
|
|
|
33
45
|
return (0, _toConsumableArray2["default"])(channels);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useNewMessage.ts"],"names":["useNewMessage","lockChannelOrder","setChannels","client","handleEvent","event","channels","cid","listener","on","unsubscribe"],"mappings":";;;;;;;;;AAAA;;AAIA;;AAGA;;AAQO,IAAMA,aAAa,GAAG,SAAhBA,aAAgB,OAKS;AAAA,MAFpCC,gBAEoC,QAFpCA,gBAEoC;AAAA,MADpCC,WACoC,QADpCA,WACoC;;AACpC,wBAAmB,kCAAnB;AAAA,MAAQC,MAAR,mBAAQA,MAAR;;AAEA,wBAAU,YAAM;AACd,QAAMC,WAAW,GAAG,SAAdA,WAAc,CAACC,KAAD,EAAsC;AACxDH,MAAAA,WAAW,CAAC,UAACI,QAAD,EAAc;AACxB,YAAI,CAACL,gBAAD,IAAqBI,KAAK,CAACE,
|
|
1
|
+
{"version":3,"sources":["useNewMessage.ts"],"names":["useNewMessage","lockChannelOrder","setChannels","client","handleEvent","event","channels","cid","channel_type","channel_id","targetChannelIndex","findIndex","c","channel","initialized","listener","on","unsubscribe"],"mappings":";;;;;;;;;AAAA;;AAIA;;AAGA;;AAQO,IAAMA,aAAa,GAAG,SAAhBA,aAAgB,OAKS;AAAA,MAFpCC,gBAEoC,QAFpCA,gBAEoC;AAAA,MADpCC,WACoC,QADpCA,WACoC;;AACpC,wBAAmB,kCAAnB;AAAA,MAAQC,MAAR,mBAAQA,MAAR;;AAEA,wBAAU,YAAM;AACd,QAAMC,WAAW,GAAG,SAAdA,WAAc,CAACC,KAAD,EAAsC;AACxDH,MAAAA,WAAW,CAAC,UAACI,QAAD,EAAc;AACxB,YAAI,CAACL,gBAAD,IAAqBI,KAAK,CAACE,GAA3B,IAAkCF,KAAK,CAACG,YAAxC,IAAwDH,KAAK,CAACI,UAAlE,EAA8E;AAC5E,cAAMC,kBAAkB,GAAGJ,QAAQ,CAACK,SAAT,CAAmB,UAACC,CAAD;AAAA,mBAAOA,CAAC,CAACL,GAAF,KAAUF,KAAK,CAACE,GAAvB;AAAA,WAAnB,CAA3B;;AAEA,cAAIG,kBAAkB,IAAI,CAA1B,EAA6B;AAC3B,mBAAO,0BAAkC;AACvCJ,cAAAA,QAAQ,EAARA,QADuC;AAEvCC,cAAAA,GAAG,EAAEF,KAAK,CAACE;AAF4B,aAAlC,CAAP;AAID;;AAKD,cAAMM,OAAO,GAAGV,MAAM,CAACU,OAAP,CAAeR,KAAK,CAACG,YAArB,EAAmCH,KAAK,CAACI,UAAzC,CAAhB;;AAEA,cAAII,OAAO,CAACC,WAAZ,EAAyB;AACvB,oBAAQD,OAAR,6CAAoBP,QAApB;AACD;AACF;;AAED,mDAAWA,QAAX;AACD,OAtBU,CAAX;AAuBD,KAxBD;;AA0BA,QAAMS,QAAQ,GAAGZ,MAAH,oBAAGA,MAAM,CAAEa,EAAR,CAAW,aAAX,EAA0BZ,WAA1B,CAAjB;AACA,WAAO;AAAA,aAAMW,QAAN,oBAAMA,QAAQ,CAAEE,WAAV,EAAN;AAAA,KAAP;AACD,GA7BD,EA6BG,EA7BH;AA8BD,CAtCM","sourcesContent":["import { useEffect } from 'react';\n\nimport type { Channel, Event } from 'stream-chat';\n\nimport { useChatContext } from '../../../../contexts/chatContext/ChatContext';\n\nimport type { DefaultStreamChatGenerics } from '../../../../types/types';\nimport { moveChannelUp } from '../../utils';\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n lockChannelOrder: boolean;\n setChannels: React.Dispatch<React.SetStateAction<Channel<StreamChatGenerics>[]>>;\n };\n\nexport const useNewMessage = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n lockChannelOrder,\n setChannels,\n}: Parameters<StreamChatGenerics>) => {\n const { client } = useChatContext<StreamChatGenerics>();\n\n useEffect(() => {\n const handleEvent = (event: Event<StreamChatGenerics>) => {\n setChannels((channels) => {\n if (!lockChannelOrder && event.cid && event.channel_type && event.channel_id) {\n const targetChannelIndex = channels.findIndex((c) => c.cid === event.cid);\n\n if (targetChannelIndex >= 0) {\n return moveChannelUp<StreamChatGenerics>({\n channels,\n cid: event.cid,\n });\n }\n\n // If channel doesn't exist in existing list, check in activeChannels as well.\n // It may happen that channel was hidden using channel.hide(). In that case\n // We remove it from `channels` state, but its still being watched and exists in client.activeChannels.\n const channel = client.channel(event.channel_type, event.channel_id);\n\n if (channel.initialized) {\n return [channel, ...channels];\n }\n }\n\n return [...channels];\n });\n };\n\n const listener = client?.on('message.new', handleEvent);\n return () => listener?.unsubscribe();\n }, []);\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["usePaginatedChannels.ts"],"names":["waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","enableOfflineSupport","filters","options","sort","client","initialChannelsStateRef","current","channels","setChannels","staticChannelsActive","setStaticChannelsActive","activeChannels","error","setError","hasNextPage","setHasNextPage","lastRefresh","Date","now","isQueryingRef","activeQueryType","setActiveQueryType","isMountedRef","filtersRef","sortRef","activeRequestId","queryChannels","queryType","retryCount","hasUpdatedData","JSON","stringify","some","Boolean","isQueryStale","currentRequestId","undefined","newOptions","limit","MAX_QUERY_CHANNELS_LIMIT","offset","length","skipInitialization","channelQueryResponse","newChannels","console","warn","Error","loadNextPage","refreshList","reloadList","filterStr","sortStr","loadChannels","user","id","channelsFromDB","currentUserId","hydrateActiveChannels","staticState","e","loadingChannels","loadingNextPage","refreshing"],"mappings":";;;;;;;;;;;;;;;;;AAAA;;AAIA;;AACA;;AACA;;AAEA;;AAEA;;AACA;;AAEA,IAAMA,WAAW,GAAG,SAAdA,WAAc,CAACC,OAAD;AAAA,SAClB,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvBC,IAAAA,UAAU,CAACD,OAAD,EAAUF,OAAO,GAAGI,sBAApB,CAAV;AACD,GAFD,CADkB;AAAA,CAApB;;AAaA,IAAMC,eAAe,GAAG;AACtBC,EAAAA,aAAa,EAAE;AADO,CAAxB;AAIA,IAAMC,qBAAqB,GAAG,CAA9B;AACA,IAAMC,oBAAoB,GAAG,IAA7B;;AAMO,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,OAOE;AAAA,MAJpCC,oBAIoC,QAJpCA,oBAIoC;AAAA,0BAHpCC,OAGoC;AAAA,MAHpCA,OAGoC,6BAH1B,EAG0B;AAAA,0BAFpCC,OAEoC;AAAA,MAFpCA,OAEoC,6BAF1BP,eAE0B;AAAA,uBADpCQ,IACoC;AAAA,MADpCA,IACoC,0BAD7B,EAC6B;;AACpC,wBAAmB,kCAAnB;AAAA,MAAQC,MAAR,mBAAQA,MAAR;;AACA,MAAMC,uBAAuB,GAAG,mBAAO,EAAP,CAAhC;;AACA,kBAAgC,qBAC9BA,uBAAuB,CAACC,OADM,CAAhC;AAAA;AAAA,MAAOC,QAAP;AAAA,MAAiBC,WAAjB;;AAGA,mBAAwD,qBAAkB,IAAlB,CAAxD;AAAA;AAAA,MAAOC,oBAAP;AAAA,MAA6BC,uBAA7B;;AACA,MAAMC,cAAc,GAAG,4DAAvB;;AAEA,mBAA0B,sBAA1B;AAAA;AAAA,MAAOC,KAAP;AAAA,MAAcC,QAAd;;AACA,mBAAsC,qBAAS,IAAT,CAAtC;AAAA;AAAA,MAAOC,WAAP;AAAA,MAAoBC,cAApB;;AACA,MAAMC,WAAW,GAAG,mBAAOC,IAAI,CAACC,GAAL,EAAP,CAApB;AACA,MAAMC,aAAa,GAAG,mBAAO,KAAP,CAAtB;;AACA,mBAA8C,qBAA2B,cAA3B,CAA9C;AAAA;AAAA,MAAOC,eAAP;AAAA,MAAwBC,kBAAxB;;AACA,MAAMC,YAAY,GAAG,uCAArB;AACA,MAAMC,UAAU,GAAG,mBAA8B,IAA9B,CAAnB;AACA,MAAMC,OAAO,GAAG,mBAA2B,IAA3B,CAAhB;AACA,MAAMC,eAAe,GAAG,mBAAe,CAAf,CAAxB;;AAEA,MAAMC,aAA4B;AAAA,gFAAG;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACnCC,cAAAA,SADmC,2DACZ,cADY;AAEnCC,cAAAA,UAFmC,2DAEtB,CAFsB;;AAAA,oBAI/B,CAACxB,MAAD,IAAW,CAACkB,YAAY,CAAChB,OAJM;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAM7BuB,cAAAA,cAN6B,GAOjCF,SAAS,KAAK,cAAd,IACAA,SAAS,KAAK,SADd,IAEA,CACEG,IAAI,CAACC,SAAL,CAAeR,UAAU,CAACjB,OAA1B,MAAuCwB,IAAI,CAACC,SAAL,CAAe9B,OAAf,CADzC,EAEE6B,IAAI,CAACC,SAAL,CAAeP,OAAO,CAAClB,OAAvB,MAAoCwB,IAAI,CAACC,SAAL,CAAe5B,IAAf,CAFtC,EAGE6B,IAHF,CAGOC,OAHP,CATiC;;AAc7BC,cAAAA,YAd6B,GAcd,SAAfA,YAAe;AAAA,uBAAM,CAACZ,YAAD,IAAiBG,eAAe,CAACnB,OAAhB,KAA4B6B,gBAAnD;AAAA,eAdc;;AAAA,kBAoB9BN,cApB8B;AAAA;AAAA;AAAA;;AAAA,oBAqB7BT,eAAe,KAAK,IArBS;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAwBnCG,cAAAA,UAAU,CAACjB,OAAX,GAAqBL,OAArB;AACAuB,cAAAA,OAAO,CAAClB,OAAR,GAAkBH,IAAlB;AACAgB,cAAAA,aAAa,CAACb,OAAd,GAAwB,IAAxB;AACAO,cAAAA,QAAQ,CAACuB,SAAD,CAAR;AACAX,cAAAA,eAAe,CAACnB,OAAhB;AACM6B,cAAAA,gBA7B6B,GA6BVV,eAAe,CAACnB,OA7BN;AA8BnCe,cAAAA,kBAAkB,CAACM,SAAD,CAAlB;AAEMU,cAAAA,UAhC6B;AAiCjCC,gBAAAA,KAAK,oBAAEpC,OAAF,oBAAEA,OAAO,CAAEoC,KAAX,6BAAoBC,+BAjCQ;AAkCjCC,gBAAAA,MAAM,EAAEb,SAAS,KAAK,cAAd,IAAgC,CAAClB,oBAAjC,GAAwDF,QAAQ,CAACkC,MAAjE,GAA0E;AAlCjD,iBAmC9BvC,OAnC8B;AAAA;AAAA;AAAA,qBAuCEE,MAAM,CAACsB,aAAP,CAAqBzB,OAArB,EAA8BE,IAA9B,EAAoCkC,UAApC,EAAgD;AACjFK,gBAAAA,kBAAkB,EAAE/B,cAAc,CAACL;AAD8C,eAAhD,CAvCF;;AAAA;AAuC3BqC,cAAAA,oBAvC2B;;AAAA,oBA2C7BT,YAAY,MAAM,CAACZ,YAAY,CAAChB,OA3CH;AAAA;AAAA;AAAA;;AAAA;;AAAA;AA8C3BsC,cAAAA,WA9C2B,GA+C/BjB,SAAS,KAAK,cAAd,IAAgC,CAAClB,oBAAjC,iDACQF,QADR,uCACqBoC,oBADrB,KAEIA,oBAjD2B;AAmDjCnC,cAAAA,WAAW,CAACoC,WAAD,CAAX;AACAlC,cAAAA,uBAAuB,CAAC,KAAD,CAAvB;AACAK,cAAAA,cAAc,CAAC4B,oBAAoB,CAACF,MAArB,IAA+BJ,UAAU,CAACC,KAA3C,CAAd;AACAzB,cAAAA,QAAQ,CAACuB,SAAD,CAAR;AACAjB,cAAAA,aAAa,CAACb,OAAd,GAAwB,KAAxB;AAvDiC;AAAA;;AAAA;AAAA;AAAA;AAyDjCa,cAAAA,aAAa,CAACb,OAAd,GAAwB,KAAxB;AAzDiC;AAAA,qBA0D3BjB,WAAW,CAAC,CAAD,CA1DgB;;AAAA;AAAA,mBA4D7B6C,YAAY,EA5DiB;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,oBAkE7BN,UAAU,KAAK/B,qBAAf,IAAwC,CAACsB,aAAa,CAACb,OAlE1B;AAAA;AAAA;AAAA;;AAmE/Be,cAAAA,kBAAkB,CAAC,IAAD,CAAlB;AACAwB,cAAAA,OAAO,CAACC,IAAR;AAEAjC,cAAAA,QAAQ,CACN,IAAIkC,KAAJ,6FADM,CAAR;AAtE+B;;AAAA;AAAA,+CA8E1BrB,aAAa,CAACC,SAAD,EAAYC,UAAU,GAAG,CAAzB,CA9Ea;;AAAA;AAiFnCP,cAAAA,kBAAkB,CAAC,IAAD,CAAlB;;AAjFmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAH;;AAAA,oBAA5BK,aAA4B;AAAA;AAAA;AAAA,KAAlC;;AAoFA,MAAMsB,YAAY,GAAGlC,WAAW,GAAGY,aAAH,GAAmBU,SAAnD;;AAEA,MAAMa,WAAW,GAAG,SAAdA,WAAc,GAAM;AACxB,QAAM/B,GAAG,GAAGD,IAAI,CAACC,GAAL,EAAZ;;AAEA,QAAIA,GAAG,GAAGF,WAAW,CAACV,OAAlB,GAA4BR,oBAA5B,IAAoDc,KAAK,KAAKwB,SAAlE,EAA6E;AAC3E;AACD;;AAEDpB,IAAAA,WAAW,CAACV,OAAZ,GAAsBW,IAAI,CAACC,GAAL,EAAtB;AACA,WAAOQ,aAAa,CAAC,SAAD,CAApB;AACD,GATD;;AAWA,MAAMwB,UAAU,GAAG,SAAbA,UAAa;AAAA,WAAMxB,aAAa,CAAC,QAAD,CAAnB;AAAA,GAAnB;;AAiBA,MAAMyB,SAAS,GAAG,oBAAQ;AAAA,WAAMrB,IAAI,CAACC,SAAL,CAAe9B,OAAf,CAAN;AAAA,GAAR,EAAuC,CAACA,OAAD,CAAvC,CAAlB;AACA,MAAMmD,OAAO,GAAG,oBAAQ;AAAA,WAAMtB,IAAI,CAACC,SAAL,CAAe5B,IAAf,CAAN;AAAA,GAAR,EAAoC,CAACA,IAAD,CAApC,CAAhB;AAEA,wBAAU,YAAM;AACd,QAAMkD,YAAY,GAAG,SAAfA,YAAe,GAAM;AAAA;;AACzB,UAAI,EAACjD,MAAD,4BAACA,MAAM,CAAEkD,IAAT,aAAC,aAAcC,EAAf,CAAJ,EAAuB;;AACvB,UAAIvD,oBAAJ,EAA0B;AACxB,YAAI;AACF,cAAMwD,cAAc,GAAG,wDAAyB;AAC9CC,YAAAA,aAAa,EAAErD,MAAM,CAACkD,IAAP,CAAYC,EADmB;AAE9CtD,YAAAA,OAAO,EAAPA,OAF8C;AAG9CE,YAAAA,IAAI,EAAJA;AAH8C,WAAzB,CAAvB;;AAMA,cAAIqD,cAAJ,EAAoB;AAClBhD,YAAAA,WAAW,CACTJ,MAAM,CAACsD,qBAAP,CAA6BF,cAA7B,EAA6C;AAC3CG,cAAAA,WAAW,EAAE;AAD8B,aAA7C,CADS,CAAX;AAKD;AACF,SAdD,CAcE,OAAOC,CAAP,EAAU;AACVf,UAAAA,OAAO,CAACC,IAAR,CAAa,wCAAb,EAAuDc,CAAvD;AACD;AACF;;AAEDV,MAAAA,UAAU;AACX,KAvBD;;AAyBAG,IAAAA,YAAY;AACb,GA3BD,EA2BG,CAACF,SAAD,EAAYC,OAAZ,CA3BH;AA6BA,SAAO;AACL7C,IAAAA,QAAQ,EAARA,QADK;AAELK,IAAAA,KAAK,EAALA,KAFK;AAGLE,IAAAA,WAAW,EAAXA,WAHK;AAIL+C,IAAAA,eAAe,EACbzC,eAAe,KAAK,cAApB,GACI,IADJ,GAEIA,eAAe,KAAK,QAApB,IAAgCb,QAAQ,KAAKF,uBAAuB,CAACC,OAPtE;AAQLwD,IAAAA,eAAe,EAAE1C,eAAe,KAAK,cARhC;AASL4B,IAAAA,YAAY,EAAZA,YATK;AAULe,IAAAA,UAAU,EAAE3C,eAAe,KAAK,SAV3B;AAWL6B,IAAAA,WAAW,EAAXA,WAXK;AAYLC,IAAAA,UAAU,EAAVA,UAZK;AAaL1C,IAAAA,WAAW,EAAXA,WAbK;AAcLC,IAAAA,oBAAoB,EAApBA;AAdK,GAAP;AAgBD,CA5LM","sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const initialChannelsStateRef = useRef([]);\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[]>(\n initialChannelsStateRef.current,\n );\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(true);\n const activeChannels = useActiveChannelsRefContext();\n\n const [error, setError] = useState<Error>();\n const [hasNextPage, setHasNextPage] = useState(true);\n const lastRefresh = useRef(Date.now());\n const isQueryingRef = useRef(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const isMountedRef = useIsMountedRef();\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset: queryType === 'loadChannels' && !staticChannelsActive ? channels.length : 0,\n ...options,\n };\n\n try {\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: activeChannels.current,\n });\n\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse;\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n setError(undefined);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const loadNextPage = hasNextPage ? queryChannels : undefined;\n\n const refreshList = () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n return queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadChannels = () => {\n if (!client?.user?.id) return;\n if (enableOfflineSupport) {\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n setChannels(\n client.hydrateActiveChannels(channelsFromDB, {\n staticState: true,\n }),\n );\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n }\n\n reloadList();\n };\n\n loadChannels();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : activeQueryType === 'reload' && channels === initialChannelsStateRef.current,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n setChannels,\n staticChannelsActive,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["usePaginatedChannels.ts"],"names":["waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","enableOfflineSupport","filters","options","sort","client","initialChannelsStateRef","current","channels","setChannels","staticChannelsActive","setStaticChannelsActive","activeChannels","error","setError","hasNextPage","setHasNextPage","lastRefresh","Date","now","isQueryingRef","activeQueryType","setActiveQueryType","isMountedRef","filtersRef","sortRef","activeRequestId","queryChannels","queryType","retryCount","hasUpdatedData","JSON","stringify","some","Boolean","isQueryStale","currentRequestId","undefined","newOptions","limit","MAX_QUERY_CHANNELS_LIMIT","offset","length","skipInitialization","channelQueryResponse","newChannels","console","warn","Error","loadNextPage","refreshList","reloadList","filterStr","sortStr","loadChannels","user","id","channelsFromDB","currentUserId","hydrateActiveChannels","offlineMode","e","loadingChannels","loadingNextPage","refreshing"],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const initialChannelsStateRef = useRef([]);\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[]>(\n initialChannelsStateRef.current,\n );\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(true);\n const activeChannels = useActiveChannelsRefContext();\n\n const [error, setError] = useState<Error>();\n const [hasNextPage, setHasNextPage] = useState(true);\n const lastRefresh = useRef(Date.now());\n const isQueryingRef = useRef(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const isMountedRef = useIsMountedRef();\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset: queryType === 'loadChannels' && !staticChannelsActive ? channels.length : 0,\n ...options,\n };\n\n try {\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: activeChannels.current,\n });\n\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse;\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n setError(undefined);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const loadNextPage = hasNextPage ? queryChannels : undefined;\n\n const refreshList = () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n return queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadChannels = () => {\n if (!client?.user?.id) return;\n if (enableOfflineSupport) {\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n setChannels(\n client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n }),\n );\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n }\n\n reloadList();\n };\n\n loadChannels();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : activeQueryType === 'reload' && channels === initialChannelsStateRef.current,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n setChannels,\n staticChannelsActive,\n };\n};\n"]}
|
|
@@ -75,11 +75,15 @@ var ChannelPreviewWithContext = function ChannelPreviewWithContext(props) {
|
|
|
75
75
|
};
|
|
76
76
|
|
|
77
77
|
var handleUpdatedOrDeletedMessage = function handleUpdatedOrDeletedMessage(event) {
|
|
78
|
-
|
|
78
|
+
setLastMessage(function (prevLastMessage) {
|
|
79
|
+
var _event$message;
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
if ((prevLastMessage == null ? void 0 : prevLastMessage.id) === ((_event$message = event.message) == null ? void 0 : _event$message.id)) {
|
|
82
|
+
return event.message;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return prevLastMessage;
|
|
86
|
+
});
|
|
83
87
|
};
|
|
84
88
|
|
|
85
89
|
var listeners = [channel.on('message.new', handleNewMessageEvent), channel.on('message.updated', handleUpdatedOrDeletedMessage), channel.on('message.deleted', handleUpdatedOrDeletedMessage)];
|
|
@@ -114,7 +118,7 @@ var ChannelPreviewWithContext = function ChannelPreviewWithContext(props) {
|
|
|
114
118
|
__self: _this,
|
|
115
119
|
__source: {
|
|
116
120
|
fileName: _jsxFileName,
|
|
117
|
-
lineNumber:
|
|
121
|
+
lineNumber: 111,
|
|
118
122
|
columnNumber: 10
|
|
119
123
|
}
|
|
120
124
|
});
|
|
@@ -134,7 +138,7 @@ var ChannelPreview = function ChannelPreview(props) {
|
|
|
134
138
|
__self: _this,
|
|
135
139
|
__source: {
|
|
136
140
|
fileName: _jsxFileName,
|
|
137
|
-
lineNumber:
|
|
141
|
+
lineNumber: 127,
|
|
138
142
|
columnNumber: 10
|
|
139
143
|
}
|
|
140
144
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ChannelPreview.tsx"],"names":["ChannelPreviewWithContext","props","channel","client","Preview","state","messages","length","lastMessage","setLastMessage","translatedLastMessage","forceUpdate","setForceUpdate","countUnread","unread","setUnread","latestMessagePreview","channelLastMessage","channelLastMessageString","id","updated_at","newUnreadCount","handleNewMessageEvent","event","message","parent_id","show_in_channel","handleUpdatedOrDeletedMessage","listeners","on","forEach","l","unsubscribe","handleReadEvent","user","userID","prev","listener","ChannelPreview"],"mappings":";;;;;;;;;;;;;AAAA;;AAIA;;AAEA;;AAIA;;AAEA;;;;;;;;;AAiBA,IAAMA,yBAAyB,GAAG,SAA5BA,yBAA4B,CAGhCC,KAHgC,EAI7B;AACH,MAAQC,OAAR,GAAqCD,KAArC,CAAQC,OAAR;AAAA,MAAiBC,MAAjB,GAAqCF,KAArC,CAAiBE,MAAjB;AAAA,MAAyBC,OAAzB,GAAqCH,KAArC,CAAyBG,OAAzB;;AAEA,kBAAsC,qBAIpCF,OAAO,CAACG,KAAR,CAAcC,QAAd,CAAuBJ,OAAO,CAACG,KAAR,CAAcC,QAAd,CAAuBC,MAAvB,GAAgC,CAAvD,CAJoC,CAAtC;AAAA;AAAA,MAAOC,WAAP;AAAA,MAAoBC,cAApB;;AAMA,MAAMC,qBAAqB,GAAG,gDAC5BF,WAAW,IAAK,EADY,CAA9B;;AAIA,mBAAsC,qBAAS,CAAT,CAAtC;AAAA;AAAA,MAAOG,WAAP;AAAA,MAAoBC,cAApB;;AACA,mBAA4B,qBAASV,OAAO,CAACW,WAAR,EAAT,CAA5B;AAAA;AAAA,MAAOC,MAAP;AAAA,MAAeC,SAAf;;AAEA,MAAMC,oBAAoB,GAAG,sDAAwBd,OAAxB,EAAiCS,WAAjC,EAA8CD,qBAA9C,CAA7B;AAEA,MAAMO,kBAAkB,GAAGf,OAAO,CAACM,WAAR,EAA3B;AACA,MAAMU,wBAAwB,SAAMD,kBAAN,oBAAMA,kBAAkB,CAAEE,EAA1B,KAA+BF,kBAA/B,oBAA+BA,kBAAkB,CAAEG,UAAnD,CAA9B;AAEA,wBAAU,YAAM;AACd,QACEH,kBAAkB,KACjBA,kBAAkB,CAACE,EAAnB,MAA0BX,WAA1B,oBAA0BA,WAAW,CAAEW,EAAvC,KACCF,kBAAkB,CAACG,UAAnB,MAAkCZ,WAAlC,oBAAkCA,WAAW,CAAEY,UAA/C,CAFgB,CADpB,EAIE;AACAX,MAAAA,cAAc,CAACQ,kBAAD,CAAd;AACD;;AAED,QAAMI,cAAc,GAAGnB,OAAO,CAACW,WAAR,EAAvB;;AAEA,QAAIQ,cAAc,KAAKP,MAAvB,EAA+B;AAC7BC,MAAAA,SAAS,CAACM,cAAD,CAAT;AACD;AACF,GAdD,EAcG,CAACH,wBAAD,CAdH;AAgBA,wBAAU,YAAM;AACd,QAAMI,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACC,KAAD,EAAsC;AAClE,UAAMC,OAAO,GAAGD,KAAK,CAACC,OAAtB;;AACA,UAAIA,OAAO,KAAK,CAACA,OAAO,CAACC,SAAT,IAAsBD,OAAO,CAACE,eAAnC,CAAX,EAAgE;AAC9DjB,QAAAA,cAAc,CAACc,KAAK,CAACC,OAAP,CAAd;AACAT,QAAAA,SAAS,CAACb,OAAO,CAACW,WAAR,EAAD,CAAT;AACD;AACF,KAND;;AAQA,QAAMc,6BAA6B,GAAG,SAAhCA,6BAAgC,CAACJ,KAAD,EAAsC;AAAA;;
|
|
1
|
+
{"version":3,"sources":["ChannelPreview.tsx"],"names":["ChannelPreviewWithContext","props","channel","client","Preview","state","messages","length","lastMessage","setLastMessage","translatedLastMessage","forceUpdate","setForceUpdate","countUnread","unread","setUnread","latestMessagePreview","channelLastMessage","channelLastMessageString","id","updated_at","newUnreadCount","handleNewMessageEvent","event","message","parent_id","show_in_channel","handleUpdatedOrDeletedMessage","prevLastMessage","listeners","on","forEach","l","unsubscribe","handleReadEvent","user","userID","prev","listener","ChannelPreview"],"mappings":";;;;;;;;;;;;;AAAA;;AAIA;;AAEA;;AAIA;;AAEA;;;;;;;;;AAiBA,IAAMA,yBAAyB,GAAG,SAA5BA,yBAA4B,CAGhCC,KAHgC,EAI7B;AACH,MAAQC,OAAR,GAAqCD,KAArC,CAAQC,OAAR;AAAA,MAAiBC,MAAjB,GAAqCF,KAArC,CAAiBE,MAAjB;AAAA,MAAyBC,OAAzB,GAAqCH,KAArC,CAAyBG,OAAzB;;AAEA,kBAAsC,qBAIpCF,OAAO,CAACG,KAAR,CAAcC,QAAd,CAAuBJ,OAAO,CAACG,KAAR,CAAcC,QAAd,CAAuBC,MAAvB,GAAgC,CAAvD,CAJoC,CAAtC;AAAA;AAAA,MAAOC,WAAP;AAAA,MAAoBC,cAApB;;AAMA,MAAMC,qBAAqB,GAAG,gDAC5BF,WAAW,IAAK,EADY,CAA9B;;AAIA,mBAAsC,qBAAS,CAAT,CAAtC;AAAA;AAAA,MAAOG,WAAP;AAAA,MAAoBC,cAApB;;AACA,mBAA4B,qBAASV,OAAO,CAACW,WAAR,EAAT,CAA5B;AAAA;AAAA,MAAOC,MAAP;AAAA,MAAeC,SAAf;;AAEA,MAAMC,oBAAoB,GAAG,sDAAwBd,OAAxB,EAAiCS,WAAjC,EAA8CD,qBAA9C,CAA7B;AAEA,MAAMO,kBAAkB,GAAGf,OAAO,CAACM,WAAR,EAA3B;AACA,MAAMU,wBAAwB,SAAMD,kBAAN,oBAAMA,kBAAkB,CAAEE,EAA1B,KAA+BF,kBAA/B,oBAA+BA,kBAAkB,CAAEG,UAAnD,CAA9B;AAEA,wBAAU,YAAM;AACd,QACEH,kBAAkB,KACjBA,kBAAkB,CAACE,EAAnB,MAA0BX,WAA1B,oBAA0BA,WAAW,CAAEW,EAAvC,KACCF,kBAAkB,CAACG,UAAnB,MAAkCZ,WAAlC,oBAAkCA,WAAW,CAAEY,UAA/C,CAFgB,CADpB,EAIE;AACAX,MAAAA,cAAc,CAACQ,kBAAD,CAAd;AACD;;AAED,QAAMI,cAAc,GAAGnB,OAAO,CAACW,WAAR,EAAvB;;AAEA,QAAIQ,cAAc,KAAKP,MAAvB,EAA+B;AAC7BC,MAAAA,SAAS,CAACM,cAAD,CAAT;AACD;AACF,GAdD,EAcG,CAACH,wBAAD,CAdH;AAgBA,wBAAU,YAAM;AACd,QAAMI,qBAAqB,GAAG,SAAxBA,qBAAwB,CAACC,KAAD,EAAsC;AAClE,UAAMC,OAAO,GAAGD,KAAK,CAACC,OAAtB;;AACA,UAAIA,OAAO,KAAK,CAACA,OAAO,CAACC,SAAT,IAAsBD,OAAO,CAACE,eAAnC,CAAX,EAAgE;AAC9DjB,QAAAA,cAAc,CAACc,KAAK,CAACC,OAAP,CAAd;AACAT,QAAAA,SAAS,CAACb,OAAO,CAACW,WAAR,EAAD,CAAT;AACD;AACF,KAND;;AAQA,QAAMc,6BAA6B,GAAG,SAAhCA,6BAAgC,CAACJ,KAAD,EAAsC;AAC1Ed,MAAAA,cAAc,CAAC,UAACmB,eAAD,EAAqB;AAAA;;AAClC,YAAI,CAAAA,eAAe,QAAf,YAAAA,eAAe,CAAET,EAAjB,yBAAwBI,KAAK,CAACC,OAA9B,qBAAwB,eAAeL,EAAvC,CAAJ,EAA+C;AAC7C,iBAAOI,KAAK,CAACC,OAAb;AACD;;AACD,eAAOI,eAAP;AACD,OALa,CAAd;AAMD,KAPD;;AASA,QAAMC,SAAS,GAAG,CAChB3B,OAAO,CAAC4B,EAAR,CAAW,aAAX,EAA0BR,qBAA1B,CADgB,EAEhBpB,OAAO,CAAC4B,EAAR,CAAW,iBAAX,EAA8BH,6BAA9B,CAFgB,EAGhBzB,OAAO,CAAC4B,EAAR,CAAW,iBAAX,EAA8BH,6BAA9B,CAHgB,CAAlB;AAMA,WAAO;AAAA,aAAME,SAAS,CAACE,OAAV,CAAkB,UAACC,CAAD;AAAA,eAAOA,CAAC,CAACC,WAAF,EAAP;AAAA,OAAlB,CAAN;AAAA,KAAP;AACD,GAzBD,EAyBG,EAzBH;AA2BA,wBAAU,YAAM;AACd,QAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAACX,KAAD,EAAsC;AAAA;;AAC5D,UAAI,gBAAAA,KAAK,CAACY,IAAN,iCAAYhB,EAAZ,MAAmBhB,MAAM,CAACiC,MAA9B,EAAsC;AACpCrB,QAAAA,SAAS,CAAC,CAAD,CAAT;AACD,OAFD,MAEO,oBAAIQ,KAAK,CAACY,IAAV,aAAI,aAAYhB,EAAhB,EAAoB;AACzBP,QAAAA,cAAc,CAAC,UAACyB,IAAD;AAAA,iBAAUA,IAAI,GAAG,CAAjB;AAAA,SAAD,CAAd;AACD;AACF,KAND;;AAQA,QAAMC,QAAQ,GAAGpC,OAAO,CAAC4B,EAAR,CAAW,cAAX,EAA2BI,eAA3B,CAAjB;AACA,WAAO;AAAA,aAAMI,QAAQ,CAACL,WAAT,EAAN;AAAA,KAAP;AACD,GAXD,EAWG,EAXH;AAaA,SAAO,gCAAC,OAAD;AAAS,IAAA,OAAO,EAAE/B,OAAlB;AAA2B,IAAA,oBAAoB,EAAEc,oBAAjD;AAAuE,IAAA,MAAM,EAAEF,MAA/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAP;AACD,CAlFD;;AAyFO,IAAMyB,cAAc,GAAG,SAAjBA,cAAiB,CAG5BtC,KAH4B,EAIzB;AACH,wBAAmB,kCAAnB;AAAA,MAAQE,MAAR,mBAAQA,MAAR;;AACA,4BAAoB,0CAApB;AAAA,MAAQC,OAAR,uBAAQA,OAAR;;AAEA,SAAO,gCAAC,yBAAD;AAAiCD,IAAAA,MAAM,EAANA,MAAjC;AAAyCC,IAAAA,OAAO,EAAPA;AAAzC,KAAwDH,KAAxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAP;AACD,CATM","sourcesContent":["import React, { useEffect, useState } from 'react';\n\nimport type { Channel, ChannelState, Event, MessageResponse } from 'stream-chat';\n\nimport { useLatestMessagePreview } from './hooks/useLatestMessagePreview';\n\nimport {\n ChannelsContextValue,\n useChannelsContext,\n} from '../../contexts/channelsContext/ChannelsContext';\nimport { ChatContextValue, useChatContext } from '../../contexts/chatContext/ChatContext';\n\nimport { useTranslatedMessage } from '../../hooks/useTranslatedMessage';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\n\nexport type ChannelPreviewPropsWithContext<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Pick<ChatContextValue<StreamChatGenerics>, 'client'> &\n Pick<ChannelsContextValue<StreamChatGenerics>, 'Preview'> & {\n /**\n * The previewed channel\n */\n channel: Channel<StreamChatGenerics>;\n };\n\n/**\n * This component manages state for the ChannelPreviewMessenger UI component and receives\n * all props from the ChannelListMessenger component.\n */\nconst ChannelPreviewWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelPreviewPropsWithContext<StreamChatGenerics>,\n) => {\n const { channel, client, Preview } = props;\n\n const [lastMessage, setLastMessage] = useState<\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>\n | undefined\n >(channel.state.messages[channel.state.messages.length - 1]);\n\n const translatedLastMessage = useTranslatedMessage<StreamChatGenerics>(\n lastMessage || ({} as MessageResponse<StreamChatGenerics>),\n );\n\n const [forceUpdate, setForceUpdate] = useState(0);\n const [unread, setUnread] = useState(channel.countUnread());\n\n const latestMessagePreview = useLatestMessagePreview(channel, forceUpdate, translatedLastMessage);\n\n const channelLastMessage = channel.lastMessage();\n const channelLastMessageString = `${channelLastMessage?.id}${channelLastMessage?.updated_at}`;\n\n useEffect(() => {\n if (\n channelLastMessage &&\n (channelLastMessage.id !== lastMessage?.id ||\n channelLastMessage.updated_at !== lastMessage?.updated_at)\n ) {\n setLastMessage(channelLastMessage);\n }\n\n const newUnreadCount = channel.countUnread();\n\n if (newUnreadCount !== unread) {\n setUnread(newUnreadCount);\n }\n }, [channelLastMessageString]);\n\n useEffect(() => {\n const handleNewMessageEvent = (event: Event<StreamChatGenerics>) => {\n const message = event.message;\n if (message && (!message.parent_id || message.show_in_channel)) {\n setLastMessage(event.message);\n setUnread(channel.countUnread());\n }\n };\n\n const handleUpdatedOrDeletedMessage = (event: Event<StreamChatGenerics>) => {\n setLastMessage((prevLastMessage) => {\n if (prevLastMessage?.id === event.message?.id) {\n return event.message;\n }\n return prevLastMessage;\n });\n };\n\n const listeners = [\n channel.on('message.new', handleNewMessageEvent),\n channel.on('message.updated', handleUpdatedOrDeletedMessage),\n channel.on('message.deleted', handleUpdatedOrDeletedMessage),\n ];\n\n return () => listeners.forEach((l) => l.unsubscribe());\n }, []);\n\n useEffect(() => {\n const handleReadEvent = (event: Event<StreamChatGenerics>) => {\n if (event.user?.id === client.userID) {\n setUnread(0);\n } else if (event.user?.id) {\n setForceUpdate((prev) => prev + 1);\n }\n };\n\n const listener = channel.on('message.read', handleReadEvent);\n return () => listener.unsubscribe();\n }, []);\n\n return <Preview channel={channel} latestMessagePreview={latestMessagePreview} unread={unread} />;\n};\n\nexport type ChannelPreviewProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<Omit<ChannelPreviewPropsWithContext<StreamChatGenerics>, 'channel'>> &\n Pick<ChannelPreviewPropsWithContext<StreamChatGenerics>, 'channel'>;\n\nexport const ChannelPreview = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelPreviewProps<StreamChatGenerics>,\n) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const { Preview } = useChannelsContext<StreamChatGenerics>();\n\n return <ChannelPreviewWithContext {...{ client, Preview }} {...props} />;\n};\n"]}
|
|
@@ -53,6 +53,8 @@ var _getUrlOfImageAttachment = require("../../utils/getUrlOfImageAttachment");
|
|
|
53
53
|
|
|
54
54
|
var _utils = require("../../utils/utils");
|
|
55
55
|
|
|
56
|
+
var _getGiphyMimeType = require("../Attachment/utils/getGiphyMimeType");
|
|
57
|
+
|
|
56
58
|
var _this = this,
|
|
57
59
|
_jsxFileName = "/Users/vishalnarkhede/projects/stream-chat-react-native/package/src/components/ImageGallery/ImageGallery.tsx";
|
|
58
60
|
|
|
@@ -208,7 +210,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
208
210
|
created_at: cur.created_at,
|
|
209
211
|
id: "photoId-" + cur.id + "-" + imageUrl,
|
|
210
212
|
messageId: cur.id,
|
|
211
|
-
mime_type: a.type === 'giphy' ? '
|
|
213
|
+
mime_type: a.type === 'giphy' ? (0, _getGiphyMimeType.getGiphyMimeType)(giphyURL != null ? giphyURL : '') : a.mime_type,
|
|
212
214
|
original_height: a.original_height,
|
|
213
215
|
original_width: a.original_width,
|
|
214
216
|
type: a.type,
|
|
@@ -388,7 +390,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
388
390
|
__self: _this,
|
|
389
391
|
__source: {
|
|
390
392
|
fileName: _jsxFileName,
|
|
391
|
-
lineNumber:
|
|
393
|
+
lineNumber: 517,
|
|
392
394
|
columnNumber: 5
|
|
393
395
|
}
|
|
394
396
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -396,7 +398,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
396
398
|
__self: _this,
|
|
397
399
|
__source: {
|
|
398
400
|
fileName: _jsxFileName,
|
|
399
|
-
lineNumber:
|
|
401
|
+
lineNumber: 522,
|
|
400
402
|
columnNumber: 7
|
|
401
403
|
}
|
|
402
404
|
}), _react["default"].createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
@@ -408,7 +410,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
408
410
|
__self: _this,
|
|
409
411
|
__source: {
|
|
410
412
|
fileName: _jsxFileName,
|
|
411
|
-
lineNumber:
|
|
413
|
+
lineNumber: 523,
|
|
412
414
|
columnNumber: 7
|
|
413
415
|
}
|
|
414
416
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -416,7 +418,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
416
418
|
__self: _this,
|
|
417
419
|
__source: {
|
|
418
420
|
fileName: _jsxFileName,
|
|
419
|
-
lineNumber:
|
|
421
|
+
lineNumber: 530,
|
|
420
422
|
columnNumber: 9
|
|
421
423
|
}
|
|
422
424
|
}, _react["default"].createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
@@ -430,7 +432,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
430
432
|
__self: _this,
|
|
431
433
|
__source: {
|
|
432
434
|
fileName: _jsxFileName,
|
|
433
|
-
lineNumber:
|
|
435
|
+
lineNumber: 531,
|
|
434
436
|
columnNumber: 11
|
|
435
437
|
}
|
|
436
438
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -438,7 +440,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
438
440
|
__self: _this,
|
|
439
441
|
__source: {
|
|
440
442
|
fileName: _jsxFileName,
|
|
441
|
-
lineNumber:
|
|
443
|
+
lineNumber: 540,
|
|
442
444
|
columnNumber: 13
|
|
443
445
|
}
|
|
444
446
|
}, _react["default"].createElement(_reactNativeGestureHandler.PinchGestureHandler, {
|
|
@@ -448,7 +450,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
448
450
|
__self: _this,
|
|
449
451
|
__source: {
|
|
450
452
|
fileName: _jsxFileName,
|
|
451
|
-
lineNumber:
|
|
453
|
+
lineNumber: 541,
|
|
452
454
|
columnNumber: 15
|
|
453
455
|
}
|
|
454
456
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -456,7 +458,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
456
458
|
__self: _this,
|
|
457
459
|
__source: {
|
|
458
460
|
fileName: _jsxFileName,
|
|
459
|
-
lineNumber:
|
|
461
|
+
lineNumber: 546,
|
|
460
462
|
columnNumber: 17
|
|
461
463
|
}
|
|
462
464
|
}, _react["default"].createElement(_reactNativeGestureHandler.PanGestureHandler, {
|
|
@@ -469,7 +471,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
469
471
|
__self: _this,
|
|
470
472
|
__source: {
|
|
471
473
|
fileName: _jsxFileName,
|
|
472
|
-
lineNumber:
|
|
474
|
+
lineNumber: 547,
|
|
473
475
|
columnNumber: 19
|
|
474
476
|
}
|
|
475
477
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -477,7 +479,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
477
479
|
__self: _this,
|
|
478
480
|
__source: {
|
|
479
481
|
fileName: _jsxFileName,
|
|
480
|
-
lineNumber:
|
|
482
|
+
lineNumber: 555,
|
|
481
483
|
columnNumber: 21
|
|
482
484
|
}
|
|
483
485
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -491,7 +493,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
491
493
|
__self: _this,
|
|
492
494
|
__source: {
|
|
493
495
|
fileName: _jsxFileName,
|
|
494
|
-
lineNumber:
|
|
496
|
+
lineNumber: 556,
|
|
495
497
|
columnNumber: 23
|
|
496
498
|
}
|
|
497
499
|
}, photos.map(function (photo, i) {
|
|
@@ -522,7 +524,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
522
524
|
__self: _this,
|
|
523
525
|
__source: {
|
|
524
526
|
fileName: _jsxFileName,
|
|
525
|
-
lineNumber:
|
|
527
|
+
lineNumber: 573,
|
|
526
528
|
columnNumber: 29
|
|
527
529
|
}
|
|
528
530
|
}) : _react["default"].createElement(_AnimatedGalleryImage.AnimatedGalleryImage, {
|
|
@@ -546,7 +548,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
546
548
|
__self: _this,
|
|
547
549
|
__source: {
|
|
548
550
|
fileName: _jsxFileName,
|
|
549
|
-
lineNumber:
|
|
551
|
+
lineNumber: 600,
|
|
550
552
|
columnNumber: 29
|
|
551
553
|
}
|
|
552
554
|
});
|
|
@@ -558,7 +560,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
558
560
|
__self: _this,
|
|
559
561
|
__source: {
|
|
560
562
|
fileName: _jsxFileName,
|
|
561
|
-
lineNumber:
|
|
563
|
+
lineNumber: 633,
|
|
562
564
|
columnNumber: 7
|
|
563
565
|
}
|
|
564
566
|
})), _react["default"].createElement(_ImageGalleryFooter.ImageGalleryFooter, (0, _extends2["default"])({
|
|
@@ -578,7 +580,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
578
580
|
__self: _this,
|
|
579
581
|
__source: {
|
|
580
582
|
fileName: _jsxFileName,
|
|
581
|
-
lineNumber:
|
|
583
|
+
lineNumber: 639,
|
|
582
584
|
columnNumber: 7
|
|
583
585
|
}
|
|
584
586
|
})), _react["default"].createElement(_ImageGalleryOverlay.ImageGalleryOverlay, {
|
|
@@ -588,14 +590,14 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
588
590
|
__self: _this,
|
|
589
591
|
__source: {
|
|
590
592
|
fileName: _jsxFileName,
|
|
591
|
-
lineNumber:
|
|
593
|
+
lineNumber: 655,
|
|
592
594
|
columnNumber: 7
|
|
593
595
|
}
|
|
594
596
|
}), _react["default"].createElement(_bottomSheet.BottomSheetModalProvider, {
|
|
595
597
|
__self: _this,
|
|
596
598
|
__source: {
|
|
597
599
|
fileName: _jsxFileName,
|
|
598
|
-
lineNumber:
|
|
600
|
+
lineNumber: 660,
|
|
599
601
|
columnNumber: 7
|
|
600
602
|
}
|
|
601
603
|
}, _react["default"].createElement(_bottomSheet.BottomSheetModal, {
|
|
@@ -608,7 +610,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
608
610
|
__self: _this,
|
|
609
611
|
__source: {
|
|
610
612
|
fileName: _jsxFileName,
|
|
611
|
-
lineNumber:
|
|
613
|
+
lineNumber: 665,
|
|
612
614
|
columnNumber: 13
|
|
613
615
|
}
|
|
614
616
|
}));
|
|
@@ -623,7 +625,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
623
625
|
__self: _this,
|
|
624
626
|
__source: {
|
|
625
627
|
fileName: _jsxFileName,
|
|
626
|
-
lineNumber:
|
|
628
|
+
lineNumber: 661,
|
|
627
629
|
columnNumber: 9
|
|
628
630
|
}
|
|
629
631
|
}, _react["default"].createElement(_ImageGrid.ImageGrid, (0, _extends2["default"])({
|
|
@@ -635,7 +637,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
635
637
|
__self: _this,
|
|
636
638
|
__source: {
|
|
637
639
|
fileName: _jsxFileName,
|
|
638
|
-
lineNumber:
|
|
640
|
+
lineNumber: 676,
|
|
639
641
|
columnNumber: 11
|
|
640
642
|
}
|
|
641
643
|
})))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ImageGallery.tsx"],"names":["isAndroid","Platform","OS","fullScreenHeight","Dimensions","get","height","measuredScreenHeight","screenWidth","halfScreenWidth","MARGIN","HasPinched","IsSwiping","ImageGallery","props","giphyVersion","imageGalleryCustomComponents","imageGalleryGridHandleHeight","imageGalleryGridSnapPoints","numberOfImageGalleryGridColumns","overlayOpacity","paused","setPaused","progress","setProgress","duration","setDuration","theme","white_snow","colors","imageGallery","backgroundColor","pager","slide","gridPhotos","setGridPhotos","overlay","translucentStatusBar","messages","selectedMessage","setSelectedMessage","statusBarHeight","StatusBar","currentHeight","bottomBarHeight","androidScreenHeightAdjustment","screenHeight","halfScreenHeight","quarterScreenHeight","snapPoints","React","useMemo","bottomSheetModalRef","currentBottomSheetIndex","setCurrentBottomSheetIndex","animatedBottomSheetIndex","screenTranslateY","showScreen","value","easing","Easing","out","ease","Keyboard","dismiss","currentImageHeight","setCurrentImageHeight","selectedIndex","setSelectedIndex","index","headerFooterVisible","doubleTapRef","panRef","pinchRef","singleTapRef","translateX","translateY","offsetScale","scale","translationX","photos","reduce","acc","cur","attachmentImages","attachments","filter","attachment","type","giphy","url","thumb_url","image_url","title_link","og_scrape_url","reverse","attachmentPhotos","map","a","imageUrl","giphyURL","channelId","cid","created_at","id","messageId","mime_type","original_height","original_width","uri","width","user","user_id","photoLength","length","stripQueryFromUrl","split","updatePosition","newIndex","findIndex","photo","uriForCurrentImage","imageHeight","Math","floor","Image","getSize","onDoubleTap","onPan","onPinch","onSingleTap","headerFooterOpacity","pagerStyle","transform","scaleX","containerBackground","opacity","showScreenStyle","closeGridView","current","close","openGridView","present","videoRef","handleEnd","handleLoad","payload","handleProgress","data","currentTime","seekableDuration","handlePlayPause","status","undefined","seek","replayAsync","state","onProgressDrag","setPositionAsync","StyleSheet","absoluteFillObject","absoluteFill","styles","animatedContainer","i","abs","marginRight","header","footer","gridHandle","grid","clamp","lowerBound","upperBound","min","max","create","alignItems","flexDirection","displayName"],"mappings":";;;;;;;;;;;;;;;AAAA;;AACA;;AAWA;;AAMA;;AAUA;;AAIA;;AACA;;AACA;;AAIA;;AAIA;;AACA;;AACA;;AAKA;;AAEA;;AACA;;AAIA;;AACA;;AAOA;;AACA;;AACA;;;;;;;;;AAEA,IAAMA,SAAS,GAAGC,sBAASC,EAAT,KAAgB,SAAlC;;AACA,IAAMC,gBAAgB,GAAGC,wBAAWC,GAAX,CAAe,QAAf,EAAyBC,MAAlD;;AACA,IAAMC,oBAAoB,GAAG,eAAG,GAAH,CAA7B;AACA,IAAMC,WAAW,GAAG,eAAG,GAAH,CAApB;AACA,IAAMC,eAAe,GAAG,eAAG,EAAH,CAAxB;AACA,IAAMC,MAAM,GAAG,EAAf;IAEYC,U;;;WAAAA,U;AAAAA,EAAAA,U,CAAAA,U;AAAAA,EAAAA,U,CAAAA,U;GAAAA,U,0BAAAA,U;;IAKAC,S;;;WAAAA,S;AAAAA,EAAAA,S,CAAAA,S;AAAAA,EAAAA,S,CAAAA,S;AAAAA,EAAAA,S,CAAAA,S;GAAAA,S,yBAAAA,S;;AA2DL,IAAMC,YAAY,GAAG,SAAfA,YAAe,CAG1BC,KAH0B,EAIvB;AAAA;;AACH,4BAOIA,KAPJ,CACEC,YADF;AAAA,MACEA,YADF,oCACiB,cADjB;AAAA,MAEEC,4BAFF,GAOIF,KAPJ,CAEEE,4BAFF;AAAA,MAGEC,4BAHF,GAOIH,KAPJ,CAGEG,4BAHF;AAAA,MAIEC,0BAJF,GAOIJ,KAPJ,CAIEI,0BAJF;AAAA,MAKEC,+BALF,GAOIL,KAPJ,CAKEK,+BALF;AAAA,MAMEC,cANF,GAOIN,KAPJ,CAMEM,cANF;;AAQA,kBAA4B,qBAAkB,KAAlB,CAA5B;AAAA;AAAA,MAAOC,MAAP;AAAA,MAAeC,SAAf;;AACA,mBAAgC,qBAAiB,CAAjB,CAAhC;AAAA;AAAA,MAAOC,QAAP;AAAA,MAAiBC,WAAjB;;AACA,mBAAgC,qBAAiB,CAAjB,CAAhC;AAAA;AAAA,MAAOC,QAAP;AAAA,MAAiBC,WAAjB;;AACA,kBAKI,6BALJ;AAAA,kCACEC,KADF;AAAA,MAEcC,UAFd,mBAEIC,MAFJ,CAEcD,UAFd;AAAA,8CAGIE,YAHJ;AAAA,MAGoBC,eAHpB,yBAGoBA,eAHpB;AAAA,MAGqCC,KAHrC,yBAGqCA,KAHrC;AAAA,MAG4CC,KAH5C,yBAG4CA,KAH5C;;AAMA,mBAAoC,qBAAsC,EAAtC,CAApC;AAAA;AAAA,MAAOC,UAAP;AAAA,MAAmBC,aAAnB;;AACA,2BAA0C,wCAA1C;AAAA,MAAQC,OAAR,sBAAQA,OAAR;AAAA,MAAiBC,oBAAjB,sBAAiBA,oBAAjB;;AACA,8BACE,kDADF;AAAA,MAAQC,QAAR,yBAAQA,QAAR;AAAA,MAAkBC,eAAlB,yBAAkBA,eAAlB;AAAA,MAAmCC,kBAAnC,yBAAmCA,kBAAnC;;AAMA,MAAMC,eAAe,4BAAGC,uBAAUC,aAAb,oCAA8B,CAAnD;AACA,MAAMC,eAAe,GAAGzC,gBAAgB,GAAGI,oBAAnB,GAA0CkC,eAAlE;AACA,MAAMI,6BAA6B,GAAGR,oBAAoB,GACtDO,eAAe,KAAKH,eAApB,IAAuCG,eAAe,GAAG,CAAzD,GACE,CADF,GAEEH,eAHoD,GAItDG,eAAe,KAAKH,eAApB,IAAuCG,eAAe,GAAG,CAAzD,GACA,CAACH,eADD,GAEA,CANJ;AAOA,MAAMK,YAAY,GAAG9C,SAAS,GAC1BI,wBAAWC,GAAX,CAAe,QAAf,EAAyBC,MAAzB,GAAkCuC,6BADR,GAE1B,eAAG,GAAH,CAFJ;AAGA,MAAME,gBAAgB,GAAGD,YAAY,GAAG,CAAxC;AACA,MAAME,mBAAmB,GAAGF,YAAY,GAAG,CAA3C;;AACA,MAAMG,UAAU,GAAGC,kBAAMC,OAAN,CACjB;AAAA,WAAM,CAAEL,YAAY,GAAG,CAAhB,GAAqB,CAAtB,EAAyBA,YAAY,IAAI7B,4BAAJ,WAAIA,4BAAJ,GAAoC,EAApC,CAArC,CAAN;AAAA,GADiB,EAEjB,EAFiB,CAAnB;;AAQA,MAAMmC,mBAAmB,GAAG,mBAAyB,IAAzB,CAA5B;;AAKA,mBAA8D,qBAAS,CAAT,CAA9D;AAAA;AAAA,MAAOC,uBAAP;AAAA,MAAgCC,0BAAhC;;AACA,MAAMC,wBAAwB,GAAG,2CAAe,CAAf,CAAjC;AAMA,MAAMC,gBAAgB,GAAG,2CAAeV,YAAf,CAAzB;;AACA,MAAMW,UAAU,GAAG,SAAbA,UAAa,GAAM;AACvB;;AACAD,IAAAA,gBAAgB,CAACE,KAAjB,GAAyB,uCAAW,CAAX,EAAc;AACrCjC,MAAAA,QAAQ,EAAE,GAD2B;AAErCkC,MAAAA,MAAM,EAAEC,8BAAOC,GAAP,CAAWD,8BAAOE,IAAlB;AAF6B,KAAd,CAAzB;AAID,GAND;;AAWA,wBAAU,YAAM;AACdC,0BAASC,OAAT;;AACAP,IAAAA,UAAU;AACX,GAHD,EAGG,EAHH;;AAQA,oBAAoD,qBAAiBX,YAAjB,CAApD;AAAA;AAAA,MAAOmB,kBAAP;AAAA,MAA2BC,qBAA3B;;AAMA,oBAA0C,qBAAS,CAAT,CAA1C;AAAA;AAAA,MAAOC,aAAP;AAAA,MAAsBC,gBAAtB;;AACA,MAAMC,KAAK,GAAG,2CAAe,CAAf,CAAd;AAKA,MAAMC,mBAAmB,GAAG,2CAAe,CAAf,CAA5B;AAKA,MAAMC,YAAY,GAAG,mBAA0B,IAA1B,CAArB;AACA,MAAMC,MAAM,GAAG,mBAA0B,IAA1B,CAAf;AACA,MAAMC,QAAQ,GAAG,mBAA4B,IAA5B,CAAjB;AACA,MAAMC,YAAY,GAAG,mBAA0B,IAA1B,CAArB;AAKA,MAAMC,UAAU,GAAG,2CAAe,CAAf,CAAnB;AACA,MAAMC,UAAU,GAAG,2CAAe,CAAf,CAAnB;AACA,MAAMC,WAAW,GAAG,2CAAe,CAAf,CAApB;AACA,MAAMC,KAAK,GAAG,2CAAe,CAAf,CAAd;AACA,MAAMC,YAAY,GAAG,2CAAe,CAAf,CAArB;AAOA,MAAMC,MAAM,GAAG1C,QAAQ,CAAC2C,MAAT,CAAgB,UAACC,GAAD,EAAmCC,GAAnC,EAA2C;AAAA;;AACxE,QAAMC,gBAAgB,GACpB,qBAAAD,GAAG,CAACE,WAAJ,sCACIC,MADJ,CAEI,UAACC,UAAD;AAAA;;AAAA,aACGA,UAAU,CAACC,IAAX,KAAoB,OAApB,KACE,sBAAAD,UAAU,CAACE,KAAX,gEAAmB1E,YAAnB,4CAAkC2E,GAAlC,KACCH,UAAU,CAACI,SADZ,IAECJ,UAAU,CAACK,SAHd,CAAD,IAICL,UAAU,CAACC,IAAX,KAAoB,OAApB,IACC,CAACD,UAAU,CAACM,UADb,IAEC,CAACN,UAAU,CAACO,aAFb,IAGC,sDAAwBP,UAAxB,CAPF,IAQC,0CAA6BA,UAAU,CAACC,IAAX,KAAoB,OATpD;AAAA,KAFJ,EAaGO,OAbH,OAagB,EAdlB;AAgBA,QAAMC,gBAAgB,GAAGZ,gBAAgB,CAACa,GAAjB,CAAqB,UAACC,CAAD,EAAO;AAAA;;AACnD,UAAMC,QAAQ,GAAG,sDAAwBD,CAAxB,CAAjB;AACA,UAAME,QAAQ,GAAG,aAAAF,CAAC,CAACT,KAAF,uDAAU1E,YAAV,4CAAyB2E,GAAzB,KAAgCQ,CAAC,CAACP,SAAlC,IAA+CO,CAAC,CAACN,SAAlE;AAEA,aAAO;AACLS,QAAAA,SAAS,EAAElB,GAAG,CAACmB,GADV;AAELC,QAAAA,UAAU,EAAEpB,GAAG,CAACoB,UAFX;AAGLC,QAAAA,EAAE,eAAarB,GAAG,CAACqB,EAAjB,SAAuBL,QAHpB;AAILM,QAAAA,SAAS,EAAEtB,GAAG,CAACqB,EAJV;AAKLE,QAAAA,SAAS,EAAER,CAAC,CAACV,IAAF,KAAW,OAAX,GAAqB,WAArB,GAAmCU,CAAC,CAACQ,SAL3C;AAMLC,QAAAA,eAAe,EAAET,CAAC,CAACS,eANd;AAOLC,QAAAA,cAAc,EAAEV,CAAC,CAACU,cAPb;AAQLpB,QAAAA,IAAI,EAAEU,CAAC,CAACV,IARH;AASLqB,QAAAA,GAAG,EACDX,CAAC,CAACV,IAAF,KAAW,OAAX,GACIY,QADJ,GAEI,4CAAmB;AACjB9F,UAAAA,MAAM,EAAEwC,YADS;AAEjB4C,UAAAA,GAAG,EAAES,QAFY;AAGjBW,UAAAA,KAAK,EAAEtG;AAHU,SAAnB,CAZD;AAiBLuG,QAAAA,IAAI,EAAE5B,GAAG,CAAC4B,IAjBL;AAkBLC,QAAAA,OAAO,EAAE7B,GAAG,CAAC6B;AAlBR,OAAP;AAoBD,KAxBwB,CAAzB;AA0BA,yDAAWhB,gBAAX,uCAAgCd,GAAhC;AACD,GA5Cc,EA4CZ,EA5CY,CAAf;AAoDA,MAAM+B,WAAW,GAAGjC,MAAM,CAACkC,MAA3B;;AAMA,MAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAACzB,GAAD;AAAA,WAAiBA,GAAG,CAAC0B,KAAJ,CAAU,GAAV,EAAe,CAAf,CAAjB;AAAA,GAA1B;;AAKA,wBAAU,YAAM;AACd,QAAMC,cAAc,GAAG,SAAjBA,cAAiB,CAACC,QAAD,EAAsB;AAC3C;;AAEA,UAAIA,QAAQ,GAAG,CAAC,CAAhB,EAAmB;AACjBjD,QAAAA,KAAK,CAACX,KAAN,GAAc4D,QAAd;AACAvC,QAAAA,YAAY,CAACrB,KAAb,GAAqB,EAAElD,WAAW,GAAGE,MAAhB,IAA0B4G,QAA/C;AACA,4CAAQlD,gBAAR,EAA0BkD,QAA1B;AACD;AACF,KARD;;AAUA,QAAMA,QAAQ,GAAGtC,MAAM,CAACuC,SAAP,CACf,UAACC,KAAD;AAAA,aACEA,KAAK,CAACf,SAAN,MAAoBlE,eAApB,oBAAoBA,eAAe,CAAEkE,SAArC,KACAU,iBAAiB,CAACK,KAAK,CAACX,GAAP,CAAjB,KAAiCM,iBAAiB,CAAC,CAAA5E,eAAe,QAAf,YAAAA,eAAe,CAAEmD,GAAjB,KAAwB,EAAzB,CAFpD;AAAA,KADe,CAAjB;;AAMA,QAAIuB,WAAW,GAAG,CAAlB,EAAqB;AACnB3F,MAAAA,SAAS,CAAC,IAAD,CAAT;AACD;;AAED,wCAAQ+F,cAAR,EAAwBC,QAAxB;AACD,GAtBD,EAsBG,CAAC/E,eAAD,EAAkB0E,WAAlB,CAtBH;AA8BA,MAAMQ,kBAAkB,4BAAGzC,MAAM,CAACb,aAAD,CAAT,qBAAG,sBAAuB0C,GAAlD;AACA,wBAAU,YAAM;AACd3C,IAAAA,qBAAqB,CAACpB,YAAD,CAArB;AACA,QAAM0E,KAAK,GAAGxC,MAAM,CAACX,KAAK,CAACX,KAAP,CAApB;AACA,QAAMpD,MAAM,GAAGkH,KAAH,oBAAGA,KAAK,CAAEb,eAAtB;AACA,QAAMG,KAAK,GAAGU,KAAH,oBAAGA,KAAK,CAAEZ,cAArB;;AAEA,QAAItG,MAAM,IAAIwG,KAAd,EAAqB;AACnB,UAAMY,WAAW,GAAGC,IAAI,CAACC,KAAL,CAAWtH,MAAM,IAAIE,WAAW,GAAGsG,KAAlB,CAAjB,CAApB;AACA5C,MAAAA,qBAAqB,CAACwD,WAAW,GAAG5E,YAAd,GAA6BA,YAA7B,GAA4C4E,WAA7C,CAArB;AACD,KAHD,MAGO,IAAIF,KAAJ,YAAIA,KAAK,CAAEX,GAAX,EAAgB;AACrB,UAAIW,KAAK,CAAChC,IAAN,KAAe,OAAnB,EAA4B;AAC1BqC,2BAAMC,OAAN,CAAcN,KAAK,CAACX,GAApB,EAAyB,UAACC,KAAD,EAAQxG,MAAR,EAAmB;AAC1C,cAAMoH,WAAW,GAAGC,IAAI,CAACC,KAAL,CAAWtH,MAAM,IAAIE,WAAW,GAAGsG,KAAlB,CAAjB,CAApB;AACA5C,UAAAA,qBAAqB,CAACwD,WAAW,GAAG5E,YAAd,GAA6BA,YAA7B,GAA4C4E,WAA7C,CAArB;AACD,SAHD;AAID;AACF;AACF,GAjBD,EAiBG,CAACD,kBAAD,CAjBH;;AAmBA,8BAAqD,sDAAwB;AAC3ExD,IAAAA,kBAAkB,EAAlBA,kBAD2E;AAE3ElB,IAAAA,gBAAgB,EAAhBA,gBAF2E;AAG3EtC,IAAAA,eAAe,EAAfA,eAH2E;AAI3E6D,IAAAA,mBAAmB,EAAnBA,mBAJ2E;AAK3EO,IAAAA,WAAW,EAAXA,WAL2E;AAM3EzD,IAAAA,cAAc,EAAdA,cAN2E;AAO3E6F,IAAAA,WAAW,EAAXA,WAP2E;AAQ3EnC,IAAAA,KAAK,EAALA,KAR2E;AAS3EhC,IAAAA,YAAY,EAAZA,YAT2E;AAU3EtC,IAAAA,WAAW,EAAXA,WAV2E;AAW3E2D,IAAAA,aAAa,EAAbA,aAX2E;AAY3EC,IAAAA,gBAAgB,EAAhBA,gBAZ2E;AAa3EO,IAAAA,UAAU,EAAVA,UAb2E;AAc3EC,IAAAA,UAAU,EAAVA,UAd2E;AAe3EG,IAAAA,YAAY,EAAZA;AAf2E,GAAxB,CAArD;AAAA,MAAQgD,WAAR,yBAAQA,WAAR;AAAA,MAAqBC,KAArB,yBAAqBA,KAArB;AAAA,MAA4BC,OAA5B,yBAA4BA,OAA5B;AAAA,MAAqCC,WAArC,yBAAqCA,WAArC;;AAsBA,MAAMC,mBAAmB,GAAG,4CAC1B;AAAA,WACElE,kBAAkB,GAAGa,KAAK,CAACpB,KAA3B,GAAmCZ,YAAnC,IAAmD8B,UAAU,CAAClB,KAAX,GAAmB,CAAtE,GACI,IAAIkB,UAAU,CAAClB,KAAX,GAAmBV,mBAD3B,GAEIiB,kBAAkB,GAAGa,KAAK,CAACpB,KAA3B,GAAmCZ,YAAnC,IACA8B,UAAU,CAAClB,KAAX,GAAoBO,kBAAkB,GAAG,CAAtB,GAA2Ba,KAAK,CAACpB,KAAjC,GAAyCX,gBAD5D,GAEA,IACA,CAAC6B,UAAU,CAAClB,KAAX,IAAqBO,kBAAkB,GAAG,CAAtB,GAA2Ba,KAAK,CAACpB,KAAjC,GAAyCX,gBAA7D,CAAD,IACEC,mBAJF,GAKA,CARN;AAAA,GAD0B,EAU1B,CAACiB,kBAAD,CAV0B,CAA5B;AAgBA,MAAMmE,UAAU,GAAG,6CACjB;AAAA,WAAO;AACLC,MAAAA,SAAS,EAAE,CACT;AAAEC,QAAAA,MAAM,EAAE,CAAC;AAAX,OADS,EAET;AACE3D,QAAAA,UAAU,EAAEI,YAAY,CAACrB;AAD3B,OAFS;AADN,KAAP;AAAA,GADiB,EASjB,EATiB,CAAnB;AAeA,MAAM6E,mBAAmB,GAAG,6CAC1B;AAAA,WAAO;AACLxG,MAAAA,eAAe,EAAEA,eAAe,IAAIH,UAD/B;AAEL4G,MAAAA,OAAO,EAAEL,mBAAmB,CAACzE;AAFxB,KAAP;AAAA,GAD0B,EAK1B,CAACyE,mBAAD,CAL0B,CAA5B;AAYA,MAAMM,eAAe,GAAG,6CACtB;AAAA,WAAO;AACLJ,MAAAA,SAAS,EAAE,CACT;AACEzD,QAAAA,UAAU,EAAEpB,gBAAgB,CAACE;AAD/B,OADS;AADN,KAAP;AAAA,GADsB,EAQtB,EARsB,CAAxB;;AAcA,MAAMgF,aAAa,GAAG,SAAhBA,aAAgB,GAAM;AAAA;;AAC1B,iCAAItF,mBAAmB,CAACuF,OAAxB,aAAI,sBAA6BC,KAAjC,EAAwC;AACtCxF,MAAAA,mBAAmB,CAACuF,OAApB,CAA4BC,KAA5B;AACAzG,MAAAA,aAAa,CAAC,EAAD,CAAb;AACD;AACF,GALD;;AAUA,MAAM0G,YAAY,GAAG,SAAfA,YAAe,GAAM;AAAA;;AACzB,kCAAIzF,mBAAmB,CAACuF,OAAxB,aAAI,uBAA6BG,OAAjC,EAA0C;AACxC1F,MAAAA,mBAAmB,CAACuF,OAApB,CAA4BG,OAA5B;AACA3G,MAAAA,aAAa,CAAC6C,MAAD,CAAb;AACD;AACF,GALD;;AAOA,MAAM+D,QAAQ,GAAG,mBAAkB,IAAlB,CAAjB;;AAEA,MAAMC,SAAS,GAAG,SAAZA,SAAY,GAAM;AACtB1H,IAAAA,SAAS,CAAC,IAAD,CAAT;AACAE,IAAAA,WAAW,CAAC,CAAD,CAAX;AACD,GAHD;;AAKA,MAAMyH,UAAU,GAAG,SAAbA,UAAa,CAACC,OAAD,EAA+B;AAChD,QAAIA,OAAO,CAACzH,QAAZ,EAAsBC,WAAW,CAACwH,OAAO,CAACzH,QAAT,CAAX;AACvB,GAFD;;AAIA,MAAM0H,cAAc,GAAG,SAAjBA,cAAiB,CAACC,IAAD,EAA6B;AAClD,QAAIA,IAAI,CAACC,WAAL,IAAoBD,IAAI,CAACE,gBAA7B,EAA+C;AAC7C9H,MAAAA,WAAW,CAAC4H,IAAI,CAACC,WAAL,GAAmBD,IAAI,CAACE,gBAAzB,CAAX;AACD;AACF,GAJD;;AAMA,MAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAACC,MAAD,EAAsB;AAC5C,QAAIA,MAAM,KAAKC,SAAf,EAA0B;AAExB,UAAIlI,QAAQ,KAAK,CAAb,IAAkBwH,QAAQ,CAACJ,OAA3B,IAAsCI,QAAQ,CAACJ,OAAT,CAAiBe,IAA3D,EAAiE;AAC/DX,QAAAA,QAAQ,CAACJ,OAAT,CAAiBe,IAAjB,CAAsB,CAAtB;AACD;;AAED,UAAInI,QAAQ,KAAK,CAAb,IAAkBwH,QAAQ,CAACJ,OAA3B,IAAsCI,QAAQ,CAACJ,OAAT,CAAiBgB,WAA3D,EAAwE;AACtEZ,QAAAA,QAAQ,CAACJ,OAAT,CAAiBgB,WAAjB;AACD;;AAEDrI,MAAAA,SAAS,CAAC,UAACsI,KAAD;AAAA,eAAW,CAACA,KAAZ;AAAA,OAAD,CAAT;AACD,KAXD,MAWO;AACLtI,MAAAA,SAAS,CAACkI,MAAD,CAAT;AACD;AACF,GAfD;;AAiBA,MAAMK,cAAc,GAAG,SAAjBA,cAAiB,CAACtI,QAAD,EAAsB;AAE3C,QAAIwH,QAAQ,CAACJ,OAAT,IAAoBI,QAAQ,CAACJ,OAAT,CAAiBe,IAAzC,EAA+C;AAC7CX,MAAAA,QAAQ,CAACJ,OAAT,CAAiBe,IAAjB,CAAsBnI,QAAtB;AACD;;AAGD,QAAIwH,QAAQ,CAACJ,OAAT,IAAoBI,QAAQ,CAACJ,OAAT,CAAiBmB,gBAAzC,EAA2D;AACzDf,MAAAA,QAAQ,CAACJ,OAAT,CAAiBmB,gBAAjB,CAAkCvI,QAAQ,GAAG,IAA7C;AACD;AACF,GAVD;;AAYA,SACE,gCAAC,iCAAD,CAAU,IAAV;AACE,IAAA,kBAAkB,EAAC,eADrB;AAEE,IAAA,aAAa,EAAE,MAFjB;AAGE,IAAA,KAAK,EAAE,CAACwI,wBAAWC,kBAAZ,EAAgCvB,eAAhC,CAHT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAKE,gCAAC,iCAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAE,CAACsB,wBAAWC,kBAAZ,EAAgCzB,mBAAhC,CAAtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IALF,EAME,gCAAC,4CAAD;AACE,IAAA,WAAW,EAAE,CADf;AAEE,IAAA,YAAY,EAAE,CAFhB;AAGE,IAAA,cAAc,EAAEL,WAHlB;AAIE,IAAA,GAAG,EAAExD,YAJP;AAKE,IAAA,OAAO,EAAE,CAACF,MAAD,EAASC,QAAT,EAAmBF,YAAnB,CALX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOE,gCAAC,iCAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEwF,wBAAWC,kBAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,4CAAD;AACE,IAAA,SAAS,EAAE,CADb;AAEE,IAAA,SAAS,EAAE,CAFb;AAGE,IAAA,OAAO,EAAE,CAHX;AAIE,IAAA,WAAW,EAAE,CAJf;AAKE,IAAA,YAAY,EAAE,CALhB;AAME,IAAA,cAAc,EAAEjC,WANlB;AAOE,IAAA,GAAG,EAAExD,YAPP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASE,gCAAC,iCAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEwF,wBAAWC,kBAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,8CAAD;AACE,IAAA,cAAc,EAAE/B,OADlB;AAEE,IAAA,GAAG,EAAExD,QAFP;AAGE,IAAA,oBAAoB,EAAE,CAACD,MAAD,CAHxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAKE,gCAAC,iCAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEuF,wBAAWE,YAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,4CAAD;AACE,IAAA,OAAO,EAAE7H,OAAO,KAAK,SADvB;AAEE,IAAA,WAAW,EAAEpC,SAAS,GAAGyJ,SAAH,GAAe,CAFvC;AAGE,IAAA,OAAO,EAAE,EAHX;AAIE,IAAA,cAAc,EAAEzB,KAJlB;AAKE,IAAA,GAAG,EAAExD,MALP;AAME,IAAA,oBAAoB,EAAE,CAACC,QAAD,CANxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQE,gCAAC,iCAAD,CAAU,IAAV;AAAe,IAAA,KAAK,EAAEsF,wBAAWE,YAAjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,iCAAD,CAAU,IAAV;AACE,IAAA,KAAK,EAAE,CACLC,MAAM,CAACC,iBADF,EAEL/B,UAFK,EAGLpG,KAHK,EAIL;AACEqG,MAAAA,SAAS,EAAE,CACT;AAAEC,QAAAA,MAAM,EAAE,CAAC;AAAX,OADS,EAET;AACE3D,QAAAA,UAAU,EAAEI,YAAY,CAACrB;AAD3B,OAFS;AADb,KAJK,CADT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAeGsB,MAAM,CAACiB,GAAP,CAAW,UAACuB,KAAD,EAAQ4C,CAAR;AAAA,WACV5C,KAAK,CAAChC,IAAN,KAAe,OAAf,GACE,gCAAC,0CAAD;AACE,MAAA,SAAS,EAAEwD,SADb;AAEE,MAAA,UAAU,EAAEC,UAFd;AAGE,MAAA,cAAc,EAAEE,cAHlB;AAIE,MAAA,KAAK,EAAEiB,CAJT;AAKE,MAAA,GAAG,EAAK5C,KAAK,CAACX,GAAX,SAAkBuD,CALvB;AAME,MAAA,WAAW,EAAEvF,WANf;AAOE,MAAA,MAAM,EAAExD,MAPV;AAQE,MAAA,QAAQ,EAAE8C,aAAa,GAAGiG,CAR5B;AASE,MAAA,KAAK,EAAEtF,KATT;AAUE,MAAA,YAAY,EAAEhC,YAVhB;AAWE,MAAA,QAAQ,EAAEqB,aAAa,KAAKiG,CAX9B;AAYE,MAAA,YAAY,EAAEzC,IAAI,CAAC0C,GAAL,CAASlG,aAAa,GAAGiG,CAAzB,IAA8B,CAZ9C;AAaE,MAAA,MAAM,EAAE;AAAEvD,QAAAA,GAAG,EAAEW,KAAK,CAACX;AAAb,OAbV;AAcE,MAAA,KAAK,EAAE,CACL;AACEvG,QAAAA,MAAM,EAAEwC,YAAY,GAAG,CADzB;AAEEwH,QAAAA,WAAW,EAAE5J,MAFf;AAGEoG,QAAAA,KAAK,EAAEtG,WAAW,GAAG;AAHvB,OADK,EAMLyB,KANK,CAdT;AAsBE,MAAA,UAAU,EAAE0C,UAtBd;AAuBE,MAAA,UAAU,EAAEC,UAvBd;AAwBE,MAAA,QAAQ,EAAEmE,QAxBZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MADF,GA4BE,gCAAC,0CAAD;AACE,MAAA,kBAAkB,EAAE,YADtB;AAEE,MAAA,KAAK,EAAEqB,CAFT;AAGE,MAAA,GAAG,EAAK5C,KAAK,CAACX,GAAX,SAAkBuD,CAHvB;AAIE,MAAA,WAAW,EAAEvF,WAJf;AAKE,MAAA,KAAK,EAAE2C,KALT;AAME,MAAA,QAAQ,EAAErD,aAAa,GAAGiG,CAN5B;AAOE,MAAA,KAAK,EAAEtF,KAPT;AAQE,MAAA,YAAY,EAAEhC,YARhB;AASE,MAAA,QAAQ,EAAEqB,aAAa,KAAKiG,CAT9B;AAUE,MAAA,YAAY,EAAEzC,IAAI,CAAC0C,GAAL,CAASlG,aAAa,GAAGiG,CAAzB,IAA8B,CAV9C;AAWE,MAAA,KAAK,EAAE,CACL;AACE9J,QAAAA,MAAM,EAAEwC,YAAY,GAAG,CADzB;AAEEwH,QAAAA,WAAW,EAAE5J,MAFf;AAGEoG,QAAAA,KAAK,EAAEtG,WAAW,GAAG;AAHvB,OADK,EAMLyB,KANK,CAXT;AAmBE,MAAA,UAAU,EAAE0C,UAnBd;AAoBE,MAAA,UAAU,EAAEC,UApBd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA7BQ;AAAA,GAAX,CAfH,CADF,CARF,CADF,CALF,CADF,CATF,CADF,CAPF,CANF,EAoHE,gCAAC,sCAAD;AACE,IAAA,OAAO,EAAEuD,mBADX;AAEE,IAAA,KAAK,EAAEnD,MAAM,CAACb,aAAD,CAFf;AAGE,IAAA,OAAO,EAAEG;AAHX,KAIMtD,4BAJN,oBAIMA,4BAA4B,CAAEuJ,MAJpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KApHF,EA0HE,gCAAC,sCAAD;AACE,IAAA,kBAAkB,EAAE,sBADtB;AAEE,IAAA,QAAQ,EAAE9I,QAFZ;AAGE,IAAA,WAAW,EAAE8H,eAHf;AAIE,IAAA,cAAc,EAAEM,cAJlB;AAKE,IAAA,OAAO,EAAE1B,mBALX;AAME,IAAA,YAAY,EAAEU,YANhB;AAOE,IAAA,MAAM,EAAExH,MAPV;AAQE,IAAA,KAAK,EAAE2D,MAAM,CAACb,aAAD,CARf;AASE,IAAA,WAAW,EAAE8C,WATf;AAUE,IAAA,QAAQ,EAAE1F,QAVZ;AAWE,IAAA,aAAa,EAAE4C,aAXjB;AAYE,IAAA,OAAO,EAAEG;AAZX,KAaMtD,4BAbN,oBAaMA,4BAA4B,CAAEwJ,MAbpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA1HF,EA0IE,gCAAC,wCAAD;AACE,IAAA,wBAAwB,EAAEjH,wBAD5B;AAEE,IAAA,aAAa,EAAEmF,aAFjB;AAGE,IAAA,uBAAuB,EAAErF,uBAH3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA1IF,EA+IE,gCAAC,qCAAD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KACE,gCAAC,6BAAD;AACE,IAAA,aAAa,EAAEE,wBADjB;AAEE,IAAA,oBAAoB,EAAE,IAFxB;AAGE,IAAA,eAAe,EAAE;AAAA,aACf,gCAAC,gCAAD;AACE,QAAA,aAAa,EAAEmF;AADjB,SAEM1H,4BAFN,oBAEMA,4BAA4B,CAAEyJ,UAFpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SADe;AAAA,KAHnB;AASE,IAAA,YAAY,EAAExJ,4BAAF,WAAEA,4BAAF,GAAkC,EAThD;AAUE,IAAA,KAAK,EAAE,CAVT;AAWE,IAAA,QAAQ,EAAE,kBAACoD,KAAD;AAAA,aAAmBf,0BAA0B,CAACe,KAAD,CAA7C;AAAA,KAXZ;AAYE,IAAA,GAAG,EAAEjB,mBAZP;AAaE,IAAA,UAAU,EAAElC,0BAA0B,IAAI+B,UAb5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAeE,gCAAC,oBAAD;AACE,IAAA,aAAa,EAAEyF,aADjB;AAEE,IAAA,+BAA+B,EAAEvH,+BAFnC;AAGE,IAAA,MAAM,EAAEe,UAHV;AAIE,IAAA,kBAAkB,EAAEM;AAJtB,KAKMxB,4BALN,oBAKMA,4BAA4B,CAAE0J,IALpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAfF,CADF,CA/IF,CADF;AA2KD,CAliBM;;;;AAuiBA,IAAMC,KAAK,GAAG,SAARA,KAAQ,CAACjH,KAAD,EAAgBkH,UAAhB,EAAoCC,UAApC,EAA2D;AAC9E;;AACA,SAAOlD,IAAI,CAACmD,GAAL,CAASnD,IAAI,CAACoD,GAAL,CAASH,UAAT,EAAqBlH,KAArB,CAAT,EAAsCmH,UAAtC,CAAP;AACD,CAHM;;;;AAKP,IAAMX,MAAM,GAAGH,wBAAWiB,MAAX,CAAkB;AAC/Bb,EAAAA,iBAAiB,EAAE;AACjBc,IAAAA,UAAU,EAAE,QADK;AAEjBC,IAAAA,aAAa,EAAE;AAFE;AADY,CAAlB,CAAf;;AAuBArK,YAAY,CAACsK,WAAb,GAA2B,4BAA3B","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport {\n Dimensions,\n Image,\n ImageStyle,\n Keyboard,\n Platform,\n StatusBar,\n StyleSheet,\n ViewStyle,\n} from 'react-native';\n\nimport {\n PanGestureHandler,\n PinchGestureHandler,\n TapGestureHandler,\n} from 'react-native-gesture-handler';\n\nimport Animated, {\n Easing,\n runOnJS,\n runOnUI,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nimport { BottomSheetModal, BottomSheetModalProvider } from '@gorhom/bottom-sheet';\n\nimport type { UserResponse } from 'stream-chat';\n\nimport { AnimatedGalleryImage } from './components/AnimatedGalleryImage';\nimport { AnimatedGalleryVideo } from './components/AnimatedGalleryVideo';\nimport {\n ImageGalleryFooter,\n ImageGalleryFooterCustomComponentProps,\n} from './components/ImageGalleryFooter';\nimport {\n ImageGalleryHeader,\n ImageGalleryHeaderCustomComponentProps,\n} from './components/ImageGalleryHeader';\nimport { ImageGalleryOverlay } from './components/ImageGalleryOverlay';\nimport { ImageGalleryGridImageComponents, ImageGrid } from './components/ImageGrid';\nimport {\n ImageGalleryGridHandleCustomComponentProps,\n ImageGridHandle,\n} from './components/ImageGridHandle';\n\nimport { useImageGalleryGestures } from './hooks/useImageGalleryGestures';\n\nimport { useImageGalleryContext } from '../../contexts/imageGalleryContext/ImageGalleryContext';\nimport {\n OverlayProviderProps,\n useOverlayContext,\n} from '../../contexts/overlayContext/OverlayContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport {\n isVideoPackageAvailable,\n VideoPayloadData,\n VideoProgressData,\n VideoType,\n} from '../../native';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { getResizedImageUrl } from '../../utils/getResizedImageUrl';\nimport { getUrlOfImageAttachment } from '../../utils/getUrlOfImageAttachment';\nimport { vh, vw } from '../../utils/utils';\n\nconst isAndroid = Platform.OS === 'android';\nconst fullScreenHeight = Dimensions.get('screen').height;\nconst measuredScreenHeight = vh(100);\nconst screenWidth = vw(100);\nconst halfScreenWidth = vw(50);\nconst MARGIN = 32;\n\nexport enum HasPinched {\n FALSE = 0,\n TRUE,\n}\n\nexport enum IsSwiping {\n UNDETERMINED = 0,\n TRUE,\n FALSE,\n}\n\nexport type ImageGalleryCustomComponents<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n /**\n * Override props for following UI components, which are part of [image gallery](https://github.com/GetStream/stream-chat-react-native/wiki/Cookbook-v3.0#gallery-components).\n *\n * - [ImageGalleryFooter](#ImageGalleryFooter)\n *\n * - [ImageGrid](#ImageGrid)\n *\n * - [ImageGridHandle](#ImageGridHandle)\n *\n * - [ImageGalleryHeader](#ImageGalleryHeader)\n *\n * e.g.,\n *\n * ```js\n * {\n * footer: {\n * ShareIcon: CustomShareIconComponent\n * },\n * grid: {\n * avatarComponent: CustomAvatarComponent\n * },\n * gridHandle: {\n * centerComponent: CustomCenterComponent\n * },\n * header: {\n * CloseIcon: CustomCloseButtonComponent\n * },\n * }\n * ```\n * @overrideType object\n */\n imageGalleryCustomComponents?: {\n footer?: ImageGalleryFooterCustomComponentProps<StreamChatGenerics>;\n grid?: ImageGalleryGridImageComponents<StreamChatGenerics>;\n gridHandle?: ImageGalleryGridHandleCustomComponentProps;\n header?: ImageGalleryHeaderCustomComponentProps<StreamChatGenerics>;\n };\n};\n\ntype Props<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n ImageGalleryCustomComponents<StreamChatGenerics> & {\n overlayOpacity: Animated.SharedValue<number>;\n } & Pick<\n OverlayProviderProps<StreamChatGenerics>,\n | 'giphyVersion'\n | 'imageGalleryGridSnapPoints'\n | 'imageGalleryGridHandleHeight'\n | 'numberOfImageGalleryGridColumns'\n >;\n\nexport const ImageGallery = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: Props<StreamChatGenerics>,\n) => {\n const {\n giphyVersion = 'fixed_height',\n imageGalleryCustomComponents,\n imageGalleryGridHandleHeight,\n imageGalleryGridSnapPoints,\n numberOfImageGalleryGridColumns,\n overlayOpacity,\n } = props;\n const [paused, setPaused] = useState<boolean>(false);\n const [progress, setProgress] = useState<number>(0);\n const [duration, setDuration] = useState<number>(0);\n const {\n theme: {\n colors: { white_snow },\n imageGallery: { backgroundColor, pager, slide },\n },\n } = useTheme();\n const [gridPhotos, setGridPhotos] = useState<Photo<StreamChatGenerics>[]>([]);\n const { overlay, translucentStatusBar } = useOverlayContext();\n const { messages, selectedMessage, setSelectedMessage } =\n useImageGalleryContext<StreamChatGenerics>();\n\n /**\n * Height constants\n */\n const statusBarHeight = StatusBar.currentHeight ?? 0;\n const bottomBarHeight = fullScreenHeight - measuredScreenHeight - statusBarHeight;\n const androidScreenHeightAdjustment = translucentStatusBar\n ? bottomBarHeight === statusBarHeight || bottomBarHeight < 0\n ? 0\n : statusBarHeight\n : bottomBarHeight === statusBarHeight || bottomBarHeight < 0\n ? -statusBarHeight\n : 0;\n const screenHeight = isAndroid\n ? Dimensions.get('window').height + androidScreenHeightAdjustment\n : vh(100);\n const halfScreenHeight = screenHeight / 2;\n const quarterScreenHeight = screenHeight / 4;\n const snapPoints = React.useMemo(\n () => [(screenHeight * 3) / 4, screenHeight - (imageGalleryGridHandleHeight ?? 40)],\n [],\n );\n\n /**\n * BottomSheetModal ref\n */\n const bottomSheetModalRef = useRef<BottomSheetModal>(null);\n\n /**\n * BottomSheetModal state\n */\n const [currentBottomSheetIndex, setCurrentBottomSheetIndex] = useState(0);\n const animatedBottomSheetIndex = useSharedValue(0);\n\n /**\n * Fade animation for screen, it is always rendered with pointerEvents\n * set to none for fast opening\n */\n const screenTranslateY = useSharedValue(screenHeight);\n const showScreen = () => {\n 'worklet';\n screenTranslateY.value = withTiming(0, {\n duration: 250,\n easing: Easing.out(Easing.ease),\n });\n };\n\n /**\n * Run the fade animation on visible change\n */\n useEffect(() => {\n Keyboard.dismiss();\n showScreen();\n }, []);\n\n /**\n * Image height from URL or default to full screen height\n */\n const [currentImageHeight, setCurrentImageHeight] = useState<number>(screenHeight);\n\n /**\n * JS and UI index values, the JS follows the UI but is needed\n * for rendering the virtualized image list\n */\n const [selectedIndex, setSelectedIndex] = useState(0);\n const index = useSharedValue(0);\n\n /**\n * Header visible value for animating in out\n */\n const headerFooterVisible = useSharedValue(1);\n\n /**\n * Gesture handler refs\n */\n const doubleTapRef = useRef<TapGestureHandler>(null);\n const panRef = useRef<PanGestureHandler>(null);\n const pinchRef = useRef<PinchGestureHandler>(null);\n const singleTapRef = useRef<TapGestureHandler>(null);\n\n /**\n * Shared values for movement\n */\n const translateX = useSharedValue(0);\n const translateY = useSharedValue(0);\n const offsetScale = useSharedValue(1);\n const scale = useSharedValue(1);\n const translationX = useSharedValue(0);\n\n /**\n * Photos array created from all currently available\n * photo attachments\n */\n\n const photos = messages.reduce((acc: Photo<StreamChatGenerics>[], cur) => {\n const attachmentImages =\n cur.attachments\n ?.filter(\n (attachment) =>\n (attachment.type === 'giphy' &&\n (attachment.giphy?.[giphyVersion]?.url ||\n attachment.thumb_url ||\n attachment.image_url)) ||\n (attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url &&\n getUrlOfImageAttachment(attachment)) ||\n (isVideoPackageAvailable() && attachment.type === 'video'),\n )\n .reverse() || [];\n\n const attachmentPhotos = attachmentImages.map((a) => {\n const imageUrl = getUrlOfImageAttachment(a) as string;\n const giphyURL = a.giphy?.[giphyVersion]?.url || a.thumb_url || a.image_url;\n\n return {\n channelId: cur.cid,\n created_at: cur.created_at,\n id: `photoId-${cur.id}-${imageUrl}`,\n messageId: cur.id,\n mime_type: a.type === 'giphy' ? 'image/gif' : a.mime_type,\n original_height: a.original_height,\n original_width: a.original_width,\n type: a.type,\n uri:\n a.type === 'giphy'\n ? giphyURL\n : getResizedImageUrl({\n height: screenHeight,\n url: imageUrl,\n width: screenWidth,\n }),\n user: cur.user,\n user_id: cur.user_id,\n };\n });\n\n return [...attachmentPhotos, ...acc] as Photo<StreamChatGenerics>[];\n }, []);\n\n /**\n * Photos length needs to be kept as a const here so if the length\n * changes it causes the pan gesture handler function to refresh. This\n * does not work if the calculation for the length of the array is left\n * inside the gesture handler as it will have an array as a dependency\n */\n const photoLength = photos.length;\n\n /**\n * The URL for the images may differ because of dimensions passed as\n * part of the query.\n */\n const stripQueryFromUrl = (url: string) => url.split('?')[0];\n\n /**\n * Set selected photo when changed via pressing in the message list\n */\n useEffect(() => {\n const updatePosition = (newIndex: number) => {\n 'worklet';\n\n if (newIndex > -1) {\n index.value = newIndex;\n translationX.value = -(screenWidth + MARGIN) * newIndex;\n runOnJS(setSelectedIndex)(newIndex);\n }\n };\n\n const newIndex = photos.findIndex(\n (photo) =>\n photo.messageId === selectedMessage?.messageId &&\n stripQueryFromUrl(photo.uri) === stripQueryFromUrl(selectedMessage?.url || ''),\n );\n\n if (photoLength > 1) {\n setPaused(true);\n }\n\n runOnUI(updatePosition)(newIndex);\n }, [selectedMessage, photoLength]);\n\n /**\n * Image heights are not provided and therefore need to be calculated.\n * We start by allowing the image to be the full height then reduce it\n * to the proper scaled height based on the width being restricted to the\n * screen width when the dimensions are received.\n */\n const uriForCurrentImage = photos[selectedIndex]?.uri;\n useEffect(() => {\n setCurrentImageHeight(screenHeight);\n const photo = photos[index.value];\n const height = photo?.original_height;\n const width = photo?.original_width;\n\n if (height && width) {\n const imageHeight = Math.floor(height * (screenWidth / width));\n setCurrentImageHeight(imageHeight > screenHeight ? screenHeight : imageHeight);\n } else if (photo?.uri) {\n if (photo.type === 'image') {\n Image.getSize(photo.uri, (width, height) => {\n const imageHeight = Math.floor(height * (screenWidth / width));\n setCurrentImageHeight(imageHeight > screenHeight ? screenHeight : imageHeight);\n });\n }\n }\n }, [uriForCurrentImage]);\n\n const { onDoubleTap, onPan, onPinch, onSingleTap } = useImageGalleryGestures({\n currentImageHeight,\n halfScreenHeight,\n halfScreenWidth,\n headerFooterVisible,\n offsetScale,\n overlayOpacity,\n photoLength,\n scale,\n screenHeight,\n screenWidth,\n selectedIndex,\n setSelectedIndex,\n translateX,\n translateY,\n translationX,\n });\n\n /**\n * If the header is visible we scale down the opacity of it as the\n * image is swiped downward\n */\n const headerFooterOpacity = useDerivedValue(\n () =>\n currentImageHeight * scale.value < screenHeight && translateY.value > 0\n ? 1 - translateY.value / quarterScreenHeight\n : currentImageHeight * scale.value > screenHeight &&\n translateY.value > (currentImageHeight / 2) * scale.value - halfScreenHeight\n ? 1 -\n (translateY.value - ((currentImageHeight / 2) * scale.value - halfScreenHeight)) /\n quarterScreenHeight\n : 1,\n [currentImageHeight],\n );\n\n /**\n * This transition and scaleX reverse lets use scroll left\n */\n const pagerStyle = useAnimatedStyle<ImageStyle>(\n () => ({\n transform: [\n { scaleX: -1 },\n {\n translateX: translationX.value,\n },\n ],\n }),\n [],\n );\n\n /**\n * Simple background color animation on Y movement\n */\n const containerBackground = useAnimatedStyle<ViewStyle>(\n () => ({\n backgroundColor: backgroundColor || white_snow,\n opacity: headerFooterOpacity.value,\n }),\n [headerFooterOpacity],\n );\n\n /**\n * Show screen style as component is always rendered we hide it\n * down and up and set opacity to 0 for good measure\n */\n const showScreenStyle = useAnimatedStyle<ViewStyle>(\n () => ({\n transform: [\n {\n translateY: screenTranslateY.value,\n },\n ],\n }),\n [],\n );\n\n /**\n * Functions toclose BottomSheetModal with image grid\n */\n const closeGridView = () => {\n if (bottomSheetModalRef.current?.close) {\n bottomSheetModalRef.current.close();\n setGridPhotos([]);\n }\n };\n\n /**\n * Function to open BottomSheetModal with image grid\n */\n const openGridView = () => {\n if (bottomSheetModalRef.current?.present) {\n bottomSheetModalRef.current.present();\n setGridPhotos(photos);\n }\n };\n\n const videoRef = useRef<VideoType>(null);\n\n const handleEnd = () => {\n setPaused(true);\n setProgress(1);\n };\n\n const handleLoad = (payload: VideoPayloadData) => {\n if (payload.duration) setDuration(payload.duration);\n };\n\n const handleProgress = (data: VideoProgressData) => {\n if (data.currentTime && data.seekableDuration) {\n setProgress(data.currentTime / data.seekableDuration);\n }\n };\n\n const handlePlayPause = (status?: boolean) => {\n if (status === undefined) {\n // React Native Video for RN CLI has seek as an API to move to a particular location in the video\n if (progress === 1 && videoRef.current && videoRef.current.seek) {\n videoRef.current.seek(0);\n }\n // Expo AV for Expo has replayAsync as an API to move to a starting of the video\n if (progress === 1 && videoRef.current && videoRef.current.replayAsync) {\n videoRef.current.replayAsync();\n }\n\n setPaused((state) => !state);\n } else {\n setPaused(status);\n }\n };\n\n const onProgressDrag = (progress: number) => {\n // React Native Video for RN CLI has seek as an API to move to a particular location in the video\n if (videoRef.current && videoRef.current.seek) {\n videoRef.current.seek(progress);\n }\n\n // Expo AV for Expo has setPositionAsync as an API to move to a particular location of the video\n if (videoRef.current && videoRef.current.setPositionAsync) {\n videoRef.current.setPositionAsync(progress * 1000);\n }\n };\n\n return (\n <Animated.View\n accessibilityLabel='Image Gallery'\n pointerEvents={'auto'}\n style={[StyleSheet.absoluteFillObject, showScreenStyle]}\n >\n <Animated.View style={[StyleSheet.absoluteFillObject, containerBackground]} />\n <TapGestureHandler\n minPointers={1}\n numberOfTaps={1}\n onGestureEvent={onSingleTap}\n ref={singleTapRef}\n waitFor={[panRef, pinchRef, doubleTapRef]}\n >\n <Animated.View style={StyleSheet.absoluteFillObject}>\n <TapGestureHandler\n maxDeltaX={8}\n maxDeltaY={8}\n maxDist={8}\n minPointers={1}\n numberOfTaps={2}\n onGestureEvent={onDoubleTap}\n ref={doubleTapRef}\n >\n <Animated.View style={StyleSheet.absoluteFillObject}>\n <PinchGestureHandler\n onGestureEvent={onPinch}\n ref={pinchRef}\n simultaneousHandlers={[panRef]}\n >\n <Animated.View style={StyleSheet.absoluteFill}>\n <PanGestureHandler\n enabled={overlay === 'gallery'}\n maxPointers={isAndroid ? undefined : 1}\n minDist={10}\n onGestureEvent={onPan}\n ref={panRef}\n simultaneousHandlers={[pinchRef]}\n >\n <Animated.View style={StyleSheet.absoluteFill}>\n <Animated.View\n style={[\n styles.animatedContainer,\n pagerStyle,\n pager,\n {\n transform: [\n { scaleX: -1 }, // Also only here for opening, wrong direction when not included\n {\n translateX: translationX.value, // Only here for opening, wrong index when this is not included\n },\n ],\n },\n ]}\n >\n {photos.map((photo, i) =>\n photo.type === 'video' ? (\n <AnimatedGalleryVideo\n handleEnd={handleEnd}\n handleLoad={handleLoad}\n handleProgress={handleProgress}\n index={i}\n key={`${photo.uri}-${i}`}\n offsetScale={offsetScale}\n paused={paused}\n previous={selectedIndex > i}\n scale={scale}\n screenHeight={screenHeight}\n selected={selectedIndex === i}\n shouldRender={Math.abs(selectedIndex - i) < 4}\n source={{ uri: photo.uri }}\n style={[\n {\n height: screenHeight * 8,\n marginRight: MARGIN,\n width: screenWidth * 8,\n },\n slide,\n ]}\n translateX={translateX}\n translateY={translateY}\n videoRef={videoRef}\n />\n ) : (\n <AnimatedGalleryImage\n accessibilityLabel={'Image Item'}\n index={i}\n key={`${photo.uri}-${i}`}\n offsetScale={offsetScale}\n photo={photo}\n previous={selectedIndex > i}\n scale={scale}\n screenHeight={screenHeight}\n selected={selectedIndex === i}\n shouldRender={Math.abs(selectedIndex - i) < 4}\n style={[\n {\n height: screenHeight * 8,\n marginRight: MARGIN,\n width: screenWidth * 8,\n },\n slide,\n ]}\n translateX={translateX}\n translateY={translateY}\n />\n ),\n )}\n </Animated.View>\n </Animated.View>\n </PanGestureHandler>\n </Animated.View>\n </PinchGestureHandler>\n </Animated.View>\n </TapGestureHandler>\n </Animated.View>\n </TapGestureHandler>\n <ImageGalleryHeader<StreamChatGenerics>\n opacity={headerFooterOpacity}\n photo={photos[selectedIndex]}\n visible={headerFooterVisible}\n {...imageGalleryCustomComponents?.header}\n />\n <ImageGalleryFooter<StreamChatGenerics>\n accessibilityLabel={'Image Gallery Footer'}\n duration={duration}\n onPlayPause={handlePlayPause}\n onProgressDrag={onProgressDrag}\n opacity={headerFooterOpacity}\n openGridView={openGridView}\n paused={paused}\n photo={photos[selectedIndex]}\n photoLength={photoLength}\n progress={progress}\n selectedIndex={selectedIndex}\n visible={headerFooterVisible}\n {...imageGalleryCustomComponents?.footer}\n />\n\n <ImageGalleryOverlay\n animatedBottomSheetIndex={animatedBottomSheetIndex}\n closeGridView={closeGridView}\n currentBottomSheetIndex={currentBottomSheetIndex}\n />\n <BottomSheetModalProvider>\n <BottomSheetModal\n animatedIndex={animatedBottomSheetIndex}\n enablePanDownToClose={true}\n handleComponent={() => (\n <ImageGridHandle\n closeGridView={closeGridView}\n {...imageGalleryCustomComponents?.gridHandle}\n />\n )}\n handleHeight={imageGalleryGridHandleHeight ?? 40}\n index={0}\n onChange={(index: number) => setCurrentBottomSheetIndex(index)}\n ref={bottomSheetModalRef}\n snapPoints={imageGalleryGridSnapPoints || snapPoints}\n >\n <ImageGrid\n closeGridView={closeGridView}\n numberOfImageGalleryGridColumns={numberOfImageGalleryGridColumns}\n photos={gridPhotos}\n setSelectedMessage={setSelectedMessage}\n {...imageGalleryCustomComponents?.grid}\n />\n </BottomSheetModal>\n </BottomSheetModalProvider>\n </Animated.View>\n );\n};\n\n/**\n * Clamping worklet to clamp the scaling\n */\nexport const clamp = (value: number, lowerBound: number, upperBound: number) => {\n 'worklet';\n return Math.min(Math.max(lowerBound, value), upperBound);\n};\n\nconst styles = StyleSheet.create({\n animatedContainer: {\n alignItems: 'center',\n flexDirection: 'row',\n },\n});\n\nexport type Photo<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n id: string;\n uri: string;\n channelId?: string;\n created_at?: string | Date;\n messageId?: string;\n mime_type?: string;\n original_height?: number;\n original_width?: number;\n type?: string;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nImageGallery.displayName = 'ImageGallery{imageGallery}';\n"]}
|
|
1
|
+
{"version":3,"sources":["ImageGallery.tsx"],"names":["isAndroid","Platform","OS","fullScreenHeight","Dimensions","get","height","measuredScreenHeight","screenWidth","halfScreenWidth","MARGIN","HasPinched","IsSwiping","ImageGallery","props","giphyVersion","imageGalleryCustomComponents","imageGalleryGridHandleHeight","imageGalleryGridSnapPoints","numberOfImageGalleryGridColumns","overlayOpacity","paused","setPaused","progress","setProgress","duration","setDuration","theme","white_snow","colors","imageGallery","backgroundColor","pager","slide","gridPhotos","setGridPhotos","overlay","translucentStatusBar","messages","selectedMessage","setSelectedMessage","statusBarHeight","StatusBar","currentHeight","bottomBarHeight","androidScreenHeightAdjustment","screenHeight","halfScreenHeight","quarterScreenHeight","snapPoints","React","useMemo","bottomSheetModalRef","currentBottomSheetIndex","setCurrentBottomSheetIndex","animatedBottomSheetIndex","screenTranslateY","showScreen","value","easing","Easing","out","ease","Keyboard","dismiss","currentImageHeight","setCurrentImageHeight","selectedIndex","setSelectedIndex","index","headerFooterVisible","doubleTapRef","panRef","pinchRef","singleTapRef","translateX","translateY","offsetScale","scale","translationX","photos","reduce","acc","cur","attachmentImages","attachments","filter","attachment","type","giphy","url","thumb_url","image_url","title_link","og_scrape_url","reverse","attachmentPhotos","map","a","imageUrl","giphyURL","channelId","cid","created_at","id","messageId","mime_type","original_height","original_width","uri","width","user","user_id","photoLength","length","stripQueryFromUrl","split","updatePosition","newIndex","findIndex","photo","uriForCurrentImage","imageHeight","Math","floor","Image","getSize","onDoubleTap","onPan","onPinch","onSingleTap","headerFooterOpacity","pagerStyle","transform","scaleX","containerBackground","opacity","showScreenStyle","closeGridView","current","close","openGridView","present","videoRef","handleEnd","handleLoad","payload","handleProgress","data","currentTime","seekableDuration","handlePlayPause","status","undefined","seek","replayAsync","state","onProgressDrag","setPositionAsync","StyleSheet","absoluteFillObject","absoluteFill","styles","animatedContainer","i","abs","marginRight","header","footer","gridHandle","grid","clamp","lowerBound","upperBound","min","max","create","alignItems","flexDirection","displayName"],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport {\n Dimensions,\n Image,\n ImageStyle,\n Keyboard,\n Platform,\n StatusBar,\n StyleSheet,\n ViewStyle,\n} from 'react-native';\n\nimport {\n PanGestureHandler,\n PinchGestureHandler,\n TapGestureHandler,\n} from 'react-native-gesture-handler';\n\nimport Animated, {\n Easing,\n runOnJS,\n runOnUI,\n useAnimatedStyle,\n useDerivedValue,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated';\n\nimport { BottomSheetModal, BottomSheetModalProvider } from '@gorhom/bottom-sheet';\n\nimport type { UserResponse } from 'stream-chat';\n\nimport { AnimatedGalleryImage } from './components/AnimatedGalleryImage';\nimport { AnimatedGalleryVideo } from './components/AnimatedGalleryVideo';\nimport {\n ImageGalleryFooter,\n ImageGalleryFooterCustomComponentProps,\n} from './components/ImageGalleryFooter';\nimport {\n ImageGalleryHeader,\n ImageGalleryHeaderCustomComponentProps,\n} from './components/ImageGalleryHeader';\nimport { ImageGalleryOverlay } from './components/ImageGalleryOverlay';\nimport { ImageGalleryGridImageComponents, ImageGrid } from './components/ImageGrid';\nimport {\n ImageGalleryGridHandleCustomComponentProps,\n ImageGridHandle,\n} from './components/ImageGridHandle';\n\nimport { useImageGalleryGestures } from './hooks/useImageGalleryGestures';\n\nimport { useImageGalleryContext } from '../../contexts/imageGalleryContext/ImageGalleryContext';\nimport {\n OverlayProviderProps,\n useOverlayContext,\n} from '../../contexts/overlayContext/OverlayContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport {\n isVideoPackageAvailable,\n VideoPayloadData,\n VideoProgressData,\n VideoType,\n} from '../../native';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { getResizedImageUrl } from '../../utils/getResizedImageUrl';\nimport { getUrlOfImageAttachment } from '../../utils/getUrlOfImageAttachment';\nimport { vh, vw } from '../../utils/utils';\nimport { getGiphyMimeType } from '../Attachment/utils/getGiphyMimeType';\n\nconst isAndroid = Platform.OS === 'android';\nconst fullScreenHeight = Dimensions.get('screen').height;\nconst measuredScreenHeight = vh(100);\nconst screenWidth = vw(100);\nconst halfScreenWidth = vw(50);\nconst MARGIN = 32;\n\nexport enum HasPinched {\n FALSE = 0,\n TRUE,\n}\n\nexport enum IsSwiping {\n UNDETERMINED = 0,\n TRUE,\n FALSE,\n}\n\nexport type ImageGalleryCustomComponents<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n /**\n * Override props for following UI components, which are part of [image gallery](https://github.com/GetStream/stream-chat-react-native/wiki/Cookbook-v3.0#gallery-components).\n *\n * - [ImageGalleryFooter](#ImageGalleryFooter)\n *\n * - [ImageGrid](#ImageGrid)\n *\n * - [ImageGridHandle](#ImageGridHandle)\n *\n * - [ImageGalleryHeader](#ImageGalleryHeader)\n *\n * e.g.,\n *\n * ```js\n * {\n * footer: {\n * ShareIcon: CustomShareIconComponent\n * },\n * grid: {\n * avatarComponent: CustomAvatarComponent\n * },\n * gridHandle: {\n * centerComponent: CustomCenterComponent\n * },\n * header: {\n * CloseIcon: CustomCloseButtonComponent\n * },\n * }\n * ```\n * @overrideType object\n */\n imageGalleryCustomComponents?: {\n footer?: ImageGalleryFooterCustomComponentProps<StreamChatGenerics>;\n grid?: ImageGalleryGridImageComponents<StreamChatGenerics>;\n gridHandle?: ImageGalleryGridHandleCustomComponentProps;\n header?: ImageGalleryHeaderCustomComponentProps<StreamChatGenerics>;\n };\n};\n\ntype Props<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n ImageGalleryCustomComponents<StreamChatGenerics> & {\n overlayOpacity: Animated.SharedValue<number>;\n } & Pick<\n OverlayProviderProps<StreamChatGenerics>,\n | 'giphyVersion'\n | 'imageGalleryGridSnapPoints'\n | 'imageGalleryGridHandleHeight'\n | 'numberOfImageGalleryGridColumns'\n >;\n\nexport const ImageGallery = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: Props<StreamChatGenerics>,\n) => {\n const {\n giphyVersion = 'fixed_height',\n imageGalleryCustomComponents,\n imageGalleryGridHandleHeight,\n imageGalleryGridSnapPoints,\n numberOfImageGalleryGridColumns,\n overlayOpacity,\n } = props;\n const [paused, setPaused] = useState<boolean>(false);\n const [progress, setProgress] = useState<number>(0);\n const [duration, setDuration] = useState<number>(0);\n const {\n theme: {\n colors: { white_snow },\n imageGallery: { backgroundColor, pager, slide },\n },\n } = useTheme();\n const [gridPhotos, setGridPhotos] = useState<Photo<StreamChatGenerics>[]>([]);\n const { overlay, translucentStatusBar } = useOverlayContext();\n const { messages, selectedMessage, setSelectedMessage } =\n useImageGalleryContext<StreamChatGenerics>();\n\n /**\n * Height constants\n */\n const statusBarHeight = StatusBar.currentHeight ?? 0;\n const bottomBarHeight = fullScreenHeight - measuredScreenHeight - statusBarHeight;\n const androidScreenHeightAdjustment = translucentStatusBar\n ? bottomBarHeight === statusBarHeight || bottomBarHeight < 0\n ? 0\n : statusBarHeight\n : bottomBarHeight === statusBarHeight || bottomBarHeight < 0\n ? -statusBarHeight\n : 0;\n const screenHeight = isAndroid\n ? Dimensions.get('window').height + androidScreenHeightAdjustment\n : vh(100);\n const halfScreenHeight = screenHeight / 2;\n const quarterScreenHeight = screenHeight / 4;\n const snapPoints = React.useMemo(\n () => [(screenHeight * 3) / 4, screenHeight - (imageGalleryGridHandleHeight ?? 40)],\n [],\n );\n\n /**\n * BottomSheetModal ref\n */\n const bottomSheetModalRef = useRef<BottomSheetModal>(null);\n\n /**\n * BottomSheetModal state\n */\n const [currentBottomSheetIndex, setCurrentBottomSheetIndex] = useState(0);\n const animatedBottomSheetIndex = useSharedValue(0);\n\n /**\n * Fade animation for screen, it is always rendered with pointerEvents\n * set to none for fast opening\n */\n const screenTranslateY = useSharedValue(screenHeight);\n const showScreen = () => {\n 'worklet';\n screenTranslateY.value = withTiming(0, {\n duration: 250,\n easing: Easing.out(Easing.ease),\n });\n };\n\n /**\n * Run the fade animation on visible change\n */\n useEffect(() => {\n Keyboard.dismiss();\n showScreen();\n }, []);\n\n /**\n * Image height from URL or default to full screen height\n */\n const [currentImageHeight, setCurrentImageHeight] = useState<number>(screenHeight);\n\n /**\n * JS and UI index values, the JS follows the UI but is needed\n * for rendering the virtualized image list\n */\n const [selectedIndex, setSelectedIndex] = useState(0);\n const index = useSharedValue(0);\n\n /**\n * Header visible value for animating in out\n */\n const headerFooterVisible = useSharedValue(1);\n\n /**\n * Gesture handler refs\n */\n const doubleTapRef = useRef<TapGestureHandler>(null);\n const panRef = useRef<PanGestureHandler>(null);\n const pinchRef = useRef<PinchGestureHandler>(null);\n const singleTapRef = useRef<TapGestureHandler>(null);\n\n /**\n * Shared values for movement\n */\n const translateX = useSharedValue(0);\n const translateY = useSharedValue(0);\n const offsetScale = useSharedValue(1);\n const scale = useSharedValue(1);\n const translationX = useSharedValue(0);\n\n /**\n * Photos array created from all currently available\n * photo attachments\n */\n\n const photos = messages.reduce((acc: Photo<StreamChatGenerics>[], cur) => {\n const attachmentImages =\n cur.attachments\n ?.filter(\n (attachment) =>\n (attachment.type === 'giphy' &&\n (attachment.giphy?.[giphyVersion]?.url ||\n attachment.thumb_url ||\n attachment.image_url)) ||\n (attachment.type === 'image' &&\n !attachment.title_link &&\n !attachment.og_scrape_url &&\n getUrlOfImageAttachment(attachment)) ||\n (isVideoPackageAvailable() && attachment.type === 'video'),\n )\n .reverse() || [];\n\n const attachmentPhotos = attachmentImages.map((a) => {\n const imageUrl = getUrlOfImageAttachment(a) as string;\n const giphyURL = a.giphy?.[giphyVersion]?.url || a.thumb_url || a.image_url;\n\n return {\n channelId: cur.cid,\n created_at: cur.created_at,\n id: `photoId-${cur.id}-${imageUrl}`,\n messageId: cur.id,\n mime_type: a.type === 'giphy' ? getGiphyMimeType(giphyURL ?? '') : a.mime_type,\n original_height: a.original_height,\n original_width: a.original_width,\n type: a.type,\n uri:\n a.type === 'giphy'\n ? giphyURL\n : getResizedImageUrl({\n height: screenHeight,\n url: imageUrl,\n width: screenWidth,\n }),\n user: cur.user,\n user_id: cur.user_id,\n };\n });\n\n return [...attachmentPhotos, ...acc] as Photo<StreamChatGenerics>[];\n }, []);\n\n /**\n * Photos length needs to be kept as a const here so if the length\n * changes it causes the pan gesture handler function to refresh. This\n * does not work if the calculation for the length of the array is left\n * inside the gesture handler as it will have an array as a dependency\n */\n const photoLength = photos.length;\n\n /**\n * The URL for the images may differ because of dimensions passed as\n * part of the query.\n */\n const stripQueryFromUrl = (url: string) => url.split('?')[0];\n\n /**\n * Set selected photo when changed via pressing in the message list\n */\n useEffect(() => {\n const updatePosition = (newIndex: number) => {\n 'worklet';\n\n if (newIndex > -1) {\n index.value = newIndex;\n translationX.value = -(screenWidth + MARGIN) * newIndex;\n runOnJS(setSelectedIndex)(newIndex);\n }\n };\n\n const newIndex = photos.findIndex(\n (photo) =>\n photo.messageId === selectedMessage?.messageId &&\n stripQueryFromUrl(photo.uri) === stripQueryFromUrl(selectedMessage?.url || ''),\n );\n\n if (photoLength > 1) {\n setPaused(true);\n }\n\n runOnUI(updatePosition)(newIndex);\n }, [selectedMessage, photoLength]);\n\n /**\n * Image heights are not provided and therefore need to be calculated.\n * We start by allowing the image to be the full height then reduce it\n * to the proper scaled height based on the width being restricted to the\n * screen width when the dimensions are received.\n */\n const uriForCurrentImage = photos[selectedIndex]?.uri;\n useEffect(() => {\n setCurrentImageHeight(screenHeight);\n const photo = photos[index.value];\n const height = photo?.original_height;\n const width = photo?.original_width;\n\n if (height && width) {\n const imageHeight = Math.floor(height * (screenWidth / width));\n setCurrentImageHeight(imageHeight > screenHeight ? screenHeight : imageHeight);\n } else if (photo?.uri) {\n if (photo.type === 'image') {\n Image.getSize(photo.uri, (width, height) => {\n const imageHeight = Math.floor(height * (screenWidth / width));\n setCurrentImageHeight(imageHeight > screenHeight ? screenHeight : imageHeight);\n });\n }\n }\n }, [uriForCurrentImage]);\n\n const { onDoubleTap, onPan, onPinch, onSingleTap } = useImageGalleryGestures({\n currentImageHeight,\n halfScreenHeight,\n halfScreenWidth,\n headerFooterVisible,\n offsetScale,\n overlayOpacity,\n photoLength,\n scale,\n screenHeight,\n screenWidth,\n selectedIndex,\n setSelectedIndex,\n translateX,\n translateY,\n translationX,\n });\n\n /**\n * If the header is visible we scale down the opacity of it as the\n * image is swiped downward\n */\n const headerFooterOpacity = useDerivedValue(\n () =>\n currentImageHeight * scale.value < screenHeight && translateY.value > 0\n ? 1 - translateY.value / quarterScreenHeight\n : currentImageHeight * scale.value > screenHeight &&\n translateY.value > (currentImageHeight / 2) * scale.value - halfScreenHeight\n ? 1 -\n (translateY.value - ((currentImageHeight / 2) * scale.value - halfScreenHeight)) /\n quarterScreenHeight\n : 1,\n [currentImageHeight],\n );\n\n /**\n * This transition and scaleX reverse lets use scroll left\n */\n const pagerStyle = useAnimatedStyle<ImageStyle>(\n () => ({\n transform: [\n { scaleX: -1 },\n {\n translateX: translationX.value,\n },\n ],\n }),\n [],\n );\n\n /**\n * Simple background color animation on Y movement\n */\n const containerBackground = useAnimatedStyle<ViewStyle>(\n () => ({\n backgroundColor: backgroundColor || white_snow,\n opacity: headerFooterOpacity.value,\n }),\n [headerFooterOpacity],\n );\n\n /**\n * Show screen style as component is always rendered we hide it\n * down and up and set opacity to 0 for good measure\n */\n const showScreenStyle = useAnimatedStyle<ViewStyle>(\n () => ({\n transform: [\n {\n translateY: screenTranslateY.value,\n },\n ],\n }),\n [],\n );\n\n /**\n * Functions toclose BottomSheetModal with image grid\n */\n const closeGridView = () => {\n if (bottomSheetModalRef.current?.close) {\n bottomSheetModalRef.current.close();\n setGridPhotos([]);\n }\n };\n\n /**\n * Function to open BottomSheetModal with image grid\n */\n const openGridView = () => {\n if (bottomSheetModalRef.current?.present) {\n bottomSheetModalRef.current.present();\n setGridPhotos(photos);\n }\n };\n\n const videoRef = useRef<VideoType>(null);\n\n const handleEnd = () => {\n setPaused(true);\n setProgress(1);\n };\n\n const handleLoad = (payload: VideoPayloadData) => {\n if (payload.duration) setDuration(payload.duration);\n };\n\n const handleProgress = (data: VideoProgressData) => {\n if (data.currentTime && data.seekableDuration) {\n setProgress(data.currentTime / data.seekableDuration);\n }\n };\n\n const handlePlayPause = (status?: boolean) => {\n if (status === undefined) {\n // React Native Video for RN CLI has seek as an API to move to a particular location in the video\n if (progress === 1 && videoRef.current && videoRef.current.seek) {\n videoRef.current.seek(0);\n }\n // Expo AV for Expo has replayAsync as an API to move to a starting of the video\n if (progress === 1 && videoRef.current && videoRef.current.replayAsync) {\n videoRef.current.replayAsync();\n }\n\n setPaused((state) => !state);\n } else {\n setPaused(status);\n }\n };\n\n const onProgressDrag = (progress: number) => {\n // React Native Video for RN CLI has seek as an API to move to a particular location in the video\n if (videoRef.current && videoRef.current.seek) {\n videoRef.current.seek(progress);\n }\n\n // Expo AV for Expo has setPositionAsync as an API to move to a particular location of the video\n if (videoRef.current && videoRef.current.setPositionAsync) {\n videoRef.current.setPositionAsync(progress * 1000);\n }\n };\n\n return (\n <Animated.View\n accessibilityLabel='Image Gallery'\n pointerEvents={'auto'}\n style={[StyleSheet.absoluteFillObject, showScreenStyle]}\n >\n <Animated.View style={[StyleSheet.absoluteFillObject, containerBackground]} />\n <TapGestureHandler\n minPointers={1}\n numberOfTaps={1}\n onGestureEvent={onSingleTap}\n ref={singleTapRef}\n waitFor={[panRef, pinchRef, doubleTapRef]}\n >\n <Animated.View style={StyleSheet.absoluteFillObject}>\n <TapGestureHandler\n maxDeltaX={8}\n maxDeltaY={8}\n maxDist={8}\n minPointers={1}\n numberOfTaps={2}\n onGestureEvent={onDoubleTap}\n ref={doubleTapRef}\n >\n <Animated.View style={StyleSheet.absoluteFillObject}>\n <PinchGestureHandler\n onGestureEvent={onPinch}\n ref={pinchRef}\n simultaneousHandlers={[panRef]}\n >\n <Animated.View style={StyleSheet.absoluteFill}>\n <PanGestureHandler\n enabled={overlay === 'gallery'}\n maxPointers={isAndroid ? undefined : 1}\n minDist={10}\n onGestureEvent={onPan}\n ref={panRef}\n simultaneousHandlers={[pinchRef]}\n >\n <Animated.View style={StyleSheet.absoluteFill}>\n <Animated.View\n style={[\n styles.animatedContainer,\n pagerStyle,\n pager,\n {\n transform: [\n { scaleX: -1 }, // Also only here for opening, wrong direction when not included\n {\n translateX: translationX.value, // Only here for opening, wrong index when this is not included\n },\n ],\n },\n ]}\n >\n {photos.map((photo, i) =>\n photo.type === 'video' ? (\n <AnimatedGalleryVideo\n handleEnd={handleEnd}\n handleLoad={handleLoad}\n handleProgress={handleProgress}\n index={i}\n key={`${photo.uri}-${i}`}\n offsetScale={offsetScale}\n paused={paused}\n previous={selectedIndex > i}\n scale={scale}\n screenHeight={screenHeight}\n selected={selectedIndex === i}\n shouldRender={Math.abs(selectedIndex - i) < 4}\n source={{ uri: photo.uri }}\n style={[\n {\n height: screenHeight * 8,\n marginRight: MARGIN,\n width: screenWidth * 8,\n },\n slide,\n ]}\n translateX={translateX}\n translateY={translateY}\n videoRef={videoRef}\n />\n ) : (\n <AnimatedGalleryImage\n accessibilityLabel={'Image Item'}\n index={i}\n key={`${photo.uri}-${i}`}\n offsetScale={offsetScale}\n photo={photo}\n previous={selectedIndex > i}\n scale={scale}\n screenHeight={screenHeight}\n selected={selectedIndex === i}\n shouldRender={Math.abs(selectedIndex - i) < 4}\n style={[\n {\n height: screenHeight * 8,\n marginRight: MARGIN,\n width: screenWidth * 8,\n },\n slide,\n ]}\n translateX={translateX}\n translateY={translateY}\n />\n ),\n )}\n </Animated.View>\n </Animated.View>\n </PanGestureHandler>\n </Animated.View>\n </PinchGestureHandler>\n </Animated.View>\n </TapGestureHandler>\n </Animated.View>\n </TapGestureHandler>\n <ImageGalleryHeader<StreamChatGenerics>\n opacity={headerFooterOpacity}\n photo={photos[selectedIndex]}\n visible={headerFooterVisible}\n {...imageGalleryCustomComponents?.header}\n />\n <ImageGalleryFooter<StreamChatGenerics>\n accessibilityLabel={'Image Gallery Footer'}\n duration={duration}\n onPlayPause={handlePlayPause}\n onProgressDrag={onProgressDrag}\n opacity={headerFooterOpacity}\n openGridView={openGridView}\n paused={paused}\n photo={photos[selectedIndex]}\n photoLength={photoLength}\n progress={progress}\n selectedIndex={selectedIndex}\n visible={headerFooterVisible}\n {...imageGalleryCustomComponents?.footer}\n />\n\n <ImageGalleryOverlay\n animatedBottomSheetIndex={animatedBottomSheetIndex}\n closeGridView={closeGridView}\n currentBottomSheetIndex={currentBottomSheetIndex}\n />\n <BottomSheetModalProvider>\n <BottomSheetModal\n animatedIndex={animatedBottomSheetIndex}\n enablePanDownToClose={true}\n handleComponent={() => (\n <ImageGridHandle\n closeGridView={closeGridView}\n {...imageGalleryCustomComponents?.gridHandle}\n />\n )}\n handleHeight={imageGalleryGridHandleHeight ?? 40}\n index={0}\n onChange={(index: number) => setCurrentBottomSheetIndex(index)}\n ref={bottomSheetModalRef}\n snapPoints={imageGalleryGridSnapPoints || snapPoints}\n >\n <ImageGrid\n closeGridView={closeGridView}\n numberOfImageGalleryGridColumns={numberOfImageGalleryGridColumns}\n photos={gridPhotos}\n setSelectedMessage={setSelectedMessage}\n {...imageGalleryCustomComponents?.grid}\n />\n </BottomSheetModal>\n </BottomSheetModalProvider>\n </Animated.View>\n );\n};\n\n/**\n * Clamping worklet to clamp the scaling\n */\nexport const clamp = (value: number, lowerBound: number, upperBound: number) => {\n 'worklet';\n return Math.min(Math.max(lowerBound, value), upperBound);\n};\n\nconst styles = StyleSheet.create({\n animatedContainer: {\n alignItems: 'center',\n flexDirection: 'row',\n },\n});\n\nexport type Photo<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n id: string;\n uri: string;\n channelId?: string;\n created_at?: string | Date;\n messageId?: string;\n mime_type?: string;\n original_height?: number;\n original_width?: number;\n type?: string;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nImageGallery.displayName = 'ImageGallery{imageGallery}';\n"]}
|