@sendbird/uikit-react-native 3.9.5 → 3.10.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 (59) hide show
  1. package/lib/commonjs/components/ChannelMessageList/index.js +57 -9
  2. package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
  3. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js +53 -0
  4. package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js.map +1 -0
  5. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +5 -0
  6. package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
  7. package/lib/commonjs/components/UnreadMessagesFloating.js +77 -0
  8. package/lib/commonjs/components/UnreadMessagesFloating.js.map +1 -0
  9. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +156 -7
  10. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  11. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  12. package/lib/commonjs/fragments/createGroupChannelFragment.js +57 -3
  13. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  14. package/lib/commonjs/localization/StringSet.type.js.map +1 -1
  15. package/lib/commonjs/localization/createBaseStringSet.js +16 -2
  16. package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
  17. package/lib/commonjs/version.js +1 -1
  18. package/lib/commonjs/version.js.map +1 -1
  19. package/lib/module/components/ChannelMessageList/index.js +57 -9
  20. package/lib/module/components/ChannelMessageList/index.js.map +1 -1
  21. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js +46 -0
  22. package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js.map +1 -0
  23. package/lib/module/components/GroupChannelMessageRenderer/index.js +5 -0
  24. package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
  25. package/lib/module/components/UnreadMessagesFloating.js +70 -0
  26. package/lib/module/components/UnreadMessagesFloating.js.map +1 -0
  27. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +158 -9
  28. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  29. package/lib/module/domain/groupChannel/types.js.map +1 -1
  30. package/lib/module/fragments/createGroupChannelFragment.js +59 -5
  31. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  32. package/lib/module/localization/StringSet.type.js.map +1 -1
  33. package/lib/module/localization/createBaseStringSet.js +16 -2
  34. package/lib/module/localization/createBaseStringSet.js.map +1 -1
  35. package/lib/module/version.js +1 -1
  36. package/lib/module/version.js.map +1 -1
  37. package/lib/typescript/src/components/ChannelMessageList/index.d.ts +8 -1
  38. package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.d.ts +6 -0
  39. package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +1 -0
  40. package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +1 -0
  41. package/lib/typescript/src/components/UnreadMessagesFloating.d.ts +8 -0
  42. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  43. package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +6 -1
  44. package/lib/typescript/src/domain/groupChannel/types.d.ts +13 -1
  45. package/lib/typescript/src/domain/openChannel/component/OpenChannelHeader.d.ts +1 -1
  46. package/lib/typescript/src/hooks/useChannelInputItems.d.ts +1 -1
  47. package/lib/typescript/src/localization/StringSet.type.d.ts +3 -0
  48. package/lib/typescript/src/version.d.ts +1 -1
  49. package/package.json +8 -7
  50. package/src/components/ChannelMessageList/index.tsx +71 -5
  51. package/src/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.tsx +45 -0
  52. package/src/components/GroupChannelMessageRenderer/index.tsx +5 -0
  53. package/src/components/UnreadMessagesFloating.tsx +60 -0
  54. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +204 -5
  55. package/src/domain/groupChannel/types.ts +15 -0
  56. package/src/fragments/createGroupChannelFragment.tsx +67 -4
  57. package/src/localization/StringSet.type.ts +3 -0
  58. package/src/localization/createBaseStringSet.ts +16 -4
  59. package/src/version.ts +1 -1
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _reactNative = require("react-native");
9
+ var _uikitReactNativeFoundation = require("@sendbird/uikit-react-native-foundation");
10
+ var _useContext = require("../hooks/useContext");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const UnreadMessagesFloating = ({
13
+ unreadMessageCount,
14
+ visible,
15
+ onPressClose
16
+ }) => {
17
+ const {
18
+ STRINGS
19
+ } = (0, _useContext.useLocalization)();
20
+ const {
21
+ select,
22
+ palette,
23
+ colors
24
+ } = (0, _uikitReactNativeFoundation.useUIKitTheme)();
25
+ if (unreadMessageCount <= 0 || !visible) return null;
26
+ return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
27
+ style: [styles.container, {
28
+ backgroundColor: select({
29
+ dark: palette.background400,
30
+ light: palette.background50
31
+ })
32
+ }]
33
+ }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Text, {
34
+ body2: true,
35
+ color: colors.onBackground02
36
+ }, STRINGS.GROUP_CHANNEL.LIST_FLOATING_UNREAD_MSG(unreadMessageCount)), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
37
+ onPress: onPressClose,
38
+ style: {
39
+ marginLeft: 4
40
+ },
41
+ hitSlop: {
42
+ top: 12,
43
+ bottom: 12,
44
+ left: 14,
45
+ right: 38
46
+ }
47
+ }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Icon, {
48
+ icon: 'close',
49
+ size: 14
50
+ })));
51
+ };
52
+ const styles = (0, _uikitReactNativeFoundation.createStyleSheet)({
53
+ container: {
54
+ flexDirection: 'row',
55
+ justifyContent: 'flex-start',
56
+ alignItems: 'center',
57
+ paddingHorizontal: 16,
58
+ paddingVertical: 12,
59
+ borderRadius: 20,
60
+ ..._reactNative.Platform.select({
61
+ android: {
62
+ elevation: 3
63
+ },
64
+ ios: {
65
+ shadowColor: 'black',
66
+ shadowRadius: 3,
67
+ shadowOffset: {
68
+ width: 0,
69
+ height: 4
70
+ },
71
+ shadowOpacity: 0.08
72
+ }
73
+ })
74
+ }
75
+ });
76
+ var _default = exports.default = /*#__PURE__*/_react.default.memo(UnreadMessagesFloating);
77
+ //# sourceMappingURL=UnreadMessagesFloating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_uikitReactNativeFoundation","_useContext","e","__esModule","default","UnreadMessagesFloating","unreadMessageCount","visible","onPressClose","STRINGS","useLocalization","select","palette","colors","useUIKitTheme","createElement","View","style","styles","container","backgroundColor","dark","background400","light","background50","Text","body2","color","onBackground02","GROUP_CHANNEL","LIST_FLOATING_UNREAD_MSG","TouchableOpacity","onPress","marginLeft","hitSlop","top","bottom","left","right","Icon","icon","size","createStyleSheet","flexDirection","justifyContent","alignItems","paddingHorizontal","paddingVertical","borderRadius","Platform","android","elevation","ios","shadowColor","shadowRadius","shadowOffset","width","height","shadowOpacity","_default","exports","React","memo"],"sources":["UnreadMessagesFloating.tsx"],"sourcesContent":["import React from 'react';\nimport { Platform, TouchableOpacity, View } from 'react-native';\n\nimport { Icon, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';\n\nimport { useLocalization } from '../hooks/useContext';\n\nexport type UnreadMessagesFloatingProps = {\n unreadMessageCount: number;\n visible: boolean;\n onPressClose: () => void;\n};\nconst UnreadMessagesFloating = ({ unreadMessageCount, visible, onPressClose }: UnreadMessagesFloatingProps) => {\n const { STRINGS } = useLocalization();\n const { select, palette, colors } = useUIKitTheme();\n if (unreadMessageCount <= 0 || !visible) return null;\n return (\n <View\n style={[\n styles.container,\n { backgroundColor: select({ dark: palette.background400, light: palette.background50 }) },\n ]}\n >\n <Text body2 color={colors.onBackground02}>\n {STRINGS.GROUP_CHANNEL.LIST_FLOATING_UNREAD_MSG(unreadMessageCount)}\n </Text>\n <TouchableOpacity\n onPress={onPressClose}\n style={{ marginLeft: 4 }}\n hitSlop={{ top: 12, bottom: 12, left: 14, right: 38 }}\n >\n <Icon icon={'close'} size={14} />\n </TouchableOpacity>\n </View>\n );\n};\n\nconst styles = createStyleSheet({\n container: {\n flexDirection: 'row',\n justifyContent: 'flex-start',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderRadius: 20,\n ...Platform.select({\n android: {\n elevation: 3,\n },\n ios: {\n shadowColor: 'black',\n shadowRadius: 3,\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.08,\n },\n }),\n },\n});\n\nexport default React.memo(UnreadMessagesFloating);\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,2BAAA,GAAAF,OAAA;AAEA,IAAAG,WAAA,GAAAH,OAAA;AAAsD,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAOtD,MAAMG,sBAAsB,GAAGA,CAAC;EAAEC,kBAAkB;EAAEC,OAAO;EAAEC;AAA0C,CAAC,KAAK;EAC7G,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAAC,2BAAe,EAAC,CAAC;EACrC,MAAM;IAAEC,MAAM;IAAEC,OAAO;IAAEC;EAAO,CAAC,GAAG,IAAAC,yCAAa,EAAC,CAAC;EACnD,IAAIR,kBAAkB,IAAI,CAAC,IAAI,CAACC,OAAO,EAAE,OAAO,IAAI;EACpD,oBACEX,MAAA,CAAAQ,OAAA,CAAAW,aAAA,CAAChB,YAAA,CAAAiB,IAAI;IACHC,KAAK,EAAE,CACLC,MAAM,CAACC,SAAS,EAChB;MAAEC,eAAe,EAAET,MAAM,CAAC;QAAEU,IAAI,EAAET,OAAO,CAACU,aAAa;QAAEC,KAAK,EAAEX,OAAO,CAACY;MAAa,CAAC;IAAE,CAAC;EACzF,gBAEF5B,MAAA,CAAAQ,OAAA,CAAAW,aAAA,CAACf,2BAAA,CAAAyB,IAAI;IAACC,KAAK;IAACC,KAAK,EAAEd,MAAM,CAACe;EAAe,GACtCnB,OAAO,CAACoB,aAAa,CAACC,wBAAwB,CAACxB,kBAAkB,CAC9D,CAAC,eACPV,MAAA,CAAAQ,OAAA,CAAAW,aAAA,CAAChB,YAAA,CAAAgC,gBAAgB;IACfC,OAAO,EAAExB,YAAa;IACtBS,KAAK,EAAE;MAAEgB,UAAU,EAAE;IAAE,CAAE;IACzBC,OAAO,EAAE;MAAEC,GAAG,EAAE,EAAE;MAAEC,MAAM,EAAE,EAAE;MAAEC,IAAI,EAAE,EAAE;MAAEC,KAAK,EAAE;IAAG;EAAE,gBAEtD1C,MAAA,CAAAQ,OAAA,CAAAW,aAAA,CAACf,2BAAA,CAAAuC,IAAI;IAACC,IAAI,EAAE,OAAQ;IAACC,IAAI,EAAE;EAAG,CAAE,CAChB,CACd,CAAC;AAEX,CAAC;AAED,MAAMvB,MAAM,GAAG,IAAAwB,4CAAgB,EAAC;EAC9BvB,SAAS,EAAE;IACTwB,aAAa,EAAE,KAAK;IACpBC,cAAc,EAAE,YAAY;IAC5BC,UAAU,EAAE,QAAQ;IACpBC,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE,EAAE;IACnBC,YAAY,EAAE,EAAE;IAChB,GAAGC,qBAAQ,CAACtC,MAAM,CAAC;MACjBuC,OAAO,EAAE;QACPC,SAAS,EAAE;MACb,CAAC;MACDC,GAAG,EAAE;QACHC,WAAW,EAAE,OAAO;QACpBC,YAAY,EAAE,CAAC;QACfC,YAAY,EAAE;UAAEC,KAAK,EAAE,CAAC;UAAEC,MAAM,EAAE;QAAE,CAAC;QACrCC,aAAa,EAAE;MACjB;IACF,CAAC;EACH;AACF,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAxD,OAAA,gBAEYyD,cAAK,CAACC,IAAI,CAACzD,sBAAsB,CAAC","ignoreList":[]}
@@ -30,9 +30,7 @@ const GroupChannelMessageList = props => {
30
30
  setMessageToEdit,
31
31
  setMessageToReply
32
32
  } = (0, _react.useContext)(_moduleContext.GroupChannelContexts.Fragment);
