@sendbird/uikit-react-native 3.2.0 → 3.3.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.
Files changed (73) hide show
  1. package/lib/commonjs/components/ChannelInput/EditInput.js +2 -11
  2. package/lib/commonjs/components/ChannelInput/EditInput.js.map +1 -1
  3. package/lib/commonjs/components/ChannelInput/SendInput.js +2 -11
  4. package/lib/commonjs/components/ChannelInput/SendInput.js.map +1 -1
  5. package/lib/commonjs/components/ChannelInput/index.js +30 -3
  6. package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
  7. package/lib/commonjs/components/ChannelMessageList/index.js +148 -116
  8. package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
  9. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +34 -1
  10. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
  11. package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js +14 -4
  12. package/lib/commonjs/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
  13. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +1 -0
  14. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  15. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  16. package/lib/commonjs/fragments/createGroupChannelFragment.js +4 -3
  17. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  18. package/lib/commonjs/index.js +4 -0
  19. package/lib/commonjs/index.js.map +1 -1
  20. package/lib/commonjs/types.js +7 -0
  21. package/lib/commonjs/types.js.map +1 -1
  22. package/lib/commonjs/utils/promise.js +138 -0
  23. package/lib/commonjs/utils/promise.js.map +1 -0
  24. package/lib/commonjs/version.js +1 -1
  25. package/lib/commonjs/version.js.map +1 -1
  26. package/lib/module/components/ChannelInput/EditInput.js +3 -12
  27. package/lib/module/components/ChannelInput/EditInput.js.map +1 -1
  28. package/lib/module/components/ChannelInput/SendInput.js +3 -12
  29. package/lib/module/components/ChannelInput/SendInput.js.map +1 -1
  30. package/lib/module/components/ChannelInput/index.js +32 -5
  31. package/lib/module/components/ChannelInput/index.js.map +1 -1
  32. package/lib/module/components/ChannelMessageList/index.js +148 -116
  33. package/lib/module/components/ChannelMessageList/index.js.map +1 -1
  34. package/lib/module/components/GroupChannelMessageRenderer/index.js +34 -2
  35. package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
  36. package/lib/module/domain/groupChannel/component/GroupChannelHeader.js +15 -5
  37. package/lib/module/domain/groupChannel/component/GroupChannelHeader.js.map +1 -1
  38. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +1 -0
  39. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  40. package/lib/module/domain/groupChannel/types.js.map +1 -1
  41. package/lib/module/fragments/createGroupChannelFragment.js +4 -3
  42. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  43. package/lib/module/index.js +4 -0
  44. package/lib/module/index.js.map +1 -1
  45. package/lib/module/types.js +5 -1
  46. package/lib/module/types.js.map +1 -1
  47. package/lib/module/utils/promise.js +132 -0
  48. package/lib/module/utils/promise.js.map +1 -0
  49. package/lib/module/version.js +1 -1
  50. package/lib/module/version.js.map +1 -1
  51. package/lib/typescript/src/components/ChannelInput/index.d.ts +2 -0
  52. package/lib/typescript/src/components/ChannelMessageList/index.d.ts +3 -0
  53. package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +3 -0
  54. package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +2 -0
  55. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  56. package/lib/typescript/src/domain/groupChannel/types.d.ts +3 -0
  57. package/lib/typescript/src/types.d.ts +4 -0
  58. package/lib/typescript/src/utils/promise.d.ts +7 -0
  59. package/lib/typescript/src/version.d.ts +1 -1
  60. package/package.json +6 -6
  61. package/src/components/ChannelInput/EditInput.tsx +3 -15
  62. package/src/components/ChannelInput/SendInput.tsx +2 -9
  63. package/src/components/ChannelInput/index.tsx +27 -4
  64. package/src/components/ChannelMessageList/index.tsx +144 -114
  65. package/src/components/GroupChannelMessageRenderer/index.tsx +34 -2
  66. package/src/domain/groupChannel/component/GroupChannelHeader.tsx +14 -3
  67. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +1 -0
  68. package/src/domain/groupChannel/types.ts +4 -0
  69. package/src/fragments/createGroupChannelFragment.tsx +11 -3
  70. package/src/index.ts +5 -1
  71. package/src/types.ts +5 -0
  72. package/src/utils/promise.ts +139 -0
  73. package/src/version.ts +1 -1
@@ -54,7 +54,7 @@ const ChannelMessageList = (_ref, ref) => {
54
54
  left,
55
55
  right
56
56
  } = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
57
- const getMessagePressActions = useGetMessagePressActions({
57
+ const createMessagePressActions = useCreateMessagePressActions({
58
58
  channel,
59
59
  currentUserId,
60
60
  onEditMessage,
@@ -74,8 +74,11 @@ const ChannelMessageList = (_ref, ref) => {
74
74
  } = _ref2;
75
75
  const {
76
76
  onPress,
77
- onLongPress
78
- } = getMessagePressActions(item);
77
+ onLongPress,
78
+ bottomSheetItem
79
+ } = createMessagePressActions({
80
+ message: item
81
+ });
79
82
  return renderMessage({
80
83
  message: item,
81
84
  prevMessage: messages[index + 1],
@@ -87,7 +90,9 @@ const ChannelMessageList = (_ref, ref) => {
87
90
  enableMessageGrouping,
88
91
  channel,
89
92
  currentUserId,
90
- focused: ((searchItem === null || searchItem === void 0 ? void 0 : searchItem.startingPoint) ?? -1) === item.createdAt
93
+ focused: ((searchItem === null || searchItem === void 0 ? void 0 : searchItem.startingPoint) ?? -1) === item.createdAt,
94
+ bottomSheetItem,
95
+ isFirstItem: index === 0
91
96
  });
92
97
  });
93
98
  return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
@@ -122,7 +127,7 @@ const ChannelMessageList = (_ref, ref) => {
122
127
  onPress: () => onPressScrollToBottomButton()
123
128
  })));
124
129
  };
