@sendbird/uikit-chat-hooks 2.4.1 → 2.4.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 (124) hide show
  1. package/README.md +2 -2
  2. package/lib/commonjs/channel/useGroupChannel.js +0 -4
  3. package/lib/commonjs/channel/useGroupChannel.js.map +1 -1
  4. package/lib/commonjs/channel/useGroupChannelList/index.js +0 -5
  5. package/lib/commonjs/channel/useGroupChannelList/index.js.map +1 -1
  6. package/lib/commonjs/channel/useGroupChannelList/reducer.js +12 -29
  7. package/lib/commonjs/channel/useGroupChannelList/reducer.js.map +1 -1
  8. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js +1 -22
  9. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  10. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js +1 -18
  11. package/lib/commonjs/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  12. package/lib/commonjs/channel/useGroupChannelMessages/index.js +0 -5
  13. package/lib/commonjs/channel/useGroupChannelMessages/index.js.map +1 -1
  14. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +18 -28
  15. package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
  16. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +8 -37
  17. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  18. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +21 -49
  19. package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  20. package/lib/commonjs/channel/useOpenChannel.js +0 -4
  21. package/lib/commonjs/channel/useOpenChannel.js.map +1 -1
  22. package/lib/commonjs/channel/useOpenChannelList/index.js +0 -3
  23. package/lib/commonjs/channel/useOpenChannelList/index.js.map +1 -1
  24. package/lib/commonjs/channel/useOpenChannelList/reducer.js +2 -21
  25. package/lib/commonjs/channel/useOpenChannelList/reducer.js.map +1 -1
  26. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +1 -18
  27. package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  28. package/lib/commonjs/channel/useOpenChannelMessages/index.js +0 -3
  29. package/lib/commonjs/channel/useOpenChannelMessages/index.js.map +1 -1
  30. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +18 -28
  31. package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +1 -1
  32. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +1 -30
  33. package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  34. package/lib/commonjs/common/useAppFeatures.js +0 -3
  35. package/lib/commonjs/common/useAppFeatures.js.map +1 -1
  36. package/lib/commonjs/common/useMessageOutgoingStatus.js +0 -11
  37. package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
  38. package/lib/commonjs/common/usePushTrigger.js +0 -6
  39. package/lib/commonjs/common/usePushTrigger.js.map +1 -1
  40. package/lib/commonjs/common/useTotalUnreadMessageCount.js +0 -7
  41. package/lib/commonjs/common/useTotalUnreadMessageCount.js.map +1 -1
  42. package/lib/commonjs/common/useUserList.js +3 -18
  43. package/lib/commonjs/common/useUserList.js.map +1 -1
  44. package/lib/commonjs/handler/useChannelHandler.js +15 -41
  45. package/lib/commonjs/handler/useChannelHandler.js.map +1 -1
  46. package/lib/commonjs/handler/useConnectionHandler.js +14 -11
  47. package/lib/commonjs/handler/useConnectionHandler.js.map +1 -1
  48. package/lib/commonjs/handler/useUserEventHandler.js +0 -8
  49. package/lib/commonjs/handler/useUserEventHandler.js.map +1 -1
  50. package/lib/commonjs/index.js +0 -23
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/model/CustomQuery.js +0 -6
  53. package/lib/commonjs/model/CustomQuery.js.map +1 -1
  54. package/lib/module/channel/useGroupChannel.js.map +1 -1
  55. package/lib/module/channel/useGroupChannelList/index.js.map +1 -1
  56. package/lib/module/channel/useGroupChannelList/reducer.js +12 -26
  57. package/lib/module/channel/useGroupChannelList/reducer.js.map +1 -1
  58. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js +1 -15
  59. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithCollection.js.map +1 -1
  60. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js +1 -11
  61. package/lib/module/channel/useGroupChannelList/useGroupChannelListWithQuery.js.map +1 -1
  62. package/lib/module/channel/useGroupChannelMessages/index.js.map +1 -1
  63. package/lib/module/channel/useGroupChannelMessages/reducer.js +18 -25
  64. package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
  65. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +9 -30
  66. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
  67. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +23 -46
  68. package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
  69. package/lib/module/channel/useOpenChannel.js.map +1 -1
  70. package/lib/module/channel/useOpenChannelList/index.js.map +1 -1
  71. package/lib/module/channel/useOpenChannelList/reducer.js +2 -18
  72. package/lib/module/channel/useOpenChannelList/reducer.js.map +1 -1
  73. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +1 -13
  74. package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
  75. package/lib/module/channel/useOpenChannelMessages/index.js.map +1 -1
  76. package/lib/module/channel/useOpenChannelMessages/reducer.js +18 -25
  77. package/lib/module/channel/useOpenChannelMessages/reducer.js.map +1 -1
  78. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +1 -25
  79. package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
  80. package/lib/module/common/useAppFeatures.js.map +1 -1
  81. package/lib/module/common/useMessageOutgoingStatus.js +0 -6
  82. package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
  83. package/lib/module/common/usePushTrigger.js.map +1 -1
  84. package/lib/module/common/useTotalUnreadMessageCount.js +0 -1
  85. package/lib/module/common/useTotalUnreadMessageCount.js.map +1 -1
  86. package/lib/module/common/useUserList.js +3 -13
  87. package/lib/module/common/useUserList.js.map +1 -1
  88. package/lib/module/handler/useChannelHandler.js +15 -35
  89. package/lib/module/handler/useChannelHandler.js.map +1 -1
  90. package/lib/module/handler/useConnectionHandler.js +15 -6
  91. package/lib/module/handler/useConnectionHandler.js.map +1 -1
  92. package/lib/module/handler/useUserEventHandler.js +0 -2
  93. package/lib/module/handler/useUserEventHandler.js.map +1 -1
  94. package/lib/module/index.js +0 -1
  95. package/lib/module/index.js.map +1 -1
  96. package/lib/module/model/CustomQuery.js +0 -4
  97. package/lib/module/model/CustomQuery.js.map +1 -1
  98. package/lib/typescript/src/channel/useGroupChannelList/reducer.d.ts +1 -1
  99. package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +2 -2
  100. package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +2 -2
  101. package/lib/typescript/src/common/useUserList.d.ts +1 -1
  102. package/lib/typescript/src/handler/useChannelHandler.d.ts +1 -1
  103. package/lib/typescript/src/handler/useConnectionHandler.d.ts +1 -2
  104. package/lib/typescript/src/index.d.ts +0 -1
  105. package/package.json +15 -9
  106. package/src/channel/useGroupChannelList/reducer.ts +11 -7
  107. package/src/channel/useGroupChannelList/useGroupChannelListWithCollection.ts +1 -1
  108. package/src/channel/useGroupChannelList/useGroupChannelListWithQuery.ts +1 -1
  109. package/src/channel/useGroupChannelMessages/reducer.ts +11 -10
  110. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +69 -72
  111. package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +32 -42
  112. package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +1 -1
  113. package/src/channel/useOpenChannelMessages/reducer.ts +11 -10
  114. package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +1 -1
  115. package/src/common/useUserList.ts +2 -2
  116. package/src/handler/useChannelHandler.ts +11 -24
  117. package/src/handler/useConnectionHandler.ts +11 -5
  118. package/src/index.ts +0 -1
  119. package/lib/commonjs/common/useTotalUnreadChannelCount.js +0 -29
  120. package/lib/commonjs/common/useTotalUnreadChannelCount.js.map +0 -1
  121. package/lib/module/common/useTotalUnreadChannelCount.js +0 -17
  122. package/lib/module/common/useTotalUnreadChannelCount.js.map +0 -1
  123. package/lib/typescript/src/common/useTotalUnreadChannelCount.d.ts +0 -6
  124. package/src/common/useTotalUnreadChannelCount.ts +0 -26
