stream-chat-react-native-core 3.9.0 → 3.9.2-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js +5 -5
  2. package/lib/commonjs/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  3. package/lib/commonjs/components/Channel/Channel.js +103 -75
  4. package/lib/commonjs/components/Channel/Channel.js.map +1 -1
  5. package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js +32 -11
  6. package/lib/commonjs/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
  7. package/lib/commonjs/components/Chat/hooks/useIsOnline.js +23 -24
  8. package/lib/commonjs/components/Chat/hooks/useIsOnline.js.map +1 -1
  9. package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js +1 -1
  10. package/lib/commonjs/components/Message/MessageSimple/utils/renderText.js.map +1 -1
  11. package/lib/commonjs/hooks/useIsMountedRef.js +19 -0
  12. package/lib/commonjs/hooks/useIsMountedRef.js.map +1 -0
  13. package/lib/commonjs/hooks/useStreami18n.js +4 -1
  14. package/lib/commonjs/hooks/useStreami18n.js.map +1 -1
  15. package/lib/commonjs/i18n/fr.json +1 -1
  16. package/lib/commonjs/version.json +1 -1
  17. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js +5 -5
  18. package/lib/module/components/AutoCompleteInput/AutoCompleteInput.js.map +1 -1
  19. package/lib/module/components/Channel/Channel.js +103 -75
  20. package/lib/module/components/Channel/Channel.js.map +1 -1
  21. package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js +32 -11
  22. package/lib/module/components/ChannelList/hooks/usePaginatedChannels.js.map +1 -1
  23. package/lib/module/components/Chat/hooks/useIsOnline.js +23 -24
  24. package/lib/module/components/Chat/hooks/useIsOnline.js.map +1 -1
  25. package/lib/module/components/Message/MessageSimple/utils/renderText.js +1 -1
  26. package/lib/module/components/Message/MessageSimple/utils/renderText.js.map +1 -1
  27. package/lib/module/hooks/useIsMountedRef.js +19 -0
  28. package/lib/module/hooks/useIsMountedRef.js.map +1 -0
  29. package/lib/module/hooks/useStreami18n.js +4 -1
  30. package/lib/module/hooks/useStreami18n.js.map +1 -1
  31. package/lib/module/i18n/fr.json +1 -1
  32. package/lib/module/version.json +1 -1
  33. package/lib/typescript/hooks/useIsMountedRef.d.ts +20 -0
  34. package/lib/typescript/hooks/useStreami18n.d.ts +1 -1
  35. package/lib/typescript/i18n/fr.json +1 -1
  36. package/package.json +1 -1
  37. package/src/components/AutoCompleteInput/AutoCompleteInput.tsx +3 -8
  38. package/src/components/Channel/Channel.tsx +43 -15
  39. package/src/components/Channel/__tests__/Channel.test.js +18 -2
  40. package/src/components/ChannelList/hooks/usePaginatedChannels.ts +7 -1
  41. package/src/components/Chat/hooks/useIsOnline.ts +16 -17
  42. package/src/components/Message/MessageSimple/utils/renderText.tsx +1 -1
  43. package/src/hooks/useIsMountedRef.ts +36 -0
  44. package/src/hooks/useStreami18n.ts +5 -3
  45. package/src/i18n/fr.json +1 -1
  46. package/src/version.json +1 -1
@@ -21,6 +21,8 @@ var _utils = require("../utils");
21
21
 
22
22
  var _ChatContext = require("../../../contexts/chatContext/ChatContext");
23
23
 
24
+ var _useIsMountedRef = require("../../../hooks/useIsMountedRef");
25
+
24
26
  var wait = function wait(ms) {
25
27
  return new Promise(function (resolve) {
26
28
  setTimeout(resolve, ms);
@@ -74,6 +76,8 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
74
76
  refreshing = _useState12[0],
75
77
  setRefreshing = _useState12[1];
76
78
 
79
+ var isMounted = (0, _useIsMountedRef.useIsMountedRef)();
80
+
77
81
  var queryChannels = function () {
78
82
  var _ref2 = (0, _asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee() {
79
83
  var _options$limit;
@@ -91,7 +95,7 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
91
95
  queryType = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';
92
96
  retryCount = _args.length > 1 && _args[1] !== undefined ? _args[1] : 0;
93
97
 
94
- if (!(!client || loadingChannels || loadingNextPage || refreshing)) {
98
+ if (!(!client || loadingChannels || loadingNextPage || refreshing || !isMounted.current)) {
95
99
  _context.next = 4;
96
100
  break;
97
101
  }
@@ -117,6 +121,15 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
117
121
 
118
122
  case 9:
119
123
  channelQueryResponse = _context.sent;
124
+
125
+ if (isMounted.current) {
126
+ _context.next = 12;
127
+ break;
128
+ }
129
+
130
+ return _context.abrupt("return");
131
+
132
+ case 12:
120
133
  channelQueryResponse.forEach(function (channel) {
121
134
  return channel.state.setIsUpToDate(true);
122
135
  });
@@ -124,18 +137,26 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
124
137
  setChannels(newChannels);
125
138
  setHasNextPage(channelQueryResponse.length >= newOptions.limit);
126
139
  setError(false);
127
- _context.next = 28;
140
+ _context.next = 32;
128
141
  break;
129
142
 
130
- case 17:
131
- _context.prev = 17;
143
+ case 19:
144
+ _context.prev = 19;
132
145
  _context.t0 = _context["catch"](6);
133
- _context.next = 21;
146
+ _context.next = 23;
134
147
  return wait(2000);
135
148
 
136
- case 21:
149
+ case 23:
150
+ if (isMounted.current) {
151
+ _context.next = 25;
152
+ break;
153
+ }
154
+
155
+ return _context.abrupt("return");
156
+
157
+ case 25:
137
158
  if (!(retryCount === 3)) {
138
- _context.next = 27;
159
+ _context.next = 31;
139
160
  break;
140
161
  }
141
162
 
@@ -145,20 +166,20 @@ var usePaginatedChannels = function usePaginatedChannels(_ref) {
145
166
  console.warn(_context.t0);
146
167
  return _context.abrupt("return", setError(true));
147
168
 
148
- case 27:
169
+ case 31:
149
170
  return _context.abrupt("return", queryChannels(queryType, retryCount + 1));
150
171
 
151
- case 28:
172
+ case 32:
152
173
  setLoadingChannels(false);
153
174
  setLoadingNextPage(false);
154
175
  setRefreshing(false);
155
176
 
156
- case 31:
177
+ case 35:
157
178
  case "end":
158
179
  return _context.stop();
159
180
  }
160
181
  }
161
- }, _callee, null, [[6, 17]]);
182
+ }, _callee, null, [[6, 19]]);
162
183
  }));
163
184
 