125
- const useGetMessagePressActions = _ref3 => {
130
+ const useCreateMessagePressActions = _ref3 => {
126
131
  let {
127
132
  channel,
128
133
  currentUserId,
@@ -152,25 +157,61 @@ const useGetMessagePressActions = _ref3 => {
152
157
  const {
153
158
  sbOptions
154
159
  } = (0, _useContext.useSendbirdChat)();
155
- const onFailureToReSend = error => {
160
+ const onResendFailure = error => {
156
161
  toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error');
157
162
  _uikitUtils.Logger.error(STRINGS.TOAST.RESEND_MSG_ERROR, error);
158
163
  };
159
- const handleFailedMessage = message => {
164
+ const onDeleteFailure = error => {
165
+ toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');
166
+ _uikitUtils.Logger.error(STRINGS.TOAST.DELETE_MSG_ERROR, error);
167
+ };
168
+ const onCopyText = message => {
169
+ if (message.isUserMessage()) {
170
+ clipboardService.setString(message.message || '');
171
+ toast.show(STRINGS.TOAST.COPY_OK, 'success');
172
+ }
173
+ };
174
+ const onDownloadFile = message => {
175
+ if (message.isFileMessage()) {
176
+ if ((0, _uikitUtils.toMegabyte)(message.size) > 4) {
177
+ toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');
178
+ }
179
+ fileService.save({
180
+ fileUrl: message.url,
181
+ fileName: message.name,
182
+ fileType: message.type
183
+ }).then(response => {
184
+ toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
185
+ _uikitUtils.Logger.log('File saved to', response);
186
+ }).catch(err => {
187
+ toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
188
+ _uikitUtils.Logger.log('File save failure', err);
189
+ });
190
+ }
191
+ };
192
+ const onOpenFile = message => {
193
+ if (message.isFileMessage()) {
194
+ const fileType = (0, _uikitUtils.getFileType)(message.type || (0, _uikitUtils.getFileExtension)(message.name));
195
+ if (['image', 'video', 'audio'].includes(fileType)) {
196
+ onPressMediaMessage === null || onPressMediaMessage === void 0 ? void 0 : onPressMediaMessage(message, () => onDeleteMessage(message), (0, _uikitUtils.getAvailableUriFromFileMessage)(message));
197
+ } else {
198
+ _SBUUtils.default.openURL(message.url);
199
+ }
200
+ }
201
+ };
202
+ const openSheetForFailedMessage = message => {
160
203
  openSheet({
161
204
  sheetItems: [{
162
205
  title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,
163
- onPress: () => {
164
- onResendFailedMessage(message).catch(onFailureToReSend);
165
- }
206
+ onPress: () => onResendFailedMessage(message).catch(onResendFailure)
166
207
  }, {
167
208
  title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,
168
209
  titleColor: colors.ui.dialog.default.none.destructive,
169
- onPress: () => confirmDelete(message)
210
+ onPress: () => alertForMessageDelete(message)
170
211
  }]
171
212
  });
172
213
  };
173
- const confirmDelete = message => {
214
+ const alertForMessageDelete = message => {
174
215
  alert({
175
216
  title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,
176
217
  buttons: [{
@@ -179,127 +220,118 @@ const useGetMessagePressActions = _ref3 => {
179
220
  text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,
180
221
  style: 'destructive',
181
222
  onPress: () => {
182
- onDeleteMessage(message).catch(() => toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error'));
223
+ onDeleteMessage(message).catch(onDeleteFailure);
183
224
  }
184
225
  }]
185
226
  });
186
227
  };
187
- return msg => {
188
- if (!msg.isUserMessage() && !msg.isFileMessage()) {
189
- return {
190
- onPress: undefined,
191
- onLongPress: undefined
192
- };
193
- }
228
+ return _ref4 => {
229
+ let {
230
+ message
231
+ } = _ref4;
232
+ if (!message.isUserMessage() && !message.isFileMessage()) return {};
194
233
  const sheetItems = [];
195
- const response = {
196
- onPress: undefined,
197
- onLongPress: undefined
198
- };
199
- if (msg.isUserMessage()) {
200
- sheetItems.push({
234
+ const menu = {
235
+ copy: message => ({
201
236
  icon: 'copy',
202
237
  title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,
203
- onPress: () => {
204
- clipboardService.setString(msg.message || '');
205
- toast.show(STRINGS.TOAST.COPY_OK, 'success');
206
- }
207
- });
208
- }
209
- if (!(0, _uikitUtils.isVoiceMessage)(msg) && msg.isFileMessage()) {
210
- sheetItems.push({
238
+ onPress: () => onCopyText(message)
239
+ }),
240
+ edit: message => ({
241
+ icon: 'edit',
242
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,
243
+ onPress: () => onEditMessage(message)
244
+ }),
245
+ delete: message => ({
246
+ disabled: message.threadInfo ? message.threadInfo.replyCount > 0 : undefined,
247
+ icon: 'delete',
248
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
249
+ onPress: () => alertForMessageDelete(message)
250
+ }),
251
+ reply: message => ({
252
+ disabled: Boolean(message.parentMessageId),
253
+ icon: 'reply',
254
+ title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,
255
+ onPress: () => onReplyMessage === null || onReplyMessage === void 0 ? void 0 : onReplyMessage(message)
256
+ }),
257
+ download: message => ({
211
258
  icon: 'download',
212
259
  title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,
213
- onPress: async () => {
214
- if ((0, _uikitUtils.toMegabyte)(msg.size) > 4) {
215
- toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');
216
- }
217
- fileService.save({
218
- fileUrl: msg.url,
219
- fileName: msg.name,
220
- fileType: msg.type
221
- }).then(response => {
222
- toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
223
- _uikitUtils.Logger.log('File saved to', response);
224
- }).catch(err => {
225
- toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
226
- _uikitUtils.Logger.log('File save failure', err);
227
- });
260
+ onPress: () => onDownloadFile(message)
261
+ })
262
+ };
263
+ if (message.isUserMessage()) {
264
+ sheetItems.push(menu.copy(message));
265
+ if (!channel.isEphemeral) {
266
+ if ((0, _uikitUtils.isMyMessage)(message, currentUserId) && message.sendingStatus === 'succeeded') {
267
+ sheetItems.push(menu.edit(message));
268
+ sheetItems.push(menu.delete(message));
228
269
  }
229
- });
230
- }
231
- if (!channel.isEphemeral) {
232
- if ((0, _uikitUtils.isMyMessage)(msg, currentUserId) && msg.sendingStatus === 'succeeded') {
233
- if (msg.isUserMessage()) {
234
- sheetItems.push({
235
- icon: 'edit',
236
- title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,
237
- onPress: () => onEditMessage(msg)
238
- });
270
+ if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {
271
+ sheetItems.push(menu.reply(message));
239
272
  }
240
- sheetItems.push({
241
- disabled: msg.threadInfo ? msg.threadInfo.replyCount > 0 : undefined,
242
- icon: 'delete',
243
- title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,
244
- onPress: () => confirmDelete(msg)
245
- });
246
- }
247
- if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {
248
- sheetItems.push({
249
- disabled: Boolean(msg.parentMessageId),
250
- icon: 'reply',
251
- title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,
252
- onPress: () => onReplyMessage === null || onReplyMessage === void 0 ? void 0 : onReplyMessage(msg)
253
- });
254
273
  }
255
274
  }
256
- if (msg.isFileMessage()) {
257
- const fileType = (0, _uikitUtils.getFileType)(msg.type || (0, _uikitUtils.getFileExtension)(msg.name));
258
- switch (fileType) {
259
- case 'image':
260
- case 'video':
261
- case 'audio':
262
- {
263
- response.onPress = () => {
264
- onPressMediaMessage === null || onPressMediaMessage === void 0 ? void 0 : onPressMediaMessage(msg, () => onDeleteMessage(msg), (0, _uikitUtils.getAvailableUriFromFileMessage)(msg));
265
- };
266
- break;
267
- }
268
- default:
269
- {
270
- response.onPress = () => _SBUUtils.default.openURL(msg.url);
271
- break;
272
- }
275
+ if (message.isFileMessage()) {
276
+ if (!(0, _uikitUtils.isVoiceMessage)(message)) {
277
+ sheetItems.push(menu.download(message));
278
+ }
279
+ if (!channel.isEphemeral) {
280
+ if ((0, _uikitUtils.isMyMessage)(message, currentUserId) && message.sendingStatus === 'succeeded') {
281
+ sheetItems.push(menu.delete(message));
282
+ }
283
+ if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {
284
+ sheetItems.push(menu.reply(message));
285
+ }
273
286
  }
274
287
  }
275
- if (sheetItems.length > 0) {
276
- response.onLongPress = () => {
277
- openSheet({
278
- sheetItems,
279
- HeaderComponent: (0, _uikitUtils.shouldRenderReaction)(channel, sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions) ? _ref4 => {
280
- let {
281
- onClose
282
- } = _ref4;
283
- return /*#__PURE__*/_react.default.createElement(_ReactionAddons.ReactionAddons.BottomSheet, {
284
- message: msg,
285
- channel: channel,
286
- onClose: onClose
287
- });
288
- } : undefined
288
+ const bottomSheetItem = {
289
+ sheetItems,
290
+ HeaderComponent: (0, _uikitUtils.shouldRenderReaction)(channel, sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions) ? _ref5 => {
291
+ let {
292
+ onClose
293
+ } = _ref5;
294
+ return /*#__PURE__*/_react.default.createElement(_ReactionAddons.ReactionAddons.BottomSheet, {
295
+ message: message,
296
+ channel: channel,
297
+ onClose: onClose
289
298
  });
290
- };
291
- }
292
- if (msg.sendingStatus === 'failed') {
293
- response.onLongPress = () => handleFailedMessage(msg);
294
- response.onPress = () => {
295
- onResendFailedMessage(msg).catch(onFailureToReSend);
296
- };
297
- }
298
- if (msg.sendingStatus === 'pending') {
299
- response.onLongPress = undefined;
300
- response.onPress = undefined;
299
+ } : undefined
300
+ };
301
+ switch (true) {
302
+ case message.sendingStatus === 'pending':
303
+ {
304
+ return {
305
+ onPress: undefined,
306
+ onLongPress: undefined,
307
+ bottomSheetItem: undefined
308
+ };
309
+ }
310
+ case message.sendingStatus === 'failed':
311
+ {
312
+ return {
313
+ onPress: () => onResendFailedMessage(message).catch(onResendFailure),
314
+ onLongPress: () => openSheetForFailedMessage(message),
315
+ bottomSheetItem
316
+ };
317
+ }
318
+ case message.isFileMessage():
319
+ {
320
+ return {
321
+ onPress: () => onOpenFile(message),
322
+ onLongPress: () => openSheet(bottomSheetItem),
323
+ bottomSheetItem
324
+ };
325
+ }
326
+ default:
327
+ {
328
+ return {
329
+ onPress: undefined,
330
+ onLongPress: () => openSheet(bottomSheetItem),
331
+ bottomSheetItem
332
+ };
333
+ }
301
334
  }
302
- return response;
303
335
  };
304
336
  };
305
337
  const styles = (0, _uikitReactNativeFoundation.createStyleSheet)({
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_reactNativeSafeAreaContext","_uikitReactNativeFoundation","_uikitUtils","_useContext","_SBUUtils","_ChatFlatList","_ReactionAddons","obj","__esModule","default","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","ChannelMessageList","_ref","ref","searchItem","hasNext","channel","onEditMessage","onReplyMessage","onDeleteMessage","onResendFailedMessage","onPressMediaMessage","onPressParentMessage","currentUserId","renderNewMessagesButton","renderScrollToBottomButton","renderMessage","messages","newMessages","enableMessageGrouping","onScrolledAwayFromBottom","scrolledAwayFromBottom","onBottomReached","onTopReached","flatListProps","onPressNewMessagesButton","onPressScrollToBottomButton","STRINGS","useLocalization","colors","useUIKitTheme","show","useUserProfile","left","right","useSafeAreaInsets","getMessagePressActions","useGetMessagePressActions","safeAreaLayout","paddingLeft","paddingRight","renderItem","useFreshCallback","_ref2","item","index","onPress","onLongPress","message","prevMessage","nextMessage","onShowUserProfile","focused","startingPoint","createdAt","createElement","View","style","flex","backgroundColor","background","isFrozen","ChannelFrozenBanner","styles","frozenBanner","text","LABELS","CHANNEL_MESSAGE_LIST_FROZEN","data","keyExtractor","messageKeyExtractor","contentContainerStyle","frozenListPadding","newMsgButton","visible","scrollButton","_ref3","toast","useToast","openSheet","useBottomSheet","alert","useAlert","clipboardService","fileService","usePlatformService","sbOptions","useSendbirdChat","onFailureToReSend","error","TOAST","RESEND_MSG_ERROR","Logger","handleFailedMessage","sheetItems","title","CHANNEL_MESSAGE_FAILED_RETRY","catch","CHANNEL_MESSAGE_FAILED_REMOVE","titleColor","ui","dialog","none","destructive","confirmDelete","CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE","buttons","CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL","CHANNEL_MESSAGE_DELETE_CONFIRM_OK","DELETE_MSG_ERROR","msg","isUserMessage","isFileMessage","undefined","response","push","icon","CHANNEL_MESSAGE_COPY","setString","COPY_OK","isVoiceMessage","CHANNEL_MESSAGE_SAVE","toMegabyte","size","DOWNLOAD_START","save","fileUrl","url","fileName","name","fileType","type","then","DOWNLOAD_OK","log","err","DOWNLOAD_ERROR","isEphemeral","isMyMessage","sendingStatus","CHANNEL_MESSAGE_EDIT","disabled","threadInfo","replyCount","CHANNEL_MESSAGE_DELETE","isGroupChannel","uikit","groupChannel","replyType","Boolean","parentMessageId","CHANNEL_MESSAGE_REPLY","getFileType","getFileExtension","getAvailableUriFromFileMessage","SBUUtils","openURL","HeaderComponent","shouldRenderReaction","uikitWithAppInfo","enableReactions","_ref4","onClose","ReactionAddons","BottomSheet","createStyleSheet","position","zIndex","top","paddingBottom","bottom","alignSelf","_default","React","forwardRef","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { Ref } from 'react';\nimport { FlatList, FlatListProps, ListRenderItem, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport {\n BottomSheetItem,\n ChannelFrozenBanner,\n createStyleSheet,\n useAlert,\n useBottomSheet,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport {\n Logger,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n getAvailableUriFromFileMessage,\n getFileExtension,\n getFileType,\n isMyMessage,\n isVoiceMessage,\n messageKeyExtractor,\n shouldRenderReaction,\n toMegabyte,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport type { UserProfileContextType } from '../../contexts/UserProfileCtx';\nimport { useLocalization, usePlatformService, useSendbirdChat, useUserProfile } from '../../hooks/useContext';\nimport SBUUtils from '../../libs/SBUUtils';\nimport type { CommonComponent } from '../../types';\nimport ChatFlatList from '../ChatFlatList';\nimport { ReactionAddons } from '../ReactionAddons';\n\ntype PressActions = { onPress?: () => void; onLongPress?: () => void };\ntype HandleableMessage = SendbirdUserMessage | SendbirdFileMessage;\nexport type ChannelMessageListProps<T extends SendbirdGroupChannel | SendbirdOpenChannel> = {\n enableMessageGrouping: boolean;\n currentUserId?: string;\n channel: T;\n messages: SendbirdMessage[];\n newMessages: SendbirdMessage[];\n searchItem?: { startingPoint: number };\n\n scrolledAwayFromBottom: boolean;\n onScrolledAwayFromBottom: (value: boolean) => void;\n onTopReached: () => void;\n onBottomReached: () => void;\n hasNext: () => boolean;\n\n onPressNewMessagesButton: (animated?: boolean) => void;\n onPressScrollToBottomButton: (animated?: boolean) => void;\n\n onEditMessage: (message: HandleableMessage) => void;\n onReplyMessage?: (message: HandleableMessage) => void; // only available on group channel\n onDeleteMessage: (message: HandleableMessage) => Promise<void>;\n onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<void>;\n onPressParentMessage?: (parentMessage: SendbirdMessage) => void;\n onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;\n\n renderMessage: (props: {\n focused: boolean;\n message: SendbirdMessage;\n prevMessage?: SendbirdMessage;\n nextMessage?: SendbirdMessage;\n onPress?: () => void;\n onLongPress?: () => void;\n onPressParentMessage?: ChannelMessageListProps<T>['onPressParentMessage'];\n onShowUserProfile?: UserProfileContextType['show'];\n channel: T;\n currentUserId?: ChannelMessageListProps<T>['currentUserId'];\n enableMessageGrouping: ChannelMessageListProps<T>['enableMessageGrouping'];\n }) => React.ReactElement | null;\n renderNewMessagesButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n newMessages: SendbirdMessage[];\n }>;\n renderScrollToBottomButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n }>;\n flatListProps?: Omit<FlatListProps<SendbirdMessage>, 'data' | 'renderItem'>;\n} & {\n ref?: Ref<FlatList<SendbirdMessage>> | undefined;\n};\n\nconst ChannelMessageList = <T extends SendbirdGroupChannel | SendbirdOpenChannel>(\n {\n searchItem,\n hasNext,\n channel,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n onPressParentMessage,\n currentUserId,\n renderNewMessagesButton,\n renderScrollToBottomButton,\n renderMessage,\n messages,\n newMessages,\n enableMessageGrouping,\n onScrolledAwayFromBottom,\n scrolledAwayFromBottom,\n onBottomReached,\n onTopReached,\n flatListProps,\n onPressNewMessagesButton,\n onPressScrollToBottomButton,\n }: ChannelMessageListProps<T>,\n ref: React.ForwardedRef<FlatList<SendbirdMessage>>,\n) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { show } = useUserProfile();\n const { left, right } = useSafeAreaInsets();\n const getMessagePressActions = useGetMessagePressActions({\n channel,\n currentUserId,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n });\n\n const safeAreaLayout = { paddingLeft: left, paddingRight: right };\n\n const renderItem: ListRenderItem<SendbirdMessage> = useFreshCallback(({ item, index }) => {\n const { onPress, onLongPress } = getMessagePressActions(item);\n return renderMessage({\n message: item,\n prevMessage: messages[index + 1],\n nextMessage: messages[index - 1],\n onPress,\n onLongPress,\n onPressParentMessage,\n onShowUserProfile: show,\n enableMessageGrouping,\n channel,\n currentUserId,\n focused: (searchItem?.startingPoint ?? -1) === item.createdAt,\n });\n });\n\n return (\n <View style={[{ flex: 1, backgroundColor: colors.background }, safeAreaLayout]}>\n {channel.isFrozen && (\n <ChannelFrozenBanner style={styles.frozenBanner} text={STRINGS.LABELS.CHANNEL_MESSAGE_LIST_FROZEN} />\n )}\n <ChatFlatList\n {...flatListProps}\n onTopReached={onTopReached}\n onBottomReached={onBottomReached}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n ref={ref}\n data={messages}\n renderItem={renderItem}\n keyExtractor={messageKeyExtractor}\n contentContainerStyle={[\n // { minHeight: '100%', justifyContent: 'flex-end' },\n channel.isFrozen && styles.frozenListPadding,\n flatListProps?.contentContainerStyle,\n ]}\n />\n {renderNewMessagesButton && (\n <View style={[styles.newMsgButton, safeAreaLayout]}>\n {renderNewMessagesButton({\n visible: newMessages.length > 0 && (hasNext() || scrolledAwayFromBottom),\n onPress: () => onPressNewMessagesButton(),\n newMessages,\n })}\n </View>\n )}\n {renderScrollToBottomButton && (\n <View style={[styles.scrollButton, safeAreaLayout]}>\n {renderScrollToBottomButton({\n visible: hasNext() || scrolledAwayFromBottom,\n onPress: () => onPressScrollToBottomButton(),\n })}\n </View>\n )}\n </View>\n );\n};\n\nconst useGetMessagePressActions = <T extends SendbirdGroupChannel | SendbirdOpenChannel>({\n channel,\n currentUserId,\n onResendFailedMessage,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onPressMediaMessage,\n}: Pick<\n ChannelMessageListProps<T>,\n | 'channel'\n | 'currentUserId'\n | 'onEditMessage'\n | 'onReplyMessage'\n | 'onDeleteMessage'\n | 'onResendFailedMessage'\n | 'onPressMediaMessage'\n>) => {\n const { colors } = useUIKitTheme();\n const { STRINGS } = useLocalization();\n const toast = useToast();\n const { openSheet } = useBottomSheet();\n const { alert } = useAlert();\n const { clipboardService, fileService } = usePlatformService();\n const { sbOptions } = useSendbirdChat();\n\n const onFailureToReSend = (error: Error) => {\n toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.RESEND_MSG_ERROR, error);\n };\n\n const handleFailedMessage = (message: HandleableMessage) => {\n openSheet({\n sheetItems: [\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,\n onPress: () => {\n onResendFailedMessage(message).catch(onFailureToReSend);\n },\n },\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,\n titleColor: colors.ui.dialog.default.none.destructive,\n onPress: () => confirmDelete(message),\n },\n ],\n });\n };\n const confirmDelete = (message: HandleableMessage) => {\n alert({\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,\n buttons: [\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL,\n },\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,\n style: 'destructive',\n onPress: () => {\n onDeleteMessage(message).catch(() => toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error'));\n },\n },\n ],\n });\n };\n\n return (msg: SendbirdMessage) => {\n if (!msg.isUserMessage() && !msg.isFileMessage()) {\n return { onPress: undefined, onLongPress: undefined };\n }\n\n const sheetItems: BottomSheetItem['sheetItems'] = [];\n const response: PressActions = {\n onPress: undefined,\n onLongPress: undefined,\n };\n\n if (msg.isUserMessage()) {\n sheetItems.push({\n icon: 'copy',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,\n onPress: () => {\n clipboardService.setString(msg.message || '');\n toast.show(STRINGS.TOAST.COPY_OK, 'success');\n },\n });\n }\n if (!isVoiceMessage(msg) && msg.isFileMessage()) {\n sheetItems.push({\n icon: 'download',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,\n onPress: async () => {\n if (toMegabyte(msg.size) > 4) {\n toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');\n }\n\n fileService\n .save({ fileUrl: msg.url, fileName: msg.name, fileType: msg.type })\n .then((response) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');\n Logger.log('File saved to', response);\n })\n .catch((err) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');\n Logger.log('File save failure', err);\n });\n },\n });\n }\n\n if (!channel.isEphemeral) {\n if (isMyMessage(msg, currentUserId) && msg.sendingStatus === 'succeeded') {\n if (msg.isUserMessage()) {\n sheetItems.push({\n icon: 'edit',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,\n onPress: () => onEditMessage(msg),\n });\n }\n sheetItems.push({\n disabled: msg.threadInfo ? msg.threadInfo.replyCount > 0 : undefined,\n icon: 'delete',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,\n onPress: () => confirmDelete(msg),\n });\n }\n if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {\n sheetItems.push({\n disabled: Boolean(msg.parentMessageId),\n icon: 'reply',\n title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,\n onPress: () => onReplyMessage?.(msg),\n });\n }\n }\n\n if (msg.isFileMessage()) {\n const fileType = getFileType(msg.type || getFileExtension(msg.name));\n switch (fileType) {\n case 'image':\n case 'video':\n case 'audio': {\n response.onPress = () => {\n onPressMediaMessage?.(msg, () => onDeleteMessage(msg), getAvailableUriFromFileMessage(msg));\n };\n break;\n }\n default: {\n response.onPress = () => SBUUtils.openURL(msg.url);\n break;\n }\n }\n }\n\n if (sheetItems.length > 0) {\n response.onLongPress = () => {\n openSheet({\n sheetItems,\n HeaderComponent: shouldRenderReaction(\n channel,\n sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions,\n )\n ? ({ onClose }) => <ReactionAddons.BottomSheet message={msg} channel={channel} onClose={onClose} />\n : undefined,\n });\n };\n }\n\n if (msg.sendingStatus === 'failed') {\n response.onLongPress = () => handleFailedMessage(msg);\n response.onPress = () => {\n onResendFailedMessage(msg).catch(onFailureToReSend);\n };\n }\n\n if (msg.sendingStatus === 'pending') {\n response.onLongPress = undefined;\n response.onPress = undefined;\n }\n\n return response;\n };\n};\n\nconst styles = createStyleSheet({\n frozenBanner: {\n position: 'absolute',\n zIndex: 999,\n top: 8,\n left: 8,\n right: 8,\n },\n frozenListPadding: {\n paddingBottom: 32,\n },\n newMsgButton: {\n position: 'absolute',\n zIndex: 999,\n bottom: 10,\n alignSelf: 'center',\n },\n scrollButton: {\n position: 'absolute',\n zIndex: 998,\n bottom: 10,\n right: 16,\n },\n});\n\n// NOTE: Due to Generic inference is not working on forwardRef, we need to cast it as typeof ChannelMessageList and implicit `ref` prop\nexport default React.forwardRef(ChannelMessageList) as typeof ChannelMessageList;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_reactNativeSafeAreaContext","_uikitReactNativeFoundation","_uikitUtils","_useContext","_SBUUtils","_ChatFlatList","_ReactionAddons","obj","__esModule","default","_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","ChannelMessageList","_ref","ref","searchItem","hasNext","channel","onEditMessage","onReplyMessage","onDeleteMessage","onResendFailedMessage","onPressMediaMessage","onPressParentMessage","currentUserId","renderNewMessagesButton","renderScrollToBottomButton","renderMessage","messages","newMessages","enableMessageGrouping","onScrolledAwayFromBottom","scrolledAwayFromBottom","onBottomReached","onTopReached","flatListProps","onPressNewMessagesButton","onPressScrollToBottomButton","STRINGS","useLocalization","colors","useUIKitTheme","show","useUserProfile","left","right","useSafeAreaInsets","createMessagePressActions","useCreateMessagePressActions","safeAreaLayout","paddingLeft","paddingRight","renderItem","useFreshCallback","_ref2","item","index","onPress","onLongPress","bottomSheetItem","message","prevMessage","nextMessage","onShowUserProfile","focused","startingPoint","createdAt","isFirstItem","createElement","View","style","flex","backgroundColor","background","isFrozen","ChannelFrozenBanner","styles","frozenBanner","text","LABELS","CHANNEL_MESSAGE_LIST_FROZEN","data","keyExtractor","messageKeyExtractor","contentContainerStyle","frozenListPadding","newMsgButton","visible","scrollButton","_ref3","toast","useToast","openSheet","useBottomSheet","alert","useAlert","clipboardService","fileService","usePlatformService","sbOptions","useSendbirdChat","onResendFailure","error","TOAST","RESEND_MSG_ERROR","Logger","onDeleteFailure","DELETE_MSG_ERROR","onCopyText","isUserMessage","setString","COPY_OK","onDownloadFile","isFileMessage","toMegabyte","size","DOWNLOAD_START","save","fileUrl","url","fileName","name","fileType","type","then","response","DOWNLOAD_OK","log","catch","err","DOWNLOAD_ERROR","onOpenFile","getFileType","getFileExtension","includes","getAvailableUriFromFileMessage","SBUUtils","openURL","openSheetForFailedMessage","sheetItems","title","CHANNEL_MESSAGE_FAILED_RETRY","CHANNEL_MESSAGE_FAILED_REMOVE","titleColor","ui","dialog","none","destructive","alertForMessageDelete","CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE","buttons","CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL","CHANNEL_MESSAGE_DELETE_CONFIRM_OK","_ref4","menu","copy","icon","CHANNEL_MESSAGE_COPY","edit","CHANNEL_MESSAGE_EDIT","delete","disabled","threadInfo","replyCount","undefined","CHANNEL_MESSAGE_DELETE","reply","Boolean","parentMessageId","CHANNEL_MESSAGE_REPLY","download","CHANNEL_MESSAGE_SAVE","push","isEphemeral","isMyMessage","sendingStatus","isGroupChannel","uikit","groupChannel","replyType","isVoiceMessage","HeaderComponent","shouldRenderReaction","uikitWithAppInfo","enableReactions","_ref5","onClose","ReactionAddons","BottomSheet","createStyleSheet","position","zIndex","top","paddingBottom","bottom","alignSelf","_default","React","forwardRef","exports"],"sources":["index.tsx"],"sourcesContent":["import React, { Ref } from 'react';\nimport { FlatList, FlatListProps, ListRenderItem, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport {\n BottomSheetItem,\n ChannelFrozenBanner,\n createStyleSheet,\n useAlert,\n useBottomSheet,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport {\n Logger,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n getAvailableUriFromFileMessage,\n getFileExtension,\n getFileType,\n isMyMessage,\n isVoiceMessage,\n messageKeyExtractor,\n shouldRenderReaction,\n toMegabyte,\n useFreshCallback,\n} from '@sendbird/uikit-utils';\n\nimport type { UserProfileContextType } from '../../contexts/UserProfileCtx';\nimport { useLocalization, usePlatformService, useSendbirdChat, useUserProfile } from '../../hooks/useContext';\nimport SBUUtils from '../../libs/SBUUtils';\nimport type { CommonComponent } from '../../types';\nimport ChatFlatList from '../ChatFlatList';\nimport { ReactionAddons } from '../ReactionAddons';\n\ntype PressActions = { onPress?: () => void; onLongPress?: () => void; bottomSheetItem?: BottomSheetItem };\ntype HandleableMessage = SendbirdUserMessage | SendbirdFileMessage;\ntype CreateMessagePressActions = (params: { message: SendbirdMessage }) => PressActions;\nexport type ChannelMessageListProps<T extends SendbirdGroupChannel | SendbirdOpenChannel> = {\n enableMessageGrouping: boolean;\n currentUserId?: string;\n channel: T;\n messages: SendbirdMessage[];\n newMessages: SendbirdMessage[];\n searchItem?: { startingPoint: number };\n\n scrolledAwayFromBottom: boolean;\n onScrolledAwayFromBottom: (value: boolean) => void;\n onTopReached: () => void;\n onBottomReached: () => void;\n hasNext: () => boolean;\n\n onPressNewMessagesButton: (animated?: boolean) => void;\n onPressScrollToBottomButton: (animated?: boolean) => void;\n\n onEditMessage: (message: HandleableMessage) => void;\n onReplyMessage?: (message: HandleableMessage) => void; // only available on group channel\n onDeleteMessage: (message: HandleableMessage) => Promise<void>;\n onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<void>;\n onPressParentMessage?: (parentMessage: SendbirdMessage) => void;\n onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;\n\n renderMessage: (props: {\n focused: boolean;\n message: SendbirdMessage;\n prevMessage?: SendbirdMessage;\n nextMessage?: SendbirdMessage;\n onPress?: () => void;\n onLongPress?: () => void;\n onPressParentMessage?: ChannelMessageListProps<T>['onPressParentMessage'];\n onShowUserProfile?: UserProfileContextType['show'];\n channel: T;\n currentUserId?: ChannelMessageListProps<T>['currentUserId'];\n enableMessageGrouping: ChannelMessageListProps<T>['enableMessageGrouping'];\n bottomSheetItem?: BottomSheetItem;\n isFirstItem: boolean;\n }) => React.ReactElement | null;\n renderNewMessagesButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n newMessages: SendbirdMessage[];\n }>;\n renderScrollToBottomButton: null | CommonComponent<{\n visible: boolean;\n onPress: () => void;\n }>;\n flatListProps?: Omit<FlatListProps<SendbirdMessage>, 'data' | 'renderItem'>;\n} & {\n ref?: Ref<FlatList<SendbirdMessage>> | undefined;\n};\n\nconst ChannelMessageList = <T extends SendbirdGroupChannel | SendbirdOpenChannel>(\n {\n searchItem,\n hasNext,\n channel,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n onPressParentMessage,\n currentUserId,\n renderNewMessagesButton,\n renderScrollToBottomButton,\n renderMessage,\n messages,\n newMessages,\n enableMessageGrouping,\n onScrolledAwayFromBottom,\n scrolledAwayFromBottom,\n onBottomReached,\n onTopReached,\n flatListProps,\n onPressNewMessagesButton,\n onPressScrollToBottomButton,\n }: ChannelMessageListProps<T>,\n ref: React.ForwardedRef<FlatList<SendbirdMessage>>,\n) => {\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n const { show } = useUserProfile();\n const { left, right } = useSafeAreaInsets();\n const createMessagePressActions = useCreateMessagePressActions({\n channel,\n currentUserId,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onResendFailedMessage,\n onPressMediaMessage,\n });\n\n const safeAreaLayout = { paddingLeft: left, paddingRight: right };\n\n const renderItem: ListRenderItem<SendbirdMessage> = useFreshCallback(({ item, index }) => {\n const { onPress, onLongPress, bottomSheetItem } = createMessagePressActions({ message: item });\n return renderMessage({\n message: item,\n prevMessage: messages[index + 1],\n nextMessage: messages[index - 1],\n onPress,\n onLongPress,\n onPressParentMessage,\n onShowUserProfile: show,\n enableMessageGrouping,\n channel,\n currentUserId,\n focused: (searchItem?.startingPoint ?? -1) === item.createdAt,\n bottomSheetItem,\n isFirstItem: index === 0,\n });\n });\n\n return (\n <View style={[{ flex: 1, backgroundColor: colors.background }, safeAreaLayout]}>\n {channel.isFrozen && (\n <ChannelFrozenBanner style={styles.frozenBanner} text={STRINGS.LABELS.CHANNEL_MESSAGE_LIST_FROZEN} />\n )}\n <ChatFlatList\n {...flatListProps}\n onTopReached={onTopReached}\n onBottomReached={onBottomReached}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n ref={ref}\n data={messages}\n renderItem={renderItem}\n keyExtractor={messageKeyExtractor}\n contentContainerStyle={[\n // { minHeight: '100%', justifyContent: 'flex-end' },\n channel.isFrozen && styles.frozenListPadding,\n flatListProps?.contentContainerStyle,\n ]}\n />\n {renderNewMessagesButton && (\n <View style={[styles.newMsgButton, safeAreaLayout]}>\n {renderNewMessagesButton({\n visible: newMessages.length > 0 && (hasNext() || scrolledAwayFromBottom),\n onPress: () => onPressNewMessagesButton(),\n newMessages,\n })}\n </View>\n )}\n {renderScrollToBottomButton && (\n <View style={[styles.scrollButton, safeAreaLayout]}>\n {renderScrollToBottomButton({\n visible: hasNext() || scrolledAwayFromBottom,\n onPress: () => onPressScrollToBottomButton(),\n })}\n </View>\n )}\n </View>\n );\n};\n\nconst useCreateMessagePressActions = <T extends SendbirdGroupChannel | SendbirdOpenChannel>({\n channel,\n currentUserId,\n onResendFailedMessage,\n onEditMessage,\n onReplyMessage,\n onDeleteMessage,\n onPressMediaMessage,\n}: Pick<\n ChannelMessageListProps<T>,\n | 'channel'\n | 'currentUserId'\n | 'onEditMessage'\n | 'onReplyMessage'\n | 'onDeleteMessage'\n | 'onResendFailedMessage'\n | 'onPressMediaMessage'\n>): CreateMessagePressActions => {\n const { colors } = useUIKitTheme();\n const { STRINGS } = useLocalization();\n const toast = useToast();\n const { openSheet } = useBottomSheet();\n const { alert } = useAlert();\n const { clipboardService, fileService } = usePlatformService();\n const { sbOptions } = useSendbirdChat();\n\n const onResendFailure = (error: Error) => {\n toast.show(STRINGS.TOAST.RESEND_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.RESEND_MSG_ERROR, error);\n };\n\n const onDeleteFailure = (error: Error) => {\n toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');\n Logger.error(STRINGS.TOAST.DELETE_MSG_ERROR, error);\n };\n\n const onCopyText = (message: HandleableMessage) => {\n if (message.isUserMessage()) {\n clipboardService.setString(message.message || '');\n toast.show(STRINGS.TOAST.COPY_OK, 'success');\n }\n };\n\n const onDownloadFile = (message: HandleableMessage) => {\n if (message.isFileMessage()) {\n if (toMegabyte(message.size) > 4) {\n toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');\n }\n\n fileService\n .save({ fileUrl: message.url, fileName: message.name, fileType: message.type })\n .then((response) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');\n Logger.log('File saved to', response);\n })\n .catch((err) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');\n Logger.log('File save failure', err);\n });\n }\n };\n\n const onOpenFile = (message: HandleableMessage) => {\n if (message.isFileMessage()) {\n const fileType = getFileType(message.type || getFileExtension(message.name));\n if (['image', 'video', 'audio'].includes(fileType)) {\n onPressMediaMessage?.(message, () => onDeleteMessage(message), getAvailableUriFromFileMessage(message));\n } else {\n SBUUtils.openURL(message.url);\n }\n }\n };\n\n const openSheetForFailedMessage = (message: HandleableMessage) => {\n openSheet({\n sheetItems: [\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_RETRY,\n onPress: () => onResendFailedMessage(message).catch(onResendFailure),\n },\n {\n title: STRINGS.LABELS.CHANNEL_MESSAGE_FAILED_REMOVE,\n titleColor: colors.ui.dialog.default.none.destructive,\n onPress: () => alertForMessageDelete(message),\n },\n ],\n });\n };\n\n const alertForMessageDelete = (message: HandleableMessage) => {\n alert({\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,\n buttons: [\n { text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL },\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,\n style: 'destructive',\n onPress: () => {\n onDeleteMessage(message).catch(onDeleteFailure);\n },\n },\n ],\n });\n };\n\n return ({ message }) => {\n if (!message.isUserMessage() && !message.isFileMessage()) return {};\n\n const sheetItems: BottomSheetItem['sheetItems'] = [];\n const menu = {\n copy: (message: HandleableMessage) => ({\n icon: 'copy' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_COPY,\n onPress: () => onCopyText(message),\n }),\n edit: (message: HandleableMessage) => ({\n icon: 'edit' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_EDIT,\n onPress: () => onEditMessage(message),\n }),\n delete: (message: HandleableMessage) => ({\n disabled: message.threadInfo ? message.threadInfo.replyCount > 0 : undefined,\n icon: 'delete' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE,\n onPress: () => alertForMessageDelete(message),\n }),\n reply: (message: HandleableMessage) => ({\n disabled: Boolean(message.parentMessageId),\n icon: 'reply' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_REPLY,\n onPress: () => onReplyMessage?.(message),\n }),\n download: (message: HandleableMessage) => ({\n icon: 'download' as const,\n title: STRINGS.LABELS.CHANNEL_MESSAGE_SAVE,\n onPress: () => onDownloadFile(message),\n }),\n };\n\n if (message.isUserMessage()) {\n sheetItems.push(menu.copy(message));\n if (!channel.isEphemeral) {\n if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {\n sheetItems.push(menu.edit(message));\n sheetItems.push(menu.delete(message));\n }\n if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {\n sheetItems.push(menu.reply(message));\n }\n }\n }\n\n if (message.isFileMessage()) {\n if (!isVoiceMessage(message)) {\n sheetItems.push(menu.download(message));\n }\n if (!channel.isEphemeral) {\n if (isMyMessage(message, currentUserId) && message.sendingStatus === 'succeeded') {\n sheetItems.push(menu.delete(message));\n }\n if (channel.isGroupChannel() && sbOptions.uikit.groupChannel.channel.replyType === 'quote_reply') {\n sheetItems.push(menu.reply(message));\n }\n }\n }\n\n const bottomSheetItem: BottomSheetItem = {\n sheetItems,\n HeaderComponent: shouldRenderReaction(channel, sbOptions.uikitWithAppInfo.groupChannel.channel.enableReactions)\n ? ({ onClose }) => <ReactionAddons.BottomSheet message={message} channel={channel} onClose={onClose} />\n : undefined,\n };\n\n switch (true) {\n case message.sendingStatus === 'pending': {\n return {\n onPress: undefined,\n onLongPress: undefined,\n bottomSheetItem: undefined,\n };\n }\n\n case message.sendingStatus === 'failed': {\n return {\n onPress: () => onResendFailedMessage(message).catch(onResendFailure),\n onLongPress: () => openSheetForFailedMessage(message),\n bottomSheetItem,\n };\n }\n\n case message.isFileMessage(): {\n return {\n onPress: () => onOpenFile(message),\n onLongPress: () => openSheet(bottomSheetItem),\n bottomSheetItem,\n };\n }\n\n default: {\n return {\n onPress: undefined,\n onLongPress: () => openSheet(bottomSheetItem),\n bottomSheetItem,\n };\n }\n }\n };\n};\n\nconst styles = createStyleSheet({\n frozenBanner: {\n position: 'absolute',\n zIndex: 999,\n top: 8,\n left: 8,\n right: 8,\n },\n frozenListPadding: {\n paddingBottom: 32,\n },\n newMsgButton: {\n position: 'absolute',\n zIndex: 999,\n bottom: 10,\n alignSelf: 'center',\n },\n scrollButton: {\n position: 'absolute',\n zIndex: 998,\n bottom: 10,\n right: 16,\n },\n});\n\n// NOTE: Due to Generic inference is not working on forwardRef, we need to cast it as typeof ChannelMessageList and implicit `ref` prop\nexport default React.forwardRef(ChannelMessageList) as typeof ChannelMessageList;\n"],"mappings":"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"}
@@ -3,13 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.default = exports.GroupChannelTypingIndicatorBubble = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _uikitReactNativeFoundation = require("@sendbird/uikit-react-native-foundation");
9
9
  var _uikitUtils = require("@sendbird/uikit-utils");
10
10
  var _constants = require("../../constants");
11
+ var _moduleContext = require("../../domain/groupChannel/module/moduleContext");
11
12
  var _useContext = require("../../hooks/useContext");
12
13
  var _SBUUtils = _interopRequireDefault(require("../../libs/SBUUtils"));
14
+ var _types = require("../../types");
13
15
  var _ReactionAddons = require("../ReactionAddons");
14
16
  var _GroupChannelMessageDateSeparator = _interopRequireDefault(require("./GroupChannelMessageDateSeparator"));
15
17
  var _GroupChannelMessageFocusAnimation = _interopRequireDefault(require("./GroupChannelMessageFocusAnimation"));
@@ -305,6 +307,37 @@ const GroupChannelMessageRenderer = _ref => {
305
307
  focused: focused
306
308
  }, renderMessage()));
307
309
  };
310
+ const GroupChannelTypingIndicatorBubble = () => {
311
+ const {
312
+ sbOptions
313
+ } = (0, _useContext.useSendbirdChat)();
314
+ const {
315
+ publish
316
+ } = (0, _react.useContext)(_moduleContext.GroupChannelContexts.PubSub);
317
+ const {
318
+ typingUsers
319
+ } = (0, _react.useContext)(_moduleContext.GroupChannelContexts.TypingIndicator);
320
+ const shouldRenderBubble = (0, _uikitUtils.useIIFE)(() => {
321
+ if (typingUsers.length === 0) return false;
322
+ if (!sbOptions.uikit.groupChannel.channel.enableTypingIndicator) return false;
323
+ if (!sbOptions.uikit.groupChannel.channel.typingIndicatorTypes.has(_types.TypingIndicatorType.Bubble)) return false;
324
+ return true;
325
+ });
326
+ (0, _react.useEffect)(() => {
327
+ if (shouldRenderBubble) publish({
328
+ type: 'TYPING_BUBBLE_RENDERED'
329
+ });
330
+ }, [shouldRenderBubble]);
331
+ if (!shouldRenderBubble) return null;
332
+ return /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Box, {
333
+ paddingHorizontal: 16,
334
+ marginTop: 4,
335
+ marginBottom: 16
336
+ }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.TypingIndicatorBubble, {
337
+ typingUsers: typingUsers
338
+ }));
339
+ };
340
+ exports.GroupChannelTypingIndicatorBubble = GroupChannelTypingIndicatorBubble;
308
341
  var _default = /*#__PURE__*/_react.default.memo(GroupChannelMessageRenderer);
309
342
  exports.default = _default;
310
343
  //# sourceMappingURL=index.js.map