@@ -1,4 +1,4 @@
1
- import { useCallback, useRef } from 'react';
1
+ import { useRef } from 'react';
2
2
 
3
3
  import type {
4
4
  SendbirdBaseChannel,
@@ -11,6 +11,7 @@ import {
11
11
  isDifferentChannel,
12
12
  useAsyncEffect,
13
13
  useForceUpdate,
14
+ useFreshCallback,
14
15
  useUniqHandlerId,
15
16
  } from '@sendbird/uikit-utils';
16
17
 
@@ -57,20 +58,17 @@ export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, c
57
58
  }
58
59
  };
59
60
 
60
- const init = useCallback(
61
- async (uid?: string) => {
62
- if (uid) {
63
- queryRef.current = createMessageQuery(channel, options?.queryCreator);
64
- channelMarkAsRead();
65
- if (queryRef.current?.hasNext) {
66
- const list = await queryRef.current?.load();
67
- updateMessages(list, true, sdk.currentUser.userId);
68
- }
69
- updateNextMessages([], true, sdk.currentUser.userId);
61
+ const init = useFreshCallback(async (uid?: string) => {
62
+ if (uid) {
63
+ queryRef.current = createMessageQuery(channel, options?.queryCreator);
64
+ channelMarkAsRead();
65
+ if (queryRef.current?.hasNext) {
66
+ const list = await queryRef.current?.load();
67
+ updateMessages(list, true, sdk.currentUser.userId);
70
68
  }
71
- },
72
- [sdk, channel.url, options?.queryCreator],
73
- );
69
+ updateNextMessages([], true, sdk.currentUser.userId);
70
+ }
71
+ });
74
72
 
75
73
  const channelUpdater = (channel: SendbirdBaseChannel) => {
76
74
  if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {
@@ -130,29 +128,29 @@ export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, c
130
128
  updateLoading(true);
131
129
  await init(userId);
132
130
  updateLoading(false);
133
- }, [init, userId]);
131
+ }, [channel.url, userId]);
134
132
 