33
- const {
34
- subscribe
35
- } = (0, _react.useContext)(_moduleContext.GroupChannelContexts.PubSub);
33
+ const groupChannelPubSub = (0, _react.useContext)(_moduleContext.GroupChannelContexts.PubSub);
36
34
  const {
37
35
  flatListRef,
38
36
  lazyScrollToBottom,
@@ -40,6 +38,28 @@ const GroupChannelMessageList = props => {
40
38
  onPressReplyMessageInThread
41
39
  } = (0, _react.useContext)(_moduleContext.GroupChannelContexts.MessageList);
42
40
  const isFirstMount = (0, _uikitUtils.useIsFirstMount)();
41
+ const hasSeenNewLineRef = (0, _react.useRef)(false);
42
+ const isNewLineInViewportRef = (0, _react.useRef)(false);
43
+ const isNewLineExistInChannelRef = (0, _react.useRef)(false);
44
+ const scrolledAwayFromBottomRef = (0, _react.useRef)(false);
45
+ const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = (0, _react.useState)(false);
46
+ const viewableMessages = (0, _react.useRef)();
47
+ const hasUserMarkedAsUnreadRef = (0, _react.useRef)(false);
48
+ const [unreadFirstMessage, setUnreadFirstMessage] = (0, _react.useState)(undefined);
49
+ const updateHasSeenNewLine = (0, _react.useCallback)(hasSeenNewLine => {
50
+ if (hasSeenNewLineRef.current !== hasSeenNewLine) {
51
+ var _props$onNewLineSeenC;
52
+ hasSeenNewLineRef.current = hasSeenNewLine;
53
+ (_props$onNewLineSeenC = props.onNewLineSeenChange) === null || _props$onNewLineSeenC === void 0 || _props$onNewLineSeenC.call(props, hasSeenNewLine);
54
+ }
55
+ }, [props.onNewLineSeenChange]);
56
+ const updateHasUserMarkedAsUnread = (0, _react.useCallback)(hasUserMarkedAsUnread => {
57
+ if (hasUserMarkedAsUnreadRef.current !== hasUserMarkedAsUnread) {
58
+ var _props$onUserMarkedAs;
59
+ hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;
60
+ (_props$onUserMarkedAs = props.onUserMarkedAsUnreadChange) === null || _props$onUserMarkedAs === void 0 || _props$onUserMarkedAs.call(props, hasUserMarkedAsUnread);
61
+ }
62
+ }, [props.onUserMarkedAsUnreadChange]);
43
63
  const scrollToMessageWithCreatedAt = (0, _uikitUtils.useFreshCallback)((createdAt, focusAnimated, timeout) => {
44
64
  const foundMessageIndex = props.messages.findIndex(it => it.createdAt === createdAt);
45
65
  const isIncludedInList = foundMessageIndex > -1;
@@ -68,12 +88,16 @@ const GroupChannelMessageList = props => {
68
88
  }
69
89
  return true;
70
90
  });
91
+ const onScrolledAwayFromBottom = (0, _uikitUtils.useFreshCallback)(value => {
92
+ scrolledAwayFromBottomRef.current = value;
93
+ props.onScrolledAwayFromBottom(value);
94
+ });
71
95
  const scrollToBottom = (0, _uikitUtils.useFreshCallback)(async (animated = false) => {
72
96
  if (props.hasNext()) {
73
97
  props.onUpdateSearchItem(undefined);
74
- props.onScrolledAwayFromBottom(false);
98
+ onScrolledAwayFromBottom(false);
75
99
  await props.onResetMessageList().catch(_ => {});
76
- props.onScrolledAwayFromBottom(false);
100
+ onScrolledAwayFromBottom(false);
77
101
  lazyScrollToBottom({
78
102
  animated
79
103
  });
@@ -83,6 +107,107 @@ const GroupChannelMessageList = props => {
83
107
  });
84
108
  }
85
109
  });
