@sendbird/uikit-chat-hooks 2.0.0 → 2.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 (32) hide show
  1. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js +14 -6
  2. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  3. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js +11 -7
  4. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  5. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +10 -14
  6. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  7. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +1 -12
  8. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  9. package/lib/commonjs/common/useMessageOutgoingStatus.js +1 -0
  10. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  11. package/lib/commonjs/common/useUserList.js +14 -4
  12. package/lib/commonjs/common/useUserList.js.map +1 -1
  13. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js +15 -7
  14. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  15. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js +11 -7
  16. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  17. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +12 -15
  18. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  19. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +2 -12
  20. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  21. package/lib/module/common/useMessageOutgoingStatus.js +1 -0
  22. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  23. package/lib/module/common/useUserList.js +14 -6
  24. package/lib/module/common/useUserList.js.map +1 -1
  25. package/lib/typescript/src/common/useUserList.d.ts +1 -1
  26. package/package.json +3 -3
  27. package/src/channel/useGroupChannelList/useGroupChannelListWithCollection.ts +20 -8
  28. package/src/channel/useGroupChannelList/useGroupChannelListWithQuery.ts +10 -7
  29. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +11 -19
  30. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +1 -10
  31. package/src/common/useMessageOutgoingStatus.ts +1 -0
  32. package/src/common/useUserList.ts +14 -3
@@ -1,4 +1,4 @@
1
- import { Optional, SendbirdChatSDK } from '@sendbird/uikit-utils';
1
+ import type { Optional, SendbirdChatSDK } from '@sendbird/uikit-utils';
2
2
  import type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';
