@sendbird/uikit-utils 2.0.0 → 2.0.2

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.
@@ -8,6 +8,9 @@ var _exportNames = {
8
8
  ASYNC_NOOP: true,
9
9
  PASS: true,
10
10
  toMegabyte: true,
11
+ isFunction: true,
12
+ SBErrorCode: true,
13
+ SBErrorMessage: true,
11
14
  Logger: true,
12
15
  arrayToMap: true,
13
16
  arrayToMapWithGetter: true,
@@ -24,16 +27,23 @@ var _exportNames = {
24
27
  replaceUrlAsComponents: true,
25
28
  normalizeFileName: true,
26
29
  emailRegex: true,
27
- phoneRegex: true
30
+ phoneRegex: true,
31
+ BufferedRequest: true
28
32
  };
29
33
  exports.ASYNC_NOOP = void 0;
34
+ Object.defineProperty(exports, "BufferedRequest", {
35
+ enumerable: true,
36
+ get: function () {
37
+ return _bufferedRequest.BufferedRequest;
38
+ }
39
+ });
30
40
  Object.defineProperty(exports, "Logger", {
31
41
  enumerable: true,
32
42
  get: function () {
33
43
  return _logger.Logger;
34
44
  }
35
45
  });
36
- exports.PASS = exports.NOOP = void 0;
46
+ exports.SBErrorMessage = exports.SBErrorCode = exports.PASS = exports.NOOP = void 0;
37
47
  Object.defineProperty(exports, "arrayToMap", {
38
48
  enumerable: true,
39
49
  get: function () {
@@ -88,6 +98,7 @@ Object.defineProperty(exports, "imageExtRegex", {
88
98
  return _regex.imageExtRegex;
89
99
  }
90
100
  });
101
+ exports.isFunction = void 0;
91
102
  Object.defineProperty(exports, "newLineRegex", {
92
103
  enumerable: true,
93
104
  get: function () {
@@ -142,6 +153,8 @@ var _conditionChaining = _interopRequireDefault(require("./shared/conditionChain
142
153
 
143
154
  var _regex = require("./shared/regex");
144
155
 
156
+ var _bufferedRequest = require("./shared/bufferedRequest");
157
+
145
158
  var _hooks = require("./hooks");
146
159
 
147
160
  Object.keys(_hooks).forEach(function (key) {
@@ -247,4 +260,16 @@ exports.PASS = PASS;
247
260
  const toMegabyte = byte => byte / 1024 / 1024;
248
261
 
249
262
  exports.toMegabyte = toMegabyte;
263
+
264
+ const isFunction = param => typeof param === 'function';
265
+
266
+ exports.isFunction = isFunction;
267
+ const SBErrorCode = {
268
+ NON_AUTHORIZED: 400108
269
+ };
270
+ exports.SBErrorCode = SBErrorCode;
271
+ const SBErrorMessage = {
272
+ ACL: "An error occurred because you don't have access to the user list in your application.\n" + 'In order to gain access, you can turn on this attribute in the Access Control List settings on Sendbird Dashboard.'
273
+ };
274
+ exports.SBErrorMessage = SBErrorMessage;
250
275
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NOOP","ASYNC_NOOP","PASS","val","toMegabyte","byte"],"sources":["index.ts"],"sourcesContent":["export { Logger } from './shared/logger';\nexport { default as arrayToMap, arrayToMapWithGetter } from './shared/arrayToMap';\nexport { createPubSub } from './shared/pubsub';\nexport { default as conditionChaining } from './shared/conditionChaining';\nexport {\n urlRegexStrict,\n urlRegexRough,\n newLineRegex,\n audioExtRegex,\n videoExtRegex,\n imageExtRegex,\n getFileType,\n getFileExtension,\n replaceUrlAsComponents,\n normalizeFileName,\n emailRegex,\n phoneRegex,\n} from './shared/regex';\n\nexport * from './hooks';\nexport * from './ui-format/groupChannel';\nexport * from './ui-format/common';\nexport * from './sendbird/channel';\nexport * from './sendbird/message';\nexport * from './sendbird/attrs';\n\nexport const NOOP: () => void = () => void 0;\nexport const ASYNC_NOOP = async () => void 0;\nexport const PASS = <T>(val: T) => val;\nexport const toMegabyte = (byte: number) => byte / 1024 / 1024;\n\nexport type {\n FilterByValueType,\n UnionToIntersection,\n OmittedValues,\n PartialDeep,\n Optional,\n ContextValue,\n SendbirdMessage,\n SendbirdChatSDK,\n SendbirdChannel,\n SendbirdBaseChannel,\n SendbirdGroupChannel,\n SendbirdOpenChannel,\n SendbirdUser,\n SendbirdMember,\n SendbirdBaseMessage,\n SendbirdUserMessage,\n SendbirdFileMessage,\n SendbirdAdminMessage,\n SendbirdGroupChannelCreateParams,\n SendbirdFileMessageCreateParams,\n SendbirdUserMessageCreateParams,\n SendbirdError,\n SendbirdMessageCollection,\n SendbirdGroupChannelCollection,\n NotificationFiles,\n NotificationMentionedUsers,\n NotificationTranslations,\n PartialNullable,\n SendbirdDataPayload,\n SendbirdPreviousMessageListQuery,\n SendbirdSendableMessage,\n SendbirdGroupChannelListQuery,\n SendbirdGroupChannelUpdateParams,\n SendbirdUserMessageUpdateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdUserUpdateParams,\n} from './types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAeA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;;;;;;;AAEO,MAAMA,IAAgB,GAAG,MAAM,KAAK,CAApC;;;;AACA,MAAMC,UAAU,GAAG,YAAY,KAAK,CAApC;;;;AACA,MAAMC,IAAI,GAAOC,GAAJ,IAAeA,GAA5B;;;;AACA,MAAMC,UAAU,GAAIC,IAAD,IAAkBA,IAAI,GAAG,IAAP,GAAc,IAAnD"}
1
+ {"version":3,"names":["NOOP","ASYNC_NOOP","PASS","val","toMegabyte","byte","isFunction","param","SBErrorCode","NON_AUTHORIZED","SBErrorMessage","ACL"],"sources":["index.ts"],"sourcesContent":["export { Logger } from './shared/logger';\nexport { default as arrayToMap, arrayToMapWithGetter } from './shared/arrayToMap';\nexport { createPubSub } from './shared/pubsub';\nexport { default as conditionChaining } from './shared/conditionChaining';\nexport {\n urlRegexStrict,\n urlRegexRough,\n newLineRegex,\n audioExtRegex,\n videoExtRegex,\n imageExtRegex,\n getFileType,\n getFileExtension,\n replaceUrlAsComponents,\n normalizeFileName,\n emailRegex,\n phoneRegex,\n} from './shared/regex';\nexport { BufferedRequest } from './shared/bufferedRequest';\n\nexport * from './hooks';\nexport * from './ui-format/groupChannel';\nexport * from './ui-format/common';\nexport * from './sendbird/channel';\nexport * from './sendbird/message';\nexport * from './sendbird/attrs';\n\nexport const NOOP: () => void = () => void 0;\nexport const ASYNC_NOOP = async () => void 0;\nexport const PASS = <T>(val: T) => val;\nexport const toMegabyte = (byte: number) => byte / 1024 / 1024;\nexport const isFunction = <T>(param?: T): param is NonNullable<T> => typeof param === 'function';\nexport const SBErrorCode = {\n NON_AUTHORIZED: 400108,\n};\nexport const SBErrorMessage = {\n ACL:\n \"An error occurred because you don't have access to the user list in your application.\\n\" +\n 'In order to gain access, you can turn on this attribute in the Access Control List settings on Sendbird Dashboard.',\n};\n\nexport type {\n FilterByValueType,\n UnionToIntersection,\n OmittedValues,\n PartialDeep,\n Optional,\n ContextValue,\n SendbirdMessage,\n SendbirdChatSDK,\n SendbirdChannel,\n SendbirdBaseChannel,\n SendbirdGroupChannel,\n SendbirdOpenChannel,\n SendbirdUser,\n SendbirdMember,\n SendbirdBaseMessage,\n SendbirdUserMessage,\n SendbirdFileMessage,\n SendbirdAdminMessage,\n SendbirdGroupChannelCreateParams,\n SendbirdFileMessageCreateParams,\n SendbirdUserMessageCreateParams,\n SendbirdError,\n SendbirdMessageCollection,\n SendbirdGroupChannelCollection,\n NotificationFiles,\n NotificationMentionedUsers,\n NotificationTranslations,\n PartialNullable,\n SendbirdDataPayload,\n SendbirdPreviousMessageListQuery,\n SendbirdSendableMessage,\n SendbirdGroupChannelListQuery,\n SendbirdGroupChannelUpdateParams,\n SendbirdUserMessageUpdateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdUserUpdateParams,\n} from './types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAcA;;AAEA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;;;;;;;AAEO,MAAMA,IAAgB,GAAG,MAAM,KAAK,CAApC;;;;AACA,MAAMC,UAAU,GAAG,YAAY,KAAK,CAApC;;;;AACA,MAAMC,IAAI,GAAOC,GAAJ,IAAeA,GAA5B;;;;AACA,MAAMC,UAAU,GAAIC,IAAD,IAAkBA,IAAI,GAAG,IAAP,GAAc,IAAnD;;;;AACA,MAAMC,UAAU,GAAOC,KAAJ,IAA2C,OAAOA,KAAP,KAAiB,UAA/E;;;AACA,MAAMC,WAAW,GAAG;EACzBC,cAAc,EAAE;AADS,CAApB;;AAGA,MAAMC,cAAc,GAAG;EAC5BC,GAAG,EACD,4FACA;AAH0B,CAAvB"}
@@ -11,6 +11,8 @@ exports.isDefaultCoverImage = isDefaultCoverImage;
11
11
  exports.isDifferentChannel = isDifferentChannel;
12
12
  exports.isGroupChannelChatUnavailable = void 0;
13
13
 
14
+ var _bufferedRequest = require("../shared/bufferedRequest");
15
+
14
16
  /**
15
17
  * Diff utils for channel
16
18
  * @param {SendbirdBaseChannel} [a]
@@ -28,17 +30,14 @@ const isGroupChannelChatUnavailable = channel => {
28
30
 
29
31
  exports.isGroupChannelChatUnavailable = isGroupChannelChatUnavailable;
30
32
 
31
- const confirmAndMarkAsRead = async (sdk, channels) => {
32
- const channelUrls = channels.filter(it => it.isGroupChannel() && it.unreadMessageCount > 0).map(it => it.url);
33
- await sdk.groupChannel.markAsReadWithChannelUrls(channelUrls);
33
+ const confirmAndMarkAsRead = async channels => {
34
+ channels.filter(it => it.isGroupChannel() && it.unreadMessageCount > 0).forEach(it => _bufferedRequest.BufferedRequest.markAsRead.push(() => it.markAsRead()));
34
35
  };
35
36
 
36
37
  exports.confirmAndMarkAsRead = confirmAndMarkAsRead;
37
38
 
38
- const confirmAndMarkAsDelivered = async (sdk, channel) => {
39
- if (channel.isGroupChannel() && channel.unreadMessageCount > 0) {
40
- await sdk.groupChannel.markAsDelivered(channel.url);
41
- }
39
+ const confirmAndMarkAsDelivered = async channels => {
40
+ channels.filter(it => it.isGroupChannel() && it.unreadMessageCount > 0).forEach(it => _bufferedRequest.BufferedRequest.markAsDelivered.push(() => it.markAsDelivered()));
42
41
  };
43
42
 
44
43
  exports.confirmAndMarkAsDelivered = confirmAndMarkAsDelivered;
@@ -1 +1 @@
1
- {"version":3,"names":["isDifferentChannel","a","b","url","isGroupChannelChatUnavailable","channel","myMutedState","isFrozen","myRole","confirmAndMarkAsRead","sdk","channels","channelUrls","filter","it","isGroupChannel","unreadMessageCount","map","groupChannel","markAsReadWithChannelUrls","confirmAndMarkAsDelivered","markAsDelivered","isDefaultCoverImage","coverUrl","startsWith","getMembersExcludeMe","currentUserId","members","m","userId","getGroupChannels","c","getOpenChannels","isOpenChannel"],"sources":["channel.ts"],"sourcesContent":["import type {\n SendbirdBaseChannel,\n SendbirdChannel,\n SendbirdChatSDK,\n SendbirdGroupChannel,\n SendbirdOpenChannel,\n} from '../types';\n\n/**\n * Diff utils for channel\n * @param {SendbirdBaseChannel} [a]\n * @param {SendbirdBaseChannel} [b]\n * @returns {boolean}\n * */\nexport function isDifferentChannel<T extends SendbirdBaseChannel>(a?: T, b?: T): boolean {\n if (!a || !b) return true;\n return a.url !== b.url;\n}\n\nexport const isGroupChannelChatUnavailable = (channel: SendbirdGroupChannel) => {\n return channel.myMutedState === 'muted' || (channel.isFrozen && channel.myRole !== 'operator');\n};\n\nexport const confirmAndMarkAsRead = async (sdk: SendbirdChatSDK, channels: SendbirdBaseChannel[]) => {\n const channelUrls = channels.filter((it) => it.isGroupChannel() && it.unreadMessageCount > 0).map((it) => it.url);\n await sdk.groupChannel.markAsReadWithChannelUrls(channelUrls);\n};\n\nexport const confirmAndMarkAsDelivered = async (sdk: SendbirdChatSDK, channel: SendbirdBaseChannel) => {\n if (channel.isGroupChannel() && channel.unreadMessageCount > 0) {\n await sdk.groupChannel.markAsDelivered(channel.url);\n }\n};\n\nexport function isDefaultCoverImage(coverUrl: string) {\n return coverUrl === '' || coverUrl.startsWith('https://static.sendbird.com/sample/cover');\n}\n\nexport function getMembersExcludeMe(channel: SendbirdGroupChannel, currentUserId?: string) {\n return channel.members.filter((m) => m.userId !== currentUserId);\n}\n\nexport function getGroupChannels(channels: SendbirdChannel[]): SendbirdGroupChannel[] {\n return channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());\n}\n\nexport function getOpenChannels(channels: SendbirdChannel[]): SendbirdOpenChannel[] {\n return channels.filter((c): c is SendbirdOpenChannel => c.isOpenChannel());\n}\n"],"mappings":";;;;;;;;;;;;;AAQA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,kBAAT,CAA2DC,CAA3D,EAAkEC,CAAlE,EAAkF;EACvF,IAAI,CAACD,CAAD,IAAM,CAACC,CAAX,EAAc,OAAO,IAAP;EACd,OAAOD,CAAC,CAACE,GAAF,KAAUD,CAAC,CAACC,GAAnB;AACD;;AAEM,MAAMC,6BAA6B,GAAIC,OAAD,IAAmC;EAC9E,OAAOA,OAAO,CAACC,YAAR,KAAyB,OAAzB,IAAqCD,OAAO,CAACE,QAAR,IAAoBF,OAAO,CAACG,MAAR,KAAmB,UAAnF;AACD,CAFM;;;;AAIA,MAAMC,oBAAoB,GAAG,OAAOC,GAAP,EAA6BC,QAA7B,KAAiE;EACnG,MAAMC,WAAW,GAAGD,QAAQ,CAACE,MAAT,CAAiBC,EAAD,IAAQA,EAAE,CAACC,cAAH,MAAuBD,EAAE,CAACE,kBAAH,GAAwB,CAAvE,EAA0EC,GAA1E,CAA+EH,EAAD,IAAQA,EAAE,CAACX,GAAzF,CAApB;EACA,MAAMO,GAAG,CAACQ,YAAJ,CAAiBC,yBAAjB,CAA2CP,WAA3C,CAAN;AACD,CAHM;;;;AAKA,MAAMQ,yBAAyB,GAAG,OAAOV,GAAP,EAA6BL,OAA7B,KAA8D;EACrG,IAAIA,OAAO,CAACU,cAAR,MAA4BV,OAAO,CAACW,kBAAR,GAA6B,CAA7D,EAAgE;IAC9D,MAAMN,GAAG,CAACQ,YAAJ,CAAiBG,eAAjB,CAAiChB,OAAO,CAACF,GAAzC,CAAN;EACD;AACF,CAJM;;;;AAMA,SAASmB,mBAAT,CAA6BC,QAA7B,EAA+C;EACpD,OAAOA,QAAQ,KAAK,EAAb,IAAmBA,QAAQ,CAACC,UAAT,CAAoB,0CAApB,CAA1B;AACD;;AAEM,SAASC,mBAAT,CAA6BpB,OAA7B,EAA4DqB,aAA5D,EAAoF;EACzF,OAAOrB,OAAO,CAACsB,OAAR,CAAgBd,MAAhB,CAAwBe,CAAD,IAAOA,CAAC,CAACC,MAAF,KAAaH,aAA3C,CAAP;AACD;;AAEM,SAASI,gBAAT,CAA0BnB,QAA1B,EAA+E;EACpF,OAAOA,QAAQ,CAACE,MAAT,CAAiBkB,CAAD,IAAkCA,CAAC,CAAChB,cAAF,EAAlD,CAAP;AACD;;AAEM,SAASiB,eAAT,CAAyBrB,QAAzB,EAA6E;EAClF,OAAOA,QAAQ,CAACE,MAAT,CAAiBkB,CAAD,IAAiCA,CAAC,CAACE,aAAF,EAAjD,CAAP;AACD"}
1
+ {"version":3,"names":["isDifferentChannel","a","b","url","isGroupChannelChatUnavailable","channel","myMutedState","isFrozen","myRole","confirmAndMarkAsRead","channels","filter","it","isGroupChannel","unreadMessageCount","forEach","BufferedRequest","markAsRead","push","confirmAndMarkAsDelivered","markAsDelivered","isDefaultCoverImage","coverUrl","startsWith","getMembersExcludeMe","currentUserId","members","m","userId","getGroupChannels","c","getOpenChannels","isOpenChannel"],"sources":["channel.ts"],"sourcesContent":["import { BufferedRequest } from '../shared/bufferedRequest';\nimport type { SendbirdBaseChannel, SendbirdChannel, SendbirdGroupChannel, SendbirdOpenChannel } from '../types';\n\n/**\n * Diff utils for channel\n * @param {SendbirdBaseChannel} [a]\n * @param {SendbirdBaseChannel} [b]\n * @returns {boolean}\n * */\nexport function isDifferentChannel<T extends SendbirdBaseChannel>(a?: T, b?: T): boolean {\n if (!a || !b) return true;\n return a.url !== b.url;\n}\n\nexport const isGroupChannelChatUnavailable = (channel: SendbirdGroupChannel) => {\n return channel.myMutedState === 'muted' || (channel.isFrozen && channel.myRole !== 'operator');\n};\n\nexport const confirmAndMarkAsRead = async (channels: SendbirdBaseChannel[]) => {\n channels\n .filter((it): it is SendbirdGroupChannel => it.isGroupChannel() && it.unreadMessageCount > 0)\n .forEach((it) => BufferedRequest.markAsRead.push(() => it.markAsRead()));\n};\n\nexport const confirmAndMarkAsDelivered = async (channels: SendbirdBaseChannel[]) => {\n channels\n .filter((it): it is SendbirdGroupChannel => it.isGroupChannel() && it.unreadMessageCount > 0)\n .forEach((it) => BufferedRequest.markAsDelivered.push(() => it.markAsDelivered()));\n};\n\nexport function isDefaultCoverImage(coverUrl: string) {\n return coverUrl === '' || coverUrl.startsWith('https://static.sendbird.com/sample/cover');\n}\n\nexport function getMembersExcludeMe(channel: SendbirdGroupChannel, currentUserId?: string) {\n return channel.members.filter((m) => m.userId !== currentUserId);\n}\n\nexport function getGroupChannels(channels: SendbirdChannel[]): SendbirdGroupChannel[] {\n return channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());\n}\n\nexport function getOpenChannels(channels: SendbirdChannel[]): SendbirdOpenChannel[] {\n return channels.filter((c): c is SendbirdOpenChannel => c.isOpenChannel());\n}\n"],"mappings":";;;;;;;;;;;;;AAAA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,kBAAT,CAA2DC,CAA3D,EAAkEC,CAAlE,EAAkF;EACvF,IAAI,CAACD,CAAD,IAAM,CAACC,CAAX,EAAc,OAAO,IAAP;EACd,OAAOD,CAAC,CAACE,GAAF,KAAUD,CAAC,CAACC,GAAnB;AACD;;AAEM,MAAMC,6BAA6B,GAAIC,OAAD,IAAmC;EAC9E,OAAOA,OAAO,CAACC,YAAR,KAAyB,OAAzB,IAAqCD,OAAO,CAACE,QAAR,IAAoBF,OAAO,CAACG,MAAR,KAAmB,UAAnF;AACD,CAFM;;;;AAIA,MAAMC,oBAAoB,GAAG,MAAOC,QAAP,IAA2C;EAC7EA,QAAQ,CACLC,MADH,CACWC,EAAD,IAAoCA,EAAE,CAACC,cAAH,MAAuBD,EAAE,CAACE,kBAAH,GAAwB,CAD7F,EAEGC,OAFH,CAEYH,EAAD,IAAQI,gCAAA,CAAgBC,UAAhB,CAA2BC,IAA3B,CAAgC,MAAMN,EAAE,CAACK,UAAH,EAAtC,CAFnB;AAGD,CAJM;;;;AAMA,MAAME,yBAAyB,GAAG,MAAOT,QAAP,IAA2C;EAClFA,QAAQ,CACLC,MADH,CACWC,EAAD,IAAoCA,EAAE,CAACC,cAAH,MAAuBD,EAAE,CAACE,kBAAH,GAAwB,CAD7F,EAEGC,OAFH,CAEYH,EAAD,IAAQI,gCAAA,CAAgBI,eAAhB,CAAgCF,IAAhC,CAAqC,MAAMN,EAAE,CAACQ,eAAH,EAA3C,CAFnB;AAGD,CAJM;;;;AAMA,SAASC,mBAAT,CAA6BC,QAA7B,EAA+C;EACpD,OAAOA,QAAQ,KAAK,EAAb,IAAmBA,QAAQ,CAACC,UAAT,CAAoB,0CAApB,CAA1B;AACD;;AAEM,SAASC,mBAAT,CAA6BnB,OAA7B,EAA4DoB,aAA5D,EAAoF;EACzF,OAAOpB,OAAO,CAACqB,OAAR,CAAgBf,MAAhB,CAAwBgB,CAAD,IAAOA,CAAC,CAACC,MAAF,KAAaH,aAA3C,CAAP;AACD;;AAEM,SAASI,gBAAT,CAA0BnB,QAA1B,EAA+E;EACpF,OAAOA,QAAQ,CAACC,MAAT,CAAiBmB,CAAD,IAAkCA,CAAC,CAACjB,cAAF,EAAlD,CAAP;AACD;;AAEM,SAASkB,eAAT,CAAyBrB,QAAzB,EAA6E;EAClF,OAAOA,QAAQ,CAACC,MAAT,CAAiBmB,CAAD,IAAiCA,CAAC,CAACE,aAAF,EAAjD,CAAP;AACD"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BufferedRequest = void 0;
7
+
8
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+
10
+ let REQ_PER_TIMEOUT = 5;
11
+ let TIMEOUT_MILLS = 1000;
12
+ const SAFE_TIMEOUT_BUFFER = 100;
13
+
14
+ class BufferedRequest {
15
+ static get reqPerTimeout() {
16
+ return REQ_PER_TIMEOUT;
17
+ }
18
+
19
+ static set reqPerTimeout(value) {
20
+ REQ_PER_TIMEOUT = value;
21
+ BufferedRequest.markAsRead = BufferedRequest.create();
22
+ BufferedRequest.markAsDelivered = BufferedRequest.create();
23
+ }
24
+
25
+ static get timeoutMills() {
26
+ return TIMEOUT_MILLS;
27
+ }
28
+
29
+ static set timeoutMills(value) {
30
+ TIMEOUT_MILLS = value;
31
+ BufferedRequest.markAsRead = BufferedRequest.create();
32
+ BufferedRequest.markAsDelivered = BufferedRequest.create();
33
+ }
34
+
35
+ static create() {
36
+ let reqPerTimeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : REQ_PER_TIMEOUT;
37
+ let timeoutMills = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TIMEOUT_MILLS;
38
+ const waitQueue = [];
39
+ const nextQueue = [];
40
+ let state = 'idle';
41
+ let timeout;
42
+ return {
43
+ push(func) {
44
+ waitQueue.push(func);
45
+ this.invoke();
46
+ },
47
+
48
+ shift() {
49
+ if (nextQueue.length < reqPerTimeout) {
50
+ const nextRemains = Math.min(reqPerTimeout - nextQueue.length, waitQueue.length);
51
+
52
+ for (let n = 0; n < nextRemains; n++) {
53
+ const func = waitQueue.shift();
54
+ if (func) nextQueue.push(func);
55
+ }
56
+ }
57
+ },
58
+
59
+ handleIdle() {
60
+ if (0 < nextQueue.length) {
61
+ state = 'processing';
62
+ this.invoke();
63
+ }
64
+ },
65
+
66
+ handleProcessing() {
67
+ if (timeout) return;
68
+ timeout = setTimeout(() => {
69
+ timeout = undefined;
70
+
71
+ if (0 < nextQueue.length || 0 < waitQueue.length) {
72
+ this.invoke();
73
+ } else {
74
+ state = 'idle';
75
+ }
76
+ }, timeoutMills + SAFE_TIMEOUT_BUFFER);
77
+ nextQueue.forEach(func => func());
78
+ nextQueue.length = 0;
79
+ },
80
+
81
+ async invoke() {
82
+ this.shift();
83
+
84
+ if (state === 'idle') {
85
+ this.handleIdle();
86
+ }
87
+
88
+ if (state === 'processing') {
89
+ this.handleProcessing();
90
+ }
91
+ }
92
+
93
+ };
94
+ }
95
+
96
+ }
97
+
98
+ exports.BufferedRequest = BufferedRequest;
99
+
100
+ _defineProperty(BufferedRequest, "markAsRead", BufferedRequest.create());
101
+
102
+ _defineProperty(BufferedRequest, "markAsDelivered", BufferedRequest.create());
103
+ //# sourceMappingURL=bufferedRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["REQ_PER_TIMEOUT","TIMEOUT_MILLS","SAFE_TIMEOUT_BUFFER","BufferedRequest","reqPerTimeout","value","markAsRead","create","markAsDelivered","timeoutMills","waitQueue","nextQueue","state","timeout","push","func","invoke","shift","length","nextRemains","Math","min","n","handleIdle","handleProcessing","setTimeout","undefined","forEach"],"sources":["bufferedRequest.ts"],"sourcesContent":["type Func = (...args: unknown[]) => Promise<unknown>;\ntype State = 'idle' | 'processing';\n\nlet REQ_PER_TIMEOUT = 5;\nlet TIMEOUT_MILLS = 1000;\nconst SAFE_TIMEOUT_BUFFER = 100;\n\nexport class BufferedRequest {\n public static markAsRead = BufferedRequest.create();\n public static markAsDelivered = BufferedRequest.create();\n\n public static get reqPerTimeout() {\n return REQ_PER_TIMEOUT;\n }\n public static set reqPerTimeout(value: number) {\n REQ_PER_TIMEOUT = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static get timeoutMills() {\n return TIMEOUT_MILLS;\n }\n public static set timeoutMills(value: number) {\n TIMEOUT_MILLS = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static create(reqPerTimeout = REQ_PER_TIMEOUT, timeoutMills = TIMEOUT_MILLS) {\n const waitQueue: Func[] = [];\n const nextQueue: Func[] = [];\n\n let state: State = 'idle';\n let timeout: NodeJS.Timeout | undefined;\n\n return {\n push(func: Func) {\n waitQueue.push(func);\n this.invoke();\n },\n shift() {\n if (nextQueue.length < reqPerTimeout) {\n const nextRemains = Math.min(reqPerTimeout - nextQueue.length, waitQueue.length);\n for (let n = 0; n < nextRemains; n++) {\n const func = waitQueue.shift();\n if (func) nextQueue.push(func);\n }\n }\n },\n handleIdle() {\n if (0 < nextQueue.length) {\n state = 'processing';\n this.invoke();\n }\n },\n handleProcessing() {\n if (timeout) return;\n\n timeout = setTimeout(() => {\n timeout = undefined;\n if (0 < nextQueue.length || 0 < waitQueue.length) {\n this.invoke();\n } else {\n state = 'idle';\n }\n }, timeoutMills + SAFE_TIMEOUT_BUFFER);\n\n nextQueue.forEach((func) => func());\n nextQueue.length = 0;\n },\n async invoke() {\n this.shift();\n\n if (state === 'idle') {\n this.handleIdle();\n }\n\n if (state === 'processing') {\n this.handleProcessing();\n }\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;AAGA,IAAIA,eAAe,GAAG,CAAtB;AACA,IAAIC,aAAa,GAAG,IAApB;AACA,MAAMC,mBAAmB,GAAG,GAA5B;;AAEO,MAAMC,eAAN,CAAsB;EAII,WAAbC,aAAa,GAAG;IAChC,OAAOJ,eAAP;EACD;;EAC8B,WAAbI,aAAa,CAACC,KAAD,EAAgB;IAC7CL,eAAe,GAAGK,KAAlB;IACAF,eAAe,CAACG,UAAhB,GAA6BH,eAAe,CAACI,MAAhB,EAA7B;IACAJ,eAAe,CAACK,eAAhB,GAAkCL,eAAe,CAACI,MAAhB,EAAlC;EACD;;EAE6B,WAAZE,YAAY,GAAG;IAC/B,OAAOR,aAAP;EACD;;EAC6B,WAAZQ,YAAY,CAACJ,KAAD,EAAgB;IAC5CJ,aAAa,GAAGI,KAAhB;IACAF,eAAe,CAACG,UAAhB,GAA6BH,eAAe,CAACI,MAAhB,EAA7B;IACAJ,eAAe,CAACK,eAAhB,GAAkCL,eAAe,CAACI,MAAhB,EAAlC;EACD;;EAEmB,OAANA,MAAM,GAAgE;IAAA,IAA/DH,aAA+D,uEAA/CJ,eAA+C;IAAA,IAA9BS,YAA8B,uEAAfR,aAAe;IAClF,MAAMS,SAAiB,GAAG,EAA1B;IACA,MAAMC,SAAiB,GAAG,EAA1B;IAEA,IAAIC,KAAY,GAAG,MAAnB;IACA,IAAIC,OAAJ;IAEA,OAAO;MACLC,IAAI,CAACC,IAAD,EAAa;QACfL,SAAS,CAACI,IAAV,CAAeC,IAAf;QACA,KAAKC,MAAL;MACD,CAJI;;MAKLC,KAAK,GAAG;QACN,IAAIN,SAAS,CAACO,MAAV,GAAmBd,aAAvB,EAAsC;UACpC,MAAMe,WAAW,GAAGC,IAAI,CAACC,GAAL,CAASjB,aAAa,GAAGO,SAAS,CAACO,MAAnC,EAA2CR,SAAS,CAACQ,MAArD,CAApB;;UACA,KAAK,IAAII,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,WAApB,EAAiCG,CAAC,EAAlC,EAAsC;YACpC,MAAMP,IAAI,GAAGL,SAAS,CAACO,KAAV,EAAb;YACA,IAAIF,IAAJ,EAAUJ,SAAS,CAACG,IAAV,CAAeC,IAAf;UACX;QACF;MACF,CAbI;;MAcLQ,UAAU,GAAG;QACX,IAAI,IAAIZ,SAAS,CAACO,MAAlB,EAA0B;UACxBN,KAAK,GAAG,YAAR;UACA,KAAKI,MAAL;QACD;MACF,CAnBI;;MAoBLQ,gBAAgB,GAAG;QACjB,IAAIX,OAAJ,EAAa;QAEbA,OAAO,GAAGY,UAAU,CAAC,MAAM;UACzBZ,OAAO,GAAGa,SAAV;;UACA,IAAI,IAAIf,SAAS,CAACO,MAAd,IAAwB,IAAIR,SAAS,CAACQ,MAA1C,EAAkD;YAChD,KAAKF,MAAL;UACD,CAFD,MAEO;YACLJ,KAAK,GAAG,MAAR;UACD;QACF,CAPmB,EAOjBH,YAAY,GAAGP,mBAPE,CAApB;QASAS,SAAS,CAACgB,OAAV,CAAmBZ,IAAD,IAAUA,IAAI,EAAhC;QACAJ,SAAS,CAACO,MAAV,GAAmB,CAAnB;MACD,CAlCI;;MAmCL,MAAMF,MAAN,GAAe;QACb,KAAKC,KAAL;;QAEA,IAAIL,KAAK,KAAK,MAAd,EAAsB;UACpB,KAAKW,UAAL;QACD;;QAED,IAAIX,KAAK,KAAK,YAAd,EAA4B;UAC1B,KAAKY,gBAAL;QACD;MACF;;IA7CI,CAAP;EA+CD;;AA5E0B;;;;gBAAhBrB,e,gBACgBA,eAAe,CAACI,MAAhB,E;;gBADhBJ,e,qBAEqBA,eAAe,CAACI,MAAhB,E"}
@@ -3,6 +3,7 @@ export { default as arrayToMap, arrayToMapWithGetter } from './shared/arrayToMap
3
3
  export { createPubSub } from './shared/pubsub';
4
4
  export { default as conditionChaining } from './shared/conditionChaining';
5
5
  export { urlRegexStrict, urlRegexRough, newLineRegex, audioExtRegex, videoExtRegex, imageExtRegex, getFileType, getFileExtension, replaceUrlAsComponents, normalizeFileName, emailRegex, phoneRegex } from './shared/regex';
6
+ export { BufferedRequest } from './shared/bufferedRequest';
6
7
  export * from './hooks';
7
8
  export * from './ui-format/groupChannel';
8
9
  export * from './ui-format/common';
@@ -13,4 +14,11 @@ export const NOOP = () => void 0;
13
14
  export const ASYNC_NOOP = async () => void 0;
14
15
  export const PASS = val => val;
15
16
  export const toMegabyte = byte => byte / 1024 / 1024;
17
+ export const isFunction = param => typeof param === 'function';
18
+ export const SBErrorCode = {
19
+ NON_AUTHORIZED: 400108
20
+ };
21
+ export const SBErrorMessage = {
22
+ ACL: "An error occurred because you don't have access to the user list in your application.\n" + 'In order to gain access, you can turn on this attribute in the Access Control List settings on Sendbird Dashboard.'
23
+ };
16
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","default","arrayToMap","arrayToMapWithGetter","createPubSub","conditionChaining","urlRegexStrict","urlRegexRough","newLineRegex","audioExtRegex","videoExtRegex","imageExtRegex","getFileType","getFileExtension","replaceUrlAsComponents","normalizeFileName","emailRegex","phoneRegex","NOOP","ASYNC_NOOP","PASS","val","toMegabyte","byte"],"sources":["index.ts"],"sourcesContent":["export { Logger } from './shared/logger';\nexport { default as arrayToMap, arrayToMapWithGetter } from './shared/arrayToMap';\nexport { createPubSub } from './shared/pubsub';\nexport { default as conditionChaining } from './shared/conditionChaining';\nexport {\n urlRegexStrict,\n urlRegexRough,\n newLineRegex,\n audioExtRegex,\n videoExtRegex,\n imageExtRegex,\n getFileType,\n getFileExtension,\n replaceUrlAsComponents,\n normalizeFileName,\n emailRegex,\n phoneRegex,\n} from './shared/regex';\n\nexport * from './hooks';\nexport * from './ui-format/groupChannel';\nexport * from './ui-format/common';\nexport * from './sendbird/channel';\nexport * from './sendbird/message';\nexport * from './sendbird/attrs';\n\nexport const NOOP: () => void = () => void 0;\nexport const ASYNC_NOOP = async () => void 0;\nexport const PASS = <T>(val: T) => val;\nexport const toMegabyte = (byte: number) => byte / 1024 / 1024;\n\nexport type {\n FilterByValueType,\n UnionToIntersection,\n OmittedValues,\n PartialDeep,\n Optional,\n ContextValue,\n SendbirdMessage,\n SendbirdChatSDK,\n SendbirdChannel,\n SendbirdBaseChannel,\n SendbirdGroupChannel,\n SendbirdOpenChannel,\n SendbirdUser,\n SendbirdMember,\n SendbirdBaseMessage,\n SendbirdUserMessage,\n SendbirdFileMessage,\n SendbirdAdminMessage,\n SendbirdGroupChannelCreateParams,\n SendbirdFileMessageCreateParams,\n SendbirdUserMessageCreateParams,\n SendbirdError,\n SendbirdMessageCollection,\n SendbirdGroupChannelCollection,\n NotificationFiles,\n NotificationMentionedUsers,\n NotificationTranslations,\n PartialNullable,\n SendbirdDataPayload,\n SendbirdPreviousMessageListQuery,\n SendbirdSendableMessage,\n SendbirdGroupChannelListQuery,\n SendbirdGroupChannelUpdateParams,\n SendbirdUserMessageUpdateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdUserUpdateParams,\n} from './types';\n"],"mappings":"AAAA,SAASA,MAAT,QAAuB,iBAAvB;AACA,SAASC,OAAO,IAAIC,UAApB,EAAgCC,oBAAhC,QAA4D,qBAA5D;AACA,SAASC,YAAT,QAA6B,iBAA7B;AACA,SAASH,OAAO,IAAII,iBAApB,QAA6C,4BAA7C;AACA,SACEC,cADF,EAEEC,aAFF,EAGEC,YAHF,EAIEC,aAJF,EAKEC,aALF,EAMEC,aANF,EAOEC,WAPF,EAQEC,gBARF,EASEC,sBATF,EAUEC,iBAVF,EAWEC,UAXF,EAYEC,UAZF,QAaO,gBAbP;AAeA,cAAc,SAAd;AACA,cAAc,0BAAd;AACA,cAAc,oBAAd;AACA,cAAc,oBAAd;AACA,cAAc,oBAAd;AACA,cAAc,kBAAd;AAEA,OAAO,MAAMC,IAAgB,GAAG,MAAM,KAAK,CAApC;AACP,OAAO,MAAMC,UAAU,GAAG,YAAY,KAAK,CAApC;AACP,OAAO,MAAMC,IAAI,GAAOC,GAAJ,IAAeA,GAA5B;AACP,OAAO,MAAMC,UAAU,GAAIC,IAAD,IAAkBA,IAAI,GAAG,IAAP,GAAc,IAAnD"}
1
+ {"version":3,"names":["Logger","default","arrayToMap","arrayToMapWithGetter","createPubSub","conditionChaining","urlRegexStrict","urlRegexRough","newLineRegex","audioExtRegex","videoExtRegex","imageExtRegex","getFileType","getFileExtension","replaceUrlAsComponents","normalizeFileName","emailRegex","phoneRegex","BufferedRequest","NOOP","ASYNC_NOOP","PASS","val","toMegabyte","byte","isFunction","param","SBErrorCode","NON_AUTHORIZED","SBErrorMessage","ACL"],"sources":["index.ts"],"sourcesContent":["export { Logger } from './shared/logger';\nexport { default as arrayToMap, arrayToMapWithGetter } from './shared/arrayToMap';\nexport { createPubSub } from './shared/pubsub';\nexport { default as conditionChaining } from './shared/conditionChaining';\nexport {\n urlRegexStrict,\n urlRegexRough,\n newLineRegex,\n audioExtRegex,\n videoExtRegex,\n imageExtRegex,\n getFileType,\n getFileExtension,\n replaceUrlAsComponents,\n normalizeFileName,\n emailRegex,\n phoneRegex,\n} from './shared/regex';\nexport { BufferedRequest } from './shared/bufferedRequest';\n\nexport * from './hooks';\nexport * from './ui-format/groupChannel';\nexport * from './ui-format/common';\nexport * from './sendbird/channel';\nexport * from './sendbird/message';\nexport * from './sendbird/attrs';\n\nexport const NOOP: () => void = () => void 0;\nexport const ASYNC_NOOP = async () => void 0;\nexport const PASS = <T>(val: T) => val;\nexport const toMegabyte = (byte: number) => byte / 1024 / 1024;\nexport const isFunction = <T>(param?: T): param is NonNullable<T> => typeof param === 'function';\nexport const SBErrorCode = {\n NON_AUTHORIZED: 400108,\n};\nexport const SBErrorMessage = {\n ACL:\n \"An error occurred because you don't have access to the user list in your application.\\n\" +\n 'In order to gain access, you can turn on this attribute in the Access Control List settings on Sendbird Dashboard.',\n};\n\nexport type {\n FilterByValueType,\n UnionToIntersection,\n OmittedValues,\n PartialDeep,\n Optional,\n ContextValue,\n SendbirdMessage,\n SendbirdChatSDK,\n SendbirdChannel,\n SendbirdBaseChannel,\n SendbirdGroupChannel,\n SendbirdOpenChannel,\n SendbirdUser,\n SendbirdMember,\n SendbirdBaseMessage,\n SendbirdUserMessage,\n SendbirdFileMessage,\n SendbirdAdminMessage,\n SendbirdGroupChannelCreateParams,\n SendbirdFileMessageCreateParams,\n SendbirdUserMessageCreateParams,\n SendbirdError,\n SendbirdMessageCollection,\n SendbirdGroupChannelCollection,\n NotificationFiles,\n NotificationMentionedUsers,\n NotificationTranslations,\n PartialNullable,\n SendbirdDataPayload,\n SendbirdPreviousMessageListQuery,\n SendbirdSendableMessage,\n SendbirdGroupChannelListQuery,\n SendbirdGroupChannelUpdateParams,\n SendbirdUserMessageUpdateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdUserUpdateParams,\n} from './types';\n"],"mappings":"AAAA,SAASA,MAAT,QAAuB,iBAAvB;AACA,SAASC,OAAO,IAAIC,UAApB,EAAgCC,oBAAhC,QAA4D,qBAA5D;AACA,SAASC,YAAT,QAA6B,iBAA7B;AACA,SAASH,OAAO,IAAII,iBAApB,QAA6C,4BAA7C;AACA,SACEC,cADF,EAEEC,aAFF,EAGEC,YAHF,EAIEC,aAJF,EAKEC,aALF,EAMEC,aANF,EAOEC,WAPF,EAQEC,gBARF,EASEC,sBATF,EAUEC,iBAVF,EAWEC,UAXF,EAYEC,UAZF,QAaO,gBAbP;AAcA,SAASC,eAAT,QAAgC,0BAAhC;AAEA,cAAc,SAAd;AACA,cAAc,0BAAd;AACA,cAAc,oBAAd;AACA,cAAc,oBAAd;AACA,cAAc,oBAAd;AACA,cAAc,kBAAd;AAEA,OAAO,MAAMC,IAAgB,GAAG,MAAM,KAAK,CAApC;AACP,OAAO,MAAMC,UAAU,GAAG,YAAY,KAAK,CAApC;AACP,OAAO,MAAMC,IAAI,GAAOC,GAAJ,IAAeA,GAA5B;AACP,OAAO,MAAMC,UAAU,GAAIC,IAAD,IAAkBA,IAAI,GAAG,IAAP,GAAc,IAAnD;AACP,OAAO,MAAMC,UAAU,GAAOC,KAAJ,IAA2C,OAAOA,KAAP,KAAiB,UAA/E;AACP,OAAO,MAAMC,WAAW,GAAG;EACzBC,cAAc,EAAE;AADS,CAApB;AAGP,OAAO,MAAMC,cAAc,GAAG;EAC5BC,GAAG,EACD,4FACA;AAH0B,CAAvB"}
@@ -1,3 +1,5 @@
1
+ import { BufferedRequest } from '../shared/bufferedRequest';
2
+
1
3
  /**
2
4
  * Diff utils for channel
3
5
  * @param {SendbirdBaseChannel} [a]
@@ -11,14 +13,11 @@ export function isDifferentChannel(a, b) {
11
13
  export const isGroupChannelChatUnavailable = channel => {
12
14
  return channel.myMutedState === 'muted' || channel.isFrozen && channel.myRole !== 'operator';
13
15
  };
14
- export const confirmAndMarkAsRead = async (sdk, channels) => {
15
- const channelUrls = channels.filter(it => it.isGroupChannel() && it.unreadMessageCount > 0).map(it => it.url);
16
- await sdk.groupChannel.markAsReadWithChannelUrls(channelUrls);
16
+ export const confirmAndMarkAsRead = async channels => {
17
+ channels.filter(it => it.isGroupChannel() && it.unreadMessageCount > 0).forEach(it => BufferedRequest.markAsRead.push(() => it.markAsRead()));
17
18
  };
18
- export const confirmAndMarkAsDelivered = async (sdk, channel) => {
19
- if (channel.isGroupChannel() && channel.unreadMessageCount > 0) {
20
- await sdk.groupChannel.markAsDelivered(channel.url);
21
- }
19
+ export const confirmAndMarkAsDelivered = async channels => {
20
+ channels.filter(it => it.isGroupChannel() && it.unreadMessageCount > 0).forEach(it => BufferedRequest.markAsDelivered.push(() => it.markAsDelivered()));
22
21
  };
23
22
  export function isDefaultCoverImage(coverUrl) {
24
23
  return coverUrl === '' || coverUrl.startsWith('https://static.sendbird.com/sample/cover');
@@ -1 +1 @@
1
- {"version":3,"names":["isDifferentChannel","a","b","url","isGroupChannelChatUnavailable","channel","myMutedState","isFrozen","myRole","confirmAndMarkAsRead","sdk","channels","channelUrls","filter","it","isGroupChannel","unreadMessageCount","map","groupChannel","markAsReadWithChannelUrls","confirmAndMarkAsDelivered","markAsDelivered","isDefaultCoverImage","coverUrl","startsWith","getMembersExcludeMe","currentUserId","members","m","userId","getGroupChannels","c","getOpenChannels","isOpenChannel"],"sources":["channel.ts"],"sourcesContent":["import type {\n SendbirdBaseChannel,\n SendbirdChannel,\n SendbirdChatSDK,\n SendbirdGroupChannel,\n SendbirdOpenChannel,\n} from '../types';\n\n/**\n * Diff utils for channel\n * @param {SendbirdBaseChannel} [a]\n * @param {SendbirdBaseChannel} [b]\n * @returns {boolean}\n * */\nexport function isDifferentChannel<T extends SendbirdBaseChannel>(a?: T, b?: T): boolean {\n if (!a || !b) return true;\n return a.url !== b.url;\n}\n\nexport const isGroupChannelChatUnavailable = (channel: SendbirdGroupChannel) => {\n return channel.myMutedState === 'muted' || (channel.isFrozen && channel.myRole !== 'operator');\n};\n\nexport const confirmAndMarkAsRead = async (sdk: SendbirdChatSDK, channels: SendbirdBaseChannel[]) => {\n const channelUrls = channels.filter((it) => it.isGroupChannel() && it.unreadMessageCount > 0).map((it) => it.url);\n await sdk.groupChannel.markAsReadWithChannelUrls(channelUrls);\n};\n\nexport const confirmAndMarkAsDelivered = async (sdk: SendbirdChatSDK, channel: SendbirdBaseChannel) => {\n if (channel.isGroupChannel() && channel.unreadMessageCount > 0) {\n await sdk.groupChannel.markAsDelivered(channel.url);\n }\n};\n\nexport function isDefaultCoverImage(coverUrl: string) {\n return coverUrl === '' || coverUrl.startsWith('https://static.sendbird.com/sample/cover');\n}\n\nexport function getMembersExcludeMe(channel: SendbirdGroupChannel, currentUserId?: string) {\n return channel.members.filter((m) => m.userId !== currentUserId);\n}\n\nexport function getGroupChannels(channels: SendbirdChannel[]): SendbirdGroupChannel[] {\n return channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());\n}\n\nexport function getOpenChannels(channels: SendbirdChannel[]): SendbirdOpenChannel[] {\n return channels.filter((c): c is SendbirdOpenChannel => c.isOpenChannel());\n}\n"],"mappings":"AAQA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,kBAAT,CAA2DC,CAA3D,EAAkEC,CAAlE,EAAkF;EACvF,IAAI,CAACD,CAAD,IAAM,CAACC,CAAX,EAAc,OAAO,IAAP;EACd,OAAOD,CAAC,CAACE,GAAF,KAAUD,CAAC,CAACC,GAAnB;AACD;AAED,OAAO,MAAMC,6BAA6B,GAAIC,OAAD,IAAmC;EAC9E,OAAOA,OAAO,CAACC,YAAR,KAAyB,OAAzB,IAAqCD,OAAO,CAACE,QAAR,IAAoBF,OAAO,CAACG,MAAR,KAAmB,UAAnF;AACD,CAFM;AAIP,OAAO,MAAMC,oBAAoB,GAAG,OAAOC,GAAP,EAA6BC,QAA7B,KAAiE;EACnG,MAAMC,WAAW,GAAGD,QAAQ,CAACE,MAAT,CAAiBC,EAAD,IAAQA,EAAE,CAACC,cAAH,MAAuBD,EAAE,CAACE,kBAAH,GAAwB,CAAvE,EAA0EC,GAA1E,CAA+EH,EAAD,IAAQA,EAAE,CAACX,GAAzF,CAApB;EACA,MAAMO,GAAG,CAACQ,YAAJ,CAAiBC,yBAAjB,CAA2CP,WAA3C,CAAN;AACD,CAHM;AAKP,OAAO,MAAMQ,yBAAyB,GAAG,OAAOV,GAAP,EAA6BL,OAA7B,KAA8D;EACrG,IAAIA,OAAO,CAACU,cAAR,MAA4BV,OAAO,CAACW,kBAAR,GAA6B,CAA7D,EAAgE;IAC9D,MAAMN,GAAG,CAACQ,YAAJ,CAAiBG,eAAjB,CAAiChB,OAAO,CAACF,GAAzC,CAAN;EACD;AACF,CAJM;AAMP,OAAO,SAASmB,mBAAT,CAA6BC,QAA7B,EAA+C;EACpD,OAAOA,QAAQ,KAAK,EAAb,IAAmBA,QAAQ,CAACC,UAAT,CAAoB,0CAApB,CAA1B;AACD;AAED,OAAO,SAASC,mBAAT,CAA6BpB,OAA7B,EAA4DqB,aAA5D,EAAoF;EACzF,OAAOrB,OAAO,CAACsB,OAAR,CAAgBd,MAAhB,CAAwBe,CAAD,IAAOA,CAAC,CAACC,MAAF,KAAaH,aAA3C,CAAP;AACD;AAED,OAAO,SAASI,gBAAT,CAA0BnB,QAA1B,EAA+E;EACpF,OAAOA,QAAQ,CAACE,MAAT,CAAiBkB,CAAD,IAAkCA,CAAC,CAAChB,cAAF,EAAlD,CAAP;AACD;AAED,OAAO,SAASiB,eAAT,CAAyBrB,QAAzB,EAA6E;EAClF,OAAOA,QAAQ,CAACE,MAAT,CAAiBkB,CAAD,IAAiCA,CAAC,CAACE,aAAF,EAAjD,CAAP;AACD"}
1
+ {"version":3,"names":["BufferedRequest","isDifferentChannel","a","b","url","isGroupChannelChatUnavailable","channel","myMutedState","isFrozen","myRole","confirmAndMarkAsRead","channels","filter","it","isGroupChannel","unreadMessageCount","forEach","markAsRead","push","confirmAndMarkAsDelivered","markAsDelivered","isDefaultCoverImage","coverUrl","startsWith","getMembersExcludeMe","currentUserId","members","m","userId","getGroupChannels","c","getOpenChannels","isOpenChannel"],"sources":["channel.ts"],"sourcesContent":["import { BufferedRequest } from '../shared/bufferedRequest';\nimport type { SendbirdBaseChannel, SendbirdChannel, SendbirdGroupChannel, SendbirdOpenChannel } from '../types';\n\n/**\n * Diff utils for channel\n * @param {SendbirdBaseChannel} [a]\n * @param {SendbirdBaseChannel} [b]\n * @returns {boolean}\n * */\nexport function isDifferentChannel<T extends SendbirdBaseChannel>(a?: T, b?: T): boolean {\n if (!a || !b) return true;\n return a.url !== b.url;\n}\n\nexport const isGroupChannelChatUnavailable = (channel: SendbirdGroupChannel) => {\n return channel.myMutedState === 'muted' || (channel.isFrozen && channel.myRole !== 'operator');\n};\n\nexport const confirmAndMarkAsRead = async (channels: SendbirdBaseChannel[]) => {\n channels\n .filter((it): it is SendbirdGroupChannel => it.isGroupChannel() && it.unreadMessageCount > 0)\n .forEach((it) => BufferedRequest.markAsRead.push(() => it.markAsRead()));\n};\n\nexport const confirmAndMarkAsDelivered = async (channels: SendbirdBaseChannel[]) => {\n channels\n .filter((it): it is SendbirdGroupChannel => it.isGroupChannel() && it.unreadMessageCount > 0)\n .forEach((it) => BufferedRequest.markAsDelivered.push(() => it.markAsDelivered()));\n};\n\nexport function isDefaultCoverImage(coverUrl: string) {\n return coverUrl === '' || coverUrl.startsWith('https://static.sendbird.com/sample/cover');\n}\n\nexport function getMembersExcludeMe(channel: SendbirdGroupChannel, currentUserId?: string) {\n return channel.members.filter((m) => m.userId !== currentUserId);\n}\n\nexport function getGroupChannels(channels: SendbirdChannel[]): SendbirdGroupChannel[] {\n return channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());\n}\n\nexport function getOpenChannels(channels: SendbirdChannel[]): SendbirdOpenChannel[] {\n return channels.filter((c): c is SendbirdOpenChannel => c.isOpenChannel());\n}\n"],"mappings":"AAAA,SAASA,eAAT,QAAgC,2BAAhC;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAT,CAA2DC,CAA3D,EAAkEC,CAAlE,EAAkF;EACvF,IAAI,CAACD,CAAD,IAAM,CAACC,CAAX,EAAc,OAAO,IAAP;EACd,OAAOD,CAAC,CAACE,GAAF,KAAUD,CAAC,CAACC,GAAnB;AACD;AAED,OAAO,MAAMC,6BAA6B,GAAIC,OAAD,IAAmC;EAC9E,OAAOA,OAAO,CAACC,YAAR,KAAyB,OAAzB,IAAqCD,OAAO,CAACE,QAAR,IAAoBF,OAAO,CAACG,MAAR,KAAmB,UAAnF;AACD,CAFM;AAIP,OAAO,MAAMC,oBAAoB,GAAG,MAAOC,QAAP,IAA2C;EAC7EA,QAAQ,CACLC,MADH,CACWC,EAAD,IAAoCA,EAAE,CAACC,cAAH,MAAuBD,EAAE,CAACE,kBAAH,GAAwB,CAD7F,EAEGC,OAFH,CAEYH,EAAD,IAAQb,eAAe,CAACiB,UAAhB,CAA2BC,IAA3B,CAAgC,MAAML,EAAE,CAACI,UAAH,EAAtC,CAFnB;AAGD,CAJM;AAMP,OAAO,MAAME,yBAAyB,GAAG,MAAOR,QAAP,IAA2C;EAClFA,QAAQ,CACLC,MADH,CACWC,EAAD,IAAoCA,EAAE,CAACC,cAAH,MAAuBD,EAAE,CAACE,kBAAH,GAAwB,CAD7F,EAEGC,OAFH,CAEYH,EAAD,IAAQb,eAAe,CAACoB,eAAhB,CAAgCF,IAAhC,CAAqC,MAAML,EAAE,CAACO,eAAH,EAA3C,CAFnB;AAGD,CAJM;AAMP,OAAO,SAASC,mBAAT,CAA6BC,QAA7B,EAA+C;EACpD,OAAOA,QAAQ,KAAK,EAAb,IAAmBA,QAAQ,CAACC,UAAT,CAAoB,0CAApB,CAA1B;AACD;AAED,OAAO,SAASC,mBAAT,CAA6BlB,OAA7B,EAA4DmB,aAA5D,EAAoF;EACzF,OAAOnB,OAAO,CAACoB,OAAR,CAAgBd,MAAhB,CAAwBe,CAAD,IAAOA,CAAC,CAACC,MAAF,KAAaH,aAA3C,CAAP;AACD;AAED,OAAO,SAASI,gBAAT,CAA0BlB,QAA1B,EAA+E;EACpF,OAAOA,QAAQ,CAACC,MAAT,CAAiBkB,CAAD,IAAkCA,CAAC,CAAChB,cAAF,EAAlD,CAAP;AACD;AAED,OAAO,SAASiB,eAAT,CAAyBpB,QAAzB,EAA6E;EAClF,OAAOA,QAAQ,CAACC,MAAT,CAAiBkB,CAAD,IAAiCA,CAAC,CAACE,aAAF,EAAjD,CAAP;AACD"}
@@ -0,0 +1,93 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
3
+ let REQ_PER_TIMEOUT = 5;
4
+ let TIMEOUT_MILLS = 1000;
5
+ const SAFE_TIMEOUT_BUFFER = 100;
6
+ export class BufferedRequest {
7
+ static get reqPerTimeout() {
8
+ return REQ_PER_TIMEOUT;
9
+ }
10
+
11
+ static set reqPerTimeout(value) {
12
+ REQ_PER_TIMEOUT = value;
13
+ BufferedRequest.markAsRead = BufferedRequest.create();
14
+ BufferedRequest.markAsDelivered = BufferedRequest.create();
15
+ }
16
+
17
+ static get timeoutMills() {
18
+ return TIMEOUT_MILLS;
19
+ }
20
+
21
+ static set timeoutMills(value) {
22
+ TIMEOUT_MILLS = value;
23
+ BufferedRequest.markAsRead = BufferedRequest.create();
24
+ BufferedRequest.markAsDelivered = BufferedRequest.create();
25
+ }
26
+
27
+ static create() {
28
+ let reqPerTimeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : REQ_PER_TIMEOUT;
29
+ let timeoutMills = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TIMEOUT_MILLS;
30
+ const waitQueue = [];
31
+ const nextQueue = [];
32
+ let state = 'idle';
33
+ let timeout;
34
+ return {
35
+ push(func) {
36
+ waitQueue.push(func);
37
+ this.invoke();
38
+ },
39
+
40
+ shift() {
41
+ if (nextQueue.length < reqPerTimeout) {
42
+ const nextRemains = Math.min(reqPerTimeout - nextQueue.length, waitQueue.length);
43
+
44
+ for (let n = 0; n < nextRemains; n++) {
45
+ const func = waitQueue.shift();
46
+ if (func) nextQueue.push(func);
47
+ }
48
+ }
49
+ },
50
+
51
+ handleIdle() {
52
+ if (0 < nextQueue.length) {
53
+ state = 'processing';
54
+ this.invoke();
55
+ }
56
+ },
57
+
58
+ handleProcessing() {
59
+ if (timeout) return;
60
+ timeout = setTimeout(() => {
61
+ timeout = undefined;
62
+
63
+ if (0 < nextQueue.length || 0 < waitQueue.length) {
64
+ this.invoke();
65
+ } else {
66
+ state = 'idle';
67
+ }
68
+ }, timeoutMills + SAFE_TIMEOUT_BUFFER);
69
+ nextQueue.forEach(func => func());
70
+ nextQueue.length = 0;
71
+ },
72
+
73
+ async invoke() {
74
+ this.shift();
75
+
76
+ if (state === 'idle') {
77
+ this.handleIdle();
78
+ }
79
+
80
+ if (state === 'processing') {
81
+ this.handleProcessing();
82
+ }
83
+ }
84
+
85
+ };
86
+ }
87
+
88
+ }
89
+
90
+ _defineProperty(BufferedRequest, "markAsRead", BufferedRequest.create());
91
+
92
+ _defineProperty(BufferedRequest, "markAsDelivered", BufferedRequest.create());
93
+ //# sourceMappingURL=bufferedRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["REQ_PER_TIMEOUT","TIMEOUT_MILLS","SAFE_TIMEOUT_BUFFER","BufferedRequest","reqPerTimeout","value","markAsRead","create","markAsDelivered","timeoutMills","waitQueue","nextQueue","state","timeout","push","func","invoke","shift","length","nextRemains","Math","min","n","handleIdle","handleProcessing","setTimeout","undefined","forEach"],"sources":["bufferedRequest.ts"],"sourcesContent":["type Func = (...args: unknown[]) => Promise<unknown>;\ntype State = 'idle' | 'processing';\n\nlet REQ_PER_TIMEOUT = 5;\nlet TIMEOUT_MILLS = 1000;\nconst SAFE_TIMEOUT_BUFFER = 100;\n\nexport class BufferedRequest {\n public static markAsRead = BufferedRequest.create();\n public static markAsDelivered = BufferedRequest.create();\n\n public static get reqPerTimeout() {\n return REQ_PER_TIMEOUT;\n }\n public static set reqPerTimeout(value: number) {\n REQ_PER_TIMEOUT = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static get timeoutMills() {\n return TIMEOUT_MILLS;\n }\n public static set timeoutMills(value: number) {\n TIMEOUT_MILLS = value;\n BufferedRequest.markAsRead = BufferedRequest.create();\n BufferedRequest.markAsDelivered = BufferedRequest.create();\n }\n\n public static create(reqPerTimeout = REQ_PER_TIMEOUT, timeoutMills = TIMEOUT_MILLS) {\n const waitQueue: Func[] = [];\n const nextQueue: Func[] = [];\n\n let state: State = 'idle';\n let timeout: NodeJS.Timeout | undefined;\n\n return {\n push(func: Func) {\n waitQueue.push(func);\n this.invoke();\n },\n shift() {\n if (nextQueue.length < reqPerTimeout) {\n const nextRemains = Math.min(reqPerTimeout - nextQueue.length, waitQueue.length);\n for (let n = 0; n < nextRemains; n++) {\n const func = waitQueue.shift();\n if (func) nextQueue.push(func);\n }\n }\n },\n handleIdle() {\n if (0 < nextQueue.length) {\n state = 'processing';\n this.invoke();\n }\n },\n handleProcessing() {\n if (timeout) return;\n\n timeout = setTimeout(() => {\n timeout = undefined;\n if (0 < nextQueue.length || 0 < waitQueue.length) {\n this.invoke();\n } else {\n state = 'idle';\n }\n }, timeoutMills + SAFE_TIMEOUT_BUFFER);\n\n nextQueue.forEach((func) => func());\n nextQueue.length = 0;\n },\n async invoke() {\n this.shift();\n\n if (state === 'idle') {\n this.handleIdle();\n }\n\n if (state === 'processing') {\n this.handleProcessing();\n }\n },\n };\n }\n}\n"],"mappings":";;AAGA,IAAIA,eAAe,GAAG,CAAtB;AACA,IAAIC,aAAa,GAAG,IAApB;AACA,MAAMC,mBAAmB,GAAG,GAA5B;AAEA,OAAO,MAAMC,eAAN,CAAsB;EAII,WAAbC,aAAa,GAAG;IAChC,OAAOJ,eAAP;EACD;;EAC8B,WAAbI,aAAa,CAACC,KAAD,EAAgB;IAC7CL,eAAe,GAAGK,KAAlB;IACAF,eAAe,CAACG,UAAhB,GAA6BH,eAAe,CAACI,MAAhB,EAA7B;IACAJ,eAAe,CAACK,eAAhB,GAAkCL,eAAe,CAACI,MAAhB,EAAlC;EACD;;EAE6B,WAAZE,YAAY,GAAG;IAC/B,OAAOR,aAAP;EACD;;EAC6B,WAAZQ,YAAY,CAACJ,KAAD,EAAgB;IAC5CJ,aAAa,GAAGI,KAAhB;IACAF,eAAe,CAACG,UAAhB,GAA6BH,eAAe,CAACI,MAAhB,EAA7B;IACAJ,eAAe,CAACK,eAAhB,GAAkCL,eAAe,CAACI,MAAhB,EAAlC;EACD;;EAEmB,OAANA,MAAM,GAAgE;IAAA,IAA/DH,aAA+D,uEAA/CJ,eAA+C;IAAA,IAA9BS,YAA8B,uEAAfR,aAAe;IAClF,MAAMS,SAAiB,GAAG,EAA1B;IACA,MAAMC,SAAiB,GAAG,EAA1B;IAEA,IAAIC,KAAY,GAAG,MAAnB;IACA,IAAIC,OAAJ;IAEA,OAAO;MACLC,IAAI,CAACC,IAAD,EAAa;QACfL,SAAS,CAACI,IAAV,CAAeC,IAAf;QACA,KAAKC,MAAL;MACD,CAJI;;MAKLC,KAAK,GAAG;QACN,IAAIN,SAAS,CAACO,MAAV,GAAmBd,aAAvB,EAAsC;UACpC,MAAMe,WAAW,GAAGC,IAAI,CAACC,GAAL,CAASjB,aAAa,GAAGO,SAAS,CAACO,MAAnC,EAA2CR,SAAS,CAACQ,MAArD,CAApB;;UACA,KAAK,IAAII,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,WAApB,EAAiCG,CAAC,EAAlC,EAAsC;YACpC,MAAMP,IAAI,GAAGL,SAAS,CAACO,KAAV,EAAb;YACA,IAAIF,IAAJ,EAAUJ,SAAS,CAACG,IAAV,CAAeC,IAAf;UACX;QACF;MACF,CAbI;;MAcLQ,UAAU,GAAG;QACX,IAAI,IAAIZ,SAAS,CAACO,MAAlB,EAA0B;UACxBN,KAAK,GAAG,YAAR;UACA,KAAKI,MAAL;QACD;MACF,CAnBI;;MAoBLQ,gBAAgB,GAAG;QACjB,IAAIX,OAAJ,EAAa;QAEbA,OAAO,GAAGY,UAAU,CAAC,MAAM;UACzBZ,OAAO,GAAGa,SAAV;;UACA,IAAI,IAAIf,SAAS,CAACO,MAAd,IAAwB,IAAIR,SAAS,CAACQ,MAA1C,EAAkD;YAChD,KAAKF,MAAL;UACD,CAFD,MAEO;YACLJ,KAAK,GAAG,MAAR;UACD;QACF,CAPmB,EAOjBH,YAAY,GAAGP,mBAPE,CAApB;QASAS,SAAS,CAACgB,OAAV,CAAmBZ,IAAD,IAAUA,IAAI,EAAhC;QACAJ,SAAS,CAACO,MAAV,GAAmB,CAAnB;MACD,CAlCI;;MAmCL,MAAMF,MAAN,GAAe;QACb,KAAKC,KAAL;;QAEA,IAAIL,KAAK,KAAK,MAAd,EAAsB;UACpB,KAAKW,UAAL;QACD;;QAED,IAAIX,KAAK,KAAK,YAAd,EAA4B;UAC1B,KAAKY,gBAAL;QACD;MACF;;IA7CI,CAAP;EA+CD;;AA5E0B;;gBAAhBrB,e,gBACgBA,eAAe,CAACI,MAAhB,E;;gBADhBJ,e,qBAEqBA,eAAe,CAACI,MAAhB,E"}
@@ -3,6 +3,7 @@ export { default as arrayToMap, arrayToMapWithGetter } from './shared/arrayToMap
3
3
  export { createPubSub } from './shared/pubsub';
4
4
  export { default as conditionChaining } from './shared/conditionChaining';
5
5
  export { urlRegexStrict, urlRegexRough, newLineRegex, audioExtRegex, videoExtRegex, imageExtRegex, getFileType, getFileExtension, replaceUrlAsComponents, normalizeFileName, emailRegex, phoneRegex, } from './shared/regex';
6
+ export { BufferedRequest } from './shared/bufferedRequest';
6
7
  export * from './hooks';
7
8
  export * from './ui-format/groupChannel';
8
9
  export * from './ui-format/common';
@@ -13,4 +14,11 @@ export declare const NOOP: () => void;
13
14
  export declare const ASYNC_NOOP: () => Promise<undefined>;
14
15
  export declare const PASS: <T>(val: T) => T;
15
16
  export declare const toMegabyte: (byte: number) => number;
17
+ export declare const isFunction: <T>(param?: T | undefined) => param is NonNullable<T>;
18
+ export declare const SBErrorCode: {
19
+ NON_AUTHORIZED: number;
20
+ };
21
+ export declare const SBErrorMessage: {
22
+ ACL: string;
23
+ };
16
24
  export type { FilterByValueType, UnionToIntersection, OmittedValues, PartialDeep, Optional, ContextValue, SendbirdMessage, SendbirdChatSDK, SendbirdChannel, SendbirdBaseChannel, SendbirdGroupChannel, SendbirdOpenChannel, SendbirdUser, SendbirdMember, SendbirdBaseMessage, SendbirdUserMessage, SendbirdFileMessage, SendbirdAdminMessage, SendbirdGroupChannelCreateParams, SendbirdFileMessageCreateParams, SendbirdUserMessageCreateParams, SendbirdError, SendbirdMessageCollection, SendbirdGroupChannelCollection, NotificationFiles, NotificationMentionedUsers, NotificationTranslations, PartialNullable, SendbirdDataPayload, SendbirdPreviousMessageListQuery, SendbirdSendableMessage, SendbirdGroupChannelListQuery, SendbirdGroupChannelUpdateParams, SendbirdUserMessageUpdateParams, SendbirdFileMessageUpdateParams, SendbirdUserUpdateParams, } from './types';
@@ -1,4 +1,4 @@
1
- import type { SendbirdBaseChannel, SendbirdChannel, SendbirdChatSDK, SendbirdGroupChannel, SendbirdOpenChannel } from '../types';
1
+ import type { SendbirdBaseChannel, SendbirdChannel, SendbirdGroupChannel, SendbirdOpenChannel } from '../types';
2
2
  /**
3
3
  * Diff utils for channel
4
4
  * @param {SendbirdBaseChannel} [a]
@@ -7,8 +7,8 @@ import type { SendbirdBaseChannel, SendbirdChannel, SendbirdChatSDK, SendbirdGro
7
7
  * */
8
8
  export declare function isDifferentChannel<T extends SendbirdBaseChannel>(a?: T, b?: T): boolean;
9
9
  export declare const isGroupChannelChatUnavailable: (channel: SendbirdGroupChannel) => boolean;
10
- export declare const confirmAndMarkAsRead: (sdk: SendbirdChatSDK, channels: SendbirdBaseChannel[]) => Promise<void>;
11
- export declare const confirmAndMarkAsDelivered: (sdk: SendbirdChatSDK, channel: SendbirdBaseChannel) => Promise<void>;
10
+ export declare const confirmAndMarkAsRead: (channels: SendbirdBaseChannel[]) => Promise<void>;
11
+ export declare const confirmAndMarkAsDelivered: (channels: SendbirdBaseChannel[]) => Promise<void>;
12
12
  export declare function isDefaultCoverImage(coverUrl: string): boolean;
13
13
  export declare function getMembersExcludeMe(channel: SendbirdGroupChannel, currentUserId?: string): import("@sendbird/chat/groupChannel").Member[];
14
14
  export declare function getGroupChannels(channels: SendbirdChannel[]): SendbirdGroupChannel[];
@@ -0,0 +1,29 @@
1
+ declare type Func = (...args: unknown[]) => Promise<unknown>;
2
+ export declare class BufferedRequest {
3
+ static markAsRead: {
4
+ push(func: Func): void;
5
+ shift(): void;
6
+ handleIdle(): void;
7
+ handleProcessing(): void;
8
+ invoke(): Promise<void>;
9
+ };
10
+ static markAsDelivered: {
11
+ push(func: Func): void;
12
+ shift(): void;
13
+ handleIdle(): void;
14
+ handleProcessing(): void;
15
+ invoke(): Promise<void>;
16
+ };
17
+ static get reqPerTimeout(): number;
18
+ static set reqPerTimeout(value: number);
19
+ static get timeoutMills(): number;
20
+ static set timeoutMills(value: number);
21
+ static create(reqPerTimeout?: number, timeoutMills?: number): {
22
+ push(func: Func): void;
23
+ shift(): void;
24
+ handleIdle(): void;
25
+ handleProcessing(): void;
26
+ invoke(): Promise<void>;
27
+ };
28
+ }
29
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-utils",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "UIKit utilities",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -76,5 +76,5 @@
76
76
  "readmeFile": "./README.md",
77
77
  "displayName": "@sendbird/uikit-utils"
78
78
  },
79
- "gitHead": "955f7adf0891976d8553d9c3b4c171225c775bc9"
79
+ "gitHead": "95323825da753f20b931b4a8b7e187cd8dc6284e"
80
80
  }
package/src/index.ts CHANGED
@@ -16,6 +16,7 @@ export {
16
16
  emailRegex,
17
17
  phoneRegex,
18
18
  } from './shared/regex';
19
+ export { BufferedRequest } from './shared/bufferedRequest';
19
20
 
20
21
  export * from './hooks';
21
22
  export * from './ui-format/groupChannel';
@@ -28,6 +29,15 @@ export const NOOP: () => void = () => void 0;
28
29
  export const ASYNC_NOOP = async () => void 0;
29
30
  export const PASS = <T>(val: T) => val;
30
31
  export const toMegabyte = (byte: number) => byte / 1024 / 1024;
32
+ export const isFunction = <T>(param?: T): param is NonNullable<T> => typeof param === 'function';
33
+ export const SBErrorCode = {
34
+ NON_AUTHORIZED: 400108,
35
+ };
36
+ export const SBErrorMessage = {
37
+ ACL:
38
+ "An error occurred because you don't have access to the user list in your application.\n" +
39
+ 'In order to gain access, you can turn on this attribute in the Access Control List settings on Sendbird Dashboard.',
40
+ };
31
41
 
32
42
  export type {
33
43
  FilterByValueType,
@@ -1,10 +1,5 @@
1
- import type {
2
- SendbirdBaseChannel,
3
- SendbirdChannel,
4
- SendbirdChatSDK,
5
- SendbirdGroupChannel,
6
- SendbirdOpenChannel,
7
- } from '../types';
1
+ import { BufferedRequest } from '../shared/bufferedRequest';
2
+ import type { SendbirdBaseChannel, SendbirdChannel, SendbirdGroupChannel, SendbirdOpenChannel } from '../types';
8
3
 
9
4
  /**
10
5
  * Diff utils for channel
@@ -21,15 +16,16 @@ export const isGroupChannelChatUnavailable = (channel: SendbirdGroupChannel) =>
21
16
  return channel.myMutedState === 'muted' || (channel.isFrozen && channel.myRole !== 'operator');
22
17
  };
23
18
 
24
- export const confirmAndMarkAsRead = async (sdk: SendbirdChatSDK, channels: SendbirdBaseChannel[]) => {
25
- const channelUrls = channels.filter((it) => it.isGroupChannel() && it.unreadMessageCount > 0).map((it) => it.url);
26
- await sdk.groupChannel.markAsReadWithChannelUrls(channelUrls);
19
+ export const confirmAndMarkAsRead = async (channels: SendbirdBaseChannel[]) => {
20
+ channels
21
+ .filter((it): it is SendbirdGroupChannel => it.isGroupChannel() && it.unreadMessageCount > 0)
22
+ .forEach((it) => BufferedRequest.markAsRead.push(() => it.markAsRead()));
27
23
  };
28
24
 
29
- export const confirmAndMarkAsDelivered = async (sdk: SendbirdChatSDK, channel: SendbirdBaseChannel) => {
30
- if (channel.isGroupChannel() && channel.unreadMessageCount > 0) {
31
- await sdk.groupChannel.markAsDelivered(channel.url);
32
- }
25
+ export const confirmAndMarkAsDelivered = async (channels: SendbirdBaseChannel[]) => {
26
+ channels
27
+ .filter((it): it is SendbirdGroupChannel => it.isGroupChannel() && it.unreadMessageCount > 0)
28
+ .forEach((it) => BufferedRequest.markAsDelivered.push(() => it.markAsDelivered()));
33
29
  };
34
30
 
35
31
  export function isDefaultCoverImage(coverUrl: string) {
@@ -0,0 +1,85 @@
1
+ type Func = (...args: unknown[]) => Promise<unknown>;
2
+ type State = 'idle' | 'processing';
3
+
4
+ let REQ_PER_TIMEOUT = 5;
5
+ let TIMEOUT_MILLS = 1000;
6
+ const SAFE_TIMEOUT_BUFFER = 100;
7
+
8
+ export class BufferedRequest {
9
+ public static markAsRead = BufferedRequest.create();
10
+ public static markAsDelivered = BufferedRequest.create();
11
+
12
+ public static get reqPerTimeout() {
13
+ return REQ_PER_TIMEOUT;
14
+ }
15
+ public static set reqPerTimeout(value: number) {
16
+ REQ_PER_TIMEOUT = value;
17
+ BufferedRequest.markAsRead = BufferedRequest.create();
18
+ BufferedRequest.markAsDelivered = BufferedRequest.create();
19
+ }
20
+
21
+ public static get timeoutMills() {
22
+ return TIMEOUT_MILLS;
23
+ }
24
+ public static set timeoutMills(value: number) {
25
+ TIMEOUT_MILLS = value;
26
+ BufferedRequest.markAsRead = BufferedRequest.create();
27
+ BufferedRequest.markAsDelivered = BufferedRequest.create();
28
+ }
29
+
30
+ public static create(reqPerTimeout = REQ_PER_TIMEOUT, timeoutMills = TIMEOUT_MILLS) {
31
+ const waitQueue: Func[] = [];
32
+ const nextQueue: Func[] = [];
33
+
34
+ let state: State = 'idle';
35
+ let timeout: NodeJS.Timeout | undefined;
36
+
37
+ return {
38
+ push(func: Func) {
39
+ waitQueue.push(func);
40
+ this.invoke();
41
+ },
42
+ shift() {
43
+ if (nextQueue.length < reqPerTimeout) {
44
+ const nextRemains = Math.min(reqPerTimeout - nextQueue.length, waitQueue.length);
45
+ for (let n = 0; n < nextRemains; n++) {
46
+ const func = waitQueue.shift();
47
+ if (func) nextQueue.push(func);
48
+ }
49
+ }
50
+ },
51
+ handleIdle() {
52
+ if (0 < nextQueue.length) {
53
+ state = 'processing';
54
+ this.invoke();
55
+ }
56
+ },
57
+ handleProcessing() {
58
+ if (timeout) return;
59
+
60
+ timeout = setTimeout(() => {
61
+ timeout = undefined;
62
+ if (0 < nextQueue.length || 0 < waitQueue.length) {
63
+ this.invoke();
64
+ } else {
65
+ state = 'idle';
66
+ }
67
+ }, timeoutMills + SAFE_TIMEOUT_BUFFER);
68
+
69
+ nextQueue.forEach((func) => func());
70
+ nextQueue.length = 0;
71
+ },
72
+ async invoke() {
73
+ this.shift();
74
+
75
+ if (state === 'idle') {
76
+ this.handleIdle();
77
+ }
78
+
79
+ if (state === 'processing') {
80
+ this.handleProcessing();
81
+ }
82
+ },
83
+ };
84
+ }
85
+ }