164
185
  return function queryChannels() {
@@ -1 +1 @@
1
- {"version":3,"sources":["usePaginatedChannels.ts"],"names":["wait","ms","Promise","resolve","setTimeout","DEFAULT_OPTIONS","message_limit","usePaginatedChannels","filters","options","sort","client","channels","setChannels","error","setError","hasNextPage","setHasNextPage","lastRefresh","Date","now","loadingChannels","setLoadingChannels","loadingNextPage","setLoadingNextPage","refreshing","setRefreshing","queryChannels","queryType","retryCount","newOptions","limit","MAX_QUERY_CHANNELS_LIMIT","offset","length","channelQueryResponse","forEach","channel","state","setIsUpToDate","newChannels","console","warn","loadNextPage","undefined","refreshList","current","reloadList","filterStr","JSON","stringify","sortStr"],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../../types/types';\n\nconst wait = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\ntype Parameters<\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Us extends UnknownType = DefaultUserType,\n> = {\n filters: ChannelFilters<Ch, Co, Us>;\n options: ChannelOptions;\n sort: ChannelSort<Ch>;\n};\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nexport const usePaginatedChannels = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>({\n filters = {},\n options = DEFAULT_OPTIONS,\n sort = {},\n}: Parameters<Ch, Co, Us>) => {\n const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n const [channels, setChannels] = useState<Channel<At, Ch, Co, Ev, Me, Re, Us>[]>([]);\n const [error, setError] = useState(false);\n const [hasNextPage, setHasNextPage] = useState(true);\n const lastRefresh = useRef(Date.now());\n const [loadingChannels, setLoadingChannels] = useState(false);\n const [loadingNextPage, setLoadingNextPage] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const queryChannels = async (queryType = '', retryCount = 0): Promise<void> => {\n if (!client || loadingChannels || loadingNextPage || refreshing) return;\n\n if (queryType === 'reload') {\n setLoadingChannels(true);\n } else if (queryType === 'refresh') {\n setRefreshing(true);\n } else if (!queryType) {\n setLoadingNextPage(true);\n }\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset: queryType === 'reload' || queryType === 'refresh' ? 0 : channels.length,\n ...options,\n };\n\n try {\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions);\n\n channelQueryResponse.forEach((channel) => channel.state.setIsUpToDate(true));\n\n const newChannels =\n queryType === 'reload' || queryType === 'refresh'\n ? channelQueryResponse\n : [...channels, ...channelQueryResponse];\n\n setChannels(newChannels);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n setError(false);\n } catch (err) {\n await wait(2000);\n\n if (retryCount === 3) {\n setLoadingChannels(false);\n setLoadingNextPage(false);\n setRefreshing(false);\n console.warn(err);\n return setError(true);\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setLoadingChannels(false);\n setLoadingNextPage(false);\n setRefreshing(false);\n };\n\n const loadNextPage = hasNextPage ? queryChannels : undefined;\n const refreshList = () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < 5000 && !error) {\n return;\n }\n\n lastRefresh.current = Date.now();\n return queryChannels('refresh');\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 reloadList();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels,\n loadingNextPage,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setChannels,\n };\n};\n"]}
1
+ {"version":3,"sources":["usePaginatedChannels.ts"],"names":["wait","ms","Promise","resolve","setTimeout","DEFAULT_OPTIONS","message_limit","usePaginatedChannels","filters","options","sort","client","channels","setChannels","error","setError","hasNextPage","setHasNextPage","lastRefresh","Date","now","loadingChannels","setLoadingChannels","loadingNextPage","setLoadingNextPage","refreshing","setRefreshing","isMounted","queryChannels","queryType","retryCount","current","newOptions","limit","MAX_QUERY_CHANNELS_LIMIT","offset","length","channelQueryResponse","forEach","channel","state","setIsUpToDate","newChannels","console","warn","loadNextPage","undefined","refreshList","reloadList","filterStr","JSON","stringify","sortStr"],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { MAX_QUERY_CHANNELS_LIMIT } from '../utils';\n\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\n\nimport type { Channel, ChannelFilters, ChannelOptions, ChannelSort } from 'stream-chat';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../../types/types';\n\nconst wait = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\ntype Parameters<\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Us extends UnknownType = DefaultUserType,\n> = {\n filters: ChannelFilters<Ch, Co, Us>;\n options: ChannelOptions;\n sort: ChannelSort<Ch>;\n};\n\nconst DEFAULT_OPTIONS = {\n message_limit: 10,\n};\n\nexport const usePaginatedChannels = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>({\n filters = {},\n options = DEFAULT_OPTIONS,\n sort = {},\n}: Parameters<Ch, Co, Us>) => {\n const { client } = useChatContext<At, Ch, Co, Ev, Me, Re, Us>();\n\n const [channels, setChannels] = useState<Channel<At, Ch, Co, Ev, Me, Re, Us>[]>([]);\n const [error, setError] = useState(false);\n const [hasNextPage, setHasNextPage] = useState(true);\n const lastRefresh = useRef(Date.now());\n const [loadingChannels, setLoadingChannels] = useState(false);\n const [loadingNextPage, setLoadingNextPage] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n const isMounted = useIsMountedRef();\n\n const queryChannels = async (queryType = '', retryCount = 0): Promise<void> => {\n if (!client || loadingChannels || loadingNextPage || refreshing || !isMounted.current) return;\n\n if (queryType === 'reload') {\n setLoadingChannels(true);\n } else if (queryType === 'refresh') {\n setRefreshing(true);\n } else if (!queryType) {\n setLoadingNextPage(true);\n }\n\n const newOptions = {\n limit: options?.limit ?? MAX_QUERY_CHANNELS_LIMIT,\n offset: queryType === 'reload' || queryType === 'refresh' ? 0 : channels.length,\n ...options,\n };\n\n try {\n const channelQueryResponse = await client.queryChannels(filters, sort, newOptions);\n\n if (!isMounted.current) return;\n\n channelQueryResponse.forEach((channel) => channel.state.setIsUpToDate(true));\n\n const newChannels =\n queryType === 'reload' || queryType === 'refresh'\n ? channelQueryResponse\n : [...channels, ...channelQueryResponse];\n\n setChannels(newChannels);\n setHasNextPage(channelQueryResponse.length >= newOptions.limit);\n setError(false);\n } catch (err) {\n await wait(2000);\n\n if (!isMounted.current) return;\n\n if (retryCount === 3) {\n setLoadingChannels(false);\n setLoadingNextPage(false);\n setRefreshing(false);\n console.warn(err);\n return setError(true);\n }\n\n return queryChannels(queryType, retryCount + 1);\n }\n\n setLoadingChannels(false);\n setLoadingNextPage(false);\n setRefreshing(false);\n };\n\n const loadNextPage = hasNextPage ? queryChannels : undefined;\n const refreshList = () => {\n const now = Date.now();\n // Only allow pull-to-refresh 5 seconds after last successful refresh.\n if (now - lastRefresh.current < 5000 && !error) {\n return;\n }\n\n lastRefresh.current = Date.now();\n return queryChannels('refresh');\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 reloadList();\n }, [filterStr, sortStr]);\n\n return {\n channels,\n error,\n hasNextPage,\n loadingChannels,\n loadingNextPage,\n loadNextPage,\n refreshing,\n refreshList,\n reloadList,\n setChannels,\n };\n};\n"]}
@@ -15,26 +15,24 @@ var _react = require("react");
15
15
 
16
16
  var _useAppStateListener = require("../../../hooks/useAppStateListener");
17
17
 
18
+ var _useIsMountedRef = require("../../../hooks/useIsMountedRef");
19
+
18
20
  var _native = require("../../../native");
19
21
 
20
22
  var useIsOnline = function useIsOnline(client) {
21
23
  var closeConnectionOnBackground = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
22
24
 
23
- var _useState = (0, _react.useState)(),
25
+ var _useState = (0, _react.useState)(true),
24
26
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
25
- unsubscribeNetInfo = _useState2[0],
26
- setUnsubscribeNetInfo = _useState2[1];
27
+ isOnline = _useState2[0],
28
+ setIsOnline = _useState2[1];
27
29
 
28
- var _useState3 = (0, _react.useState)(true),
30
+ var _useState3 = (0, _react.useState)(false),
29
31
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
30
- isOnline = _useState4[0],
31
- setIsOnline = _useState4[1];
32
-
33
- var _useState5 = (0, _react.useState)(false),
34
- _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
35
- connectionRecovering = _useState6[0],
36
- setConnectionRecovering = _useState6[1];
32
+ connectionRecovering = _useState4[0],
33
+ setConnectionRecovering = _useState4[1];
37
34
 
35
+ var isMounted = (0, _useIsMountedRef.useIsMountedRef)();
38
36
  var clientExits = !!client;
39
37
  var onBackground = (0, _react.useCallback)(function () {
40
38
  if (!closeConnectionOnBackground) return;
@@ -76,14 +74,16 @@ var useIsOnline = function useIsOnline(client) {
76
74
  }
77
75
  };
78
76
 
79
- var setConnectionListener = function setConnectionListener() {
77
+ var unsubscribeNetInfo;
78
+
79
+ var setNetInfoListener = function setNetInfoListener() {
80
80
  _native.NetInfo.fetch().then(function (netInfoState) {
81
81
  notifyChatClient(netInfoState);
82
82
  });
83
83
 
84
- setUnsubscribeNetInfo(_native.NetInfo.addEventListener(function (netInfoState) {
84
+ unsubscribeNetInfo = _native.NetInfo.addEventListener(function (netInfoState) {
85
85
  notifyChatClient(netInfoState);
86
- }));
86
+ });
87
87
  };
88
88
 
89
89
  var setInitialOnlineState = function () {
@@ -98,7 +98,7 @@ var useIsOnline = function useIsOnline(client) {
98
98
 
99
99
  case 2:
100
100
  status = _context.sent;
101
- setIsOnline(status);
101
+ if (isMounted.current) setIsOnline(status);
102
102
 
103
103
  case 4:
104
104
  case "end":
@@ -114,20 +114,19 @@ var useIsOnline = function useIsOnline(client) {
114
114
  }();
115
115
 
116
116
  setInitialOnlineState();
117
+ var chatListeners = [];
117
118
 
118
119
  if (client) {
119
- client.on('connection.changed', handleChangedEvent);
120
- client.on('connection.recovered', handleRecoveredEvent);
121
- setConnectionListener();
120
+ chatListeners.push(client.on('connection.changed', handleChangedEvent));
121
+ chatListeners.push(client.on('connection.recovered', handleRecoveredEvent));
122
+ setNetInfoListener();
122
123
  }
123
124
 
124
125
  return function () {
125
- client.off('connection.changed', handleChangedEvent);
126
- client.off('connection.recovered', handleRecoveredEvent);
127
-
128
- if (unsubscribeNetInfo) {
129
- unsubscribeNetInfo();
130
- }
126
+ chatListeners.forEach(function (listener) {
127
+ return listener.unsubscribe == null ? void 0 : listener.unsubscribe();
128
+ });
129
+ unsubscribeNetInfo == null ? void 0 : unsubscribeNetInfo();
131
130
  };
132
131
  }, [clientExits]);
133
132
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["useIsOnline.ts"],"names":["useIsOnline","client","closeConnectionOnBackground","unsubscribeNetInfo","setUnsubscribeNetInfo","isOnline","setIsOnline","connectionRecovering","setConnectionRecovering","clientExits","onBackground","cid","activeChannels","channel","state","setIsUpToDate","closeConnection","onForeground","openConnection","handleChangedEvent","event","online","handleRecoveredEvent","notifyChatClient","netInfoState","wsConnection","onlineStatusChanged","type","setConnectionListener","NetInfo","fetch","then","addEventListener","setInitialOnlineState","status","on","off"],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStateListener } from '../../../hooks/useAppStateListener';\nimport { NetInfo } from '../../../native';\n\nimport type { NetInfoSubscription } from '@react-native-community/netinfo';\nimport type { StreamChat, Event as StreamEvent } from 'stream-chat';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../../types/types';\n\n/**\n * Disconnect the websocket connection when app goes to background,\n * and reconnect when app comes to foreground.\n * We do this to make sure, user receives push notifications when app is in the background.\n * You can't receive push notification until you have active websocket connection.\n */\nexport const useIsOnline = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n client: StreamChat<At, Ch, Co, Ev, Me, Re, Us>,\n closeConnectionOnBackground = true,\n) => {\n const [unsubscribeNetInfo, setUnsubscribeNetInfo] = useState<NetInfoSubscription>();\n const [isOnline, setIsOnline] = useState(true);\n const [connectionRecovering, setConnectionRecovering] = useState(false);\n\n const clientExits = !!client;\n\n const onBackground = useCallback(() => {\n if (!closeConnectionOnBackground) return;\n\n for (const cid in client.activeChannels) {\n const channel = client.activeChannels[cid];\n channel?.state.setIsUpToDate(false);\n }\n\n client.closeConnection();\n setIsOnline(false);\n }, [closeConnectionOnBackground, client]);\n\n const onForeground = useCallback(() => {\n if (!closeConnectionOnBackground) return;\n\n client.openConnection();\n }, [closeConnectionOnBackground, client]);\n\n useAppStateListener(onForeground, onBackground);\n\n useEffect(() => {\n const handleChangedEvent = (event: StreamEvent<At, Ch, Co, Ev, Me, Re, Us>) => {\n setConnectionRecovering(!event.online);\n setIsOnline(event.online || false);\n };\n\n const handleRecoveredEvent = () => setConnectionRecovering(false);\n\n const notifyChatClient = (netInfoState: boolean) => {\n if (client?.wsConnection) {\n if (netInfoState) {\n client.wsConnection.onlineStatusChanged({\n type: 'online',\n } as Event);\n } else {\n client.wsConnection.onlineStatusChanged({\n type: 'offline',\n } as Event);\n }\n }\n };\n\n const setConnectionListener = () => {\n NetInfo.fetch().then((netInfoState) => {\n notifyChatClient(netInfoState);\n });\n setUnsubscribeNetInfo(\n NetInfo.addEventListener((netInfoState) => {\n notifyChatClient(netInfoState);\n }),\n );\n };\n\n const setInitialOnlineState = async () => {\n const status = await NetInfo.fetch();\n setIsOnline(status);\n };\n\n setInitialOnlineState();\n if (client) {\n client.on('connection.changed', handleChangedEvent);\n client.on('connection.recovered', handleRecoveredEvent);\n setConnectionListener();\n }\n\n return () => {\n client.off('connection.changed', handleChangedEvent);\n client.off('connection.recovered', handleRecoveredEvent);\n if (unsubscribeNetInfo) {\n unsubscribeNetInfo();\n }\n };\n }, [clientExits]);\n\n return { connectionRecovering, isOnline };\n};\n"]}
1
+ {"version":3,"sources":["useIsOnline.ts"],"names":["useIsOnline","client","closeConnectionOnBackground","isOnline","setIsOnline","connectionRecovering","setConnectionRecovering","isMounted","clientExits","onBackground","cid","activeChannels","channel","state","setIsUpToDate","closeConnection","onForeground","openConnection","handleChangedEvent","event","online","handleRecoveredEvent","notifyChatClient","netInfoState","wsConnection","onlineStatusChanged","type","unsubscribeNetInfo","setNetInfoListener","NetInfo","fetch","then","addEventListener","setInitialOnlineState","status","current","chatListeners","push","on","forEach","listener","unsubscribe"],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStateListener } from '../../../hooks/useAppStateListener';\nimport { useIsMountedRef } from '../../../hooks/useIsMountedRef';\nimport { NetInfo } from '../../../native';\n\nimport type { NetInfoSubscription } from '@react-native-community/netinfo';\nimport type { StreamChat, Event as StreamEvent } from 'stream-chat';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../../types/types';\n\n/**\n * Disconnect the websocket connection when app goes to background,\n * and reconnect when app comes to foreground.\n * We do this to make sure, user receives push notifications when app is in the background.\n * You can't receive push notification until you have active websocket connection.\n */\nexport const useIsOnline = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n client: StreamChat<At, Ch, Co, Ev, Me, Re, Us>,\n closeConnectionOnBackground = true,\n) => {\n const [isOnline, setIsOnline] = useState(true);\n const [connectionRecovering, setConnectionRecovering] = useState(false);\n const isMounted = useIsMountedRef();\n const clientExits = !!client;\n\n const onBackground = useCallback(() => {\n if (!closeConnectionOnBackground) return;\n\n for (const cid in client.activeChannels) {\n const channel = client.activeChannels[cid];\n channel?.state.setIsUpToDate(false);\n }\n\n client.closeConnection();\n setIsOnline(false);\n }, [closeConnectionOnBackground, client]);\n\n const onForeground = useCallback(() => {\n if (!closeConnectionOnBackground) return;\n\n client.openConnection();\n }, [closeConnectionOnBackground, client]);\n\n useAppStateListener(onForeground, onBackground);\n\n useEffect(() => {\n const handleChangedEvent = (event: StreamEvent<At, Ch, Co, Ev, Me, Re, Us>) => {\n setConnectionRecovering(!event.online);\n setIsOnline(event.online || false);\n };\n\n const handleRecoveredEvent = () => setConnectionRecovering(false);\n\n const notifyChatClient = (netInfoState: boolean) => {\n if (client?.wsConnection) {\n if (netInfoState) {\n client.wsConnection.onlineStatusChanged({\n type: 'online',\n } as Event);\n } else {\n client.wsConnection.onlineStatusChanged({\n type: 'offline',\n } as Event);\n }\n }\n };\n\n let unsubscribeNetInfo: NetInfoSubscription;\n const setNetInfoListener = () => {\n NetInfo.fetch().then((netInfoState) => {\n notifyChatClient(netInfoState);\n });\n unsubscribeNetInfo = NetInfo.addEventListener((netInfoState) => {\n notifyChatClient(netInfoState);\n });\n };\n\n const setInitialOnlineState = async () => {\n const status = await NetInfo.fetch();\n\n if (isMounted.current) setIsOnline(status);\n };\n\n setInitialOnlineState();\n const chatListeners: Array<ReturnType<StreamChat['on']>> = [];\n\n if (client) {\n chatListeners.push(client.on('connection.changed', handleChangedEvent));\n chatListeners.push(client.on('connection.recovered', handleRecoveredEvent));\n setNetInfoListener();\n }\n\n return () => {\n chatListeners.forEach((listener) => listener.unsubscribe?.());\n unsubscribeNetInfo?.();\n };\n }, [clientExits]);\n\n return { connectionRecovering, isOnline };\n};\n"]}
@@ -222,7 +222,7 @@ var renderText = function renderText(params) {
222
222
  }
223
223
  } : {});
224
224
  return _react["default"].createElement(_reactNativeMarkdownPackage["default"], {
225
- key: JSON.stringify(mentioned_users) + "-" + onlyEmojis + "-" + (messageOverlay ? JSON.stringify(markdownStyles) : undefined),
225
+ key: JSON.stringify(mentioned_users) + "-" + onlyEmojis + "-" + (messageOverlay ? JSON.stringify(markdownStyles) : undefined) + "-" + JSON.stringify(colors),
226
226
  onLink: onLink,
227
227
  rules: (0, _extends2["default"])({}, customRules, markdownRules),
228
228
  styles: styles,
@@ -1 +1 @@
1
- {"version":3,"sources":["renderText.tsx"],"names":["defaultMarkdownStyles","inlineCode","fontSize","padding","paddingHorizontal","list","marginBottom","marginTop","listItemText","flex","mentions","fontWeight","paragraph","paragraphCenter","paragraphWithImage","parse","capture","state","content","renderText","params","colors","markdownRules","markdownStyles","message","messageOverlay","onLinkParams","onLink","onLongPressParam","onLongPress","onlyEmojis","onPressParam","onPress","preventPress","mentioned_users","text","newText","trim","urls","urlInfo","displayLink","encoded","replace","length","omission","markdown","protocol","raw","styles","autolink","color","accent_blue","backgroundColor","white_smoke","borderColor","grey_gainsboro","accent_red","black","url","Linking","canOpenURL","then","canOpenUrl","openURL","react","node","output","event","defaultHandler","target","emitter","withinLink","link","React","createElement","Text","key","style","suppressHighlighting","mentionedUsers","Array","isArray","reduce","acc","cur","userName","name","id","regEx","RegExp","match","source","exec","mentionsReact","customRules","reflink","order","defaultRules","JSON","stringify","undefined"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { GestureResponderEvent, Linking, Text } from 'react-native';\nimport anchorme from 'anchorme';\nimport truncate from 'lodash/truncate';\n// @ts-expect-error\nimport Markdown from 'react-native-markdown-package';\nimport {\n DefaultRules,\n defaultRules,\n MatchFunction,\n ParseFunction,\n parseInline,\n ReactNodeOutput,\n} from 'simple-markdown';\n\nimport type { MessageType } from '../../../MessageList/hooks/useMessageList';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../../../types/types';\nimport type { MessageContextValue } from '../../../../contexts/messageContext/MessageContext';\nimport type { Colors, MarkdownStyle } from '../../../../contexts/themeContext/utils/theme';\n\nconst defaultMarkdownStyles: MarkdownStyle = {\n inlineCode: {\n fontSize: 13,\n padding: 3,\n paddingHorizontal: 5,\n },\n list: {\n marginBottom: 8,\n marginTop: 8,\n },\n listItemText: {\n flex: 0,\n },\n mentions: {\n fontWeight: '700',\n },\n // unfortunately marginVertical doesn't override the defaults for these within the 3rd party lib\n paragraph: {\n marginBottom: 8,\n marginTop: 8,\n },\n paragraphCenter: {\n marginBottom: 8,\n marginTop: 8,\n },\n paragraphWithImage: {\n marginBottom: 8,\n marginTop: 8,\n },\n};\n\nconst parse: ParseFunction = (capture, parse, state) => ({\n content: parseInline(parse, capture[0], state),\n});\n\nexport type MarkdownRules = Partial<DefaultRules>;\n\nexport type RenderTextParams<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = Partial<\n Pick<MessageContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'onLongPress' | 'onPress' | 'preventPress'>\n> & {\n colors: typeof Colors;\n message: MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n markdownRules?: MarkdownRules;\n markdownStyles?: MarkdownStyle;\n messageOverlay?: boolean;\n onLink?: (url: string) => Promise<void>;\n onlyEmojis?: boolean;\n};\n\nexport const renderText = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n params: RenderTextParams<At, Ch, Co, Ev, Me, Re, Us>,\n) => {\n const {\n colors,\n markdownRules,\n markdownStyles,\n message,\n messageOverlay,\n onLink: onLinkParams,\n onLongPress: onLongPressParam,\n onlyEmojis,\n onPress: onPressParam,\n preventPress,\n } = params;\n\n // take the @ mentions and turn them into markdown?\n // translate links\n const { mentioned_users, text } = message;\n\n if (!text) return null;\n\n let newText = text.trim();\n const urls = anchorme(newText, {\n list: true,\n });\n\n for (const urlInfo of urls) {\n const displayLink = truncate(urlInfo.encoded.replace(/^(www\\.)/, ''), {\n length: 200,\n omission: '...',\n });\n const markdown = `[${displayLink}](${urlInfo.protocol}${urlInfo.encoded})`;\n newText = newText.replace(urlInfo.raw, markdown);\n }\n\n newText = newText.replace(/[<&\"'>]/g, '\\\\$&');\n const styles: MarkdownStyle = {\n ...defaultMarkdownStyles,\n ...markdownStyles,\n autolink: {\n ...defaultMarkdownStyles.autolink,\n color: colors.accent_blue,\n ...markdownStyles?.autolink,\n },\n inlineCode: {\n ...defaultMarkdownStyles.inlineCode,\n backgroundColor: colors.white_smoke,\n borderColor: colors.grey_gainsboro,\n color: colors.accent_red,\n ...markdownStyles?.inlineCode,\n },\n mentions: {\n ...defaultMarkdownStyles.mentions,\n color: colors.accent_blue,\n ...markdownStyles?.mentions,\n },\n text: {\n ...defaultMarkdownStyles.text,\n color: colors.black,\n ...markdownStyles?.text,\n },\n };\n\n const onLink = (url: string) =>\n onLinkParams\n ? onLinkParams(url)\n : Linking.canOpenURL(url).then((canOpenUrl) => canOpenUrl && Linking.openURL(url));\n\n const react: ReactNodeOutput = (node, output, { ...state }) => {\n const onPress = (event: GestureResponderEvent) => {\n if (!preventPress && onPressParam) {\n onPressParam({\n defaultHandler: () => onLink(node.target),\n emitter: 'textLink',\n event,\n });\n }\n };\n\n const onLongPress = (event: GestureResponderEvent) => {\n if (!preventPress && onLongPressParam) {\n onLongPressParam({\n emitter: 'textLink',\n event,\n });\n }\n };\n\n state.withinLink = true;\n const link = React.createElement(\n Text,\n {\n key: state.key,\n onLongPress,\n onPress,\n style: styles.autolink,\n suppressHighlighting: true,\n },\n output(node.content, state),\n );\n state.withinLink = false;\n return link;\n };\n\n const mentionedUsers = Array.isArray(mentioned_users)\n ? mentioned_users.reduce((acc, cur) => {\n const userName = cur.name || cur.id || '';\n if (userName) {\n acc += `${acc.length ? '|' : ''}@${userName}`;\n }\n return acc;\n }, '')\n : '';\n\n const regEx = new RegExp(`^\\\\B(${mentionedUsers})`, 'g');\n const match: MatchFunction = (source) => regEx.exec(source);\n\n const mentionsReact: ReactNodeOutput = (node, output, { ...state }) => {\n const onPress = (event: GestureResponderEvent) => {\n if (!preventPress && onPressParam) {\n onPressParam({\n emitter: 'textMention',\n event,\n });\n }\n };\n\n const onLongPress = (event: GestureResponderEvent) => {\n if (!preventPress && onLongPressParam) {\n onLongPressParam({\n emitter: 'textMention',\n event,\n });\n }\n };\n\n return React.createElement(\n Text,\n {\n key: state.key,\n onLongPress,\n onPress,\n style: styles.mentions,\n },\n Array.isArray(node.content) ? node.content[0]?.content || '' : output(node.content, state),\n );\n };\n\n const customRules = {\n link: { react },\n // we have no react rendering support for reflinks\n reflink: { match: () => null },\n ...(mentionedUsers\n ? {\n mentions: {\n match,\n order: defaultRules.text.order - 0.5,\n parse,\n react: mentionsReact,\n },\n }\n : {}),\n };\n\n return (\n <Markdown\n key={`${JSON.stringify(mentioned_users)}-${onlyEmojis}-${\n messageOverlay ? JSON.stringify(markdownStyles) : undefined\n }`}\n onLink={onLink}\n rules={{\n ...customRules,\n ...markdownRules,\n }}\n styles={styles}\n >\n {newText}\n </Markdown>\n );\n};\n"]}
1
+ {"version":3,"sources":["renderText.tsx"],"names":["defaultMarkdownStyles","inlineCode","fontSize","padding","paddingHorizontal","list","marginBottom","marginTop","listItemText","flex","mentions","fontWeight","paragraph","paragraphCenter","paragraphWithImage","parse","capture","state","content","renderText","params","colors","markdownRules","markdownStyles","message","messageOverlay","onLinkParams","onLink","onLongPressParam","onLongPress","onlyEmojis","onPressParam","onPress","preventPress","mentioned_users","text","newText","trim","urls","urlInfo","displayLink","encoded","replace","length","omission","markdown","protocol","raw","styles","autolink","color","accent_blue","backgroundColor","white_smoke","borderColor","grey_gainsboro","accent_red","black","url","Linking","canOpenURL","then","canOpenUrl","openURL","react","node","output","event","defaultHandler","target","emitter","withinLink","link","React","createElement","Text","key","style","suppressHighlighting","mentionedUsers","Array","isArray","reduce","acc","cur","userName","name","id","regEx","RegExp","match","source","exec","mentionsReact","customRules","reflink","order","defaultRules","JSON","stringify","undefined"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { GestureResponderEvent, Linking, Text } from 'react-native';\nimport anchorme from 'anchorme';\nimport truncate from 'lodash/truncate';\n// @ts-expect-error\nimport Markdown from 'react-native-markdown-package';\nimport {\n DefaultRules,\n defaultRules,\n MatchFunction,\n ParseFunction,\n parseInline,\n ReactNodeOutput,\n} from 'simple-markdown';\n\nimport type { MessageType } from '../../../MessageList/hooks/useMessageList';\n\nimport type {\n DefaultAttachmentType,\n DefaultChannelType,\n DefaultCommandType,\n DefaultEventType,\n DefaultMessageType,\n DefaultReactionType,\n DefaultUserType,\n UnknownType,\n} from '../../../../types/types';\nimport type { MessageContextValue } from '../../../../contexts/messageContext/MessageContext';\nimport type { Colors, MarkdownStyle } from '../../../../contexts/themeContext/utils/theme';\n\nconst defaultMarkdownStyles: MarkdownStyle = {\n inlineCode: {\n fontSize: 13,\n padding: 3,\n paddingHorizontal: 5,\n },\n list: {\n marginBottom: 8,\n marginTop: 8,\n },\n listItemText: {\n flex: 0,\n },\n mentions: {\n fontWeight: '700',\n },\n // unfortunately marginVertical doesn't override the defaults for these within the 3rd party lib\n paragraph: {\n marginBottom: 8,\n marginTop: 8,\n },\n paragraphCenter: {\n marginBottom: 8,\n marginTop: 8,\n },\n paragraphWithImage: {\n marginBottom: 8,\n marginTop: 8,\n },\n};\n\nconst parse: ParseFunction = (capture, parse, state) => ({\n content: parseInline(parse, capture[0], state),\n});\n\nexport type MarkdownRules = Partial<DefaultRules>;\n\nexport type RenderTextParams<\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n> = Partial<\n Pick<MessageContextValue<At, Ch, Co, Ev, Me, Re, Us>, 'onLongPress' | 'onPress' | 'preventPress'>\n> & {\n colors: typeof Colors;\n message: MessageType<At, Ch, Co, Ev, Me, Re, Us>;\n markdownRules?: MarkdownRules;\n markdownStyles?: MarkdownStyle;\n messageOverlay?: boolean;\n onLink?: (url: string) => Promise<void>;\n onlyEmojis?: boolean;\n};\n\nexport const renderText = <\n At extends UnknownType = DefaultAttachmentType,\n Ch extends UnknownType = DefaultChannelType,\n Co extends string = DefaultCommandType,\n Ev extends UnknownType = DefaultEventType,\n Me extends UnknownType = DefaultMessageType,\n Re extends UnknownType = DefaultReactionType,\n Us extends UnknownType = DefaultUserType,\n>(\n params: RenderTextParams<At, Ch, Co, Ev, Me, Re, Us>,\n) => {\n const {\n colors,\n markdownRules,\n markdownStyles,\n message,\n messageOverlay,\n onLink: onLinkParams,\n onLongPress: onLongPressParam,\n onlyEmojis,\n onPress: onPressParam,\n preventPress,\n } = params;\n\n // take the @ mentions and turn them into markdown?\n // translate links\n const { mentioned_users, text } = message;\n\n if (!text) return null;\n\n let newText = text.trim();\n const urls = anchorme(newText, {\n list: true,\n });\n\n for (const urlInfo of urls) {\n const displayLink = truncate(urlInfo.encoded.replace(/^(www\\.)/, ''), {\n length: 200,\n omission: '...',\n });\n const markdown = `[${displayLink}](${urlInfo.protocol}${urlInfo.encoded})`;\n newText = newText.replace(urlInfo.raw, markdown);\n }\n\n newText = newText.replace(/[<&\"'>]/g, '\\\\$&');\n const styles: MarkdownStyle = {\n ...defaultMarkdownStyles,\n ...markdownStyles,\n autolink: {\n ...defaultMarkdownStyles.autolink,\n color: colors.accent_blue,\n ...markdownStyles?.autolink,\n },\n inlineCode: {\n ...defaultMarkdownStyles.inlineCode,\n backgroundColor: colors.white_smoke,\n borderColor: colors.grey_gainsboro,\n color: colors.accent_red,\n ...markdownStyles?.inlineCode,\n },\n mentions: {\n ...defaultMarkdownStyles.mentions,\n color: colors.accent_blue,\n ...markdownStyles?.mentions,\n },\n text: {\n ...defaultMarkdownStyles.text,\n color: colors.black,\n ...markdownStyles?.text,\n },\n };\n\n const onLink = (url: string) =>\n onLinkParams\n ? onLinkParams(url)\n : Linking.canOpenURL(url).then((canOpenUrl) => canOpenUrl && Linking.openURL(url));\n\n const react: ReactNodeOutput = (node, output, { ...state }) => {\n const onPress = (event: GestureResponderEvent) => {\n if (!preventPress && onPressParam) {\n onPressParam({\n defaultHandler: () => onLink(node.target),\n emitter: 'textLink',\n event,\n });\n }\n };\n\n const onLongPress = (event: GestureResponderEvent) => {\n if (!preventPress && onLongPressParam) {\n onLongPressParam({\n emitter: 'textLink',\n event,\n });\n }\n };\n\n state.withinLink = true;\n const link = React.createElement(\n Text,\n {\n key: state.key,\n onLongPress,\n onPress,\n style: styles.autolink,\n suppressHighlighting: true,\n },\n output(node.content, state),\n );\n state.withinLink = false;\n return link;\n };\n\n const mentionedUsers = Array.isArray(mentioned_users)\n ? mentioned_users.reduce((acc, cur) => {\n const userName = cur.name || cur.id || '';\n if (userName) {\n acc += `${acc.length ? '|' : ''}@${userName}`;\n }\n return acc;\n }, '')\n : '';\n\n const regEx = new RegExp(`^\\\\B(${mentionedUsers})`, 'g');\n const match: MatchFunction = (source) => regEx.exec(source);\n\n const mentionsReact: ReactNodeOutput = (node, output, { ...state }) => {\n const onPress = (event: GestureResponderEvent) => {\n if (!preventPress && onPressParam) {\n onPressParam({\n emitter: 'textMention',\n event,\n });\n }\n };\n\n const onLongPress = (event: GestureResponderEvent) => {\n if (!preventPress && onLongPressParam) {\n onLongPressParam({\n emitter: 'textMention',\n event,\n });\n }\n };\n\n return React.createElement(\n Text,\n {\n key: state.key,\n onLongPress,\n onPress,\n style: styles.mentions,\n },\n Array.isArray(node.content) ? node.content[0]?.content || '' : output(node.content, state),\n );\n };\n\n const customRules = {\n link: { react },\n // we have no react rendering support for reflinks\n reflink: { match: () => null },\n ...(mentionedUsers\n ? {\n mentions: {\n match,\n order: defaultRules.text.order - 0.5,\n parse,\n react: mentionsReact,\n },\n }\n : {}),\n };\n\n return (\n <Markdown\n key={`${JSON.stringify(mentioned_users)}-${onlyEmojis}-${\n messageOverlay ? JSON.stringify(markdownStyles) : undefined\n }-${JSON.stringify(colors)}`}\n onLink={onLink}\n rules={{\n ...customRules,\n ...markdownRules,\n }}\n styles={styles}\n >\n {newText}\n </Markdown>\n );\n};\n"]}
@@ -0,0 +1,19 @@
1
+ Object.defineProperty(exports, "__esModule", {
2
+ value: true
3
+ });
4
+ exports.useIsMountedRef = void 0;
5
+
6
+ var _react = require("react");
7
+
8
+ var useIsMountedRef = function useIsMountedRef() {
9
+ var isMounted = (0, _react.useRef)(true);
10
+ (0, _react.useEffect)(function () {
11
+ return function () {
12
+ isMounted.current = false;
13
+ };
14
+ }, []);
15
+ return isMounted;
16
+ };
17
+
18
+ exports.useIsMountedRef = useIsMountedRef;
19
+ //# sourceMappingURL=useIsMountedRef.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useIsMountedRef.ts"],"names":["useIsMountedRef","isMounted","current"],"mappings":";;;;;AAAA;;AAoBO,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,GAAM;AAKnC,MAAMC,SAAS,GAAG,mBAAO,IAAP,CAAlB;AAEA,wBACE;AAAA,WAAM,YAAM;AACVA,MAAAA,SAAS,CAACC,OAAV,GAAoB,KAApB;AACD,KAFD;AAAA,GADF,EAIE,EAJF;AAOA,SAAOD,SAAP;AACD,CAfM","sourcesContent":["import { useEffect, useRef } from 'react';\n\n/**\n * Returns mount status of component. This hook can be used for purpose of avoiding any\n * setState calls (within async operation) after component gets unmounted.\n *\n * @example\n * ```\n * const isMounted = useIsMountedRef();\n * const [dummyValue, setDummyValue] = useState(false);\n *\n * useEffect(() => {\n * someAsyncOperation().then(() => {\n * if (isMounted.current) setDummyValue(true);\n * })\n * })\n * ```\n *\n * @returns isMounted {Object} Mount status ref for the component.\n */\nexport const useIsMountedRef = () => {\n // Initial value has been set to true, since this hook exist only for sole purpose of\n // avoiding any setState calls (within async operation) after component gets unmounted.\n // Basically we don't need to know about state change from component being initialized -> mounted.\n // We only need a state change from initialized or mounted state -> unmounted state.\n const isMounted = useRef(true);\n\n useEffect(\n () => () => {\n isMounted.current = false;\n },\n [],\n );\n\n return isMounted;\n};\n"]}
@@ -11,6 +11,8 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
 
12
12
  var _react = require("react");
13
13
 
14
+ var _useIsMountedRef = require("./useIsMountedRef");
15
+
14
16
  var _Streami18n = require("../utils/Streami18n");
15
17
 
16
18
  var useStreami18n = function useStreami18n(_ref) {
@@ -22,6 +24,7 @@ var useStreami18n = function useStreami18n(_ref) {
22
24
  loadingTranslators = _useState2[0],
23
25
  setLoadingTranslators = _useState2[1];
24
26
 
27
+ var isMounted = (0, _useIsMountedRef.useIsMountedRef)();
25
28
  var i18nInstanceExists = !!i18nInstance;
26
29
  (0, _react.useEffect)(function () {
27
30
  var streami18n;
@@ -42,7 +45,7 @@ var useStreami18n = function useStreami18n(_ref) {
42
45
  });
43
46
  });
44
47
  streami18n.getTranslators().then(function (translator) {
45
- if (translator) setTranslators(translator);
48
+ if (translator && isMounted.current) setTranslators(translator);
46
49
  });
47
50
  setLoadingTranslators(false);
48
51
  }, [i18nInstanceExists, i18nInstance]);
@@ -1 +1 @@
1
- {"version":3,"sources":["useStreami18n.ts"],"names":["useStreami18n","i18nInstance","setTranslators","loadingTranslators","setLoadingTranslators","i18nInstanceExists","streami18n","Streami18n","language","registerSetLanguageCallback","t","prevTranslator","getTranslators","then","translator"],"mappings":";;;;;;;;;;;AAAA;;AAGA;;AAEO,IAAMA,aAAa,GAAG,SAAhBA,aAAgB,OAMvB;AAAA,MALJC,YAKI,QALJA,YAKI;AAAA,MAJJC,cAII,QAJJA,cAII;;AACJ,kBAAoD,qBAAS,IAAT,CAApD;AAAA;AAAA,MAAOC,kBAAP;AAAA,MAA2BC,qBAA3B;;AAEA,MAAMC,kBAAkB,GAAG,CAAC,CAACJ,YAA7B;AACA,wBAAU,YAAM;AACd,QAAIK,UAAJ;;AAEA,QAAIL,YAAY,YAAYM,sBAA5B,EAAwC;AACtCD,MAAAA,UAAU,GAAGL,YAAb;AACD,KAFD,MAEO;AACLK,MAAAA,UAAU,GAAG,IAAIC,sBAAJ,CAAe;AAAEC,QAAAA,QAAQ,EAAE;AAAZ,OAAf,CAAb;AACD;;AAEDF,IAAAA,UAAU,CAACG,2BAAX,CAAuC,UAACC,CAAD;AAAA,aACrCR,cAAc,CAAC,UAACS,cAAD;AAAA,6CAA0BA,cAA1B;AAA0CD,UAAAA,CAAC,EAADA;AAA1C;AAAA,OAAD,CADuB;AAAA,KAAvC;AAGAJ,IAAAA,UAAU,CAACM,cAAX,GAA4BC,IAA5B,CAAiC,UAACC,UAAD,EAAgB;AAC/C,UAAIA,UAAJ,EAAgBZ,cAAc,CAACY,UAAD,CAAd;AACjB,KAFD;AAIAV,IAAAA,qBAAqB,CAAC,KAAD,CAArB;AACD,GAjBD,EAiBG,CAACC,kBAAD,EAAqBJ,YAArB,CAjBH;AAmBA,SAAOE,kBAAP;AACD,CA9BM","sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { TranslationContextValue } from '../contexts/translationContext/TranslationContext';\nimport { Streami18n } from '../utils/Streami18n';\n\nexport const useStreami18n = ({\n i18nInstance,\n setTranslators,\n}: {\n setTranslators: React.Dispatch<React.SetStateAction<TranslationContextValue>>;\n i18nInstance?: Streami18n;\n}) => {\n const [loadingTranslators, setLoadingTranslators] = useState(true);\n\n const i18nInstanceExists = !!i18nInstance;\n useEffect(() => {\n let streami18n: Streami18n;\n\n if (i18nInstance instanceof Streami18n) {\n streami18n = i18nInstance;\n } else {\n streami18n = new Streami18n({ language: 'en' });\n }\n\n streami18n.registerSetLanguageCallback((t: (key: string) => string) =>\n setTranslators((prevTranslator) => ({ ...prevTranslator, t })),\n );\n streami18n.getTranslators().then((translator) => {\n if (translator) setTranslators(translator);\n });\n\n setLoadingTranslators(false);\n }, [i18nInstanceExists, i18nInstance]);\n\n return loadingTranslators;\n};\n"]}
1
+ {"version":3,"sources":["useStreami18n.ts"],"names":["useStreami18n","i18nInstance","setTranslators","loadingTranslators","setLoadingTranslators","isMounted","i18nInstanceExists","streami18n","Streami18n","language","registerSetLanguageCallback","t","prevTranslator","getTranslators","then","translator","current"],"mappings":";;;;;;;;;;;AAAA;;AAEA;;AACA;;AAIO,IAAMA,aAAa,GAAG,SAAhBA,aAAgB,OAMvB;AAAA,MALJC,YAKI,QALJA,YAKI;AAAA,MAJJC,cAII,QAJJA,cAII;;AACJ,kBAAoD,qBAAS,IAAT,CAApD;AAAA;AAAA,MAAOC,kBAAP;AAAA,MAA2BC,qBAA3B;;AACA,MAAMC,SAAS,GAAG,uCAAlB;AACA,MAAMC,kBAAkB,GAAG,CAAC,CAACL,YAA7B;AACA,wBAAU,YAAM;AACd,QAAIM,UAAJ;;AAEA,QAAIN,YAAY,YAAYO,sBAA5B,EAAwC;AACtCD,MAAAA,UAAU,GAAGN,YAAb;AACD,KAFD,MAEO;AACLM,MAAAA,UAAU,GAAG,IAAIC,sBAAJ,CAAe;AAAEC,QAAAA,QAAQ,EAAE;AAAZ,OAAf,CAAb;AACD;;AAEDF,IAAAA,UAAU,CAACG,2BAAX,CAAuC,UAACC,CAAD;AAAA,aACrCT,cAAc,CAAC,UAACU,cAAD;AAAA,6CAA0BA,cAA1B;AAA0CD,UAAAA,CAAC,EAADA;AAA1C;AAAA,OAAD,CADuB;AAAA,KAAvC;AAGAJ,IAAAA,UAAU,CAACM,cAAX,GAA4BC,IAA5B,CAAiC,UAACC,UAAD,EAAgB;AAC/C,UAAIA,UAAU,IAAIV,SAAS,CAACW,OAA5B,EAAqCd,cAAc,CAACa,UAAD,CAAd;AACtC,KAFD;AAIAX,IAAAA,qBAAqB,CAAC,KAAD,CAArB;AACD,GAjBD,EAiBG,CAACE,kBAAD,EAAqBL,YAArB,CAjBH;AAmBA,SAAOE,kBAAP;AACD,CA9BM","sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useIsMountedRef } from './useIsMountedRef';\nimport { Streami18n } from '../utils/Streami18n';\n\nimport type { TranslationContextValue } from '../contexts/translationContext/TranslationContext';\n\nexport const useStreami18n = ({\n i18nInstance,\n setTranslators,\n}: {\n setTranslators: React.Dispatch<React.SetStateAction<TranslationContextValue>>;\n i18nInstance?: Streami18n;\n}) => {\n const [loadingTranslators, setLoadingTranslators] = useState(true);\n const isMounted = useIsMountedRef();\n const i18nInstanceExists = !!i18nInstance;\n useEffect(() => {\n let streami18n: Streami18n;\n\n if (i18nInstance instanceof Streami18n) {\n streami18n = i18nInstance;\n } else {\n streami18n = new Streami18n({ language: 'en' });\n }\n\n streami18n.registerSetLanguageCallback((t: (key: string) => string) =>\n setTranslators((prevTranslator) => ({ ...prevTranslator, t })),\n );\n streami18n.getTranslators().then((translator) => {\n if (translator && isMounted.current) setTranslators(translator);\n });\n\n setLoadingTranslators(false);\n }, [i18nInstanceExists, i18nInstance]);\n\n return loadingTranslators;\n};\n"]}
@@ -9,7 +9,7 @@
9
9
  "Copy Message": "Copier le message",
10
10
  "Delete": "Supprimer",
11
11
  "Delete Message": "Supprimer un message",
12
- "Dismiss": "Rejeter",
12
+ "Dismiss": "Fermer",
13
13
  "Do you want to send a copy of this message to a moderator for further investigation?": "Voulez-vous envoyer une copie de ce message à un modérateur pour une enquête plus approfondie?",
14
14
  "Edit Message": "Éditer un message",
15
15
  "Editing Message": "Édite un message",
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "3.9.0"
2
+ "version": "3.9.2-next.2"
3
3
  }
@@ -315,7 +315,7 @@ var AutoCompleteInputWithContext = function AutoCompleteInputWithContext(props)
315
315
  }
316
316
 
317
317
  var textToModify = text.slice(0, selectionEnd.current);
318
- var startOfTokenPosition = textToModify.search(new RegExp("\\" + trigger + ("[^\\" + trigger + '\\s' + "]") + "*$"));
318
+ var startOfTokenPosition = textToModify.lastIndexOf(trigger, selectionEnd.current);
319
319
  var newCaretPosition = computeCaretPosition(newTokenString, startOfTokenPosition);
320
320
  var modifiedText = "" + textToModify.substring(0, startOfTokenPosition) + newTokenString;
321
321
  stopTracking();
@@ -383,7 +383,7 @@ var AutoCompleteInputWithContext = function AutoCompleteInputWithContext(props)
383
383
 
384
384
  var handleMentions = function handleMentions(_ref6) {
385
385
  var tokenMatch = _ref6.tokenMatch;
386
- var lastToken = tokenMatch == null ? void 0 : tokenMatch[tokenMatch.length - 1].trim();
386
+ var lastToken = tokenMatch == null ? void 0 : tokenMatch[tokenMatch.length - 1];
387
387
  var handleMentionsTrigger = lastToken && Object.keys(triggerSettings).find(function (trigger) {
388
388
  return trigger === lastToken[0];
389
389
  }) || null;
@@ -473,7 +473,7 @@ var AutoCompleteInputWithContext = function AutoCompleteInputWithContext(props)
473
473
  break;
474
474
  }
475
475
 
476
- mentionTokenMatch = text.slice(0, selectionEnd.current).match(/(?!^|\W)?@[^\s]*\s?[^\s]*$/g);
476
+ mentionTokenMatch = text.slice(0, selectionEnd.current).match(/(?!^|\W)?@[^\s@]*\s?[^\s@]*$/g);
477
477
 
478
478
  if (mentionTokenMatch) {
479
479
  handleMentions({
@@ -541,7 +541,7 @@ var AutoCompleteInputWithContext = function AutoCompleteInputWithContext(props)
541
541
  __self: _this,
542
542
  __source: {
543
543
  fileName: _jsxFileName,
544
- lineNumber: 421,
544
+ lineNumber: 416,
545
545
  columnNumber: 5
546
546
  }
547
547
  }));
@@ -615,7 +615,7 @@ var AutoCompleteInput = function AutoCompleteInput(props) {
615
615
  __self: _this,
616
616
  __source: {
617
617
  fileName: _jsxFileName,
618
- lineNumber: 529,
618
+ lineNumber: 524,
619
619
  columnNumber: 5
620
620
  }
621
621
  }));