@sendbird/uikit-chat-hooks 1.0.1 → 1.0.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 (96) hide show
  1. package/lib/commonjs/channel/useActiveGroupChannel.js +22 -0
  2. package/lib/commonjs/channel/useActiveGroupChannel.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelList.js +21 -0
  4. package/lib/commonjs/channel/useGroupChannelList.js.map +1 -0
  5. package/lib/commonjs/channel/useGroupChannelListWithCollection.js +148 -0
  6. package/lib/commonjs/channel/useGroupChannelListWithCollection.js.map +1 -0
  7. package/lib/commonjs/channel/useGroupChannelListWithQuery.js +130 -0
  8. package/lib/commonjs/channel/useGroupChannelListWithQuery.js.map +1 -0
  9. package/lib/commonjs/channel/useGroupChannelMessages/index.js +21 -0
  10. package/lib/commonjs/channel/useGroupChannelMessages/index.js.map +1 -0
  11. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +158 -0
  12. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -0
  13. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +305 -0
  14. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -0
  15. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +249 -0
  16. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -0
  17. package/lib/commonjs/common/useAppFeatures.js +44 -0
  18. package/lib/commonjs/common/useAppFeatures.js.map +1 -0
  19. package/lib/commonjs/common/usePushTrigger.js +33 -0
  20. package/lib/commonjs/common/usePushTrigger.js.map +1 -0
  21. package/lib/commonjs/common/useTotalUnreadChannelCount.js +29 -0
  22. package/lib/commonjs/common/useTotalUnreadChannelCount.js.map +1 -0
  23. package/lib/commonjs/common/useTotalUnreadMessageCount.js +40 -0
  24. package/lib/commonjs/common/useTotalUnreadMessageCount.js.map +1 -0
  25. package/lib/commonjs/common/useUserList.js +110 -0
  26. package/lib/commonjs/common/useUserList.js.map +1 -0
  27. package/lib/commonjs/handler/useChannelHandler.js +29 -0
  28. package/lib/commonjs/handler/useChannelHandler.js.map +1 -0
  29. package/lib/commonjs/handler/useConnectionHandler.js +29 -0
  30. package/lib/commonjs/handler/useConnectionHandler.js.map +1 -0
  31. package/lib/commonjs/handler/useUserEventHandler.js +29 -0
  32. package/lib/commonjs/handler/useUserEventHandler.js.map +1 -0
  33. package/lib/commonjs/index.js +102 -0
  34. package/lib/commonjs/index.js.map +1 -0
  35. package/lib/commonjs/model/CustomQuery.js +28 -0
  36. package/lib/commonjs/model/CustomQuery.js.map +1 -0
  37. package/lib/commonjs/types.js +6 -0
  38. package/lib/commonjs/types.js.map +1 -0
  39. package/lib/module/channel/useActiveGroupChannel.js +12 -0
  40. package/lib/module/channel/useActiveGroupChannel.js.map +1 -0
  41. package/lib/module/channel/useGroupChannelList.js +10 -0
  42. package/lib/module/channel/useGroupChannelList.js.map +1 -0
  43. package/lib/module/channel/useGroupChannelListWithCollection.js +135 -0
  44. package/lib/module/channel/useGroupChannelListWithCollection.js.map +1 -0
  45. package/lib/module/channel/useGroupChannelListWithQuery.js +117 -0
  46. package/lib/module/channel/useGroupChannelListWithQuery.js.map +1 -0
  47. package/lib/module/channel/useGroupChannelMessages/index.js +10 -0
  48. package/lib/module/channel/useGroupChannelMessages/index.js.map +1 -0
  49. package/lib/module/channel/useGroupChannelMessages/reducer.js +148 -0
  50. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -0
  51. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +289 -0
  52. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -0
  53. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +234 -0
  54. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -0
  55. package/lib/module/common/useAppFeatures.js +33 -0
  56. package/lib/module/common/useAppFeatures.js.map +1 -0
  57. package/lib/module/common/usePushTrigger.js +22 -0
  58. package/lib/module/common/usePushTrigger.js.map +1 -0
  59. package/lib/module/common/useTotalUnreadChannelCount.js +17 -0
  60. package/lib/module/common/useTotalUnreadChannelCount.js.map +1 -0
  61. package/lib/module/common/useTotalUnreadMessageCount.js +28 -0
  62. package/lib/module/common/useTotalUnreadMessageCount.js.map +1 -0
  63. package/lib/module/common/useUserList.js +100 -0
  64. package/lib/module/common/useUserList.js.map +1 -0
  65. package/lib/module/handler/useChannelHandler.js +17 -0
  66. package/lib/module/handler/useChannelHandler.js.map +1 -0
  67. package/lib/module/handler/useConnectionHandler.js +17 -0
  68. package/lib/module/handler/useConnectionHandler.js.map +1 -0
  69. package/lib/module/handler/useUserEventHandler.js +17 -0
  70. package/lib/module/handler/useUserEventHandler.js.map +1 -0
  71. package/lib/module/index.js +13 -0
  72. package/lib/module/index.js.map +1 -0
  73. package/lib/module/model/CustomQuery.js +19 -0
  74. package/lib/module/model/CustomQuery.js.map +1 -0
  75. package/lib/module/types.js +2 -0
  76. package/lib/module/types.js.map +1 -0
  77. package/lib/typescript/src/channel/useActiveGroupChannel.d.ts +5 -0
  78. package/lib/typescript/src/channel/useGroupChannelList.d.ts +2 -0
  79. package/lib/typescript/src/channel/useGroupChannelListWithCollection.d.ts +2 -0
  80. package/lib/typescript/src/channel/useGroupChannelListWithQuery.d.ts +2 -0
  81. package/lib/typescript/src/channel/useGroupChannelMessages/index.d.ts +2 -0
  82. package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +15 -0
  83. package/lib/typescript/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.d.ts +2 -0
  84. package/lib/typescript/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.d.ts +2 -0
  85. package/lib/typescript/src/common/useAppFeatures.d.ts +7 -0
  86. package/lib/typescript/src/common/usePushTrigger.d.ts +7 -0
  87. package/lib/typescript/src/common/useTotalUnreadChannelCount.d.ts +6 -0
  88. package/lib/typescript/src/common/useTotalUnreadMessageCount.d.ts +8 -0
  89. package/lib/typescript/src/common/useUserList.d.ts +24 -0
  90. package/lib/typescript/src/handler/useChannelHandler.d.ts +4 -0
  91. package/lib/typescript/src/handler/useConnectionHandler.d.ts +4 -0
  92. package/lib/typescript/src/handler/useUserEventHandler.d.ts +4 -0
  93. package/lib/typescript/src/index.d.ts +13 -0
  94. package/lib/typescript/src/model/CustomQuery.d.ts +14 -0
  95. package/lib/typescript/src/types.d.ts +198 -0
  96. package/package.json +3 -3
