stream-chat-react-native-core 5.15.0-beta.4 → 5.15.0-beta.6
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/ChannelList/hooks/usePaginatedChannels.js +24 -56
- package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +24 -56
- package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/package.json +1 -1
- package/src/components/ChannelList/hooks/usePaginatedChannels.ts +8 -49
- package/src/version.json +1 -1
|
@@ -15,8 +15,7 @@ var _useIsMountedRef = require("../../../hooks/useIsMountedRef");
|
|
|
15
15
|
var _getChannelsForFilterSort = require("../../../store/apis/getChannelsForFilterSort");
|
|
16
16
|
var _date = require("../../../utils/date");
|
|
17
17
|
var _DBSyncManager = require("../../../utils/DBSyncManager");
|
|
18
|
-
var _utils = require("
|
|
19
|
-
var _utils2 = require("../utils");
|
|
18
|
+
var _utils = require("../utils");
|
|
20
19
|
var waitSeconds = function waitSeconds(seconds) {
|
|
21
20
|
return new Promise(function (resolve) {
|
|
22
21
|
setTimeout(resolve, seconds * _date.ONE_SECOND_IN_MS);
|
|
@@ -74,12 +73,7 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
74
73
|
isQueryStale,
|
|
75
74
|
currentRequestId,
|
|
76
75
|
newOptions,
|
|
77
|
-
failedMessagesInDb,
|
|
78
|
-
cid,
|
|
79
|
-
failedMessages,
|
|
80
76
|
channelQueryResponse,
|
|
81
|
-
_cid2,
|
|
82
|
-
msgsToAdd,
|
|
83
77
|
newChannels,
|
|
84
78
|
_args = arguments;
|
|
85
79
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
@@ -115,35 +109,22 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
115
109
|
currentRequestId = activeRequestId.current;
|
|
116
110
|
setActiveQueryType(queryType);
|
|
117
111
|
newOptions = (0, _extends2["default"])({
|
|
118
|
-
limit: (_options$limit = options == null ? void 0 : options.limit) != null ? _options$limit :
|
|
112
|
+
limit: (_options$limit = options == null ? void 0 : options.limit) != null ? _options$limit : _utils.MAX_QUERY_CHANNELS_LIMIT,
|
|
119
113
|
offset: queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0
|
|
120
114
|
}, options);
|
|
121
115
|
_context.prev = 17;
|
|
122
|
-
|
|
123
|
-
if (enableOfflineSupport) {
|
|
124
|
-
for (cid in client.activeChannels) {
|
|
125
|
-
failedMessages = getFailedMessages(client.activeChannels[cid]);
|
|
126
|
-
if (failedMessages) failedMessagesInDb.set(cid, failedMessages);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
_context.next = 22;
|
|
116
|
+
_context.next = 20;
|
|
130
117
|
return client.queryChannels(filters, sort, newOptions, {
|
|
131
|
-
skipInitialization: activeChannels.current
|
|
118
|
+
skipInitialization: enableOfflineSupport ? undefined : activeChannels.current
|
|
132
119
|
});
|
|
133
|
-
case
|
|
120
|
+
case 20:
|
|
134
121
|
channelQueryResponse = _context.sent;
|
|
135
122
|
if (!(isQueryStale() || !isMountedRef.current)) {
|
|
136
|
-
_context.next =
|
|
123
|
+
_context.next = 23;
|
|
137
124
|
break;
|
|
138
125
|
}
|
|
139
126
|
return _context.abrupt("return");
|
|
140
|
-
case
|
|
141
|
-
if (failedMessagesInDb.size) {
|
|
142
|
-
for (_cid2 in client.activeChannels) {
|
|
143
|
-
msgsToAdd = failedMessagesInDb.get(_cid2);
|
|
144
|
-
if (msgsToAdd) client.activeChannels[_cid2].state.addMessagesSorted(msgsToAdd);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
127
|
+
case 23:
|
|
147
128
|
newChannels = queryType === 'loadChannels' && !staticChannelsActive && channels ? [].concat((0, _toConsumableArray2["default"])(channels), (0, _toConsumableArray2["default"])(channelQueryResponse)) : channelQueryResponse.map(function (c) {
|
|
148
129
|
var existingChannel = client.activeChannels[c.cid];
|
|
149
130
|
if (existingChannel) {
|
|
@@ -155,38 +136,38 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
155
136
|
setStaticChannelsActive(false);
|
|
156
137
|
setHasNextPage(channelQueryResponse.length >= newOptions.limit);
|
|
157
138
|
isQueryingRef.current = false;
|
|
158
|
-
_context.next =
|
|
139
|
+
_context.next = 43;
|
|
159
140
|
break;
|
|
160
|
-
case
|
|
161
|
-
_context.prev =
|
|
141
|
+
case 30:
|
|
142
|
+
_context.prev = 30;
|
|
162
143
|
_context.t0 = _context["catch"](17);
|
|
163
144
|
isQueryingRef.current = false;
|
|
164
|
-
_context.next =
|
|
145
|
+
_context.next = 35;
|
|
165
146
|
return waitSeconds(2);
|
|
166
|
-
case
|
|
147
|
+
case 35:
|
|
167
148
|
if (!isQueryStale()) {
|
|
168
|
-
_context.next =
|
|
149
|
+
_context.next = 37;
|
|
169
150
|
break;
|
|
170
151
|
}
|
|
171
152
|
return _context.abrupt("return");
|
|
172
|
-
case
|
|
153
|
+
case 37:
|
|
173
154
|
if (!(retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current)) {
|
|
174
|
-
_context.next =
|
|
155
|
+
_context.next = 42;
|
|
175
156
|
break;
|
|
176
157
|
}
|
|
177
158
|
setActiveQueryType(null);
|
|
178
159
|
console.warn(_context.t0);
|
|
179
160
|
setError(new Error("Maximum number of retries reached in queryChannels. Last error message is: " + _context.t0));
|
|
180
161
|
return _context.abrupt("return");
|
|
181
|
-
case
|
|
162
|
+
case 42:
|
|
182
163
|
return _context.abrupt("return", queryChannels(queryType, retryCount + 1));
|
|
183
|
-
case
|
|
164
|
+
case 43:
|
|
184
165
|
setActiveQueryType(null);
|
|
185
|
-
case
|
|
166
|
+
case 44:
|
|
186
167
|
case "end":
|
|
187
168
|
return _context.stop();
|
|
188
169
|
}
|
|
189
|
-
}, _callee, null, [[17,
|
|
170
|
+
}, _callee, null, [[17, 30]]);
|
|
190
171
|
}));
|
|
191
172
|
return function queryChannels() {
|
|
192
173
|
return _ref2.apply(this, arguments);
|
|
@@ -238,9 +219,11 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
238
219
|
sort: sort
|
|
239
220
|
});
|
|
240
221
|
if (channelsFromDB) {
|
|
241
|
-
|
|
242
|
-
offlineMode: true
|
|
243
|
-
|
|
222
|
+
var offlineChannels = client.hydrateActiveChannels(channelsFromDB, {
|
|
223
|
+
offlineMode: true,
|
|
224
|
+
skipInitialization: []
|
|
225
|
+
});
|
|
226
|
+
setChannels(offlineChannels);
|
|
244
227
|
setStaticChannelsActive(true);
|
|
245
228
|
}
|
|
246
229
|
} catch (e) {
|
|
@@ -309,19 +292,4 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
309
292
|
};
|
|
310
293
|
};
|
|
311
294
|
exports.usePaginatedChannels = usePaginatedChannels;
|
|
312
|
-
function getFailedMessages(channel) {
|
|
313
|
-
var failedMsgs = channel.state.messages.filter(function (m) {
|
|
314
|
-
return m.status === _utils.MessageStatusTypes.FAILED;
|
|
315
|
-
});
|
|
316
|
-
if (failedMsgs.length) {
|
|
317
|
-
return failedMsgs.map(function (m) {
|
|
318
|
-
return (0, _extends2["default"])({}, m, {
|
|
319
|
-
created_at: m.created_at.toISOString(),
|
|
320
|
-
pinned_at: m.pinned_at ? m.pinned_at.toISOString() : null,
|
|
321
|
-
updated_at: m.updated_at.toISOString()
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
return undefined;
|
|
326
|
-
}
|
|
327
295
|
//# sourceMappingURL=usePaginatedChannels.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_ActiveChannelsRefContext","_ChatContext","_useIsMountedRef","_getChannelsForFilterSort","_date","_DBSyncManager","_utils","_utils2","waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","_ref","enableOfflineSupport","_ref$filters","filters","_ref$options","options","setForceUpdate","_ref$sort","sort","_useState","useState","_useState2","_slicedToArray2","channels","setChannels","_useState3","undefined","_useState4","error","setError","_useState5","_useState6","staticChannelsActive","setStaticChannelsActive","_useState7","_useState8","activeQueryType","setActiveQueryType","_useState9","_useState10","hasNextPage","setHasNextPage","activeChannels","useActiveChannelsRefContext","isMountedRef","useIsMountedRef","_useChatContext","useChatContext","client","filtersRef","useRef","sortRef","activeRequestId","isQueryingRef","lastRefresh","Date","now","queryChannels","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","_options$limit","queryType","retryCount","hasUpdatedData","isQueryStale","currentRequestId","newOptions","failedMessagesInDb","cid","failedMessages","channelQueryResponse","_cid2","msgsToAdd","newChannels","_args","arguments","wrap","_callee$","_context","prev","next","length","current","abrupt","JSON","stringify","some","Boolean","_extends2","limit","MAX_QUERY_CHANNELS_LIMIT","offset","Map","getFailedMessages","set","skipInitialization","sent","size","get","state","addMessagesSorted","concat","_toConsumableArray2","map","c","existingChannel","t0","console","warn","Error","stop","apply","refreshList","_ref3","_callee2","_callee2$","_context2","reloadList","filterStr","useMemo","sortStr","useEffect","loadOfflineChannels","_client$user","user","id","channelsFromDB","getChannelsForFilterSort","currentUserId","hydrateActiveChannels","offlineMode","e","listener","DBSyncManager","onSyncStatusChange","syncStatus","dbSyncStatus","getSyncStatus","on","_ref4","_callee3","event","_callee3$","_context3","online","u","_x","_listener","unsubscribe","loadingChannels","loadingNextPage","loadNextPage","refreshing","exports","channel","failedMsgs","messages","filter","m","status","MessageStatusTypes","FAILED","created_at","toISOString","pinned_at","updated_at"],"sources":["usePaginatedChannels.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n MessageResponse,\n} from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { DBSyncManager } from '../../../utils/DBSyncManager';\nimport { MessageStatusTypes } from '../../../utils/utils';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n setForceUpdate: React.Dispatch<React.SetStateAction<number>>;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n setForceUpdate,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[] | null>(null);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const [hasNextPage, setHasNextPage] = useState<boolean>(false);\n const activeChannels = useActiveChannelsRefContext();\n const isMountedRef = useIsMountedRef();\n const { client } = useChatContext<StreamChatGenerics>();\n\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n const isQueryingRef = useRef(false);\n const lastRefresh = useRef(Date.now());\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset:\n queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0,\n ...options,\n };\n\n try {\n // If failed messages were present in DB it would be in the channel state now and be overwritten by the queryChannels call\n // So we store them in a separate object and add them back to the channel state after the queryChannels call\n const failedMessagesInDb: Map<string, MessageResponse<StreamChatGenerics>[]> = new Map();\n if (enableOfflineSupport) {\n for (const cid in client.activeChannels) {\n const failedMessages = getFailedMessages(client.activeChannels[cid]);\n if (failedMessages) failedMessagesInDb.set(cid, failedMessages);\n }\n }\n\n /**\n * We skipInitialization here for handling race condition between ChannelList, Channel (and Thread)\n * when they all (may) update the channel state at the same time (when connection state recovers)\n * TODO: if we move the channel state to a single context and share it between ChannelList, Channel and Thread we can remove this\n */\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: activeChannels.current,\n });\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n\n if (failedMessagesInDb.size) {\n for (const cid in client.activeChannels) {\n const msgsToAdd = failedMessagesInDb.get(cid);\n if (msgsToAdd) client.activeChannels[cid].state.addMessagesSorted(msgsToAdd);\n }\n }\n\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive && channels\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse.map((c) => {\n const existingChannel = client.activeChannels[c.cid];\n if (existingChannel) {\n return existingChannel;\n }\n\n return c;\n });\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const refreshList = async () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n await queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadOfflineChannels = () => {\n if (!client?.user?.id) return;\n\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n setChannels(\n client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n }),\n );\n setStaticChannelsActive(true);\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n\n setActiveQueryType(null);\n };\n\n let listener: ReturnType<typeof DBSyncManager.onSyncStatusChange>;\n if (enableOfflineSupport) {\n // Any time DB is synced, we need to update the UI with local DB channels first,\n // and then call queryChannels to ensure any new channels are added to UI.\n listener = DBSyncManager.onSyncStatusChange((syncStatus) => {\n if (syncStatus) {\n loadOfflineChannels();\n reloadList();\n }\n });\n // On start, load the channels from local db.\n loadOfflineChannels();\n\n // If db is already synced (sync api and pending api calls), then\n // right away call queryChannels.\n const dbSyncStatus = DBSyncManager.getSyncStatus();\n if (dbSyncStatus) {\n reloadList();\n }\n } else {\n listener = client.on('connection.changed', async (event) => {\n if (event.online) {\n await refreshList();\n setForceUpdate((u) => u + 1);\n }\n });\n\n reloadList();\n }\n\n return () => listener?.unsubscribe?.();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : (activeQueryType === 'reload' || activeQueryType === null) && channels === null,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage: queryChannels,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n // Although channels can be null, there is no practical case where channels will be null\n // when setChannels is used. setChannels is only recommended to be used for overriding\n // event handler. Thus instead of adding if check for channels === null, its better to\n // simply reassign types here.\n setChannels,\n staticChannelsActive,\n };\n};\n\nfunction getFailedMessages<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(channel: Channel<StreamChatGenerics>): MessageResponse<StreamChatGenerics>[] | undefined {\n const failedMsgs = channel.state.messages.filter((m) => m.status === MessageStatusTypes.FAILED);\n if (failedMsgs.length) {\n return failedMsgs.map(\n (m) =>\n ({\n ...m,\n created_at: m.created_at.toISOString(),\n pinned_at: m.pinned_at ? m.pinned_at.toISOString() : null,\n updated_at: m.updated_at.toISOString(),\n } as MessageResponse<StreamChatGenerics>),\n );\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_react","require","_ActiveChannelsRefContext","_ChatContext","_useIsMountedRef","_getChannelsForFilterSort","_date","_DBSyncManager","_utils","waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","_ref","enableOfflineSupport","_ref$filters","filters","_ref$options","options","setForceUpdate","_ref$sort","sort","_useState","useState","_useState2","_slicedToArray2","channels","setChannels","_useState3","undefined","_useState4","error","setError","_useState5","_useState6","staticChannelsActive","setStaticChannelsActive","_useState7","_useState8","activeQueryType","setActiveQueryType","_useState9","_useState10","hasNextPage","setHasNextPage","activeChannels","useActiveChannelsRefContext","isMountedRef","useIsMountedRef","_useChatContext","useChatContext","client","filtersRef","useRef","sortRef","activeRequestId","isQueryingRef","lastRefresh","Date","now","queryChannels","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","_options$limit","queryType","retryCount","hasUpdatedData","isQueryStale","currentRequestId","newOptions","channelQueryResponse","newChannels","_args","arguments","wrap","_callee$","_context","prev","next","length","current","abrupt","JSON","stringify","some","Boolean","_extends2","limit","MAX_QUERY_CHANNELS_LIMIT","offset","skipInitialization","sent","concat","_toConsumableArray2","map","c","existingChannel","cid","t0","console","warn","Error","stop","apply","refreshList","_ref3","_callee2","_callee2$","_context2","reloadList","filterStr","useMemo","sortStr","useEffect","loadOfflineChannels","_client$user","user","id","channelsFromDB","getChannelsForFilterSort","currentUserId","offlineChannels","hydrateActiveChannels","offlineMode","e","listener","DBSyncManager","onSyncStatusChange","syncStatus","dbSyncStatus","getSyncStatus","on","_ref4","_callee3","event","_callee3$","_context3","online","u","_x","_listener","unsubscribe","loadingChannels","loadingNextPage","loadNextPage","refreshing","exports"],"sources":["usePaginatedChannels.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { DBSyncManager } from '../../../utils/DBSyncManager';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n setForceUpdate: React.Dispatch<React.SetStateAction<number>>;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n setForceUpdate,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[] | null>(null);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const [hasNextPage, setHasNextPage] = useState<boolean>(false);\n const activeChannels = useActiveChannelsRefContext();\n const isMountedRef = useIsMountedRef();\n const { client } = useChatContext<StreamChatGenerics>();\n\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n const isQueryingRef = useRef(false);\n const lastRefresh = useRef(Date.now());\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset:\n queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0,\n ...options,\n };\n\n try {\n /**\n * We skipInitialization here for handling race condition between ChannelList, Channel (and Thread)\n * when they all (may) update the channel state at the same time (when connection state recovers)\n * TODO: if we move the channel state to a single context and share it between ChannelList, Channel and Thread we can remove this\n */\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: enableOfflineSupport ? undefined : activeChannels.current,\n });\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive && channels\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse.map((c) => {\n const existingChannel = client.activeChannels[c.cid];\n if (existingChannel) {\n return existingChannel;\n }\n\n return c;\n });\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const refreshList = async () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n await queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadOfflineChannels = () => {\n if (!client?.user?.id) return;\n\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n const offlineChannels = client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n skipInitialization: [], // passing empty array will clear out the existing messages from channel state, this removes the possibility of duplicate messages\n });\n\n setChannels(offlineChannels);\n setStaticChannelsActive(true);\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n\n setActiveQueryType(null);\n };\n\n let listener: ReturnType<typeof DBSyncManager.onSyncStatusChange>;\n if (enableOfflineSupport) {\n // Any time DB is synced, we need to update the UI with local DB channels first,\n // and then call queryChannels to ensure any new channels are added to UI.\n listener = DBSyncManager.onSyncStatusChange((syncStatus) => {\n if (syncStatus) {\n loadOfflineChannels();\n reloadList();\n }\n });\n // On start, load the channels from local db.\n loadOfflineChannels();\n\n // If db is already synced (sync api and pending api calls), then\n // right away call queryChannels.\n const dbSyncStatus = DBSyncManager.getSyncStatus();\n if (dbSyncStatus) {\n reloadList();\n }\n } else {\n listener = client.on('connection.changed', async (event) => {\n if (event.online) {\n await refreshList();\n setForceUpdate((u) => u + 1);\n }\n });\n\n reloadList();\n }\n\n return () => listener?.unsubscribe?.();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : (activeQueryType === 'reload' || activeQueryType === null) && channels === null,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage: queryChannels,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n // Although channels can be null, there is no practical case where channels will be null\n // when setChannels is used. setChannels is only recommended to be used for overriding\n // event handler. Thus instead of adding if check for channels === null, its better to\n // simply reassign types here.\n setChannels,\n staticChannelsActive,\n };\n};\n"],"mappings":"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"}
|
|
@@ -15,8 +15,7 @@ var _useIsMountedRef = require("../../../hooks/useIsMountedRef");
|
|
|
15
15
|
var _getChannelsForFilterSort = require("../../../store/apis/getChannelsForFilterSort");
|
|
16
16
|
var _date = require("../../../utils/date");
|
|
17
17
|
var _DBSyncManager = require("../../../utils/DBSyncManager");
|
|
18
|
-
var _utils = require("
|
|
19
|
-
var _utils2 = require("../utils");
|
|
18
|
+
var _utils = require("../utils");
|
|
20
19
|
var waitSeconds = function waitSeconds(seconds) {
|
|
21
20
|
return new Promise(function (resolve) {
|
|
22
21
|
setTimeout(resolve, seconds * _date.ONE_SECOND_IN_MS);
|
|
@@ -74,12 +73,7 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
74
73
|
isQueryStale,
|
|
75
74
|
currentRequestId,
|
|
76
75
|
newOptions,
|
|
77
|
-
failedMessagesInDb,
|
|
78
|
-
cid,
|
|
79
|
-
failedMessages,
|
|
80
76
|
channelQueryResponse,
|
|
81
|
-
_cid2,
|
|
82
|
-
msgsToAdd,
|
|
83
77
|
newChannels,
|
|
84
78
|
_args = arguments;
|
|
85
79
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
@@ -115,35 +109,22 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
115
109
|
currentRequestId = activeRequestId.current;
|
|
116
110
|
setActiveQueryType(queryType);
|
|
117
111
|
newOptions = (0, _extends2["default"])({
|
|
118
|
-
limit: (_options$limit = options == null ? void 0 : options.limit) != null ? _options$limit :
|
|
112
|
+
limit: (_options$limit = options == null ? void 0 : options.limit) != null ? _options$limit : _utils.MAX_QUERY_CHANNELS_LIMIT,
|
|
119
113
|
offset: queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0
|
|
120
114
|
}, options);
|
|
121
115
|
_context.prev = 17;
|
|
122
|
-
|
|
123
|
-
if (enableOfflineSupport) {
|
|
124
|
-
for (cid in client.activeChannels) {
|
|
125
|
-
failedMessages = getFailedMessages(client.activeChannels[cid]);
|
|
126
|
-
if (failedMessages) failedMessagesInDb.set(cid, failedMessages);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
_context.next = 22;
|
|
116
|
+
_context.next = 20;
|
|
130
117
|
return client.queryChannels(filters, sort, newOptions, {
|
|
131
|
-
skipInitialization: activeChannels.current
|
|
118
|
+
skipInitialization: enableOfflineSupport ? undefined : activeChannels.current
|
|
132
119
|
});
|
|
133
|
-
case
|
|
120
|
+
case 20:
|
|
134
121
|
channelQueryResponse = _context.sent;
|
|
135
122
|
if (!(isQueryStale() || !isMountedRef.current)) {
|
|
136
|
-
_context.next =
|
|
123
|
+
_context.next = 23;
|
|
137
124
|
break;
|
|
138
125
|
}
|
|
139
126
|
return _context.abrupt("return");
|
|
140
|
-
case
|
|
141
|
-
if (failedMessagesInDb.size) {
|
|
142
|
-
for (_cid2 in client.activeChannels) {
|
|
143
|
-
msgsToAdd = failedMessagesInDb.get(_cid2);
|
|
144
|
-
if (msgsToAdd) client.activeChannels[_cid2].state.addMessagesSorted(msgsToAdd);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
127
|
+
case 23:
|
|
147
128
|
newChannels = queryType === 'loadChannels' && !staticChannelsActive && channels ? [].concat((0, _toConsumableArray2["default"])(channels), (0, _toConsumableArray2["default"])(channelQueryResponse)) : channelQueryResponse.map(function (c) {
|
|
148
129
|
var existingChannel = client.activeChannels[c.cid];
|
|
149
130
|
if (existingChannel) {
|
|
@@ -155,38 +136,38 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
155
136
|
setStaticChannelsActive(false);
|
|
156
137
|
setHasNextPage(channelQueryResponse.length >= newOptions.limit);
|
|
157
138
|
isQueryingRef.current = false;
|
|
158
|
-
_context.next =
|
|
139
|
+
_context.next = 43;
|
|
159
140
|
break;
|
|
160
|
-
case
|
|
161
|
-
_context.prev =
|
|
141
|
+
case 30:
|
|
142
|
+
_context.prev = 30;
|
|
162
143
|
_context.t0 = _context["catch"](17);
|
|
163
144
|
isQueryingRef.current = false;
|
|
164
|
-
_context.next =
|
|
145
|
+
_context.next = 35;
|
|
165
146
|
return waitSeconds(2);
|
|
166
|
-
case
|
|
147
|
+
case 35:
|
|
167
148
|
if (!isQueryStale()) {
|
|
168
|
-
_context.next =
|
|
149
|
+
_context.next = 37;
|
|
169
150
|
break;
|
|
170
151
|
}
|
|
171
152
|
return _context.abrupt("return");
|
|
172
|
-
case
|
|
153
|
+
case 37:
|
|
173
154
|
if (!(retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current)) {
|
|
174
|
-
_context.next =
|
|
155
|
+
_context.next = 42;
|
|
175
156
|
break;
|
|
176
157
|
}
|
|
177
158
|
setActiveQueryType(null);
|
|
178
159
|
console.warn(_context.t0);
|
|
179
160
|
setError(new Error("Maximum number of retries reached in queryChannels. Last error message is: " + _context.t0));
|
|
180
161
|
return _context.abrupt("return");
|
|
181
|
-
case
|
|
162
|
+
case 42:
|
|
182
163
|
return _context.abrupt("return", queryChannels(queryType, retryCount + 1));
|
|
183
|
-
case
|
|
164
|
+
case 43:
|
|
184
165
|
setActiveQueryType(null);
|
|
185
|
-
case
|
|
166
|
+
case 44:
|
|
186
167
|
case "end":
|
|
187
168
|
return _context.stop();
|
|
188
169
|
}
|
|
189
|
-
}, _callee, null, [[17,
|
|
170
|
+
}, _callee, null, [[17, 30]]);
|
|
190
171
|
}));
|
|
191
172
|
return function queryChannels() {
|
|
192
173
|
return _ref2.apply(this, arguments);
|
|
@@ -238,9 +219,11 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
238
219
|
sort: sort
|
|
239
220
|
});
|
|
240
221
|
if (channelsFromDB) {
|
|
241
|
-
|
|
242
|
-
offlineMode: true
|
|
243
|
-
|
|
222
|
+
var offlineChannels = client.hydrateActiveChannels(channelsFromDB, {
|
|
223
|
+
offlineMode: true,
|
|
224
|
+
skipInitialization: []
|
|
225
|
+
});
|
|
226
|
+
setChannels(offlineChannels);
|
|
244
227
|
setStaticChannelsActive(true);
|
|
245
228
|
}
|
|
246
229
|
} catch (e) {
|
|
@@ -309,19 +292,4 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
|
|
|
309
292
|
};
|
|
310
293
|
};
|
|
311
294
|
exports.usePaginatedChannels = usePaginatedChannels;
|
|
312
|
-
function getFailedMessages(channel) {
|
|
313
|
-
var failedMsgs = channel.state.messages.filter(function (m) {
|
|
314
|
-
return m.status === _utils.MessageStatusTypes.FAILED;
|
|
315
|
-
});
|
|
316
|
-
if (failedMsgs.length) {
|
|
317
|
-
return failedMsgs.map(function (m) {
|
|
318
|
-
return (0, _extends2["default"])({}, m, {
|
|
319
|
-
created_at: m.created_at.toISOString(),
|
|
320
|
-
pinned_at: m.pinned_at ? m.pinned_at.toISOString() : null,
|
|
321
|
-
updated_at: m.updated_at.toISOString()
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
return undefined;
|
|
326
|
-
}
|
|
327
295
|
//# sourceMappingURL=usePaginatedChannels.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_ActiveChannelsRefContext","_ChatContext","_useIsMountedRef","_getChannelsForFilterSort","_date","_DBSyncManager","_utils","_utils2","waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","_ref","enableOfflineSupport","_ref$filters","filters","_ref$options","options","setForceUpdate","_ref$sort","sort","_useState","useState","_useState2","_slicedToArray2","channels","setChannels","_useState3","undefined","_useState4","error","setError","_useState5","_useState6","staticChannelsActive","setStaticChannelsActive","_useState7","_useState8","activeQueryType","setActiveQueryType","_useState9","_useState10","hasNextPage","setHasNextPage","activeChannels","useActiveChannelsRefContext","isMountedRef","useIsMountedRef","_useChatContext","useChatContext","client","filtersRef","useRef","sortRef","activeRequestId","isQueryingRef","lastRefresh","Date","now","queryChannels","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","_options$limit","queryType","retryCount","hasUpdatedData","isQueryStale","currentRequestId","newOptions","failedMessagesInDb","cid","failedMessages","channelQueryResponse","_cid2","msgsToAdd","newChannels","_args","arguments","wrap","_callee$","_context","prev","next","length","current","abrupt","JSON","stringify","some","Boolean","_extends2","limit","MAX_QUERY_CHANNELS_LIMIT","offset","Map","getFailedMessages","set","skipInitialization","sent","size","get","state","addMessagesSorted","concat","_toConsumableArray2","map","c","existingChannel","t0","console","warn","Error","stop","apply","refreshList","_ref3","_callee2","_callee2$","_context2","reloadList","filterStr","useMemo","sortStr","useEffect","loadOfflineChannels","_client$user","user","id","channelsFromDB","getChannelsForFilterSort","currentUserId","hydrateActiveChannels","offlineMode","e","listener","DBSyncManager","onSyncStatusChange","syncStatus","dbSyncStatus","getSyncStatus","on","_ref4","_callee3","event","_callee3$","_context3","online","u","_x","_listener","unsubscribe","loadingChannels","loadingNextPage","loadNextPage","refreshing","exports","channel","failedMsgs","messages","filter","m","status","MessageStatusTypes","FAILED","created_at","toISOString","pinned_at","updated_at"],"sources":["usePaginatedChannels.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n Channel,\n ChannelFilters,\n ChannelOptions,\n ChannelSort,\n MessageResponse,\n} from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { DBSyncManager } from '../../../utils/DBSyncManager';\nimport { MessageStatusTypes } from '../../../utils/utils';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n setForceUpdate: React.Dispatch<React.SetStateAction<number>>;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n setForceUpdate,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[] | null>(null);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const [hasNextPage, setHasNextPage] = useState<boolean>(false);\n const activeChannels = useActiveChannelsRefContext();\n const isMountedRef = useIsMountedRef();\n const { client } = useChatContext<StreamChatGenerics>();\n\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n const isQueryingRef = useRef(false);\n const lastRefresh = useRef(Date.now());\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset:\n queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0,\n ...options,\n };\n\n try {\n // If failed messages were present in DB it would be in the channel state now and be overwritten by the queryChannels call\n // So we store them in a separate object and add them back to the channel state after the queryChannels call\n const failedMessagesInDb: Map<string, MessageResponse<StreamChatGenerics>[]> = new Map();\n if (enableOfflineSupport) {\n for (const cid in client.activeChannels) {\n const failedMessages = getFailedMessages(client.activeChannels[cid]);\n if (failedMessages) failedMessagesInDb.set(cid, failedMessages);\n }\n }\n\n /**\n * We skipInitialization here for handling race condition between ChannelList, Channel (and Thread)\n * when they all (may) update the channel state at the same time (when connection state recovers)\n * TODO: if we move the channel state to a single context and share it between ChannelList, Channel and Thread we can remove this\n */\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: activeChannels.current,\n });\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n\n if (failedMessagesInDb.size) {\n for (const cid in client.activeChannels) {\n const msgsToAdd = failedMessagesInDb.get(cid);\n if (msgsToAdd) client.activeChannels[cid].state.addMessagesSorted(msgsToAdd);\n }\n }\n\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive && channels\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse.map((c) => {\n const existingChannel = client.activeChannels[c.cid];\n if (existingChannel) {\n return existingChannel;\n }\n\n return c;\n });\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const refreshList = async () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n await queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadOfflineChannels = () => {\n if (!client?.user?.id) return;\n\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n setChannels(\n client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n }),\n );\n setStaticChannelsActive(true);\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n\n setActiveQueryType(null);\n };\n\n let listener: ReturnType<typeof DBSyncManager.onSyncStatusChange>;\n if (enableOfflineSupport) {\n // Any time DB is synced, we need to update the UI with local DB channels first,\n // and then call queryChannels to ensure any new channels are added to UI.\n listener = DBSyncManager.onSyncStatusChange((syncStatus) => {\n if (syncStatus) {\n loadOfflineChannels();\n reloadList();\n }\n });\n // On start, load the channels from local db.\n loadOfflineChannels();\n\n // If db is already synced (sync api and pending api calls), then\n // right away call queryChannels.\n const dbSyncStatus = DBSyncManager.getSyncStatus();\n if (dbSyncStatus) {\n reloadList();\n }\n } else {\n listener = client.on('connection.changed', async (event) => {\n if (event.online) {\n await refreshList();\n setForceUpdate((u) => u + 1);\n }\n });\n\n reloadList();\n }\n\n return () => listener?.unsubscribe?.();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : (activeQueryType === 'reload' || activeQueryType === null) && channels === null,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage: queryChannels,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n // Although channels can be null, there is no practical case where channels will be null\n // when setChannels is used. setChannels is only recommended to be used for overriding\n // event handler. Thus instead of adding if check for channels === null, its better to\n // simply reassign types here.\n setChannels,\n staticChannelsActive,\n };\n};\n\nfunction getFailedMessages<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(channel: Channel<StreamChatGenerics>): MessageResponse<StreamChatGenerics>[] | undefined {\n const failedMsgs = channel.state.messages.filter((m) => m.status === MessageStatusTypes.FAILED);\n if (failedMsgs.length) {\n return failedMsgs.map(\n (m) =>\n ({\n ...m,\n created_at: m.created_at.toISOString(),\n pinned_at: m.pinned_at ? m.pinned_at.toISOString() : null,\n updated_at: m.updated_at.toISOString(),\n } as MessageResponse<StreamChatGenerics>),\n );\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_react","require","_ActiveChannelsRefContext","_ChatContext","_useIsMountedRef","_getChannelsForFilterSort","_date","_DBSyncManager","_utils","waitSeconds","seconds","Promise","resolve","setTimeout","ONE_SECOND_IN_MS","DEFAULT_OPTIONS","message_limit","MAX_NUMBER_OF_RETRIES","RETRY_INTERVAL_IN_MS","usePaginatedChannels","_ref","enableOfflineSupport","_ref$filters","filters","_ref$options","options","setForceUpdate","_ref$sort","sort","_useState","useState","_useState2","_slicedToArray2","channels","setChannels","_useState3","undefined","_useState4","error","setError","_useState5","_useState6","staticChannelsActive","setStaticChannelsActive","_useState7","_useState8","activeQueryType","setActiveQueryType","_useState9","_useState10","hasNextPage","setHasNextPage","activeChannels","useActiveChannelsRefContext","isMountedRef","useIsMountedRef","_useChatContext","useChatContext","client","filtersRef","useRef","sortRef","activeRequestId","isQueryingRef","lastRefresh","Date","now","queryChannels","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","_options$limit","queryType","retryCount","hasUpdatedData","isQueryStale","currentRequestId","newOptions","channelQueryResponse","newChannels","_args","arguments","wrap","_callee$","_context","prev","next","length","current","abrupt","JSON","stringify","some","Boolean","_extends2","limit","MAX_QUERY_CHANNELS_LIMIT","offset","skipInitialization","sent","concat","_toConsumableArray2","map","c","existingChannel","cid","t0","console","warn","Error","stop","apply","refreshList","_ref3","_callee2","_callee2$","_context2","reloadList","filterStr","useMemo","sortStr","useEffect","loadOfflineChannels","_client$user","user","id","channelsFromDB","getChannelsForFilterSort","currentUserId","offlineChannels","hydrateActiveChannels","offlineMode","e","listener","DBSyncManager","onSyncStatusChange","syncStatus","dbSyncStatus","getSyncStatus","on","_ref4","_callee3","event","_callee3$","_context3","online","u","_x","_listener","unsubscribe","loadingChannels","loadingNextPage","loadNextPage","refreshing","exports"],"sources":["usePaginatedChannels.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilterSort';\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\nimport { ONE_SECOND_IN_MS } from '../../../utils/date';\nimport { DBSyncManager } from '../../../utils/DBSyncManager';\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nconst waitSeconds = (seconds: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, seconds * ONE_SECOND_IN_MS);\n });\n\ntype Parameters<StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics> =\n {\n enableOfflineSupport: boolean;\n filters: ChannelFilters<StreamChatGenerics>;\n options: ChannelOptions;\n setForceUpdate: React.Dispatch<React.SetStateAction<number>>;\n sort: ChannelSort<StreamChatGenerics>;\n };\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nconst MAX_NUMBER_OF_RETRIES = 3;\nconst RETRY_INTERVAL_IN_MS = 5000;\n\ntype QueryType = 'queryLocalDB' | 'reload' | 'refresh' | 'loadChannels';\n\nexport type QueryChannels = (queryType?: QueryType, retryCount?: number) => Promise<void>;\n\nexport const usePaginatedChannels = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n enableOfflineSupport,\n filters = {},\n options = DEFAULT_OPTIONS,\n setForceUpdate,\n sort = {},\n}: Parameters<StreamChatGenerics>) => {\n const [channels, setChannels] = useState<Channel<StreamChatGenerics>[] | null>(null);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [staticChannelsActive, setStaticChannelsActive] = useState<boolean>(false);\n const [activeQueryType, setActiveQueryType] = useState<QueryType | null>('queryLocalDB');\n const [hasNextPage, setHasNextPage] = useState<boolean>(false);\n const activeChannels = useActiveChannelsRefContext();\n const isMountedRef = useIsMountedRef();\n const { client } = useChatContext<StreamChatGenerics>();\n\n const filtersRef = useRef<typeof filters | null>(null);\n const sortRef = useRef<typeof sort | null>(null);\n const activeRequestId = useRef<number>(0);\n const isQueryingRef = useRef(false);\n const lastRefresh = useRef(Date.now());\n\n const queryChannels: QueryChannels = async (\n queryType: QueryType = 'loadChannels',\n retryCount = 0,\n ): Promise<void> => {\n if (!client || !isMountedRef.current) return;\n\n const hasUpdatedData =\n queryType === 'loadChannels' ||\n queryType === 'refresh' ||\n [\n JSON.stringify(filtersRef.current) !== JSON.stringify(filters),\n JSON.stringify(sortRef.current) !== JSON.stringify(sort),\n ].some(Boolean);\n\n const isQueryStale = () => !isMountedRef || activeRequestId.current !== currentRequestId;\n\n /**\n * We don't need to make another call to query channels if we don't\n * have new data for the query to include\n * */\n if (!hasUpdatedData) {\n if (activeQueryType === null) return;\n }\n\n filtersRef.current = filters;\n sortRef.current = sort;\n isQueryingRef.current = true;\n setError(undefined);\n activeRequestId.current++;\n const currentRequestId = activeRequestId.current;\n setActiveQueryType(queryType);\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset:\n queryType === 'loadChannels' && !staticChannelsActive && channels ? channels.length : 0,\n ...options,\n };\n\n try {\n /**\n * We skipInitialization here for handling race condition between ChannelList, Channel (and Thread)\n * when they all (may) update the channel state at the same time (when connection state recovers)\n * TODO: if we move the channel state to a single context and share it between ChannelList, Channel and Thread we can remove this\n */\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {\n skipInitialization: enableOfflineSupport ? undefined : activeChannels.current,\n });\n if (isQueryStale() || !isMountedRef.current) {\n return;\n }\n\n const newChannels =\n queryType === 'loadChannels' && !staticChannelsActive && channels\n ? [...channels, ...channelQueryResponse]\n : channelQueryResponse.map((c) => {\n const existingChannel = client.activeChannels[c.cid];\n if (existingChannel) {\n return existingChannel;\n }\n\n return c;\n });\n\n setChannels(newChannels);\n setStaticChannelsActive(false);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n isQueryingRef.current = false;\n } catch (err: unknown) {\n isQueryingRef.current = false;\n await waitSeconds(2);\n\n if (isQueryStale()) {\n return;\n }\n\n // querying.current check is needed in order to make sure the next query call doesnt flick an error\n // state and then succeed (reconnect case)\n if (retryCount === MAX_NUMBER_OF_RETRIES && !isQueryingRef.current) {\n setActiveQueryType(null);\n console.warn(err);\n\n setError(\n new Error(\n `Maximum number of retries reached in queryChannels. Last error message is: ${err}`,\n ),\n );\n return;\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setActiveQueryType(null);\n };\n\n const refreshList = async () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < RETRY_INTERVAL_IN_MS && error === undefined) {\n return;\n }\n\n lastRefresh.current = Date.now();\n await queryChannels('refresh');\n };\n\n const reloadList = () => queryChannels('reload');\n\n /**\n * Equality check using stringified filters/sort ensure that we don't make un-necessary queryChannels api calls\n * for the scenario:\n *\n * <ChannelList\n * filters={{\n * members: { $in: ['vishal'] }\n * }}\n * ...\n * />\n *\n * Here we have passed filters as inline object, which means on every re-render of\n * parent component, ChannelList will receive new object reference (even though value is same), which\n * in return will trigger useEffect. To avoid this, we can add a value check.\n */\n const filterStr = useMemo(() => JSON.stringify(filters), [filters]);\n const sortStr = useMemo(() => JSON.stringify(sort), [sort]);\n\n useEffect(() => {\n const loadOfflineChannels = () => {\n if (!client?.user?.id) return;\n\n try {\n const channelsFromDB = getChannelsForFilterSort({\n currentUserId: client.user.id,\n filters,\n sort,\n });\n\n if (channelsFromDB) {\n const offlineChannels = client.hydrateActiveChannels(channelsFromDB, {\n offlineMode: true,\n skipInitialization: [], // passing empty array will clear out the existing messages from channel state, this removes the possibility of duplicate messages\n });\n\n setChannels(offlineChannels);\n setStaticChannelsActive(true);\n }\n } catch (e) {\n console.warn('Failed to get channels from database: ', e);\n }\n\n setActiveQueryType(null);\n };\n\n let listener: ReturnType<typeof DBSyncManager.onSyncStatusChange>;\n if (enableOfflineSupport) {\n // Any time DB is synced, we need to update the UI with local DB channels first,\n // and then call queryChannels to ensure any new channels are added to UI.\n listener = DBSyncManager.onSyncStatusChange((syncStatus) => {\n if (syncStatus) {\n loadOfflineChannels();\n reloadList();\n }\n });\n // On start, load the channels from local db.\n loadOfflineChannels();\n\n // If db is already synced (sync api and pending api calls), then\n // right away call queryChannels.\n const dbSyncStatus = DBSyncManager.getSyncStatus();\n if (dbSyncStatus) {\n reloadList();\n }\n } else {\n listener = client.on('connection.changed', async (event) => {\n if (event.online) {\n await refreshList();\n setForceUpdate((u) => u + 1);\n }\n });\n\n reloadList();\n }\n\n return () => listener?.unsubscribe?.();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels:\n activeQueryType === 'queryLocalDB'\n ? true\n : (activeQueryType === 'reload' || activeQueryType === null) && channels === null,\n loadingNextPage: activeQueryType === 'loadChannels',\n loadNextPage: queryChannels,\n refreshing: activeQueryType === 'refresh',\n refreshList,\n reloadList,\n // Although channels can be null, there is no practical case where channels will be null\n // when setChannels is used. setChannels is only recommended to be used for overriding\n // event handler. Thus instead of adding if check for channels === null, its better to\n // simply reassign types here.\n setChannels,\n staticChannelsActive,\n };\n};\n"],"mappings":"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"}
|
package/lib/module/version.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stream-chat-react-native-core",
|
|
3
3
|
"description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
|
|
4
|
-
"version": "5.15.0-beta.
|
|
4
|
+
"version": "5.15.0-beta.6",
|
|
5
5
|
"author": {
|
|
6
6
|
"company": "Stream.io Inc",
|
|
7
7
|
"name": "Stream.io Inc"
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
Channel,
|
|
5
|
-
ChannelFilters,
|
|
6
|
-
ChannelOptions,
|
|
7
|
-
ChannelSort,
|
|
8
|
-
MessageResponse,
|
|
9
|
-
} from 'stream-chat';
|
|
3
|
+
import type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';
|
|
10
4
|
|
|
11
5
|
import { useActiveChannelsRefContext } from '../../../contexts/activeChannelsRefContext/ActiveChannelsRefContext';
|
|
12
6
|
import { useChatContext } from '../../../contexts/chatContext/ChatContext';
|
|
@@ -16,7 +10,6 @@ import { getChannelsForFilterSort } from '../../../store/apis/getChannelsForFilt
|
|
|
16
10
|
import type { DefaultStreamChatGenerics } from '../../../types/types';
|
|
17
11
|
import { ONE_SECOND_IN_MS } from '../../../utils/date';
|
|
18
12
|
import { DBSyncManager } from '../../../utils/DBSyncManager';
|
|
19
|
-
import { MessageStatusTypes } from '../../../utils/utils';
|
|
20
13
|
import { MAX_QUERY_CHANNELS_LIMIT } from '../utils';
|
|
21
14
|
|
|
22
15
|
const waitSeconds = (seconds: number) =>
|
|
@@ -108,35 +101,18 @@ export const usePaginatedChannels = <
|
|
|
108
101
|
};
|
|
109
102
|
|
|
110
103
|
try {
|
|
111
|
-
// If failed messages were present in DB it would be in the channel state now and be overwritten by the queryChannels call
|
|
112
|
-
// So we store them in a separate object and add them back to the channel state after the queryChannels call
|
|
113
|
-
const failedMessagesInDb: Map<string, MessageResponse<StreamChatGenerics>[]> = new Map();
|
|
114
|
-
if (enableOfflineSupport) {
|
|
115
|
-
for (const cid in client.activeChannels) {
|
|
116
|
-
const failedMessages = getFailedMessages(client.activeChannels[cid]);
|
|
117
|
-
if (failedMessages) failedMessagesInDb.set(cid, failedMessages);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
104
|
/**
|
|
122
105
|
* We skipInitialization here for handling race condition between ChannelList, Channel (and Thread)
|
|
123
106
|
* when they all (may) update the channel state at the same time (when connection state recovers)
|
|
124
107
|
* TODO: if we move the channel state to a single context and share it between ChannelList, Channel and Thread we can remove this
|
|
125
108
|
*/
|
|
126
109
|
const channelQueryResponse = await client.queryChannels(filters, sort, newOptions, {
|
|
127
|
-
skipInitialization: activeChannels.current,
|
|
110
|
+
skipInitialization: enableOfflineSupport ? undefined : activeChannels.current,
|
|
128
111
|
});
|
|
129
112
|
if (isQueryStale() || !isMountedRef.current) {
|
|
130
113
|
return;
|
|
131
114
|
}
|
|
132
115
|
|
|
133
|
-
if (failedMessagesInDb.size) {
|
|
134
|
-
for (const cid in client.activeChannels) {
|
|
135
|
-
const msgsToAdd = failedMessagesInDb.get(cid);
|
|
136
|
-
if (msgsToAdd) client.activeChannels[cid].state.addMessagesSorted(msgsToAdd);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
116
|
const newChannels =
|
|
141
117
|
queryType === 'loadChannels' && !staticChannelsActive && channels
|
|
142
118
|
? [...channels, ...channelQueryResponse]
|
|
@@ -224,11 +200,12 @@ export const usePaginatedChannels = <
|
|
|
224
200
|
});
|
|
225
201
|
|
|
226
202
|
if (channelsFromDB) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
203
|
+
const offlineChannels = client.hydrateActiveChannels(channelsFromDB, {
|
|
204
|
+
offlineMode: true,
|
|
205
|
+
skipInitialization: [], // passing empty array will clear out the existing messages from channel state, this removes the possibility of duplicate messages
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
setChannels(offlineChannels);
|
|
232
209
|
setStaticChannelsActive(true);
|
|
233
210
|
}
|
|
234
211
|
} catch (e) {
|
|
@@ -292,21 +269,3 @@ export const usePaginatedChannels = <
|
|
|
292
269
|
staticChannelsActive,
|
|
293
270
|
};
|
|
294
271
|
};
|
|
295
|
-
|
|
296
|
-
function getFailedMessages<
|
|
297
|
-
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
|
298
|
-
>(channel: Channel<StreamChatGenerics>): MessageResponse<StreamChatGenerics>[] | undefined {
|
|
299
|
-
const failedMsgs = channel.state.messages.filter((m) => m.status === MessageStatusTypes.FAILED);
|
|
300
|
-
if (failedMsgs.length) {
|
|
301
|
-
return failedMsgs.map(
|
|
302
|
-
(m) =>
|
|
303
|
-
({
|
|
304
|
-
...m,
|
|
305
|
-
created_at: m.created_at.toISOString(),
|
|
306
|
-
pinned_at: m.pinned_at ? m.pinned_at.toISOString() : null,
|
|
307
|
-
updated_at: m.updated_at.toISOString(),
|
|
308
|
-
} as MessageResponse<StreamChatGenerics>),
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
return undefined;
|
|
312
|
-
}
|
package/src/version.json
CHANGED