135
- const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useCallback(async () => {
133
+ const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useFreshCallback(async () => {
136
134
  updateRefreshing(true);
137
135
  await init(userId);
138
136
  updateRefreshing(false);
139
- }, [init, userId]);
137
+ });
140
138
 
141
- const prev: ReturnType<UseGroupChannelMessages>['prev'] = useCallback(async () => {
139
+ const prev: ReturnType<UseGroupChannelMessages>['prev'] = useFreshCallback(async () => {
142
140
  if (queryRef.current && queryRef.current?.hasNext) {
143
141
  const list = await queryRef.current?.load();
144
142
  updateMessages(list, false, sdk.currentUser.userId);
145
143
  }
146
- }, []);
144
+ });
147
145
 
148
- const next: ReturnType<UseGroupChannelMessages>['next'] = useCallback(async () => {
146
+ const next: ReturnType<UseGroupChannelMessages>['next'] = useFreshCallback(async () => {
149
147
  if (nextMessages.length > 0) {
150
148
  updateMessages(nextMessages, false, sdk.currentUser.userId);
151
149
  updateNextMessages([], true, sdk.currentUser.userId);
152
150
  }
153
- }, [nextMessages.length]);
151
+ });
154
152
 
155
- const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useCallback(
153
+ const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useFreshCallback(
156
154
  (params, onPending) => {
157
155
  return new Promise((resolve, reject) => {
158
156
  channel
@@ -175,9 +173,8 @@ export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, c
175
173
  });
176
174
  });
177
175
  },
178
- [channel],
179
176
  );
180
- const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useCallback(
177
+ const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useFreshCallback(
181
178
  (params, onPending) => {
182
179
  return new Promise((resolve, reject) => {
183
180
  channel
@@ -200,25 +197,22 @@ export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, c
200
197
  });
201
198
  });
202
199
  },
203
- [channel],
204
200
  );
