@sendbird/uikit-react-native 3.9.6 → 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.
- package/lib/commonjs/components/ChannelMessageList/index.js +57 -9
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js +53 -0
- package/lib/commonjs/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js.map +1 -0
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js +5 -0
- package/lib/commonjs/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/commonjs/components/UnreadMessagesFloating.js +77 -0
- package/lib/commonjs/components/UnreadMessagesFloating.js.map +1 -0
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +156 -7
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +57 -3
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/localization/StringSet.type.js.map +1 -1
- package/lib/commonjs/localization/createBaseStringSet.js +16 -2
- package/lib/commonjs/localization/createBaseStringSet.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js +57 -9
- package/lib/module/components/ChannelMessageList/index.js.map +1 -1
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js +46 -0
- package/lib/module/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.js.map +1 -0
- package/lib/module/components/GroupChannelMessageRenderer/index.js +5 -0
- package/lib/module/components/GroupChannelMessageRenderer/index.js.map +1 -1
- package/lib/module/components/UnreadMessagesFloating.js +70 -0
- package/lib/module/components/UnreadMessagesFloating.js.map +1 -0
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +158 -9
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +59 -5
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/localization/StringSet.type.js.map +1 -1
- package/lib/module/localization/createBaseStringSet.js +16 -2
- package/lib/module/localization/createBaseStringSet.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChannelMessageList/index.d.ts +8 -1
- package/lib/typescript/src/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.d.ts +6 -0
- package/lib/typescript/src/components/GroupChannelMessageRenderer/index.d.ts +1 -0
- package/lib/typescript/src/components/OpenChannelMessageRenderer/index.d.ts +1 -0
- package/lib/typescript/src/components/UnreadMessagesFloating.d.ts +8 -0
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +6 -1
- package/lib/typescript/src/domain/groupChannel/types.d.ts +13 -1
- package/lib/typescript/src/domain/openChannel/component/OpenChannelHeader.d.ts +1 -1
- package/lib/typescript/src/hooks/useChannelInputItems.d.ts +1 -1
- package/lib/typescript/src/localization/StringSet.type.d.ts +3 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +8 -7
- package/src/components/ChannelMessageList/index.tsx +71 -5
- package/src/components/GroupChannelMessageRenderer/GroupChannelMessageNewLine.tsx +45 -0
- package/src/components/GroupChannelMessageRenderer/index.tsx +5 -0
- package/src/components/UnreadMessagesFloating.tsx +60 -0
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +204 -5
- package/src/domain/groupChannel/types.ts +15 -0
- package/src/fragments/createGroupChannelFragment.tsx +67 -4
- package/src/localization/StringSet.type.ts +3 -0
- package/src/localization/createBaseStringSet.ts +16 -4
- 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
|
-
|
|
98
|
+
onScrolledAwayFromBottom(false);
|
|
75
99
|
await props.onResetMessageList().catch(_ => {});
|
|
76
|
-
|
|
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":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,2BAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AASA,IAAAI,mBAAA,GAAAC,sBAAA,CAAAL,OAAA;AAEA,IAAAM,UAAA,GAAAN,OAAA;AAEA,IAAAO,WAAA,GAAAP,OAAA;AACA,IAAAQ,cAAA,GAAAR,OAAA;AAA+D,SAAAK,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,yBAAAH,CAAA,6BAAAI,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAD,wBAAA,YAAAA,CAAAH,CAAA,WAAAA,CAAA,GAAAM,CAAA,GAAAD,CAAA,KAAAL,CAAA;AAAA,SAAAV,wBAAAU,CAAA,EAAAK,CAAA,SAAAA,CAAA,IAAAL,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAE,OAAA,EAAAF,CAAA,QAAAM,CAAA,GAAAH,wBAAA,CAAAE,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAC,GAAA,CAAAP,CAAA,UAAAM,CAAA,CAAAE,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAf,CAAA,oBAAAe,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAd,CAAA,EAAAe,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAf,CAAA,CAAAe,CAAA,YAAAN,CAAA,CAAAP,OAAA,GAAAF,CAAA,EAAAM,CAAA,IAAAA,CAAA,CAAAa,GAAA,CAAAnB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AAAA,SAAAW,SAAA,WAAAA,QAAA,GAAAR,MAAA,CAAAS,MAAA,GAAAT,MAAA,CAAAS,MAAA,CAAAC,IAAA,eAAAb,CAAA,aAAAT,CAAA,MAAAA,CAAA,GAAAuB,SAAA,CAAAC,MAAA,EAAAxB,CAAA,UAAAM,CAAA,GAAAiB,SAAA,CAAAvB,CAAA,YAAAK,CAAA,IAAAC,CAAA,OAAAU,cAAA,CAAAC,IAAA,CAAAX,CAAA,EAAAD,CAAA,MAAAI,CAAA,CAAAJ,CAAA,IAAAC,CAAA,CAAAD,CAAA,aAAAI,CAAA,KAAAW,QAAA,CAAAK,KAAA,OAAAF,SAAA;AAG/D,MAAMG,uBAAuB,GAAIC,KAAuC,IAAK;EAC3E,MAAMC,KAAK,GAAG,IAAAC,oCAAQ,EAAC,CAAC;EACxB,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAAC,2BAAe,EAAC,CAAC;EACrC,MAAM;IAAEC,GAAG;IAAEC,SAAS;IAAEC;EAA4B,CAAC,GAAG,IAAAC,2BAAe,EAAC,CAAC;EACzE,MAAM;IAAEC,gBAAgB;IAAEC;EAAkB,CAAC,GAAG,IAAAC,iBAAU,EAACC,mCAAoB,CAACC,QAAQ,CAAC;EACzF,MAAMC,kBAAkB,GAAG,IAAAH,iBAAU,EAACC,mCAAoB,CAACG,MAAM,CAAC;EAClE,MAAM;IAAEC,WAAW;IAAEC,kBAAkB;IAAEC,iBAAiB;IAAEC;EAA4B,CAAC,GAAG,IAAAR,iBAAU,EACpGC,mCAAoB,CAACQ,WACvB,CAAC;EAED,MAAMC,YAAY,GAAG,IAAAC,2BAAe,EAAC,CAAC;EAEtC,MAAMC,iBAAiB,GAAG,IAAAC,aAAM,EAAC,KAAK,CAAC;EACvC,MAAMC,sBAAsB,GAAG,IAAAD,aAAM,EAAC,KAAK,CAAC;EAC5C,MAAME,0BAA0B,GAAG,IAAAF,aAAM,EAAC,KAAK,CAAC;EAChD,MAAMG,yBAAyB,GAAG,IAAAH,aAAM,EAAC,KAAK,CAAC;EAC/C,MAAM,CAACI,8BAA8B,EAAEC,iCAAiC,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAC3F,MAAMC,gBAAgB,GAAG,IAAAP,aAAM,EAAoB,CAAC;EACpD,MAAMQ,wBAAwB,GAAG,IAAAR,aAAM,EAAC,KAAK,CAAC;EAC9C,MAAM,CAACS,kBAAkB,EAAEC,qBAAqB,CAAC,GAAG,IAAAJ,eAAQ,EAA8BK,SAAS,CAAC;EAEpG,MAAMC,oBAAoB,GAAG,IAAAC,kBAAW,EACrCC,cAAuB,IAAK;IAC3B,IAAIf,iBAAiB,CAACgB,OAAO,KAAKD,cAAc,EAAE;MAAA,IAAAE,qBAAA;MAChDjB,iBAAiB,CAACgB,OAAO,GAAGD,cAAc;MAC1C,CAAAE,qBAAA,GAAAxC,KAAK,CAACyC,mBAAmB,cAAAD,qBAAA,eAAzBA,qBAAA,CAAAlD,IAAA,CAAAU,KAAK,EAAuBsC,cAAc,CAAC;IAC7C;EACF,CAAC,EACD,CAACtC,KAAK,CAACyC,mBAAmB,CAC5B,CAAC;EAED,MAAMC,2BAA2B,GAAG,IAAAL,kBAAW,EAC5CM,qBAA8B,IAAK;IAClC,IAAIX,wBAAwB,CAACO,OAAO,KAAKI,qBAAqB,EAAE;MAAA,IAAAC,qBAAA;MAC9DZ,wBAAwB,CAACO,OAAO,GAAGI,qBAAqB;MACxD,CAAAC,qBAAA,GAAA5C,KAAK,CAAC6C,0BAA0B,cAAAD,qBAAA,eAAhCA,qBAAA,CAAAtD,IAAA,CAAAU,KAAK,EAA8B2C,qBAAqB,CAAC;IAC3D;EACF,CAAC,EACD,CAAC3C,KAAK,CAAC6C,0BAA0B,CACnC,CAAC;EAED,MAAMC,4BAA4B,GAAG,IAAAC,4BAAgB,EACnD,CAACC,SAAiB,EAAEC,aAAsB,EAAEC,OAAe,KAAc;IACvE,MAAMC,iBAAiB,GAAGnD,KAAK,CAACoD,QAAQ,CAACC,SAAS,CAAEC,EAAE,IAAKA,EAAE,CAACN,SAAS,KAAKA,SAAS,CAAC;IACtF,MAAMO,gBAAgB,GAAGJ,iBAAiB,GAAG,CAAC,CAAC;IAE/C,IAAII,gBAAgB,EAAE;MACpB,IAAIN,aAAa,EAAE;QACjBO,UAAU,CAAC,MAAMxD,KAAK,CAACyD,kBAAkB,CAAC;UAAEC,aAAa,EAAEV;QAAU,CAAC,CAAC,EAAEW,wCAA6B,CAAC;MACzG;MACAzC,iBAAiB,CAAC;QAAE0C,KAAK,EAAET,iBAAiB;QAAEU,QAAQ,EAAE,IAAI;QAAEX;MAAQ,CAAC,CAAC;IAC1E,CAAC,MAAM;MACL,IAAIlD,KAAK,CAAC8D,OAAO,CAACC,sBAAsB,IAAIf,SAAS,EAAE;QACrD,IAAIC,aAAa,EAAE;UACjBjD,KAAK,CAACyD,kBAAkB,CAAC;YAAEC,aAAa,EAAEV;UAAU,CAAC,CAAC;QACxD;QACAhD,KAAK,CAACgE,mCAAmC,CAAChB,SAAS,CAAC,CAACiB,KAAK,CAAEC,CAAC,IAAK,CAAC,CAAC,CAAC;MACvE,CAAC,MAAM;QACL,OAAO,KAAK;MACd;IACF;IACA,OAAO,IAAI;EACb,CACF,CAAC;EAED,MAAMC,wBAAwB,GAAG,IAAApB,4BAAgB,EAAEqB,KAAc,IAAK;IACpEzC,yBAAyB,CAACY,OAAO,GAAG6B,KAAK;IACzCpE,KAAK,CAACmE,wBAAwB,CAACC,KAAK,CAAC;EACvC,CAAC,CAAC;EAEF,MAAMC,cAAc,GAAG,IAAAtB,4BAAgB,EAAC,OAAOc,QAAQ,GAAG,KAAK,KAAK;IAClE,IAAI7D,KAAK,CAACsE,OAAO,CAAC,CAAC,EAAE;MACnBtE,KAAK,CAACyD,kBAAkB,CAACtB,SAAS,CAAC;MACnCgC,wBAAwB,CAAC,KAAK,CAAC;MAE/B,MAAMnE,KAAK,CAACuE,kBAAkB,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK,CAAC,CAAC,CAAC;MACjDC,wBAAwB,CAAC,KAAK,CAAC;MAC/BlD,kBAAkB,CAAC;QAAE4C;MAAS,CAAC,CAAC;IAClC,CAAC,MAAM;MACL5C,kBAAkB,CAAC;QAAE4C;MAAS,CAAC,CAAC;IAClC;EACF,CAAC,CAAC;EAEF,MAAMW,wCAAwC,GAAG,IAAAnC,kBAAW,EAAC,MAAM;IAAA,IAAAoC,qBAAA;IACjErC,oBAAoB,CAAC,IAAI,CAAC;IAC1BM,2BAA2B,CAAC,KAAK,CAAC;IAClC,CAAA+B,qBAAA,GAAAzE,KAAK,CAAC0E,gBAAgB,cAAAD,qBAAA,eAAtBA,qBAAA,CAAAnF,IAAA,CAAAU,KAAyB,CAAC;IAC1B,IAAA2E,gCAAoB,EAAC,CAAC3E,KAAK,CAAC8D,OAAO,CAAC,CAAC;EACvC,CAAC,EAAE,CAAC1B,oBAAoB,EAAEM,2BAA2B,EAAE1C,KAAK,CAAC8D,OAAO,CAACc,GAAG,EAAE5E,KAAK,CAAC0E,gBAAgB,CAAC,CAAC;EAElG,MAAMG,uBAAuB,GAAG,IAAAxC,kBAAW,EACzC,CAACe,QAA2B,EAAE0B,gBAAwB,KAA6B;IACjF,IAAI1B,QAAQ,CAACvD,MAAM,IAAIiF,gBAAgB,EAAE;MACvC,OAAO,IAAI;IACb;IAEA,MAAMC,WAAW,GAAG3B,QAAQ,CAAC0B,gBAAgB,CAAC;IAC9C,IAAIC,WAAW,EAAE;MACf,IAAIA,WAAW,CAACC,MAAM,EAAE;QACtB,OAAOH,uBAAuB,CAACzB,QAAQ,EAAE0B,gBAAgB,GAAG,CAAC,CAAC;MAChE,CAAC,MAAM;QACL,OAAOC,WAAW;MACpB;IACF;IACA,OAAO,IAAI;EACb,CAAC,EACD,EACF,CAAC;EAED,MAAME,sBAAsB,GAAG,IAAAlC,4BAAgB,EAAEmC,uBAAgC,IAAK;IACpF,IAAI,CAAC5E,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IAAI,CAACH,uBAAuB,EAAE;MACxF;IACF;IAEA,OAAOlF,KAAK,CAACoD,QAAQ,CAACkC,IAAI,CAAC,CAACC,GAAG,EAAE3B,KAAK,KAAK;MAAA,IAAA4B,kBAAA;MACzC,IAAID,GAAG,CAACP,MAAM,EAAE;QACd,OAAO,KAAK;MACd;MAEA,MAAMS,uBAAuB,GAAGzF,KAAK,CAAC8D,OAAO,CAAC4B,UAAU,KAAKH,GAAG,CAACvC,SAAS,GAAG,CAAC;MAC9E,IAAIyC,uBAAuB,EAAE;QAC3B,OAAO,IAAI;MACb;MAEA,MAAME,oBAAoB,GAAGd,uBAAuB,CAAC7E,KAAK,CAACoD,QAAQ,EAAEQ,KAAK,GAAG,CAAC,CAAC;MAC/E,MAAMgC,6BAA6B,GAAG,GAAAJ,kBAAA,GAACxF,KAAK,CAAC6F,WAAW,cAAAL,kBAAA,eAAjBA,kBAAA,CAAAlG,IAAA,CAAAU,KAAoB,CAAC,KAAI2F,oBAAoB,IAAI,IAAI;MAC5F,MAAMG,iBAAiB,GACrBH,oBAAoB,IAAI,IAAI,IAAIA,oBAAoB,CAAC3C,SAAS,IAAIhD,KAAK,CAAC8D,OAAO,CAAC4B,UAAU;MAC5F,MAAMK,eAAe,GAAG/F,KAAK,CAAC8D,OAAO,CAAC4B,UAAU,GAAGH,GAAG,CAACvC,SAAS;MAChE,OAAO,CAAC4C,6BAA6B,IAAIE,iBAAiB,KAAKC,eAAe;IAChF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAAC/D,kBAAkB,EAAE;MACvB,MAAMgE,uBAAuB,GAAGhB,sBAAsB,CAACjF,KAAK,CAACkF,uBAAuB,IAAI,KAAK,CAAC;MAC9F,IAAIe,uBAAuB,EAAE;QAC3BC,wBAAwB,CAACD,uBAAuB,CAAC;QACjD/D,qBAAqB,CAAC+D,uBAAuB,CAAC;MAChD;IACF;EACF,CAAC,EAAE,CAACjG,KAAK,CAACoD,QAAQ,EAAEpD,KAAK,CAAC8D,OAAO,CAAC4B,UAAU,EAAEpF,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,CAAC,CAAC;EAEvG,MAAMa,wBAAwB,GAAG,IAAAnD,4BAAgB,EAAEoD,cAA2C,IAAK;IAAA,IAAAC,qBAAA;IACjG,MAAMC,mBAAmB,GAAG,CAAC,GAAAD,qBAAA,GAACrE,gBAAgB,CAACQ,OAAO,cAAA6D,qBAAA,eAAxBA,qBAAA,CAA0BE,IAAI,CACzDC,OAAO,IAAKA,OAAO,CAACC,SAAS,MAAKL,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEK,SAAS,CAC9D,CAAC;IAED,IAAI/E,sBAAsB,CAACc,OAAO,KAAK8D,mBAAmB,EAAE;MAC1D5E,sBAAsB,CAACc,OAAO,GAAG8D,mBAAmB;MACpDI,iCAAiC,CAAC,CAAC;MACnC,IAAI,CAACJ,mBAAmB,IAAI9E,iBAAiB,CAACgB,OAAO,EAAE;QACrD;MACF;MAEAH,oBAAoB,CAAC,IAAI,CAAC;MAC1B,IAAIJ,wBAAwB,CAACO,OAAO,EAAE;QACpC;MACF;MAEA,IAAI,CAAC,GAAGvC,KAAK,CAAC0G,WAAW,CAAC7G,MAAM,EAAE;QAChCG,KAAK,CAAC8D,OAAO,CAAC6C,YAAY,CAAC3G,KAAK,CAAC0G,WAAW,CAAC,CAAC,CAAC,CAAC;MAClD,CAAC,MAAM;QACL1G,KAAK,CAAC8D,OAAO,CAAC8C,UAAU,CAAC,CAAC;MAC5B;IACF;EACF,CAAC,CAAC;EAEF,MAAMC,sBAAsB,GAAG,IAAA9D,4BAAgB,EAC7C,MAAO+D,IAAsG,IAAK;IAChH,IAAI,CAACxG,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,EAAE;MAC5D;IACF;IAEAtD,gBAAgB,CAACQ,OAAO,GAAGuE,IAAI,CAACC,aAAa,CAACC,MAAM,CAAEC,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC,CAACC,GAAG,CAAEF,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC;IACtGhB,wBAAwB,CAACjE,kBAAkB,CAAC;EAC9C,CACF,CAAC;EAED,MAAMmF,0BAA0B,GAAG,IAAA/E,kBAAW,EAC5C,MAAOkE,OAAwB,IAAK;IAClC,IAAIjG,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IAAIkB,OAAO,EAAE;MACtE,MAAMvG,KAAK,CAAC8D,OAAO,CAAC6C,YAAY,CAACJ,OAAO,CAAC;MACzC7D,2BAA2B,CAAC,IAAI,CAAC;IACnC;EACF,CAAC,EACD,CAACpC,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,EAAE3C,2BAA2B,CACvF,CAAC;EAED,IAAAsD,gBAAS,EAAC,MAAM;IACdtE,0BAA0B,CAACa,OAAO,GAAG,CAAC,CAACvC,KAAK,CAACkF,uBAAuB,IAAI,CAAC,CAACnD,gBAAgB,CAACQ,OAAO;EACpG,CAAC,EAAE,CAACvC,KAAK,CAACkF,uBAAuB,EAAEnD,gBAAgB,CAACQ,OAAO,CAAC,CAAC;EAE7D,MAAM8E,8BAA8B,GAAG,IAAA7F,aAAM,EAA8B,CAAC;EAC5E,MAAMiF,iCAAiC,GAAG,IAAA1D,4BAAgB,EAAC,MAAM;IAC/D,MAAMuE,iBAAiB,GACrB,CAAC3F,yBAAyB,CAACY,OAAO,IAClC,CAACP,wBAAwB,CAACO,OAAO,KAChChB,iBAAiB,CAACgB,OAAO,IAAI,CAACb,0BAA0B,CAACa,OAAO,CAAC;IAEpE8E,8BAA8B,CAAC9E,OAAO,GAAG;MACvCgF,OAAO,EACLjH,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IACvD,CAACiC,iBAAiB,IAClB5F,0BAA0B,CAACa,OAAO,IAClC,CAAC,GAAGvC,KAAK,CAAC8D,OAAO,CAAC0D,kBAAkB,IACpC,CAAC/F,sBAAsB,CAACc,OAAO;MACjCkF,YAAY,EAAEjD,wCAAwC;MACtDgD,kBAAkB,EAAExH,KAAK,CAAC8D,OAAO,CAAC0D;IACpC,CAAC;IACD,IAAI5F,8BAA8B,KAAKyF,8BAA8B,CAAC9E,OAAO,CAACgF,OAAO,EAAE;MACrF1F,iCAAiC,CAACwF,8BAA8B,CAAC9E,OAAO,CAACgF,OAAO,CAAC;IACnF;EACF,CAAC,CAAC;EAEF,IAAAvB,gBAAS,EAAC,MAAM;IACdS,iCAAiC,CAAC,CAAC;EACrC,CAAC,EAAE,CACD/E,0BAA0B,CAACa,OAAO,EAClCvC,KAAK,CAAC8D,OAAO,CAAC0D,kBAAkB,EAChClH,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,CACxD,CAAC;EAEF,IAAAqC,kCAAsB,EAACrH,GAAG,EAAE;IAC1BsH,iBAAiBA,CAAC7D,OAAO,EAAE8D,KAAK,EAAE;MAChC,IAAI,IAAAC,8BAAkB,EAAC/D,OAAO,EAAE9D,KAAK,CAAC8D,OAAO,CAAC,EAAE;MAChD,MAAMgE,aAAa,GAAG9H,KAAK,CAACoD,QAAQ,CAAC,CAAC,CAAC;MACvC,MAAM2E,eAAe,GAAGD,aAAa,IAAIA,aAAa,CAACtB,SAAS,KAAKoB,KAAK,CAACpB,SAAS;MACpF,MAAMwB,+BAA+B,GAAG,CAAChI,KAAK,CAACiI,sBAAsB,IAAI,CAACjI,KAAK,CAACsE,OAAO,CAAC,CAAC;MACzF,IAAIyD,eAAe,IAAIC,+BAA+B,EAAE;QACtD/G,kBAAkB,CAAC;UAAE4C,QAAQ,EAAE,IAAI;UAAEX,OAAO,EAAE;QAAI,CAAC,CAAC;MACtD;IACF,CAAC;IACDgF,gBAAgBA,CAACpE,OAAO,EAAE;MACxB,IAAI,IAAA+D,8BAAkB,EAAC/D,OAAO,EAAE9D,KAAK,CAAC8D,OAAO,CAAC,EAAE;IAClD;EACF,CAAC,CAAC;EAEF,IAAAkC,gBAAS,EAAC,MAAM;IACd,OAAOlF,kBAAkB,CAACqH,SAAS,CAAC,CAAC;MAAEC,IAAI;MAAEC;IAAK,CAAC,KAAK;MACtD,QAAQD,IAAI;QACV,KAAK,wBAAwB;QAC7B,KAAK,mBAAmB;UAAE;YACxB,IAAI,CAACpI,KAAK,CAACiI,sBAAsB,EAAE;cACjC5D,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;QACA,KAAK,kBAAkB;UAAE;YACvB,MAAMiE,WAAW,GAAGtI,KAAK,CAAC8D,OAAO,CAACwE,WAAW;YAC7C,MAAM,CAACC,cAAc,CAAC,GAAGF,IAAI,CAACjF,QAAQ;YAEtC,MAAMoF,kBAAkB,GACtBD,cAAc,IAAID,WAAW,IAAIA,WAAW,CAAC9B,SAAS,KAAK+B,cAAc,CAAC/B,SAAS;YAErF,MAAMiC,gBAAgB,GAAGzI,KAAK,CAAC8D,OAAO,CAAC4E,QAAQ,IAAIF,kBAAkB;YAErE,IAAIC,gBAAgB,EAAE;cACpBpE,cAAc,CAAC,KAAK,CAAC;YACvB,CAAC,MAAM,IAAI,CAACrE,KAAK,CAACiI,sBAAsB,IAAIO,kBAAkB,EAAE;cAC9DnE,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;QACA,KAAK,sBAAsB;QAC3B,KAAK,sBAAsB;UAAE;YAC3BA,cAAc,CAAC,KAAK,CAAC;YACrB;UACF;QACA,KAAK,mCAAmC;UAAE;YACxCoC,iCAAiC,CAAC,CAAC;YACnC;UACF;QACA,KAAK,qCAAqC;UAAE;YAC1C/E,0BAA0B,CAACa,OAAO,GAAG,IAAI;YACzC,MAAMoG,uBAAuB,GAAG1D,sBAAsB,CAAC,IAAI,CAAC;YAC5DiB,wBAAwB,CAACyC,uBAAuB,CAAC;YACjDzG,qBAAqB,CAACyG,uBAAuB,CAAC;YAC9C,IAAI,CAAC3I,KAAK,CAACiI,sBAAsB,EAAE;cACjC5D,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAACrE,KAAK,CAACiI,sBAAsB,CAAC,CAAC;EAElC,IAAAjC,gBAAS,EAAC,MAAM;IACd,OAAOzF,2BAA2B,CAACqI,MAAM,CAACT,SAAS,CAAEU,OAAwD,IAAK;MAChH,QAAQA,OAAO,CAACT,IAAI;QAClB,KAAK,qCAAqC;UAAE;YAC1CtF,4BAA4B,CAAC+F,OAAO,CAACR,IAAI,CAAC3E,aAAa,EAAE,KAAK,EAAEoF,2CAAgC,CAAC;YACjG;UACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,IAAA9C,gBAAS,EAAC,MAAM;IACd;IACA;IACA;IACA,IAAI3E,YAAY,IAAIrB,KAAK,CAAC+I,UAAU,EAAE;MACpCjG,4BAA4B,CAAC9C,KAAK,CAAC+I,UAAU,CAACrF,aAAa,EAAE,KAAK,EAAEoF,2CAAgC,CAAC;IACvG;EACF,CAAC,EAAE,CAACzH,YAAY,CAAC,CAAC;EAElB,MAAM2H,oBAAoB,GAAG,IAAAjG,4BAAgB,EAC3C,CAACkG,aAA8B,EAAEC,YAAqC,KAAK;IACzE,IACE/H,2BAA2B,IAC3Bb,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACqF,SAAS,KAAK,QAAQ,IAC3D7I,SAAS,CAAC6E,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACsF,qBAAqB,KAAK,QAAQ,EACvE;MACA,IAAIH,aAAa,CAACjG,SAAS,IAAIhD,KAAK,CAAC8D,OAAO,CAACC,sBAAsB,EAAE;QACnE5C,2BAA2B,CAAC8H,aAAa,EAA6BC,YAAY,CAAClG,SAAS,CAAC;MAC/F,CAAC,MAAM;QACL/C,KAAK,CAACoJ,IAAI,CAAClJ,OAAO,CAACmJ,KAAK,CAACC,qBAAqB,EAAE,OAAO,CAAC;MAC1D;IACF,CAAC,MAAM;MACL,MAAMC,iBAAiB,GAAG1G,4BAA4B,CAACmG,aAAa,CAACjG,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;MACxF,IAAI,CAACwG,iBAAiB,EAAEvJ,KAAK,CAACoJ,IAAI,CAAClJ,OAAO,CAACmJ,KAAK,CAACC,qBAAqB,EAAE,OAAO,CAAC;IAClF;EACF,CACF,CAAC;EAED,oBACE7L,MAAA,CAAAa,OAAA,CAAAkL,aAAA,CAACzL,mBAAA,CAAAO,OAAkB,EAAAkB,QAAA,KACbO,KAAK;IACT0J,GAAG,EAAE1I,WAAY;IACjBmD,wBAAwB,EAAEA,wBAAyB;IACnDwF,cAAc,EAAEjJ,iBAAkB;IAClCkJ,sBAAsB,EAAElJ,iBAAkB;IAC1CmJ,aAAa,EAAEpJ,gBAAiB;IAChCoG,sBAAsB,EAAEA,sBAAuB;IAC/CmC,oBAAoB,EAAEA,oBAAqB;IAC3Cc,wBAAwB,EAAEzF,cAAe;IACzC0F,2BAA2B,EAAE1F,cAAe;IAC5C+C,0BAA0B,EAAEA,0BAA2B;IACvDnF,kBAAkB,EAAEA,kBAAmB;IACvC+H,2BAA2B,EAAE3C,8BAA8B,CAAC9E;EAAQ,EACrE,CAAC;AAEN,CAAC;AAAC,IAAA0H,QAAA,GAAAC,OAAA,CAAA3L,OAAA,gBAEa4L,cAAK,CAACC,IAAI,CAACrK,uBAAuB,CAAC","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:
|
|
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)
|
|
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),
|