@sendbird/uikit-chat-hooks 1.0.2 → 1.1.1

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 (74) hide show
  1. package/lib/commonjs/channel/{useGroupChannelList.js → useGroupChannelList/index.js} +1 -1
  2. package/lib/commonjs/channel/useGroupChannelList/index.js.map +1 -0
  3. package/lib/commonjs/channel/useGroupChannelList/reducer.js +184 -0
  4. package/lib/commonjs/channel/useGroupChannelList/reducer.js.map +1 -0
  5. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js +134 -0
  6. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -0
  7. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js +118 -0
  8. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -0
  9. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +4 -5
  10. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  11. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +3 -3
  12. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  13. package/lib/commonjs/common/useAppFeatures.js +8 -28
  14. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  15. package/lib/commonjs/common/useMessageOutgoingStatus.js +49 -0
  16. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -0
  17. package/lib/commonjs/handler/useChannelHandler.js +16 -5
  18. package/lib/commonjs/handler/useChannelHandler.js.map +1 -1
  19. package/lib/commonjs/index.js +12 -4
  20. package/lib/commonjs/index.js.map +1 -1
  21. package/lib/commonjs/types.js.map +1 -1
  22. package/lib/module/channel/{useGroupChannelList.js → useGroupChannelList/index.js} +1 -1
  23. package/lib/module/channel/useGroupChannelList/index.js.map +1 -0
  24. package/lib/module/channel/useGroupChannelList/reducer.js +174 -0
  25. package/lib/module/channel/useGroupChannelList/reducer.js.map +1 -0
  26. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js +120 -0
  27. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -0
  28. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js +104 -0
  29. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -0
  30. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +4 -5
  31. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  32. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +3 -3
  33. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  34. package/lib/module/common/useAppFeatures.js +8 -27
  35. package/lib/module/common/useAppFeatures.js.map +1 -1
  36. package/lib/module/common/useMessageOutgoingStatus.js +36 -0
  37. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -0
  38. package/lib/module/handler/useChannelHandler.js +17 -6
  39. package/lib/module/handler/useChannelHandler.js.map +1 -1
  40. package/lib/module/index.js +4 -3
  41. package/lib/module/index.js.map +1 -1
  42. package/lib/module/types.js.map +1 -1
  43. package/lib/typescript/src/channel/{useGroupChannelList.d.ts → useGroupChannelList/index.d.ts} +1 -1
  44. package/lib/typescript/src/channel/useGroupChannelList/reducer.d.ts +14 -0
  45. package/lib/typescript/src/channel/{useGroupChannelListWithCollection.d.ts → useGroupChannelList/useGroupChannelListWithCollection.d.ts} +1 -1
  46. package/lib/typescript/src/channel/{useGroupChannelListWithQuery.d.ts → useGroupChannelList/useGroupChannelListWithQuery.d.ts} +1 -1
  47. package/lib/typescript/src/common/useMessageOutgoingStatus.d.ts +3 -0
  48. package/lib/typescript/src/handler/useChannelHandler.d.ts +1 -2
  49. package/lib/typescript/src/index.d.ts +4 -3
  50. package/lib/typescript/src/types.d.ts +0 -7
  51. package/package.json +3 -3
  52. package/src/channel/{useGroupChannelList.ts → useGroupChannelList/index.ts} +1 -1
  53. package/src/channel/useGroupChannelList/reducer.ts +154 -0
  54. package/src/channel/useGroupChannelList/useGroupChannelListWithCollection.ts +116 -0
  55. package/src/channel/useGroupChannelList/useGroupChannelListWithQuery.ts +114 -0
  56. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +14 -20
  57. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +48 -53
  58. package/src/common/useAppFeatures.ts +5 -22
  59. package/src/common/useMessageOutgoingStatus.ts +56 -0
  60. package/src/handler/useChannelHandler.ts +11 -5
  61. package/src/index.ts +4 -3
  62. package/src/types.ts +0 -8
  63. package/lib/commonjs/channel/useGroupChannelList.js.map +0 -1
  64. package/lib/commonjs/channel/useGroupChannelListWithCollection.js +0 -148
  65. package/lib/commonjs/channel/useGroupChannelListWithCollection.js.map +0 -1
  66. package/lib/commonjs/channel/useGroupChannelListWithQuery.js +0 -130
  67. package/lib/commonjs/channel/useGroupChannelListWithQuery.js.map +0 -1
  68. package/lib/module/channel/useGroupChannelList.js.map +0 -1
  69. package/lib/module/channel/useGroupChannelListWithCollection.js +0 -135
  70. package/lib/module/channel/useGroupChannelListWithCollection.js.map +0 -1
  71. package/lib/module/channel/useGroupChannelListWithQuery.js +0 -117
  72. package/lib/module/channel/useGroupChannelListWithQuery.js.map +0 -1
  73. package/src/channel/useGroupChannelListWithCollection.ts +0 -144
  74. package/src/channel/useGroupChannelListWithQuery.ts +0 -124