110
+ const onPressUnreadMessagesFloatingCloseButton = (0, _react.useCallback)(() => {
111
+ var _props$resetNewMessag;
112
+ updateHasSeenNewLine(true);
113
+ updateHasUserMarkedAsUnread(false);
114
+ (_props$resetNewMessag = props.resetNewMessages) === null || _props$resetNewMessag === void 0 || _props$resetNewMessag.call(props);
115
+ (0, _uikitUtils.confirmAndMarkAsRead)([props.channel]);
116
+ }, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);
117
+ const getPrevNonSilentMessage = (0, _react.useCallback)((messages, prevMessageIndex) => {
118
+ if (messages.length <= prevMessageIndex) {
119
+ return null;
120
+ }
121
+ const prevMessage = messages[prevMessageIndex];
122
+ if (prevMessage) {
123
+ if (prevMessage.silent) {
124
+ return getPrevNonSilentMessage(messages, prevMessageIndex + 1);
125
+ } else {
126
+ return prevMessage;
127
+ }
128
+ }
129
+ return null;
130
+ }, []);
131
+ const findFirstUnreadMessage = (0, _uikitUtils.useFreshCallback)(isNewLineExistInChannel => {
132
+ if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {
133
+ return;
134
+ }
135
+ return props.messages.find((msg, index) => {
136
+ var _props$hasPrevious;
137
+ if (msg.silent) {
138
+ return false;
139
+ }
140
+ const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;
141
+ if (isMarkedAsUnreadMessage) {
142
+ return true;
143
+ }
144
+ const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);
145
+ const hasNoPreviousAndNoPrevMessage = !((_props$hasPrevious = props.hasPrevious) !== null && _props$hasPrevious !== void 0 && _props$hasPrevious.call(props)) && prevNonSilentMessage == null;
146
+ const prevMessageIsRead = prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;
147
+ const isMessageUnread = props.channel.myLastRead < msg.createdAt;
148
+ return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;
149
+ });
150
+ });
151
+ (0, _react.useEffect)(() => {
152
+ if (!unreadFirstMessage) {
153
+ const foundUnreadFirstMessage = findFirstUnreadMessage(props.isNewLineExistInChannel ?? false);
154
+ if (foundUnreadFirstMessage) {
155
+ processNewLineVisibility(foundUnreadFirstMessage);
156
+ setUnreadFirstMessage(foundUnreadFirstMessage);
157
+ }
158
+ }
159
+ }, [props.messages, props.channel.myLastRead, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);
160
+ const processNewLineVisibility = (0, _uikitUtils.useFreshCallback)(unreadFirstMsg => {
161
+ var _viewableMessages$cur;
162
+ const isNewLineInViewport = !!((_viewableMessages$cur = viewableMessages.current) !== null && _viewableMessages$cur !== void 0 && _viewableMessages$cur.some(message => message.messageId === (unreadFirstMsg === null || unreadFirstMsg === void 0 ? void 0 : unreadFirstMsg.messageId)));
163
+ if (isNewLineInViewportRef.current !== isNewLineInViewport) {
164
+ isNewLineInViewportRef.current = isNewLineInViewport;
165
+ updateUnreadMessagesFloatingProps();
166
+ if (!isNewLineInViewport || hasSeenNewLineRef.current) {
167
+ return;
168
+ }
169
+ updateHasSeenNewLine(true);
170
+ if (hasUserMarkedAsUnreadRef.current) {
171
+ return;
172
+ }
173
+ if (0 < props.newMessages.length) {
174
+ props.channel.markAsUnread(props.newMessages[0]);
175
+ } else {
176
+ props.channel.markAsRead();
177
+ }
178
+ }
179
+ });
180
+ const onViewableItemsChanged = (0, _uikitUtils.useFreshCallback)(async info => {
181
+ if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {
182
+ return;
183
+ }
184
+ viewableMessages.current = info.viewableItems.filter(token => token.item).map(token => token.item);
185
+ processNewLineVisibility(unreadFirstMessage);
186
+ });
187
+ const onPressMarkAsUnreadMessage = (0, _react.useCallback)(async message => {
188
+ if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && message) {
189
+ await props.channel.markAsUnread(message);
190
+ updateHasUserMarkedAsUnread(true);
191
+ }
192
+ }, [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread]);
193
+ (0, _react.useEffect)(() => {
194
+ isNewLineExistInChannelRef.current = !!props.isNewLineExistInChannel && !!viewableMessages.current;
195
+ }, [props.isNewLineExistInChannel, viewableMessages.current]);
196
+ const unreadMessagesFloatingPropsRef = (0, _react.useRef)();
197
+ const updateUnreadMessagesFloatingProps = (0, _uikitUtils.useFreshCallback)(() => {
198
+ const canAutoMarkAsRead = !scrolledAwayFromBottomRef.current && !hasUserMarkedAsUnreadRef.current && (hasSeenNewLineRef.current || !isNewLineExistInChannelRef.current);
199
+ unreadMessagesFloatingPropsRef.current = {
200
+ visible: sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && !canAutoMarkAsRead && isNewLineExistInChannelRef.current && 0 < props.channel.unreadMessageCount && !isNewLineInViewportRef.current,
201
+ onPressClose: onPressUnreadMessagesFloatingCloseButton,
202
+ unreadMessageCount: props.channel.unreadMessageCount
203
+ };
204
+ if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) {
205
+ setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible);
206
+ }
207
+ });
208
+ (0, _react.useEffect)(() => {
209
+ updateUnreadMessagesFloatingProps();
210
+ }, [isNewLineExistInChannelRef.current, props.channel.unreadMessageCount, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);
86
211
  (0, _uikitTools.useGroupChannelHandler)(sdk, {
87
212
  onReactionUpdated(channel, event) {
88
213
  if ((0, _uikitUtils.isDifferentChannel)(channel, props.channel)) return;
@@ -95,10 +220,13 @@ const GroupChannelMessageList = props => {
95
220
  timeout: 250
96
221
  });
97
222
  }
223
+ },
224
+ onChannelChanged(channel) {
225
+ if ((0, _uikitUtils.isDifferentChannel)(channel, props.channel)) return;
98
226
  }
99
227
  });