@@ -0,0 +1,135 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { arrayToMap, useAsyncEffect, useUniqId } from '@sendbird/uikit-utils';
3
+ import { useAppFeatures } from '../common/useAppFeatures';
4
+ import { useChannelHandler } from '../handler/useChannelHandler';
5
+ const HOOK_NAME = 'useGroupChannelListWithCollection';
6
+
7
+ const createGroupChannelListCollection = (sdk, collectionCreator) => {
8
+ const passedCollection = collectionCreator === null || collectionCreator === void 0 ? void 0 : collectionCreator();
9
+ if (passedCollection) return passedCollection;
10
+ const defaultCollection = sdk.GroupChannel.createGroupChannelCollection();
11
+ const filter = new sdk.GroupChannelFilter();
12
+ return defaultCollection.setLimit(20).setFilter(filter).build();
13
+ };
14
+
15
+ export const useGroupChannelListWithCollection = (sdk, userId, options) => {
16
+ const id = useUniqId(HOOK_NAME);
17
+ const {
18
+ deliveryReceiptEnabled
19
+ } = useAppFeatures(sdk);
20
+ const collectionRef = useRef();
21
+ const [loading, setLoading] = useState(false);
22
+ const [refreshing, setRefreshing] = useState(false);
23
+ const [groupChannelMap, setGroupChannelMap] = useState({});
24
+ const groupChannels = useMemo(() => {
25
+ const channels = Object.values(groupChannelMap);
26
+ if (options !== null && options !== void 0 && options.sortComparator) return channels.sort(options === null || options === void 0 ? void 0 : options.sortComparator);
27
+ return channels;
28
+ }, [groupChannelMap, options === null || options === void 0 ? void 0 : options.sortComparator]); // ---------- internal methods ---------- //
29
+
30
+ const updateChannels = (channels, clearPrev) => {
31
+ const groupChannels = channels.filter(c => c.isGroupChannel());
32
+ if (clearPrev) setGroupChannelMap(arrayToMap(groupChannels, 'url'));else setGroupChannelMap(prev => ({ ...prev,
33
+ ...arrayToMap(groupChannels, 'url')
34
+ }));
35
+ if (deliveryReceiptEnabled) groupChannels.forEach(channel => sdk.markAsDelivered(channel.url));
36
+ };
37
+
38
+ const deleteChannels = channelUrls => {
39
+ setGroupChannelMap(_ref => {
40
+ let { ...draft
41
+ } = _ref;
42
+ channelUrls.forEach(url => delete draft[url]);
43
+ return draft;
44
+ });
45
+ };
46
+
47
+ const init = useCallback(async uid => {
48
+ var _collectionRef$curren;
49
+
50
+ if (collectionRef.current) (_collectionRef$curren = collectionRef.current) === null || _collectionRef$curren === void 0 ? void 0 : _collectionRef$curren.dispose();
51
+
52
+ if (uid) {
53
+ var _collectionRef$curren2, _collectionRef$curren4;
54
+
55
+ collectionRef.current = createGroupChannelListCollection(sdk, options === null || options === void 0 ? void 0 : options.collectionCreator);
56
+
57
+ if ((_collectionRef$curren2 = collectionRef.current) !== null && _collectionRef$curren2 !== void 0 && _collectionRef$curren2.hasMore) {
58
+ var _collectionRef$curren3;
59
+
60
+ updateChannels(await ((_collectionRef$curren3 = collectionRef.current) === null || _collectionRef$curren3 === void 0 ? void 0 : _collectionRef$curren3.loadMore()), true);
61
+ }
62
+
63
+ (_collectionRef$curren4 = collectionRef.current) === null || _collectionRef$curren4 === void 0 ? void 0 : _collectionRef$curren4.setGroupChannelCollectionHandler({
64
+ onChannelsAdded(_, channels) {
65
+ updateChannels(channels, false);
66
+ },
67
+
68
+ onChannelsUpdated(_, channels) {
69
+ updateChannels(channels, false);
70
+ },
71
+
72
+ onChannelsDeleted(_, channelUrls) {
73
+ deleteChannels(channelUrls);
74
+ }
75
+
76
+ });
77
+ }
78
+ }, [sdk, options === null || options === void 0 ? void 0 : options.collectionCreator]); // ---------- internal methods ends ---------- //
79
+ // ---------- internal hooks ---------- //
80
+
81
+ useEffect(() => {
82
+ return () => {
83
+ var _collectionRef$curren5;
84
+
85
+ if (collectionRef.current) (_collectionRef$curren5 = collectionRef.current) === null || _collectionRef$curren5 === void 0 ? void 0 : _collectionRef$curren5.dispose();
86
+ };
87
+ }, []);
88
+ useAsyncEffect(async () => {
89
+ setLoading(true);
90
+ await init(userId);
91
+ setLoading(false);
92
+ }, [init, userId]);
93
+ useChannelHandler(sdk, `${HOOK_NAME}_${id}`, {
94
+ onUserBanned: (channel, user) => {
95
+ const isMe = user.userId === userId;
96
+ if (isMe) deleteChannels([channel.url]);else updateChannels([channel], false);
97
+ }
98
+ }, [sdk, userId]); // ---------- internal hooks ends ---------- //
99
+ // ---------- returns methods ---------- //
100
+
101
+ const refresh = useCallback(async () => {
102
+ setRefreshing(true);
103
+ await init(userId);
104
+ setRefreshing(false);
105
+ }, [init, userId]);
106
+ const update = useCallback(channel => {
107
+ if (deliveryReceiptEnabled) sdk.markAsDelivered(channel.url);
108
+ setGroupChannelMap(prev => ({ ...prev,
109
+ [channel.url]: channel
110
+ }));
111
+ }, [sdk]);
112
+ const next = useCallback(async () => {
113
+ var _collectionRef$curren6;
114
+
115
+ if ((_collectionRef$curren6 = collectionRef.current) !== null && _collectionRef$curren6 !== void 0 && _collectionRef$curren6.hasMore) {
116
+ var _collectionRef$curren7;
117
+
118
+ const channels = await ((_collectionRef$curren7 = collectionRef.current) === null || _collectionRef$curren7 === void 0 ? void 0 : _collectionRef$curren7.loadMore());
119
+ setGroupChannelMap(prev => ({ ...prev,
120
+ ...arrayToMap(channels, 'url')
121
+ }));
122
+ if (deliveryReceiptEnabled) channels.forEach(channel => sdk.markAsDelivered(channel.url));
123
+ }
124
+ }, [sdk]); // ---------- returns methods ends ---------- //
125
+
126
+ return {
127
+ loading,
128
+ groupChannels,
129
+ refresh,
130
+ refreshing,
131
+ next,
132
+ update
133
+ };
134
+ };
135
+ //# sourceMappingURL=useGroupChannelListWithCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","arrayToMap","useAsyncEffect","useUniqId","useAppFeatures","useChannelHandler","HOOK_NAME","createGroupChannelListCollection","sdk","collectionCreator","passedCollection","defaultCollection","GroupChannel","createGroupChannelCollection","filter","GroupChannelFilter","setLimit","setFilter","build","useGroupChannelListWithCollection","userId","options","id","deliveryReceiptEnabled","collectionRef","loading","setLoading","refreshing","setRefreshing","groupChannelMap","setGroupChannelMap","groupChannels","channels","Object","values","sortComparator","sort","updateChannels","clearPrev","c","isGroupChannel","prev","forEach","channel","markAsDelivered","url","deleteChannels","channelUrls","draft","init","uid","current","dispose","hasMore","loadMore","setGroupChannelCollectionHandler","onChannelsAdded","_","onChannelsUpdated","onChannelsDeleted","onUserBanned","user","isMe","refresh","update","next"],"sources":["useGroupChannelListWithCollection.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport type {\n SendbirdChannel,\n SendbirdChatSDK,\n SendbirdGroupChannel,\n SendbirdGroupChannelCollection,\n} from '@sendbird/uikit-utils';\nimport { arrayToMap, useAsyncEffect, useUniqId } from '@sendbird/uikit-utils';\n\nimport { useAppFeatures } from '../common/useAppFeatures';\nimport { useChannelHandler } from '../handler/useChannelHandler';\nimport type { UseGroupChannelList, UseGroupChannelListOptions } from '../types';\n\ntype GroupChannelMap = Record<string, SendbirdGroupChannel>;\n\nconst HOOK_NAME = 'useGroupChannelListWithCollection';\nconst createGroupChannelListCollection = (\n sdk: SendbirdChatSDK,\n collectionCreator: UseGroupChannelListOptions['collectionCreator'],\n) => {\n const passedCollection = collectionCreator?.();\n if (passedCollection) return passedCollection;\n\n const defaultCollection = sdk.GroupChannel.createGroupChannelCollection();\n const filter = new sdk.GroupChannelFilter();\n return defaultCollection.setLimit(20).setFilter(filter).build();\n};\n\nexport const useGroupChannelListWithCollection: UseGroupChannelList = (sdk, userId, options) => {\n const id = useUniqId(HOOK_NAME);\n const { deliveryReceiptEnabled } = useAppFeatures(sdk);\n\n const collectionRef = useRef<SendbirdGroupChannelCollection>();\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [groupChannelMap, setGroupChannelMap] = useState<GroupChannelMap>({});\n const groupChannels = useMemo(() => {\n const channels = Object.values(groupChannelMap);\n if (options?.sortComparator) return channels.sort(options?.sortComparator);\n return channels;\n }, [groupChannelMap, options?.sortComparator]);\n\n // ---------- internal methods ---------- //\n const updateChannels = (channels: SendbirdChannel[], clearPrev: boolean) => {\n const groupChannels = channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());\n if (clearPrev) setGroupChannelMap(arrayToMap(groupChannels, 'url'));\n else setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(groupChannels, 'url') }));\n if (deliveryReceiptEnabled) groupChannels.forEach((channel) => sdk.markAsDelivered(channel.url));\n };\n const deleteChannels = (channelUrls: string[]) => {\n setGroupChannelMap(({ ...draft }) => {\n channelUrls.forEach((url) => delete draft[url]);\n return draft;\n });\n };\n const init = useCallback(\n async (uid?: string) => {\n if (collectionRef.current) collectionRef.current?.dispose();\n\n if (uid) {\n collectionRef.current = createGroupChannelListCollection(sdk, options?.collectionCreator);\n if (collectionRef.current?.hasMore) {\n updateChannels(await collectionRef.current?.loadMore(), true);\n }\n\n collectionRef.current?.setGroupChannelCollectionHandler({\n onChannelsAdded(_, channels) {\n updateChannels(channels, false);\n },\n onChannelsUpdated(_, channels) {\n updateChannels(channels, false);\n },\n onChannelsDeleted(_, channelUrls) {\n deleteChannels(channelUrls);\n },\n });\n }\n },\n [sdk, options?.collectionCreator],\n );\n // ---------- internal methods ends ---------- //\n\n // ---------- internal hooks ---------- //\n useEffect(() => {\n return () => {\n if (collectionRef.current) collectionRef.current?.dispose();\n };\n }, []);\n\n useAsyncEffect(async () => {\n setLoading(true);\n await init(userId);\n setLoading(false);\n }, [init, userId]);\n\n useChannelHandler(\n sdk,\n `${HOOK_NAME}_${id}`,\n {\n onUserBanned: (channel, user) => {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel], false);\n },\n },\n [sdk, userId],\n );\n // ---------- internal hooks ends ---------- //\n\n // ---------- returns methods ---------- //\n const refresh = useCallback(async () => {\n setRefreshing(true);\n await init(userId);\n setRefreshing(false);\n }, [init, userId]);\n\n const update = useCallback(\n (channel: SendbirdGroupChannel) => {\n if (deliveryReceiptEnabled) sdk.markAsDelivered(channel.url);\n setGroupChannelMap((prev) => ({ ...prev, [channel.url]: channel }));\n },\n [sdk],\n );\n\n const next = useCallback(async () => {\n if (collectionRef.current?.hasMore) {\n const channels = await collectionRef.current?.loadMore();\n setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(channels, 'url') }));\n if (deliveryReceiptEnabled) channels.forEach((channel) => sdk.markAsDelivered(channel.url));\n }\n }, [sdk]);\n // ---------- returns methods ends ---------- //\n\n return {\n loading,\n groupChannels,\n refresh,\n refreshing,\n next,\n update,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { useCallback, useMemo, useRef, useState } from 'react';
2
+ import { arrayToMap, useAsyncEffect } from '@sendbird/uikit-utils';
3
+ import { useAppFeatures } from '../common/useAppFeatures';
4
+ import { useChannelHandler } from '../handler/useChannelHandler';
5
+ const HOOK_NAME = 'useGroupChannelListWithQuery';
6
+
7
+ const createGroupChannelListQuery = (sdk, queryCreator) => {
8
+ const passedQuery = queryCreator === null || queryCreator === void 0 ? void 0 : queryCreator();
9
+ if (passedQuery) return passedQuery;
10
+ const defaultQuery = sdk.GroupChannel.createMyGroupChannelListQuery();
11
+ defaultQuery.limit = 20;
12
+ return defaultQuery;
13
+ };
14
+
15
+ export const useGroupChannelListWithQuery = (sdk, userId, options) => {
16
+ const {
17
+ deliveryReceiptEnabled
18
+ } = useAppFeatures(sdk);
19
+ const queryRef = useRef();
20
+ const [loading, setLoading] = useState(false);
21
+ const [refreshing, setRefreshing] = useState(false);
22
+ const [groupChannelMap, setGroupChannelMap] = useState({});
23
+ const groupChannels = useMemo(() => {
24
+ const channels = Object.values(groupChannelMap);
25
+ if (options !== null && options !== void 0 && options.sortComparator) return channels.sort(options === null || options === void 0 ? void 0 : options.sortComparator);
26
+ return channels;
27
+ }, [groupChannelMap, options === null || options === void 0 ? void 0 : options.sortComparator]); // ---------- internal methods ---------- //
28
+
29
+ const updateChannels = (channels, clearPrev) => {
30
+ const groupChannels = channels.filter(c => c.isGroupChannel());
31
+ if (clearPrev) setGroupChannelMap(arrayToMap(groupChannels, 'url'));else setGroupChannelMap(prev => ({ ...prev,
32
+ ...arrayToMap(groupChannels, 'url')
33
+ }));
34
+ if (deliveryReceiptEnabled) groupChannels.forEach(channel => sdk.markAsDelivered(channel.url));
35
+ };
36
+
37
+ const deleteChannels = channelUrls => {
38
+ setGroupChannelMap(_ref => {
39
+ let { ...draft
40
+ } = _ref;
41
+ channelUrls.forEach(url => delete draft[url]);
42
+ return draft;
43
+ });
44
+ };
45
+
46
+ const init = useCallback(async uid => {
47
+ if (uid) {
48
+ var _queryRef$current;
49
+
50
+ queryRef.current = createGroupChannelListQuery(sdk, options === null || options === void 0 ? void 0 : options.queryCreator);
51
+
52
+ if ((_queryRef$current = queryRef.current) !== null && _queryRef$current !== void 0 && _queryRef$current.hasNext) {
53
+ const channels = await queryRef.current.next();
54
+ updateChannels(channels, true);
55
+ }
56
+ }
57
+ }, [sdk, options === null || options === void 0 ? void 0 : options.queryCreator]); // ---------- internal methods ends ---------- //
58
+ // ---------- internal hooks ---------- //
59
+
60
+ useAsyncEffect(async () => {
61
+ setLoading(true);
62
+ await init(userId);
63
+ setLoading(false);
64
+ }, [init, userId]);
65
+ useChannelHandler(sdk, HOOK_NAME, {
66
+ onChannelChanged: channel => updateChannels([channel], false),
67
+ onChannelFrozen: channel => updateChannels([channel], false),
68
+ onChannelUnfrozen: channel => updateChannels([channel], false),
69
+ onChannelMemberCountChanged: channels => updateChannels(channels, false),
70
+ onChannelDeleted: url => deleteChannels([url]),
71
+ onUserJoined: channel => updateChannels([channel], false),
72
+ onUserLeft: (channel, user) => {
73
+ const isMe = user.userId === userId;
74
+ if (isMe) deleteChannels([channel.url]);else updateChannels([channel], false);
75
+ },
76
+
77
+ onUserBanned(channel, user) {
78
+ const isMe = user.userId === userId;
79
+ if (isMe) deleteChannels([channel.url]);else updateChannels([channel], false);
80
+ }
81
+
82
+ }, [sdk, userId]); // ---------- internal hooks ends ---------- //
83
+ // ---------- returns methods ---------- //
84
+
85
+ const refresh = useCallback(async () => {
86
+ setRefreshing(true);
87
+ await init(userId);
88
+ setRefreshing(false);
89
+ }, [init, userId]);
90
+ const update = useCallback(channel => {
91
+ if (deliveryReceiptEnabled) sdk.markAsDelivered(channel.url);
92
+ setGroupChannelMap(prev => ({ ...prev,
93
+ [channel.url]: channel
94
+ }));
95
+ }, [sdk]);
96
+ const next = useCallback(async () => {
97
+ var _queryRef$current2;
98
+
99
+ if ((_queryRef$current2 = queryRef.current) !== null && _queryRef$current2 !== void 0 && _queryRef$current2.hasNext) {
100
+ const channels = await queryRef.current.next();
101
+ setGroupChannelMap(prev => ({ ...prev,
102
+ ...arrayToMap(channels, 'url')
103
+ }));
104
+ if (deliveryReceiptEnabled) channels.forEach(channel => sdk.markAsDelivered(channel.url));
105
+ }
106
+ }, [sdk]); // ---------- returns methods ends ---------- //
107
+
108
+ return {
109
+ loading,
110
+ groupChannels,
111
+ update,
112
+ refresh,
113
+ refreshing,
114
+ next
115
+ };
116
+ };
117
+ //# sourceMappingURL=useGroupChannelListWithQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useMemo","useRef","useState","arrayToMap","useAsyncEffect","useAppFeatures","useChannelHandler","HOOK_NAME","createGroupChannelListQuery","sdk","queryCreator","passedQuery","defaultQuery","GroupChannel","createMyGroupChannelListQuery","limit","useGroupChannelListWithQuery","userId","options","deliveryReceiptEnabled","queryRef","loading","setLoading","refreshing","setRefreshing","groupChannelMap","setGroupChannelMap","groupChannels","channels","Object","values","sortComparator","sort","updateChannels","clearPrev","filter","c","isGroupChannel","prev","forEach","channel","markAsDelivered","url","deleteChannels","channelUrls","draft","init","uid","current","hasNext","next","onChannelChanged","onChannelFrozen","onChannelUnfrozen","onChannelMemberCountChanged","onChannelDeleted","onUserJoined","onUserLeft","user","isMe","onUserBanned","refresh","update"],"sources":["useGroupChannelListWithQuery.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport type Sendbird from 'sendbird';\n\nimport type { SendbirdChannel, SendbirdChatSDK, SendbirdGroupChannel } from '@sendbird/uikit-utils';\nimport { arrayToMap, useAsyncEffect } from '@sendbird/uikit-utils';\n\nimport { useAppFeatures } from '../common/useAppFeatures';\nimport { useChannelHandler } from '../handler/useChannelHandler';\nimport type { UseGroupChannelList, UseGroupChannelListOptions } from '../types';\n\ntype GroupChannelMap = Record<string, SendbirdGroupChannel>;\n\nconst HOOK_NAME = 'useGroupChannelListWithQuery';\nconst createGroupChannelListQuery = (\n sdk: SendbirdChatSDK,\n queryCreator: UseGroupChannelListOptions['queryCreator'],\n) => {\n const passedQuery = queryCreator?.();\n if (passedQuery) return passedQuery;\n\n const defaultQuery = sdk.GroupChannel.createMyGroupChannelListQuery();\n defaultQuery.limit = 20;\n return defaultQuery;\n};\n\nexport const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, options) => {\n const { deliveryReceiptEnabled } = useAppFeatures(sdk);\n const queryRef = useRef<Sendbird.GroupChannelListQuery>();\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [groupChannelMap, setGroupChannelMap] = useState<GroupChannelMap>({});\n const groupChannels = useMemo(() => {\n const channels = Object.values(groupChannelMap);\n if (options?.sortComparator) return channels.sort(options?.sortComparator);\n return channels;\n }, [groupChannelMap, options?.sortComparator]);\n\n // ---------- internal methods ---------- //\n const updateChannels = (channels: SendbirdChannel[], clearPrev: boolean) => {\n const groupChannels = channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());\n if (clearPrev) setGroupChannelMap(arrayToMap(groupChannels, 'url'));\n else setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(groupChannels, 'url') }));\n\n if (deliveryReceiptEnabled) groupChannels.forEach((channel) => sdk.markAsDelivered(channel.url));\n };\n const deleteChannels = (channelUrls: string[]) => {\n setGroupChannelMap(({ ...draft }) => {\n channelUrls.forEach((url) => delete draft[url]);\n return draft;\n });\n };\n const init = useCallback(\n async (uid?: string) => {\n if (uid) {\n queryRef.current = createGroupChannelListQuery(sdk, options?.queryCreator);\n if (queryRef.current?.hasNext) {\n const channels = await queryRef.current.next();\n updateChannels(channels, true);\n }\n }\n },\n [sdk, options?.queryCreator],\n );\n // ---------- internal methods ends ---------- //\n\n // ---------- internal hooks ---------- //\n useAsyncEffect(async () => {\n setLoading(true);\n await init(userId);\n setLoading(false);\n }, [init, userId]);\n\n useChannelHandler(\n sdk,\n HOOK_NAME,\n {\n onChannelChanged: (channel) => updateChannels([channel], false),\n onChannelFrozen: (channel) => updateChannels([channel], false),\n onChannelUnfrozen: (channel) => updateChannels([channel], false),\n onChannelMemberCountChanged: (channels) => updateChannels(channels, false),\n onChannelDeleted: (url) => deleteChannels([url]),\n onUserJoined: (channel) => updateChannels([channel], false),\n onUserLeft: (channel, user) => {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel], false);\n },\n onUserBanned(channel, user) {\n const isMe = user.userId === userId;\n if (isMe) deleteChannels([channel.url]);\n else updateChannels([channel], false);\n },\n },\n [sdk, userId],\n );\n // ---------- internal hooks ends ---------- //\n\n // ---------- returns methods ---------- //\n const refresh = useCallback(async () => {\n setRefreshing(true);\n await init(userId);\n setRefreshing(false);\n }, [init, userId]);\n\n const update = useCallback(\n (channel: SendbirdGroupChannel) => {\n if (deliveryReceiptEnabled) sdk.markAsDelivered(channel.url);\n setGroupChannelMap((prev) => ({ ...prev, [channel.url]: channel }));\n },\n [sdk],\n );\n\n const next = useCallback(async () => {\n if (queryRef.current?.hasNext) {\n const channels = await queryRef.current.next();\n setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(channels, 'url') }));\n if (deliveryReceiptEnabled) channels.forEach((channel) => sdk.markAsDelivered(channel.url));\n }\n }, [sdk]);\n // ---------- returns methods ends ---------- //\n\n return { loading, groupChannels, update, refresh, refreshing, next };\n};\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { useGroupChannelMessagesWithCollection } from './useGroupChannelMessagesWithCollection';
2
+ import { useGroupChannelMessagesWithQuery } from './useGroupChannelMessagesWithQuery';
3
+ export const useGroupChannelMessages = (sdk, channel, userId, options) => {
4
+ if (sdk.isCacheEnabled || options !== null && options !== void 0 && options.enableCollectionWithoutLocalCache) {
5
+ return useGroupChannelMessagesWithCollection(sdk, channel, userId, options);
6
+ } else {
7
+ return useGroupChannelMessagesWithQuery(sdk, channel, userId, options);
8
+ }
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useGroupChannelMessagesWithCollection","useGroupChannelMessagesWithQuery","useGroupChannelMessages","sdk","channel","userId","options","isCacheEnabled","enableCollectionWithoutLocalCache"],"sources":["index.ts"],"sourcesContent":["import type { UseGroupChannelMessages } from '../../types';\nimport { useGroupChannelMessagesWithCollection } from './useGroupChannelMessagesWithCollection';\nimport { useGroupChannelMessagesWithQuery } from './useGroupChannelMessagesWithQuery';\n\nexport const useGroupChannelMessages: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n if (sdk.isCacheEnabled || options?.enableCollectionWithoutLocalCache) {\n return useGroupChannelMessagesWithCollection(sdk, channel, userId, options);\n } else {\n return useGroupChannelMessagesWithQuery(sdk, channel, userId, options);\n }\n};\n"],"mappings":"AACA,SAASA,qCAAT,QAAsD,yCAAtD;AACA,SAASC,gCAAT,QAAiD,oCAAjD;AAEA,OAAO,MAAMC,uBAAgD,GAAG,CAACC,GAAD,EAAMC,OAAN,EAAeC,MAAf,EAAuBC,OAAvB,KAAmC;EACjG,IAAIH,GAAG,CAACI,cAAJ,IAAsBD,OAAtB,aAAsBA,OAAtB,eAAsBA,OAAO,CAAEE,iCAAnC,EAAsE;IACpE,OAAOR,qCAAqC,CAACG,GAAD,EAAMC,OAAN,EAAeC,MAAf,EAAuBC,OAAvB,CAA5C;EACD,CAFD,MAEO;IACL,OAAOL,gCAAgC,CAACE,GAAD,EAAMC,OAAN,EAAeC,MAAf,EAAuBC,OAAvB,CAAvC;EACD;AACF,CANM"}
@@ -0,0 +1,148 @@
1
+ import { useReducer } from 'react';
2
+ import { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';
3
+
4
+ const defaultReducer = (_ref, action) => {
5
+ let { ...draft
6
+ } = _ref;
7
+
8
+ switch (action.type) {
9
+ case 'update_refreshing':
10
+ case 'update_loading':
11
+ {
12
+ const key = action.type === 'update_loading' ? 'loading' : 'refreshing';
13
+ draft[key] = action.value.status;
14
+ return draft;
15
+ }
16
+
17
+ case 'update_messages':
18
+ case 'update_next_messages':
19
+ {
20
+ const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
21
+ const messageMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
22
+
23
+ if (action.value.clearPrev) {
24
+ draft[key] = messageMap;
25
+ } else {
26
+ draft[key] = { ...draft[key],
27
+ ...messageMap
28
+ }; // NOTE: Replace pending message to succeeded message
29
+
30
+ action.value.messages.filter(m => {
31
+ return (m.isFileMessage() || m.isUserMessage()) && Boolean(draft[key][m.reqId]) && m.sendingStatus === 'succeeded' && isMyMessage(m, action.value.currentUserId);
32
+ }).forEach(m => delete draft[key][m.reqId]);
33
+ }
34
+
35
+ if (action.type === 'update_messages') {
36
+ draft['nextMessageMap'] = {};
37
+ }
38
+
39
+ return draft;
40
+ }
41
+
42
+ case 'delete_messages':
43
+ case 'delete_next_messages':
44
+ {
45
+ const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
46
+ draft[key] = { ...draft[key]
47
+ };
48
+ action.value.messageIds.forEach(msgId => delete draft[key][msgId]);
49
+ action.value.reqIds.forEach(reqId => delete draft[key][reqId]);
50
+ return draft;
51
+ }
52
+ }
53
+ };
54
+
55
+ export const useGroupChannelMessagesReducer = (userId, sortComparator) => {
56
+ const [{
57
+ loading,
58
+ refreshing,
59
+ messageMap,
60
+ nextMessageMap
61
+ }, dispatch] = useReducer(defaultReducer, {
62
+ loading: true,
63
+ refreshing: false,
64
+ messageMap: {},
65
+ nextMessageMap: {}
66
+ });
67
+
68
+ const updateMessages = (messages, clearPrev, currentUserId) => {
69
+ dispatch({
70
+ type: 'update_messages',
71
+ value: {
72
+ messages,
73
+ clearPrev,
74
+ currentUserId
75
+ }
76
+ });
77
+ };
78
+
79
+ const deleteMessages = (messageIds, reqIds) => {
80
+ dispatch({
81
+ type: 'delete_messages',
82
+ value: {
83
+ messageIds,
84
+ reqIds
85
+ }
86
+ });
87
+ };
88
+
89
+ const updateNextMessages = (messages, clearPrev, currentUserId) => {
90
+ dispatch({
91
+ type: 'update_next_messages',
92
+ value: {
93
+ messages,
94
+ clearPrev,
95
+ currentUserId
96
+ }
97
+ });
98
+ };
99
+
100
+ const deleteNextMessages = (messageIds, reqIds) => {
101
+ dispatch({
102
+ type: 'delete_next_messages',
103
+ value: {
104
+ messageIds,
105
+ reqIds
106
+ }
107
+ });
108
+ };
109
+
110
+ const updateLoading = status => {
111
+ dispatch({
112
+ type: 'update_loading',
113
+ value: {
114
+ status
115
+ }
116
+ });
117
+ };
118
+
119
+ const updateRefreshing = status => {
120
+ dispatch({
121
+ type: 'update_refreshing',
122
+ value: {
123
+ status
124
+ }
125
+ });
126
+ };
127
+
128
+ const messages = useIIFE(() => {
129
+ if (sortComparator) return Object.values(messageMap).sort(sortComparator);
130
+ return Object.values(messageMap);
131
+ });
132
+ const nextMessages = Object.values(nextMessageMap);
133
+ const newMessagesFromMembers = nextMessages.filter(msg => isNewMessage(msg, userId));
134
+ return {
135
+ updateLoading,
136
+ updateRefreshing,
137
+ updateMessages,
138
+ updateNextMessages,
139
+ deleteMessages,
140
+ deleteNextMessages,
141
+ loading,
142
+ refreshing,
143
+ messages,
144
+ nextMessages,
145
+ newMessagesFromMembers
146
+ };
147
+ };
148
+ //# sourceMappingURL=reducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","action","draft","type","key","value","status","messageMap","messages","clearPrev","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","nextMessageMap","dispatch","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","Object","values","sort","nextMessages","newMessagesFromMembers","msg"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type {\n SendbirdBaseMessage,\n SendbirdFileMessage,\n SendbirdMessage,\n SendbirdUserMessage,\n} from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearPrev: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdMessage>;\n nextMessageMap: Record<string, SendbirdMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing':\n case 'update_loading': {\n const key = action.type === 'update_loading' ? 'loading' : 'refreshing';\n draft[key] = action.value.status;\n\n return draft;\n }\n case 'update_messages':\n case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const messageMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearPrev) {\n draft[key] = messageMap;\n } else {\n draft[key] = { ...draft[key], ...messageMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n if (action.type === 'update_messages') {\n draft['nextMessageMap'] = {};\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useGroupChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearPrev, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearPrev, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}