@@ -1,144 +0,0 @@
1
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
-
3
- import type {
4
- SendbirdChannel,
5
- SendbirdChatSDK,
6
- SendbirdGroupChannel,
7
- SendbirdGroupChannelCollection,
8
- } from '@sendbird/uikit-utils';
9
- import { arrayToMap, useAsyncEffect, useUniqId } from '@sendbird/uikit-utils';
10
-
11
- import { useAppFeatures } from '../common/useAppFeatures';
12
- import { useChannelHandler } from '../handler/useChannelHandler';
13
- import type { UseGroupChannelList, UseGroupChannelListOptions } from '../types';
14
-
15
- type GroupChannelMap = Record<string, SendbirdGroupChannel>;
16
-
17
- const HOOK_NAME = 'useGroupChannelListWithCollection';
18
- const createGroupChannelListCollection = (
19
- sdk: SendbirdChatSDK,
20
- collectionCreator: UseGroupChannelListOptions['collectionCreator'],
21
- ) => {
22
- const passedCollection = collectionCreator?.();
23
- if (passedCollection) return passedCollection;
24
-
25
- const defaultCollection = sdk.GroupChannel.createGroupChannelCollection();
26
- const filter = new sdk.GroupChannelFilter();
27
- return defaultCollection.setLimit(20).setFilter(filter).build();
28
- };
29
-
30
- export const useGroupChannelListWithCollection: UseGroupChannelList = (sdk, userId, options) => {
31
- const id = useUniqId(HOOK_NAME);
32
- const { deliveryReceiptEnabled } = useAppFeatures(sdk);
33
-
34
- const collectionRef = useRef<SendbirdGroupChannelCollection>();
35
- const [loading, setLoading] = useState(false);
36
- const [refreshing, setRefreshing] = useState(false);
37
-
38
- const [groupChannelMap, setGroupChannelMap] = useState<GroupChannelMap>({});
39
- const groupChannels = useMemo(() => {
40
- const channels = Object.values(groupChannelMap);
41
- if (options?.sortComparator) return channels.sort(options?.sortComparator);
42
- return channels;
43
- }, [groupChannelMap, options?.sortComparator]);
44
-
45
- // ---------- internal methods ---------- //
46
- const updateChannels = (channels: SendbirdChannel[], clearPrev: boolean) => {
47
- const groupChannels = channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());
48
- if (clearPrev) setGroupChannelMap(arrayToMap(groupChannels, 'url'));
49
- else setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(groupChannels, 'url') }));
50
- if (deliveryReceiptEnabled) groupChannels.forEach((channel) => sdk.markAsDelivered(channel.url));
51
- };
52
- const deleteChannels = (channelUrls: string[]) => {
53
- setGroupChannelMap(({ ...draft }) => {
54
- channelUrls.forEach((url) => delete draft[url]);
55
- return draft;
56
- });
57
- };
58
- const init = useCallback(
59
- async (uid?: string) => {
60
- if (collectionRef.current) collectionRef.current?.dispose();
61
-
62
- if (uid) {
63
- collectionRef.current = createGroupChannelListCollection(sdk, options?.collectionCreator);
64
- if (collectionRef.current?.hasMore) {
65
- updateChannels(await collectionRef.current?.loadMore(), true);
66
- }
67
-
68
- collectionRef.current?.setGroupChannelCollectionHandler({
69
- onChannelsAdded(_, channels) {
70
- updateChannels(channels, false);
71
- },
72
- onChannelsUpdated(_, channels) {
73
- updateChannels(channels, false);
74
- },
75
- onChannelsDeleted(_, channelUrls) {
76
- deleteChannels(channelUrls);
77
- },
78
- });
79
- }
80
- },
81
- [sdk, options?.collectionCreator],
82
- );
83
- // ---------- internal methods ends ---------- //
84
-
85
- // ---------- internal hooks ---------- //
86
- useEffect(() => {
87
- return () => {
88
- if (collectionRef.current) collectionRef.current?.dispose();
89
- };
90
- }, []);
91
-
92
- useAsyncEffect(async () => {
93
- setLoading(true);
94
- await init(userId);
95
- setLoading(false);
96
- }, [init, userId]);
97
-
98
- useChannelHandler(
99
- sdk,
100
- `${HOOK_NAME}_${id}`,
101
- {
102
- onUserBanned: (channel, user) => {
103
- const isMe = user.userId === userId;
104
- if (isMe) deleteChannels([channel.url]);
105
- else updateChannels([channel], false);
106
- },
107
- },
108
- [sdk, userId],
109
- );
110
- // ---------- internal hooks ends ---------- //
111
-
112
- // ---------- returns methods ---------- //
113
- const refresh = useCallback(async () => {
114
- setRefreshing(true);
115
- await init(userId);
116
- setRefreshing(false);
117
- }, [init, userId]);
118
-
119
- const update = useCallback(
120
- (channel: SendbirdGroupChannel) => {
121
- if (deliveryReceiptEnabled) sdk.markAsDelivered(channel.url);
122
- setGroupChannelMap((prev) => ({ ...prev, [channel.url]: channel }));
123
- },
124
- [sdk],
125
- );
126
-
127
- const next = useCallback(async () => {
128
- if (collectionRef.current?.hasMore) {
129
- const channels = await collectionRef.current?.loadMore();
130
- setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(channels, 'url') }));
131
- if (deliveryReceiptEnabled) channels.forEach((channel) => sdk.markAsDelivered(channel.url));
132
- }
133
- }, [sdk]);
134
- // ---------- returns methods ends ---------- //
135
-
136
- return {
137
- loading,
138
- groupChannels,
139
- refresh,
140
- refreshing,
141
- next,
142
- update,
143
- };
144
- };
@@ -1,124 +0,0 @@
1
- import { useCallback, useMemo, useRef, useState } from 'react';
2
- import type Sendbird from 'sendbird';
3
-
4
- import type { SendbirdChannel, SendbirdChatSDK, SendbirdGroupChannel } from '@sendbird/uikit-utils';
5
- import { arrayToMap, useAsyncEffect } from '@sendbird/uikit-utils';
6
-
7
- import { useAppFeatures } from '../common/useAppFeatures';
8
- import { useChannelHandler } from '../handler/useChannelHandler';
9
- import type { UseGroupChannelList, UseGroupChannelListOptions } from '../types';
10
-
11
- type GroupChannelMap = Record<string, SendbirdGroupChannel>;
12
-
13
- const HOOK_NAME = 'useGroupChannelListWithQuery';
14
- const createGroupChannelListQuery = (
15
- sdk: SendbirdChatSDK,
16
- queryCreator: UseGroupChannelListOptions['queryCreator'],
17
- ) => {
18
- const passedQuery = queryCreator?.();
19
- if (passedQuery) return passedQuery;
20
-
21
- const defaultQuery = sdk.GroupChannel.createMyGroupChannelListQuery();
22
- defaultQuery.limit = 20;
23
- return defaultQuery;
24
- };
25
-
26
- export const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, options) => {
27
- const { deliveryReceiptEnabled } = useAppFeatures(sdk);
28
- const queryRef = useRef<Sendbird.GroupChannelListQuery>();
29
- const [loading, setLoading] = useState(false);
30
- const [refreshing, setRefreshing] = useState(false);
31
-
32
- const [groupChannelMap, setGroupChannelMap] = useState<GroupChannelMap>({});
33
- const groupChannels = useMemo(() => {
34
- const channels = Object.values(groupChannelMap);
35
- if (options?.sortComparator) return channels.sort(options?.sortComparator);
36
- return channels;
37
- }, [groupChannelMap, options?.sortComparator]);
38
-
39
- // ---------- internal methods ---------- //
40
- const updateChannels = (channels: SendbirdChannel[], clearPrev: boolean) => {
41
- const groupChannels = channels.filter((c): c is SendbirdGroupChannel => c.isGroupChannel());
42
- if (clearPrev) setGroupChannelMap(arrayToMap(groupChannels, 'url'));
43
- else setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(groupChannels, 'url') }));
44
-
45
- if (deliveryReceiptEnabled) groupChannels.forEach((channel) => sdk.markAsDelivered(channel.url));
46
- };
47
- const deleteChannels = (channelUrls: string[]) => {
48
- setGroupChannelMap(({ ...draft }) => {
49
- channelUrls.forEach((url) => delete draft[url]);
50
- return draft;
51
- });
52
- };
53
- const init = useCallback(
54
- async (uid?: string) => {
55
- if (uid) {
56
- queryRef.current = createGroupChannelListQuery(sdk, options?.queryCreator);
57
- if (queryRef.current?.hasNext) {
58
- const channels = await queryRef.current.next();
59
- updateChannels(channels, true);
60
- }
61
- }
62
- },
63
- [sdk, options?.queryCreator],
64
- );
65
- // ---------- internal methods ends ---------- //
66
-
67
- // ---------- internal hooks ---------- //
68
- useAsyncEffect(async () => {
69
- setLoading(true);
70
- await init(userId);
71
- setLoading(false);
72
- }, [init, userId]);
73
-
74
- useChannelHandler(
75
- sdk,
76
- HOOK_NAME,
77
- {
78
- onChannelChanged: (channel) => updateChannels([channel], false),
79
- onChannelFrozen: (channel) => updateChannels([channel], false),
80
- onChannelUnfrozen: (channel) => updateChannels([channel], false),
81
- onChannelMemberCountChanged: (channels) => updateChannels(channels, false),
82
- onChannelDeleted: (url) => deleteChannels([url]),
83
- onUserJoined: (channel) => updateChannels([channel], false),
84
- onUserLeft: (channel, user) => {
85
- const isMe = user.userId === userId;
86
- if (isMe) deleteChannels([channel.url]);
87
- else updateChannels([channel], false);
88
- },
89
- onUserBanned(channel, user) {
90
- const isMe = user.userId === userId;
91
- if (isMe) deleteChannels([channel.url]);
92
- else updateChannels([channel], false);
93
- },
94
- },
95
- [sdk, userId],
96
- );
97
- // ---------- internal hooks ends ---------- //
98
-
99
- // ---------- returns methods ---------- //
100
- const refresh = useCallback(async () => {
101
- setRefreshing(true);
102
- await init(userId);
103
- setRefreshing(false);
104
- }, [init, userId]);
105
-
106
- const update = useCallback(
107
- (channel: SendbirdGroupChannel) => {
108
- if (deliveryReceiptEnabled) sdk.markAsDelivered(channel.url);
109
- setGroupChannelMap((prev) => ({ ...prev, [channel.url]: channel }));
110
- },
111
- [sdk],
112
- );
113
-
114
- const next = useCallback(async () => {
115
- if (queryRef.current?.hasNext) {
116
- const channels = await queryRef.current.next();
117
- setGroupChannelMap((prev) => ({ ...prev, ...arrayToMap(channels, 'url') }));
118
- if (deliveryReceiptEnabled) channels.forEach((channel) => sdk.markAsDelivered(channel.url));
119
- }
120
- }, [sdk]);
121
- // ---------- returns methods ends ---------- //
122
-
123
- return { loading, groupChannels, update, refresh, refreshing, next };
124
- };