205
- const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useCallback(
201
+ const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useFreshCallback(
206
202
  async (messageId, params) => {
207
203
  const updatedMessage = await channel.updateUserMessage(messageId, params);
208
204
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
209
205
  return updatedMessage;
210
206
  },
211
- [channel],
212
207
  );
213
- const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useCallback(
208
+ const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useFreshCallback(
214
209
  async (messageId, params) => {
215
210
  const updatedMessage = await channel.updateFileMessage(messageId, params);
216
211
  updateMessages([updatedMessage], false, sdk.currentUser.userId);
217
212
  return updatedMessage;
218
213
  },
219
- [channel],
220
214
  );
221
- const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useCallback(
215
+ const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useFreshCallback(
222
216
  async (failedMessage) => {
223
217
  const message = await (() => {
224
218
  if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);
@@ -228,19 +222,15 @@ export const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, c
228
222
 
229
223
  if (message) updateNextMessages([message], false, sdk.currentUser.userId);
230
224
  },
231
- [channel],
232
- );
233
- const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useCallback(
234
- async (message) => {
235
- if (message.sendingStatus === 'succeeded') {
236
- if (message.isUserMessage()) await channel.deleteMessage(message);
237
- if (message.isFileMessage()) await channel.deleteMessage(message);
238
- } else {
239
- deleteMessages([message.messageId], [message.reqId]);
240
- }
241
- },
242
- [channel],
243
225
  );
226
+ const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useFreshCallback(async (message) => {
227
+ if (message.sendingStatus === 'succeeded') {
228
+ if (message.isUserMessage()) await channel.deleteMessage(message);
229
+ if (message.isFileMessage()) await channel.deleteMessage(message);
230
+ } else {
231
+ deleteMessages([message.messageId], [message.reqId]);
232
+ }
233
+ });
244
234
 
245
235
  return {
246
236
  loading,
@@ -79,7 +79,7 @@ export const useOpenChannelListWithQuery: UseOpenChannelList = (sdk, userId, opt
79
79
  } finally {
80
80
  updateLoading(false);
81
81
  }
82
- }, [init, userId]);
82
+ }, [userId]);
83
83
 
84
84
  const refresh = useFreshCallback(async () => {
85
85
  updateRefreshing(true);
@@ -12,7 +12,7 @@ type Action =
12
12
  }
13
13
  | {
14
14
  type: 'update_messages' | 'update_next_messages';
15
- value: { messages: SendbirdBaseMessage[]; clearPrev: boolean; currentUserId?: string };
15
+ value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };
16
16
  }
17
17
  | {
18
18
  type: 'delete_messages' | 'delete_next_messages';
@@ -28,18 +28,19 @@ type State = {
28
28
 
29
29
  const defaultReducer = ({ ...draft }: State, action: Action) => {
30
30
  switch (action.type) {
31
- case 'update_refreshing':
31
+ case 'update_refreshing': {
32
+ draft['refreshing'] = action.value.status;
33
+ return draft;
34
+ }
32
35
  case 'update_loading': {
33
- const key = action.type === 'update_loading' ? 'loading' : 'refreshing';
34
- draft[key] = action.value.status;
35
-
36
+ draft['loading'] = action.value.status;
36
37
  return draft;
37
38
  }
38
39
  case 'update_messages':
39
40
  case 'update_next_messages': {
40
41
  const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
41
42
  const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
42
- if (action.value.clearPrev) {
43
+ if (action.value.clearBeforeAction) {
43
44
  draft[key] = receivedMessagesAsMap;
44
45
  } else {
45
46
  draft[key] = { ...draft[key], ...receivedMessagesAsMap };
@@ -82,14 +83,14 @@ export const useOpenChannelMessagesReducer = (
82
83
  nextMessageMap: {},
83
84
  });
84
85
 
85
- const updateMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {
86
- dispatch({ type: 'update_messages', value: { messages, clearPrev, currentUserId } });
86
+ const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {
87
+ dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });
87
88
  };
88
89
  const deleteMessages = (messageIds: number[], reqIds: string[]) => {
89
90
  dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });
90
91
  };
91
- const updateNextMessages = (messages: SendbirdBaseMessage[], clearPrev: boolean, currentUserId?: string) => {
92
- dispatch({ type: 'update_next_messages', value: { messages, clearPrev, currentUserId } });
92
+ const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {
93
+ dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });
93
94
  };
94
95
  const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {
95
96
  dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });
@@ -124,7 +124,7 @@ export const useOpenChannelMessagesWithQuery: UseOpenChannelMessages = (sdk, cha
124
124
  return () => {
125
125
  channel.exit().catch(NOOP);
126
126
  };
127
- }, [init, userId]);
127
+ }, [channel.url, userId]);
128
128
 