100
228
  (0, _react.useEffect)(() => {
101
- return subscribe(({
229
+ return groupChannelPubSub.subscribe(({
102
230
  type,
103
231
  data
104
232
  }) => {
@@ -130,6 +258,22 @@ const GroupChannelMessageList = props => {
130
258
  scrollToBottom(false);
131
259
  break;
132
260
  }
261
+ case 'ON_MARKED_AS_READ_BY_CURRENT_USER':
262
+ {
263
+ updateUnreadMessagesFloatingProps();
264
+ break;
265
+ }
266
+ case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER':
267
+ {
268
+ isNewLineExistInChannelRef.current = true;
269
+ const foundFirstUnreadMessage = findFirstUnreadMessage(true);
270
+ processNewLineVisibility(foundFirstUnreadMessage);
271
+ setUnreadFirstMessage(foundFirstUnreadMessage);
272
+ if (!props.scrolledAwayFromBottom) {
273
+ scrollToBottom(true);
274
+ }
275
+ break;
276
+ }
133
277
  }
134
278
  });
135
279
  }, [props.scrolledAwayFromBottom]);
@@ -166,12 +310,17 @@ const GroupChannelMessageList = props => {
166
310
  });
167
311
  return /*#__PURE__*/_react.default.createElement(_ChannelMessageList.default, _extends({}, props, {
168
312
  ref: flatListRef,
313
+ onScrolledAwayFromBottom: onScrolledAwayFromBottom,
169
314
  onReplyMessage: setMessageToReply,
170
315
  onReplyInThreadMessage: setMessageToReply,
171
316
  onEditMessage: setMessageToEdit,
317
+ onViewableItemsChanged: onViewableItemsChanged,
172
318
  onPressParentMessage: onPressParentMessage,
173
319
  onPressNewMessagesButton: scrollToBottom,
174
- onPressScrollToBottomButton: scrollToBottom
320
+ onPressScrollToBottomButton: scrollToBottom,
321
+ onPressMarkAsUnreadMessage: onPressMarkAsUnreadMessage,
322
+ unreadFirstMessage: unreadFirstMessage,
323
+ unreadMessagesFloatingProps: unreadMessagesFloatingPropsRef.current
175
324
  }));
176
325
  };