3
3
  /**
4
4
  * Get user list from query.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-chat-hooks",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "React hooks that built with SendbirdChat SDK",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -38,7 +38,7 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@sendbird/uikit-utils": "2.0.0"
41
+ "@sendbird/uikit-utils": "2.0.2"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/react": "*",
@@ -69,5 +69,5 @@
69
69
  "readmeFile": "./README.md",
70
70
  "displayName": "@sendbird/uikit-chat-hooks"
71
71
  },
72
- "gitHead": "955f7adf0891976d8553d9c3b4c171225c775bc9"
72
+ "gitHead": "95323825da753f20b931b4a8b7e187cd8dc6284e"
73
73
  }
@@ -1,7 +1,7 @@
1
1
  import { useEffect, useRef } from 'react';
2
2
 
3
- import { GroupChannelFilter, GroupChannelListOrder } from '@sendbird/chat/groupChannel';
4
- import type { SendbirdChatSDK, SendbirdGroupChannelCollection } from '@sendbird/uikit-utils';
3
+ import { GroupChannelEventSource, GroupChannelFilter, GroupChannelListOrder } from '@sendbird/chat/groupChannel';
4
+ import type { SendbirdBaseChannel, SendbirdChatSDK, SendbirdGroupChannelCollection } from '@sendbird/uikit-utils';
5
5
  import { confirmAndMarkAsDelivered, useAsyncEffect, useFreshCallback, useUniqId } from '@sendbird/uikit-utils';
6
6
 
7
7
  import { useAppFeatures } from '../../common/useAppFeatures';
@@ -37,11 +37,23 @@ export const useGroupChannelListWithCollection: UseGroupChannelList = (sdk, user
37
37
  const { loading, groupChannels, refreshing, setChannels, deleteChannels, updateRefreshing, updateLoading } =
38
38
  useGroupChannelListReducer();
39
39
 
40
- const updateChannelsAndMarkAsDelivered = (markAsDelivered: boolean) => {
40
+ const updateChannelsAndMarkAsDelivered = (
41
+ markAsDelivered: boolean,
42
+ source?: GroupChannelEventSource,
43
+ updatedChannels?: SendbirdBaseChannel[],
44
+ ) => {
41
45
  const channels = collectionRef.current?.channels ?? [];
42
46
  setChannels(channels, true);
43
47
  if (markAsDelivered && deliveryReceiptEnabled) {
44
- channels.forEach((channel) => confirmAndMarkAsDelivered(sdk, channel));
48
+ switch (source) {
49
+ case GroupChannelEventSource.EVENT_MESSAGE_RECEIVED:
50
+ case GroupChannelEventSource.EVENT_MESSAGE_SENT:
51
+ case GroupChannelEventSource.SYNC_CHANNEL_BACKGROUND:
52
+ case GroupChannelEventSource.SYNC_CHANNEL_CHANGELOGS:
53
+ case undefined:
54
+ confirmAndMarkAsDelivered(updatedChannels ?? channels);
55
+ break;
56
+ }
45
57
  }
46
58
  };
47
59
 
@@ -52,11 +64,11 @@ export const useGroupChannelListWithCollection: UseGroupChannelList = (sdk, user
52
64
  collectionRef.current = createGroupChannelListCollection(sdk, options?.collectionCreator);
53
65
 
54
66
  collectionRef.current?.setGroupChannelCollectionHandler({
55
- onChannelsAdded: () => {
56
- updateChannelsAndMarkAsDelivered(true);
67
+ onChannelsAdded: (context, channels) => {
68
+ updateChannelsAndMarkAsDelivered(true, context.source, channels);
57
69
  },
58
- onChannelsUpdated: () => {
59
- updateChannelsAndMarkAsDelivered(true);
70
+ onChannelsUpdated: (context, channels) => {
71
+ updateChannelsAndMarkAsDelivered(true, context.source, channels);
60
72
  },
61
73
  onChannelsDeleted: () => {
62
74
  updateChannelsAndMarkAsDelivered(false);
@@ -43,7 +43,7 @@ export const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, o
43
43
 
44
44
  const updateChannelsAndMarkAsDelivered = (channels: SendbirdChannel[]) => {
45
45
  updateChannels(channels);
46
- if (deliveryReceiptEnabled) channels.forEach((channel) => confirmAndMarkAsDelivered(sdk, channel));
46
+ if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);
47
47
  };
48
48
 
49
49
  const init = useFreshCallback(async (uid?: string) => {
@@ -55,7 +55,7 @@ export const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, o
55
55
  const channels = await queryRef.current.next();
56
56
 
57
57
  setChannels(channels, true);
58
- if (deliveryReceiptEnabled) channels.forEach((channel) => confirmAndMarkAsDelivered(sdk, channel));
58
+ if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);
59
59
  }
60
60
  }
61
61
  });
@@ -67,21 +67,24 @@ export const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, o
67
67
  }, [init, userId]);
68
68
 
69
69
  useChannelHandler(sdk, HOOK_NAME, {
70
- onChannelChanged: (channel) => updateChannelsAndMarkAsDelivered([channel]),
70
+ onChannelChanged: (channel) => updateChannels([channel]),
71
71
  onChannelFrozen: (channel) => updateChannels([channel]),
72
72
  onChannelUnfrozen: (channel) => updateChannels([channel]),
73
73
  onChannelMemberCountChanged: (channels) => updateChannels(channels),
74
74
  onChannelDeleted: (url) => deleteChannels([url]),
75
- onUserJoined: (channel) => updateChannelsAndMarkAsDelivered([channel]),
75
+ onUserJoined: (channel) => updateChannels([channel]),
76
76
  onUserLeft: (channel, user) => {
77
77
  const isMe = user.userId === userId;
78
78
  if (isMe) deleteChannels([channel.url]);
79
- else updateChannelsAndMarkAsDelivered([channel]);
79
+ else updateChannels([channel]);
80
80
  },
81
81
  onUserBanned(channel, user) {
82
82
  const isMe = user.userId === userId;
83
83
  if (isMe) deleteChannels([channel.url]);
84
- else updateChannelsAndMarkAsDelivered([channel]);
84
+ else updateChannels([channel]);
85
+ },
86
+ onMessageReceived(channel) {
87
+ updateChannelsAndMarkAsDelivered([channel]);
85
88
  },
86
89
  });
87
90
 
@@ -95,7 +98,7 @@ export const useGroupChannelListWithQuery: UseGroupChannelList = (sdk, userId, o
95
98
  if (queryRef.current?.hasNext) {
96
99
  const channels = await queryRef.current.next();
97
100
  setChannels(channels, false);
98
- if (deliveryReceiptEnabled) channels.forEach((channel) => confirmAndMarkAsDelivered(sdk, channel));
101
+ if (deliveryReceiptEnabled) confirmAndMarkAsDelivered(channels);
99
102
  }
100
103
  });
101
104
 
@@ -1,21 +1,14 @@
1
1
  import { useCallback, useEffect, useRef } from 'react';
2
2
 
3
- import { MessageCollectionInitPolicy, MessageFilter } from '@sendbird/chat/groupChannel';
3
+ import { MessageCollectionInitPolicy, MessageEventSource, MessageFilter } from '@sendbird/chat/groupChannel';
4
4
  import type {
5
5
  SendbirdChannel,
6
6
  SendbirdFileMessage,
7
7
  SendbirdGroupChannel,
8
8
  SendbirdMessageCollection,
9
9
  } from '@sendbird/uikit-utils';
10
- import {
11
- Logger,
12
- confirmAndMarkAsDelivered,
13
- confirmAndMarkAsRead,
14
- isDifferentChannel,
15
- useForceUpdate,
16
- } from '@sendbird/uikit-utils';
10
+ import { Logger, confirmAndMarkAsRead, isDifferentChannel, useForceUpdate } from '@sendbird/uikit-utils';
17
11
 
18
- import { useAppFeatures } from '../../common/useAppFeatures';
19
12
  import { useChannelHandler } from '../../handler/useChannelHandler';
20
13
  import type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';
21
14
  import { useActiveGroupChannel } from '../useActiveGroupChannel';
@@ -33,8 +26,6 @@ const createMessageCollection = (
33
26
  const HOOK_NAME = 'useGroupChannelMessagesWithCollection';
34
27
 
35
28
  export const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (sdk, channel, userId, options) => {
36
- const { deliveryReceiptEnabled } = useAppFeatures(sdk);
37
-
38
29
  const collectionRef = useRef<SendbirdMessageCollection>();
39
30
 
40
31
  // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update af
@@ -57,12 +48,7 @@ export const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (s
57
48
 
58
49
  const channelMarkAs = async () => {
59
50
  try {
60
- if (deliveryReceiptEnabled) await confirmAndMarkAsDelivered(sdk, activeChannel);
61
- } catch (e) {
62
- Logger.warn(`[${HOOK_NAME}/channelMarkAs/Delivered]`, e);
63
- }
64
- try {
65
- await confirmAndMarkAsRead(sdk, [activeChannel]);
51
+ await confirmAndMarkAsRead([activeChannel]);
66
52
  } catch (e) {
67
53
  Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);
68
54
  }
@@ -84,8 +70,14 @@ export const useGroupChannelMessagesWithCollection: UseGroupChannelMessages = (s
84
70
  channelMarkAs();
85
71
 
86
72
  collectionRef.current?.setMessageCollectionHandler({
87
- onMessagesAdded: (_, channel, messages) => {
88
- channelMarkAs();
73
+ onMessagesAdded: (_, __, messages) => {
74
+ switch (_.source) {
75
+ case MessageEventSource.EVENT_MESSAGE_RECEIVED:
76
+ case MessageEventSource.EVENT_MESSAGE_SENT_SUCCESS:
77
+ case MessageEventSource.SYNC_MESSAGE_FILL:
78
+ channelMarkAs();
79
+ break;
80
+ }
89
81
  updateNextMessages(messages, false, sdk.currentUser.userId);
90
82
  updateChannel(channel);
91
83
  },
@@ -3,7 +3,6 @@ import { useCallback, useRef } from 'react';
3
3
  import type { SendbirdBaseChannel, SendbirdGroupChannel } from '@sendbird/uikit-utils';
4
4
  import {
5
5
  Logger,
6
- confirmAndMarkAsDelivered,
7
6
  confirmAndMarkAsRead,
8
7
  isDifferentChannel,
9
8
  useAsyncEffect,
@@ -11,7 +10,6 @@ import {
11
10
  } from '@sendbird/uikit-utils';
12
11
  import type { SendbirdPreviousMessageListQuery } from '@sendbird/uikit-utils';
13
12
 
14
- import { useAppFeatures } from '../../common/useAppFeatures';
15
13
  import { useChannelHandler } from '../../handler/useChannelHandler';
16
14
  import type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';
17
15
  import { useActiveGroupChannel } from '../useActiveGroupChannel';
@@ -30,8 +28,6 @@ const createMessageQuery = (
30
28
 
31
29
  const HOOK_NAME = 'useGroupChannelMessagesWithQuery';
32
30
  export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, channel, userId, options) => {
33
- const { deliveryReceiptEnabled } = useAppFeatures(sdk);
34
-
35
31
  const queryRef = useRef<SendbirdPreviousMessageListQuery>();
36
32
 
37
33
  // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update after setActiveChannel
@@ -54,12 +50,7 @@ export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, c
54
50
 
55
51
  const channelMarkAs = async () => {
56
52
  try {
57
- if (deliveryReceiptEnabled) await confirmAndMarkAsDelivered(sdk, activeChannel);
58
- } catch (e) {
59
- Logger.warn(`[${HOOK_NAME}/channelMarkAs/Delivered]`, e);
60
- }
61
- try {
62
- await confirmAndMarkAsRead(sdk, [activeChannel]);
53
+ await confirmAndMarkAsRead([channel]);
63
54
  } catch (e) {
64
55
  Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);
65
56
  }
@@ -33,6 +33,7 @@ export const useMessageOutgoingStatus = (
33
33
  },
34
34
  });
35
35
 
36
+ if (channel.isBroadcast || channel.isSuper) return 'NONE';
36
37
  if (!message) return 'NONE';
37
38
 
38
39
  if ('sendingStatus' in message) {
@@ -1,11 +1,13 @@
1
1
  import { useCallback, useMemo, useRef, useState } from 'react';
2
2
 
3
- import { Optional, SendbirdChatSDK, SendbirdUser, useAsyncEffect } from '@sendbird/uikit-utils';
3
+ import type { Optional, SendbirdChatSDK, SendbirdUser } from '@sendbird/uikit-utils';
4
+ import { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect } from '@sendbird/uikit-utils';
4
5
 
5
6
  import type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';
6
7
 
7
8
  const createUserQuery = <User>(sdk: SendbirdChatSDK, queryCreator?: UseUserListOptions<User>['queryCreator']) => {
8
9
  if (queryCreator) return queryCreator();
10
+ // In order to use the API, the option must be turned on in the dashboard.
9
11
  return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;
10
12
  };
11
13
 
@@ -57,7 +59,11 @@ export const useUserList = <
57
59
  const init = useCallback(async () => {
58
60
  query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);
59
61
  if (query.current?.hasNext) {
60
- const users = await query.current?.next();
62
+ const users = await query.current?.next().catch((err) => {
63
+ Logger.error(error);
64
+ if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
65
+ throw error;
66
+ });
61
67
  updateUsers(users, true);
62
68
  }
63
69
  }, [sdk, options?.queryCreator]);
@@ -88,7 +94,12 @@ export const useUserList = <
88
94
 
89
95
  const next = useCallback(async () => {
90
96
  if (query.current && query.current?.hasNext) {
91
- updateUsers(await query.current?.next(), false);
97
+ const nextUsers = await query.current.next().catch((err) => {
98
+ Logger.error(error);
99
+ if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);
100
+ throw error;
101
+ });
102
+ updateUsers(nextUsers, false);
92
103
  }
93
104
  }, []);
94
105