129
129
  const refresh: ReturnType<UseOpenChannelMessages>['refresh'] = useFreshCallback(async () => {
130
130
  updateRefreshing(true);
@@ -36,7 +36,7 @@ const createUserQuery = <User extends UserStruct>(
36
36
  * ```
37
37
  * */
38
38
  export const useUserList = <
39
- Options extends UseUserListOptions<QueriedUser>,
39
+ Options extends UseUserListOptions<UserStruct>,
40
40
  QueriedUser extends UserStruct = Options['queryCreator'] extends Optional<
41
41
  () => CustomQueryInterface<infer User extends UserStruct>
42
42
  >
@@ -44,7 +44,7 @@ export const useUserList = <
44
44
  : SendbirdUser,
45
45
  >(
46
46
  sdk: SendbirdChatSDK,
47
- options?: Options,
47
+ options?: UseUserListOptions<QueriedUser>,
48
48
  ): UseUserListReturn<QueriedUser> => {
49
49
  const query = useRef<CustomQueryInterface<QueriedUser>>();
50
50
 
@@ -2,26 +2,15 @@ import { useEffect, useLayoutEffect, useRef } from 'react';
2
2
 
3
3
  import { GroupChannelHandler } from '@sendbird/chat/groupChannel';
4
4
  import { OpenChannelHandler } from '@sendbird/chat/openChannel';
5
- import { Logger, SendbirdChatSDK } from '@sendbird/uikit-utils';
5
+ import type { SendbirdChatSDK } from '@sendbird/uikit-utils';
6
6
 
7
7
  type ChannelType = 'open' | 'group';
8
8
 
9
- function getChannelHandler(type: ChannelType) {
10
- switch (type) {
11
- case 'open': {
12
- return new OpenChannelHandler();
13
- }
14
- case 'group':
15
- default: {
16
- return new GroupChannelHandler();
17
- }
18
- }
19
- }
20
9
  export const useChannelHandler = <T extends ChannelType = 'group'>(
21
10
  sdk: SendbirdChatSDK,
22
11
  handlerId: string,
23
12
  hookHandler: Partial<T extends 'group' ? GroupChannelHandler : OpenChannelHandler>,
24
- type = 'group' as T,
13
+ type: T = 'group' as T,
25
14
  ) => {
26
15
  const handlerRef = useRef(hookHandler);
27
16
  useLayoutEffect(() => {
@@ -29,21 +18,19 @@ export const useChannelHandler = <T extends ChannelType = 'group'>(
29
18
  });
30
19
 
31
20
  useEffect(() => {
32
- Logger.debug('[useChannelHandler] hook called by', handlerId);
33
-
34
- const handler = getChannelHandler(type);
35
- const handlerKeys = Object.keys(handler) as (keyof typeof handler)[];
36
- handlerKeys.forEach((key) => {
37
- handler[key] = (...args: unknown[]) => {
21
+ const handlerMapper = <T extends GroupChannelHandler | OpenChannelHandler>(handler: T): T => {
22
+ const handlerKeys = Object.keys(handler) as (keyof T)[];
23
+ handlerKeys.forEach((key) => {
38
24
  // @ts-ignore
39
- handlerRef.current[key]?.(...args);
40
- };
41
- });
25
+ handler[key] = (...args: unknown[]) => handlerRef.current?.[key]?.(...args);
26
+ });
27
+ return handler;
28
+ };
42
29
 
43
30
  if (type === 'group') {
44
- sdk.groupChannel.addGroupChannelHandler(handlerId, handler);
31
+ sdk.groupChannel.addGroupChannelHandler(handlerId, handlerMapper(new GroupChannelHandler()));
45
32
  } else if (type === 'open') {
46
- sdk.openChannel.addOpenChannelHandler(handlerId, handler);
33
+ sdk.openChannel.addOpenChannelHandler(handlerId, handlerMapper(new OpenChannelHandler()));
47
34
  }
48
35
 
49
36
  return () => {
@@ -1,4 +1,4 @@
1
- import React, { useEffect } from 'react';
1
+ import { useEffect, useLayoutEffect, useRef } from 'react';
2
2
 
3
3
  import { ConnectionHandler } from '@sendbird/chat';
4
4
  import { Logger, SendbirdChatSDK } from '@sendbird/uikit-utils';
@@ -7,19 +7,25 @@ export const useConnectionHandler = (
7
7
  sdk: SendbirdChatSDK,
8
8
  handlerId: string,
9
9
  hookHandler: Partial<ConnectionHandler>,
10
- deps: React.DependencyList = [],
11
10
  ) => {
11
+ const handlerRef = useRef<Partial<ConnectionHandler>>();
12
+ useLayoutEffect(() => {
13
+ handlerRef.current = hookHandler;
14
+ });
15
+
12
16
  useEffect(() => {
13
17
  Logger.info('[useConnectionHandler]', handlerId);
14
18
 
15
19
  const handler = new ConnectionHandler();
16
20
  const handlerKeys = Object.keys(handler) as (keyof typeof handler)[];
17
21
  handlerKeys.forEach((key) => {
18
- // @ts-ignore
19
- if (hookHandler[key]) handler[key] = hookHandler[key];
22
+ handler[key] = (...args: unknown[]) => {
23
+ // @ts-ignore
24
+ handlerRef.current[key]?.(...args);
25
+ };
20
26
  });
21
27
 
22
28
  sdk.addConnectionHandler(handlerId, handler);
23
29
  return () => sdk.removeConnectionHandler(handlerId);
24
- }, [sdk, handlerId, ...deps]);
30
+ }, [sdk, handlerId]);
25
31
  };
package/src/index.ts CHANGED
@@ -9,7 +9,6 @@ export { useOpenChannel } from './channel/useOpenChannel';
9
9
  export { useAppFeatures } from './common/useAppFeatures';
10
10
  export { useMessageOutgoingStatus } from './common/useMessageOutgoingStatus';
11
11
  export { usePushTrigger } from './common/usePushTrigger';
12
- export { useTotalUnreadChannelCount } from './common/useTotalUnreadChannelCount';
13
12
  export { useTotalUnreadMessageCount } from './common/useTotalUnreadMessageCount';
14
13
  export { useUserList } from './common/useUserList';
15
14
 
@@ -1,29 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useTotalUnreadChannelCount = void 0;
7
-
8
- var _react = require("react");
9
-
10
- var _uikitUtils = require("@sendbird/uikit-utils");
11
-
12
- var _useUserEventHandler = require("../handler/useUserEventHandler");
13
-
14
- const useTotalUnreadChannelCount = (sdk, params) => {
15
- const handlerId = (0, _uikitUtils.useUniqHandlerId)('useTotalUnreadChannelCount');
16
- const [unreadChannelCount, setUnreadChannelCount] = (0, _react.useState)(0);
17
- (0, _uikitUtils.useAsyncEffect)(async () => {
18
- setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());
19
- }, [sdk]);
20
- (0, _useUserEventHandler.useUserEventHandler)(sdk, handlerId, {
21
- onTotalUnreadMessageCountUpdated: async () => {
22
- setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());
23
- }
24
- });
25
- return (0, _uikitUtils.truncatedCount)(unreadChannelCount, params === null || params === void 0 ? void 0 : params.maxCount);
26
- };
27
-
28
- exports.useTotalUnreadChannelCount = useTotalUnreadChannelCount;
29
- //# sourceMappingURL=useTotalUnreadChannelCount.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useTotalUnreadChannelCount","sdk","params","handlerId","useUniqHandlerId","unreadChannelCount","setUnreadChannelCount","useState","useAsyncEffect","groupChannel","getTotalUnreadChannelCount","useUserEventHandler","onTotalUnreadMessageCountUpdated","truncatedCount","maxCount"],"sources":["useTotalUnreadChannelCount.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport type { SendbirdChatSDK } from '@sendbird/uikit-utils';\nimport { truncatedCount, useAsyncEffect, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport { useUserEventHandler } from '../handler/useUserEventHandler';\n\ntype Params = {\n maxCount?: number;\n};\nexport const useTotalUnreadChannelCount = (sdk: SendbirdChatSDK, params?: Params) => {\n const handlerId = useUniqHandlerId('useTotalUnreadChannelCount');\n const [unreadChannelCount, setUnreadChannelCount] = useState(0);\n\n useAsyncEffect(async () => {\n setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());\n }, [sdk]);\n\n useUserEventHandler(sdk, handlerId, {\n onTotalUnreadMessageCountUpdated: async () => {\n setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());\n },\n });\n\n return truncatedCount(unreadChannelCount, params?.maxCount);\n};\n"],"mappings":";;;;;;;AAAA;;AAGA;;AAEA;;AAKO,MAAMA,0BAA0B,GAAG,CAACC,GAAD,EAAuBC,MAAvB,KAA2C;EACnF,MAAMC,SAAS,GAAG,IAAAC,4BAAA,EAAiB,4BAAjB,CAAlB;EACA,MAAM,CAACC,kBAAD,EAAqBC,qBAArB,IAA8C,IAAAC,eAAA,EAAS,CAAT,CAApD;EAEA,IAAAC,0BAAA,EAAe,YAAY;IACzBF,qBAAqB,CAAC,MAAML,GAAG,CAACQ,YAAJ,CAAiBC,0BAAjB,EAAP,CAArB;EACD,CAFD,EAEG,CAACT,GAAD,CAFH;EAIA,IAAAU,wCAAA,EAAoBV,GAApB,EAAyBE,SAAzB,EAAoC;IAClCS,gCAAgC,EAAE,YAAY;MAC5CN,qBAAqB,CAAC,MAAML,GAAG,CAACQ,YAAJ,CAAiBC,0BAAjB,EAAP,CAArB;IACD;EAHiC,CAApC;EAMA,OAAO,IAAAG,0BAAA,EAAeR,kBAAf,EAAmCH,MAAnC,aAAmCA,MAAnC,uBAAmCA,MAAM,CAAEY,QAA3C,CAAP;AACD,CAfM"}
@@ -1,17 +0,0 @@
1
- import { useState } from 'react';
2
- import { truncatedCount, useAsyncEffect, useUniqHandlerId } from '@sendbird/uikit-utils';
3
- import { useUserEventHandler } from '../handler/useUserEventHandler';
4
- export const useTotalUnreadChannelCount = (sdk, params) => {
5
- const handlerId = useUniqHandlerId('useTotalUnreadChannelCount');
6
- const [unreadChannelCount, setUnreadChannelCount] = useState(0);
7
- useAsyncEffect(async () => {
8
- setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());
9
- }, [sdk]);
10
- useUserEventHandler(sdk, handlerId, {
11
- onTotalUnreadMessageCountUpdated: async () => {
12
- setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());
13
- }
14
- });
15
- return truncatedCount(unreadChannelCount, params === null || params === void 0 ? void 0 : params.maxCount);
16
- };
17
- //# sourceMappingURL=useTotalUnreadChannelCount.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useState","truncatedCount","useAsyncEffect","useUniqHandlerId","useUserEventHandler","useTotalUnreadChannelCount","sdk","params","handlerId","unreadChannelCount","setUnreadChannelCount","groupChannel","getTotalUnreadChannelCount","onTotalUnreadMessageCountUpdated","maxCount"],"sources":["useTotalUnreadChannelCount.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport type { SendbirdChatSDK } from '@sendbird/uikit-utils';\nimport { truncatedCount, useAsyncEffect, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport { useUserEventHandler } from '../handler/useUserEventHandler';\n\ntype Params = {\n maxCount?: number;\n};\nexport const useTotalUnreadChannelCount = (sdk: SendbirdChatSDK, params?: Params) => {\n const handlerId = useUniqHandlerId('useTotalUnreadChannelCount');\n const [unreadChannelCount, setUnreadChannelCount] = useState(0);\n\n useAsyncEffect(async () => {\n setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());\n }, [sdk]);\n\n useUserEventHandler(sdk, handlerId, {\n onTotalUnreadMessageCountUpdated: async () => {\n setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());\n },\n });\n\n return truncatedCount(unreadChannelCount, params?.maxCount);\n};\n"],"mappings":"AAAA,SAASA,QAAT,QAAyB,OAAzB;AAGA,SAASC,cAAT,EAAyBC,cAAzB,EAAyCC,gBAAzC,QAAiE,uBAAjE;AAEA,SAASC,mBAAT,QAAoC,gCAApC;AAKA,OAAO,MAAMC,0BAA0B,GAAG,CAACC,GAAD,EAAuBC,MAAvB,KAA2C;EACnF,MAAMC,SAAS,GAAGL,gBAAgB,CAAC,4BAAD,CAAlC;EACA,MAAM,CAACM,kBAAD,EAAqBC,qBAArB,IAA8CV,QAAQ,CAAC,CAAD,CAA5D;EAEAE,cAAc,CAAC,YAAY;IACzBQ,qBAAqB,CAAC,MAAMJ,GAAG,CAACK,YAAJ,CAAiBC,0BAAjB,EAAP,CAArB;EACD,CAFa,EAEX,CAACN,GAAD,CAFW,CAAd;EAIAF,mBAAmB,CAACE,GAAD,EAAME,SAAN,EAAiB;IAClCK,gCAAgC,EAAE,YAAY;MAC5CH,qBAAqB,CAAC,MAAMJ,GAAG,CAACK,YAAJ,CAAiBC,0BAAjB,EAAP,CAArB;IACD;EAHiC,CAAjB,CAAnB;EAMA,OAAOX,cAAc,CAACQ,kBAAD,EAAqBF,MAArB,aAAqBA,MAArB,uBAAqBA,MAAM,CAAEO,QAA7B,CAArB;AACD,CAfM"}
@@ -1,6 +0,0 @@
1
- import type { SendbirdChatSDK } from '@sendbird/uikit-utils';
2
- type Params = {
3
- maxCount?: number;
4
- };
5
- export declare const useTotalUnreadChannelCount: (sdk: SendbirdChatSDK, params?: Params) => string;
6
- export {};
@@ -1,26 +0,0 @@
1
- import { useState } from 'react';
2
-
3
- import type { SendbirdChatSDK } from '@sendbird/uikit-utils';
4
- import { truncatedCount, useAsyncEffect, useUniqHandlerId } from '@sendbird/uikit-utils';
5
-
6
- import { useUserEventHandler } from '../handler/useUserEventHandler';
7
-
8
- type Params = {
9
- maxCount?: number;
10
- };
11
- export const useTotalUnreadChannelCount = (sdk: SendbirdChatSDK, params?: Params) => {
12
- const handlerId = useUniqHandlerId('useTotalUnreadChannelCount');
13
- const [unreadChannelCount, setUnreadChannelCount] = useState(0);
14
-
15
- useAsyncEffect(async () => {
16
- setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());
17
- }, [sdk]);
18
-
19
- useUserEventHandler(sdk, handlerId, {
20
- onTotalUnreadMessageCountUpdated: async () => {
21
- setUnreadChannelCount(await sdk.groupChannel.getTotalUnreadChannelCount());
22
- },
23
- });
24
-
25
- return truncatedCount(unreadChannelCount, params?.maxCount);
26
- };