177
326
  var _default = exports.default = /*#__PURE__*/_react.default.memo(GroupChannelMessageList);
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitReactNativeFoundation","_uikitTools","_uikitUtils","_ChannelMessageList","_interopRequireDefault","_constants","_useContext","_moduleContext","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","GroupChannelMessageList","props","toast","useToast","STRINGS","useLocalization","sdk","sbOptions","groupChannelFragmentOptions","useSendbirdChat","setMessageToEdit","setMessageToReply","useContext","GroupChannelContexts","Fragment","subscribe","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToIndex","onPressReplyMessageInThread","MessageList","isFirstMount","useIsFirstMount","scrollToMessageWithCreatedAt","useFreshCallback","createdAt","focusAnimated","timeout","foundMessageIndex","messages","findIndex","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","MESSAGE_FOCUS_ANIMATION_DELAY","index","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","catch","_","scrollToBottom","hasNext","undefined","onScrolledAwayFromBottom","onResetMessageList","useGroupChannelHandler","onReactionUpdated","event","isDifferentChannel","recentMessage","isRecentMessage","messageId","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","useEffect","type","data","lastMessage","updatedMessage","lastMessageUpdated","isMaybeStreaming","hasAiBot","pubsub","payload","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","searchItem","onPressParentMessage","parentMessage","childMessage","uikit","groupChannel","replyType","threadReplySelectType","show","TOAST","FIND_PARENT_MSG_ERROR","canScrollToParent","createElement","ref","onReplyMessage","onReplyInThreadMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","_default","exports","React","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import React, { useContext, useEffect } from 'react';\n\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport { useGroupChannelHandler } from '@sendbird/uikit-tools';\nimport {\n SendbirdMessage,\n SendbirdSendableMessage,\n isDifferentChannel,\n useFreshCallback,\n useIsFirstMount,\n} from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { GroupChannelFragmentOptionsPubSubContextPayload } from '../../../contexts/SendbirdChatCtx';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk, sbOptions, groupChannelFragmentOptions } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const { subscribe } = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToIndex, onPressReplyMessageInThread } = useContext(\n GroupChannelContexts.MessageList,\n );\n\n const isFirstMount = useIsFirstMount();\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessageIndex = props.messages.findIndex((it) => it.createdAt === createdAt);\n const isIncludedInList = foundMessageIndex > -1;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n lazyScrollToIndex({ index: foundMessageIndex, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) {\n props.onUpdateSearchItem({ startingPoint: createdAt });\n }\n props.onResetMessageListWithStartingPoint(createdAt).catch((_) => {});\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const scrollToBottom = useFreshCallback(async (animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n props.onScrolledAwayFromBottom(false);\n\n await props.onResetMessageList().catch((_) => {});\n props.onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n useGroupChannelHandler(sdk, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n });\n\n useEffect(() => {\n return subscribe(({ type, data }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGES_UPDATED': {\n const lastMessage = props.channel.lastMessage;\n const [updatedMessage] = data.messages;\n\n const lastMessageUpdated =\n updatedMessage && lastMessage && lastMessage.messageId === updatedMessage.messageId;\n\n const isMaybeStreaming = props.channel.hasAiBot && lastMessageUpdated;\n\n if (isMaybeStreaming) {\n scrollToBottom(false);\n } else if (!props.scrolledAwayFromBottom && lastMessageUpdated) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n return groupChannelFragmentOptions.pubsub.subscribe((payload: GroupChannelFragmentOptionsPubSubContextPayload) => {\n switch (payload.type) {\n case 'OVERRIDE_SEARCH_ITEM_STARTING_POINT': {\n scrollToMessageWithCreatedAt(payload.data.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n break;\n }\n }\n });\n }, []);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback(\n (parentMessage: SendbirdMessage, childMessage: SendbirdSendableMessage) => {\n if (\n onPressReplyMessageInThread &&\n sbOptions.uikit.groupChannel.channel.replyType === 'thread' &&\n sbOptions.uikit.groupChannel.channel.threadReplySelectType === 'thread'\n ) {\n if (parentMessage.createdAt >= props.channel.messageOffsetTimestamp) {\n onPressReplyMessageInThread(parentMessage as SendbirdSendableMessage, childMessage.createdAt);\n } else {\n toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n } else {\n const canScrollToParent = scrollToMessageWithCreatedAt(parentMessage.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n },\n );\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onReplyMessage={setMessageToReply}\n onReplyInThreadMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitReactNativeFoundation","_uikitTools","_uikitUtils","_ChannelMessageList","_interopRequireDefault","_constants","_useContext","_moduleContext","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","GroupChannelMessageList","props","toast","useToast","STRINGS","useLocalization","sdk","sbOptions","groupChannelFragmentOptions","useSendbirdChat","setMessageToEdit","setMessageToReply","useContext","GroupChannelContexts","Fragment","groupChannelPubSub","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToIndex","onPressReplyMessageInThread","MessageList","isFirstMount","useIsFirstMount","hasSeenNewLineRef","useRef","isNewLineInViewportRef","isNewLineExistInChannelRef","scrolledAwayFromBottomRef","isVisibleUnreadMessageFloating","setIsVisibleUnreadMessageFloating","useState","viewableMessages","hasUserMarkedAsUnreadRef","unreadFirstMessage","setUnreadFirstMessage","undefined","updateHasSeenNewLine","useCallback","hasSeenNewLine","current","_props$onNewLineSeenC","onNewLineSeenChange","updateHasUserMarkedAsUnread","hasUserMarkedAsUnread","_props$onUserMarkedAs","onUserMarkedAsUnreadChange","scrollToMessageWithCreatedAt","useFreshCallback","createdAt","focusAnimated","timeout","foundMessageIndex","messages","findIndex","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","MESSAGE_FOCUS_ANIMATION_DELAY","index","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","catch","_","onScrolledAwayFromBottom","value","scrollToBottom","hasNext","onResetMessageList","onPressUnreadMessagesFloatingCloseButton","_props$resetNewMessag","resetNewMessages","confirmAndMarkAsRead","url","getPrevNonSilentMessage","prevMessageIndex","prevMessage","silent","findFirstUnreadMessage","isNewLineExistInChannel","uikit","groupChannel","enableMarkAsUnread","find","msg","_props$hasPrevious","isMarkedAsUnreadMessage","myLastRead","prevNonSilentMessage","hasNoPreviousAndNoPrevMessage","hasPrevious","prevMessageIsRead","isMessageUnread","useEffect","foundUnreadFirstMessage","processNewLineVisibility","unreadFirstMsg","_viewableMessages$cur","isNewLineInViewport","some","message","messageId","updateUnreadMessagesFloatingProps","newMessages","markAsUnread","markAsRead","onViewableItemsChanged","info","viewableItems","filter","token","item","map","onPressMarkAsUnreadMessage","unreadMessagesFloatingPropsRef","canAutoMarkAsRead","visible","unreadMessageCount","onPressClose","useGroupChannelHandler","onReactionUpdated","event","isDifferentChannel","recentMessage","isRecentMessage","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","onChannelChanged","subscribe","type","data","lastMessage","updatedMessage","lastMessageUpdated","isMaybeStreaming","hasAiBot","foundFirstUnreadMessage","pubsub","payload","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","searchItem","onPressParentMessage","parentMessage","childMessage","replyType","threadReplySelectType","show","TOAST","FIND_PARENT_MSG_ERROR","canScrollToParent","createElement","ref","onReplyMessage","onReplyInThreadMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","unreadMessagesFloatingProps","_default","exports","React","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import type { ViewToken } from '@react-native/virtualized-lists';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport { useGroupChannelHandler } from '@sendbird/uikit-tools';\nimport {\n SendbirdMessage,\n SendbirdSendableMessage,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useFreshCallback,\n useIsFirstMount,\n} from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { UnreadMessagesFloatingProps } from '../../../components/UnreadMessagesFloating';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { GroupChannelFragmentOptionsPubSubContextPayload } from '../../../contexts/SendbirdChatCtx';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk, sbOptions, groupChannelFragmentOptions } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const groupChannelPubSub = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToIndex, onPressReplyMessageInThread } = useContext(\n GroupChannelContexts.MessageList,\n );\n\n const isFirstMount = useIsFirstMount();\n\n const hasSeenNewLineRef = useRef(false);\n const isNewLineInViewportRef = useRef(false);\n const isNewLineExistInChannelRef = useRef(false);\n const scrolledAwayFromBottomRef = useRef(false);\n const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = useState(false);\n const viewableMessages = useRef<SendbirdMessage[]>();\n const hasUserMarkedAsUnreadRef = useRef(false);\n const [unreadFirstMessage, setUnreadFirstMessage] = useState<SendbirdMessage | undefined>(undefined);\n\n const updateHasSeenNewLine = useCallback(\n (hasSeenNewLine: boolean) => {\n if (hasSeenNewLineRef.current !== hasSeenNewLine) {\n hasSeenNewLineRef.current = hasSeenNewLine;\n props.onNewLineSeenChange?.(hasSeenNewLine);\n }\n },\n [props.onNewLineSeenChange],\n );\n\n const updateHasUserMarkedAsUnread = useCallback(\n (hasUserMarkedAsUnread: boolean) => {\n if (hasUserMarkedAsUnreadRef.current !== hasUserMarkedAsUnread) {\n hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;\n props.onUserMarkedAsUnreadChange?.(hasUserMarkedAsUnread);\n }\n },\n [props.onUserMarkedAsUnreadChange],\n );\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessageIndex = props.messages.findIndex((it) => it.createdAt === createdAt);\n const isIncludedInList = foundMessageIndex > -1;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n lazyScrollToIndex({ index: foundMessageIndex, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) {\n props.onUpdateSearchItem({ startingPoint: createdAt });\n }\n props.onResetMessageListWithStartingPoint(createdAt).catch((_) => {});\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {\n scrolledAwayFromBottomRef.current = value;\n props.onScrolledAwayFromBottom(value);\n });\n\n const scrollToBottom = useFreshCallback(async (animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n onScrolledAwayFromBottom(false);\n\n await props.onResetMessageList().catch((_) => {});\n onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n const onPressUnreadMessagesFloatingCloseButton = useCallback(() => {\n updateHasSeenNewLine(true);\n updateHasUserMarkedAsUnread(false);\n props.resetNewMessages?.();\n confirmAndMarkAsRead([props.channel]);\n }, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);\n\n const getPrevNonSilentMessage = useCallback(\n (messages: SendbirdMessage[], prevMessageIndex: number): SendbirdMessage | null => {\n if (messages.length <= prevMessageIndex) {\n return null;\n }\n\n const prevMessage = messages[prevMessageIndex];\n if (prevMessage) {\n if (prevMessage.silent) {\n return getPrevNonSilentMessage(messages, prevMessageIndex + 1);\n } else {\n return prevMessage;\n }\n }\n return null;\n },\n [],\n );\n\n const findFirstUnreadMessage = useFreshCallback((isNewLineExistInChannel: boolean) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {\n return;\n }\n\n return props.messages.find((msg, index) => {\n if (msg.silent) {\n return false;\n }\n\n const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;\n if (isMarkedAsUnreadMessage) {\n return true;\n }\n\n const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);\n const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevNonSilentMessage == null;\n const prevMessageIsRead =\n prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;\n const isMessageUnread = props.channel.myLastRead < msg.createdAt;\n return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;\n });\n });\n\n useEffect(() => {\n if (!unreadFirstMessage) {\n const foundUnreadFirstMessage = findFirstUnreadMessage(props.isNewLineExistInChannel ?? false);\n if (foundUnreadFirstMessage) {\n processNewLineVisibility(foundUnreadFirstMessage);\n setUnreadFirstMessage(foundUnreadFirstMessage);\n }\n }\n }, [props.messages, props.channel.myLastRead, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);\n\n const processNewLineVisibility = useFreshCallback((unreadFirstMsg: SendbirdMessage | undefined) => {\n const isNewLineInViewport = !!viewableMessages.current?.some(\n (message) => message.messageId === unreadFirstMsg?.messageId,\n );\n\n if (isNewLineInViewportRef.current !== isNewLineInViewport) {\n isNewLineInViewportRef.current = isNewLineInViewport;\n updateUnreadMessagesFloatingProps();\n if (!isNewLineInViewport || hasSeenNewLineRef.current) {\n return;\n }\n\n updateHasSeenNewLine(true);\n if (hasUserMarkedAsUnreadRef.current) {\n return;\n }\n\n if (0 < props.newMessages.length) {\n props.channel.markAsUnread(props.newMessages[0]);\n } else {\n props.channel.markAsRead();\n }\n }\n });\n\n const onViewableItemsChanged = useFreshCallback(\n async (info: { viewableItems: Array<ViewToken<SendbirdMessage>>; changed: Array<ViewToken<SendbirdMessage>> }) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {\n return;\n }\n\n viewableMessages.current = info.viewableItems.filter((token) => token.item).map((token) => token.item);\n processNewLineVisibility(unreadFirstMessage);\n },\n );\n\n const onPressMarkAsUnreadMessage = useCallback(\n async (message: SendbirdMessage) => {\n if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && message) {\n await props.channel.markAsUnread(message);\n updateHasUserMarkedAsUnread(true);\n }\n },\n [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread],\n );\n\n useEffect(() => {\n isNewLineExistInChannelRef.current = !!props.isNewLineExistInChannel && !!viewableMessages.current;\n }, [props.isNewLineExistInChannel, viewableMessages.current]);\n\n const unreadMessagesFloatingPropsRef = useRef<UnreadMessagesFloatingProps>();\n const updateUnreadMessagesFloatingProps = useFreshCallback(() => {\n const canAutoMarkAsRead =\n !scrolledAwayFromBottomRef.current &&\n !hasUserMarkedAsUnreadRef.current &&\n (hasSeenNewLineRef.current || !isNewLineExistInChannelRef.current);\n\n unreadMessagesFloatingPropsRef.current = {\n visible:\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread &&\n !canAutoMarkAsRead &&\n isNewLineExistInChannelRef.current &&\n 0 < props.channel.unreadMessageCount &&\n !isNewLineInViewportRef.current,\n onPressClose: onPressUnreadMessagesFloatingCloseButton,\n unreadMessageCount: props.channel.unreadMessageCount,\n };\n if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) {\n setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible);\n }\n });\n\n useEffect(() => {\n updateUnreadMessagesFloatingProps();\n }, [\n isNewLineExistInChannelRef.current,\n props.channel.unreadMessageCount,\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread,\n ]);\n\n useGroupChannelHandler(sdk, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n onChannelChanged(channel) {\n if (isDifferentChannel(channel, props.channel)) return;\n },\n });\n\n useEffect(() => {\n return groupChannelPubSub.subscribe(({ type, data }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGES_UPDATED': {\n const lastMessage = props.channel.lastMessage;\n const [updatedMessage] = data.messages;\n\n const lastMessageUpdated =\n updatedMessage && lastMessage && lastMessage.messageId === updatedMessage.messageId;\n\n const isMaybeStreaming = props.channel.hasAiBot && lastMessageUpdated;\n\n if (isMaybeStreaming) {\n scrollToBottom(false);\n } else if (!props.scrolledAwayFromBottom && lastMessageUpdated) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n case 'ON_MARKED_AS_READ_BY_CURRENT_USER': {\n updateUnreadMessagesFloatingProps();\n break;\n }\n case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER': {\n isNewLineExistInChannelRef.current = true;\n const foundFirstUnreadMessage = findFirstUnreadMessage(true);\n processNewLineVisibility(foundFirstUnreadMessage);\n setUnreadFirstMessage(foundFirstUnreadMessage);\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n return groupChannelFragmentOptions.pubsub.subscribe((payload: GroupChannelFragmentOptionsPubSubContextPayload) => {\n switch (payload.type) {\n case 'OVERRIDE_SEARCH_ITEM_STARTING_POINT': {\n scrollToMessageWithCreatedAt(payload.data.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n break;\n }\n }\n });\n }, []);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback(\n (parentMessage: SendbirdMessage, childMessage: SendbirdSendableMessage) => {\n if (\n onPressReplyMessageInThread &&\n sbOptions.uikit.groupChannel.channel.replyType === 'thread' &&\n sbOptions.uikit.groupChannel.channel.threadReplySelectType === 'thread'\n ) {\n if (parentMessage.createdAt >= props.channel.messageOffsetTimestamp) {\n onPressReplyMessageInThread(parentMessage as SendbirdSendableMessage, childMessage.createdAt);\n } else {\n toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n } else {\n const canScrollToParent = scrollToMessageWithCreatedAt(parentMessage.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n },\n );\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n onReplyMessage={setMessageToReply}\n onReplyInThreadMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onViewableItemsChanged={onViewableItemsChanged}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n onPressMarkAsUnreadMessage={onPressMarkAsUnreadMessage}\n unreadFirstMessage={unreadFirstMessage}\n unreadMessagesFloatingProps={unreadMessagesFloatingPropsRef.current}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n PickPartial,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdSendableMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n onPressReplyMessageInThread?: GroupChannelProps['Provider']['onPressReplyMessageInThread'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListComponent?: GroupChannelProps['MessageList']['flatListComponent'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n\n /**\n * @description You can specify the query parameters for the message list.\n * @example\n * ```\n * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />\n * ```\n * */\n messageListQueryParams?: MessageListQueryParamsType;\n /** @deprecated Please use `messageListQueryParams` instead */\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListComponent'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: () => Promise<void>;\n onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: PickPartial<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton',\n 'inputDisabled'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n onPressReplyMessageInThread: (parentMessage: SendbirdSendableMessage, startingPoint?: number) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n\n onPressReplyMessageInThread?: (parentMessage: SendbirdSendableMessage, startingPoint?: number) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n };\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n PickPartial,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdSendableMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n onPressReplyMessageInThread?: GroupChannelProps['Provider']['onPressReplyMessageInThread'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n renderUnreadMessagesFloating?: GroupChannelProps['MessageList']['renderUnreadMessagesFloating'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListComponent?: GroupChannelProps['MessageList']['flatListComponent'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n\n /**\n * @description You can specify the query parameters for the message list.\n * @example\n * ```\n * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />\n * ```\n * */\n messageListQueryParams?: MessageListQueryParamsType;\n /** @deprecated Please use `messageListQueryParams` instead */\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'renderUnreadMessagesFloating'\n | 'flatListComponent'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: () => Promise<void>;\n onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n hasPrevious?: () => boolean;\n resetNewMessages?: () => void;\n isNewLineExistInChannel?: boolean;\n onNewLineSeenChange?: (hasSeenNewLine: boolean) => void;\n onUserMarkedAsUnreadChange?: (hasUserMarkedAsUnread: boolean) => void;\n };\n Input: PickPartial<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton',\n 'inputDisabled'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n onPressReplyMessageInThread: (parentMessage: SendbirdSendableMessage, startingPoint?: number) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n\n onPressReplyMessageInThread?: (parentMessage: SendbirdSendableMessage, startingPoint?: number) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n }\n | {\n type: 'ON_MARKED_AS_READ_BY_CURRENT_USER';\n data?: undefined;\n }\n | {\n type: 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER';\n data?: undefined;\n };\n"],"mappings":"","ignoreList":[]}
@@ -14,6 +14,7 @@ var _GroupChannelMessageRenderer = _interopRequireWildcard(require("../component
14
14
  var _NewMessagesButton = _interopRequireDefault(require("../components/NewMessagesButton"));
15
15
  var _ScrollToBottomButton = _interopRequireDefault(require("../components/ScrollToBottomButton"));
16
16
  var _StatusComposition = _interopRequireDefault(require("../components/StatusComposition"));
17
+ var _UnreadMessagesFloating = _interopRequireDefault(require("../components/UnreadMessagesFloating"));
17
18
  var _createGroupChannelModule = _interopRequireDefault(require("../domain/groupChannel/module/createGroupChannelModule"));
18
19
  var _useContext = require("../hooks/useContext");
19
20
  var _pubsub = _interopRequireDefault(require("../utils/pubsub"));
@@ -24,6 +25,7 @@ const createGroupChannelFragment = initModule => {
24
25
  const GroupChannelModule = (0, _createGroupChannelModule.default)(initModule);
25
26
  return ({
26
27
  searchItem,
28
+ renderUnreadMessagesFloating = props => /*#__PURE__*/_react.default.createElement(_UnreadMessagesFloating.default, props),
27
29
  renderNewMessagesButton = props => /*#__PURE__*/_react.default.createElement(_NewMessagesButton.default, props),
28
30
  renderScrollToBottomButton = props => /*#__PURE__*/_react.default.createElement(_ScrollToBottomButton.default, props),
29
31
  renderMessage,
@@ -72,6 +74,28 @@ const createGroupChannelFragment = initModule => {
72
74
  return _message.ReplyType.ONLY_REPLY_TO_CHANNEL;
73
75
  }
74
76
  });
77
+ const [isNewLineExistInChannel, setIsNewLineExistInChannel] = (0, _react.useState)(false);
78
+ const hasSeenNewLineRef = (0, _react.useRef)(false);
79
+ const hasUserMarkedAsUnreadRef = (0, _react.useRef)(false);
80
+ (0, _react.useEffect)(() => {
81
+ var _channel$lastMessage;
82
+ setIsNewLineExistInChannel(channel.myLastRead < (((_channel$lastMessage = channel.lastMessage) === null || _channel$lastMessage === void 0 ? void 0 : _channel$lastMessage.createdAt) ?? Number.MIN_SAFE_INTEGER));
83
+ }, [channel.url]);
84
+ const onNewLineSeenChange = (0, _uikitUtils.useFreshCallback)(hasSeenNewLine => {
85
+ hasSeenNewLineRef.current = hasSeenNewLine;
86
+ });
87
+ const onUserMarkedAsUnreadChange = (0, _uikitUtils.useFreshCallback)(hasUserMarkedAsUnread => {
88
+ hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;
89
+ });
90
+ const markAsRead = (0, _uikitUtils.useFreshCallback)(channels => {
91
+ if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {
92
+ if (!scrolledAwayFromBottom && !hasUserMarkedAsUnreadRef.current && (hasSeenNewLineRef.current || !isNewLineExistInChannel)) {
93
+ (0, _uikitUtils.confirmAndMarkAsRead)(channels, true);
94
+ }
95
+ } else {
96
+ (0, _uikitUtils.confirmAndMarkAsRead)(channels);
97
+ }
98
+ });
75
99
  const {
76
100
  loading,
77
101
  messages,
@@ -80,6 +104,7 @@ const createGroupChannelFragment = initModule => {
80
104
  loadNext,
81
105
  loadPrevious,
82
106
  hasNext,
107
+ hasPrevious,
83
108
  sendFileMessage,
84
109
  sendUserMessage,
85
110
  updateFileMessage,
@@ -105,11 +130,27 @@ const createGroupChannelFragment = initModule => {
105
130
  }
106
131
  });
107
132
  },
133
+ onChannelUpdated(_, ctx) {
134
+ if ((ctx === null || ctx === void 0 ? void 0 : ctx.source) === _groupChannel.GroupChannelEventSource.EVENT_CHANNEL_READ) {
135
+ if (ctx.userIds.includes((currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) ?? '')) {
136
+ groupChannelPubSub.publish({
137
+ type: 'ON_MARKED_AS_READ_BY_CURRENT_USER'
138
+ });
139
+ }
140
+ } else if ((ctx === null || ctx === void 0 ? void 0 : ctx.source) === _groupChannel.GroupChannelEventSource.EVENT_CHANNEL_UNREAD) {
141
+ if (ctx.userIds.includes((currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId) ?? '')) {
142
+ setIsNewLineExistInChannel(true);
143
+ groupChannelPubSub.publish({
144
+ type: 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER'
145
+ });
146
+ }
147
+ }
148
+ },
108
149
  onChannelDeleted,
109
150
  onCurrentUserBanned: onChannelDeleted,
110
151
  collectionCreator: getCollectionCreator(channel, messageListQueryParams, collectionCreator),
111
152
  sortComparator,
112
- markAsRead: _uikitUtils.confirmAndMarkAsRead,
153
+ markAsRead: markAsRead,
113
154
  replyType,
114
155
  startingPoint: internalSearchItem === null || internalSearchItem === void 0 ? void 0 : internalSearchItem.startingPoint
115
156
  });
@@ -207,7 +248,14 @@ const createGroupChannelFragment = initModule => {
207
248
  await updateFileMessage(message.messageId, processedParams);
208
249
  });
209
250
  const onScrolledAwayFromBottom = (0, _uikitUtils.useFreshCallback)(value => {
210
- if (!value) resetNewMessages();
251
+ if (!value) {
252
+ resetNewMessages();
253
+ if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {
254
+ if (!hasUserMarkedAsUnreadRef.current && (hasSeenNewLineRef.current || !isNewLineExistInChannel)) {
255
+ (0, _uikitUtils.confirmAndMarkAsRead)([channel]);
256
+ }
257
+ }
258
+ }
211
259
  setScrolledAwayFromBottom(value);
212
260
  });
213
261
  return /*#__PURE__*/_react.default.createElement(GroupChannelModule.Provider, {
@@ -239,15 +287,21 @@ const createGroupChannelFragment = initModule => {
239
287
  onTopReached: loadPrevious,
240
288
  onBottomReached: loadNext,
241
289
  hasNext: hasNext,
290
+ hasPrevious: hasPrevious,
291
+ resetNewMessages: resetNewMessages,
242
292
  scrolledAwayFromBottom: scrolledAwayFromBottom,
243
293
  onScrolledAwayFromBottom: onScrolledAwayFromBottom,
244
294
  renderNewMessagesButton: renderNewMessagesButton,
245
295
  renderScrollToBottomButton: renderScrollToBottomButton,
296
+ renderUnreadMessagesFloating: renderUnreadMessagesFloating,
246
297
  onResendFailedMessage: resendMessage,
247
298
  onDeleteMessage: deleteMessage,
248
299
  onPressMediaMessage: _onPressMediaMessage,
249
300
  flatListComponent: flatListComponent,
250
- flatListProps: memoizedFlatListProps
301
+ flatListProps: memoizedFlatListProps,
302
+ isNewLineExistInChannel: isNewLineExistInChannel,
303
+ onNewLineSeenChange: onNewLineSeenChange,
304
+ onUserMarkedAsUnreadChange: onUserMarkedAsUnreadChange
251
305
  }), /*#__PURE__*/_react.default.createElement(GroupChannelModule.Input, {
252
306
  SuggestedMentionList: GroupChannelModule.SuggestedMentionList,
253
307
  shouldRenderInput: shouldRenderInput(channel),