@sendbird/uikit-react-native 1.1.2 → 2.0.0-rc.0

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 (105) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/components/ChatFlatList.js +10 -8
  3. package/lib/commonjs/components/ChatFlatList.js.map +1 -1
  4. package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +3 -1
  5. package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
  6. package/lib/commonjs/containers/SendbirdUIKitContainer.js +12 -15
  7. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
  8. package/lib/commonjs/contexts/SendbirdChat.js +9 -9
  9. package/lib/commonjs/contexts/SendbirdChat.js.map +1 -1
  10. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js +4 -4
  11. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
  12. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  13. package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js +4 -2
  14. package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
  15. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +4 -2
  16. package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  17. package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js +9 -11
  18. package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
  19. package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -1
  20. package/lib/commonjs/fragments/createGroupChannelCreateFragment.js +7 -6
  21. package/lib/commonjs/fragments/createGroupChannelCreateFragment.js.map +1 -1
  22. package/lib/commonjs/fragments/createGroupChannelFragment.js +12 -12
  23. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  24. package/lib/commonjs/fragments/createGroupChannelMembersFragment.js +4 -4
  25. package/lib/commonjs/fragments/createGroupChannelMembersFragment.js.map +1 -1
  26. package/lib/commonjs/hooks/useConnection.js +35 -34
  27. package/lib/commonjs/hooks/useConnection.js.map +1 -1
  28. package/lib/commonjs/hooks/usePushTokenRegistration.js +2 -2
  29. package/lib/commonjs/hooks/usePushTokenRegistration.js.map +1 -1
  30. package/lib/commonjs/index.js +10 -1
  31. package/lib/commonjs/index.js.map +1 -1
  32. package/lib/commonjs/libs/InternalLocalCacheStorage.js +8 -0
  33. package/lib/commonjs/libs/InternalLocalCacheStorage.js.map +1 -1
  34. package/lib/commonjs/platform/createFileService.native.js +1 -3
  35. package/lib/commonjs/platform/createFileService.native.js.map +1 -1
  36. package/lib/commonjs/version.js +1 -1
  37. package/lib/commonjs/version.js.map +1 -1
  38. package/lib/module/components/ChatFlatList.js +10 -8
  39. package/lib/module/components/ChatFlatList.js.map +1 -1
  40. package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +3 -1
  41. package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
  42. package/lib/module/containers/SendbirdUIKitContainer.js +10 -15
  43. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
  44. package/lib/module/contexts/SendbirdChat.js +10 -10
  45. package/lib/module/contexts/SendbirdChat.js.map +1 -1
  46. package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js +5 -5
  47. package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
  48. package/lib/module/domain/groupChannel/types.js.map +1 -1
  49. package/lib/module/domain/groupChannelList/component/GroupChannelListList.js +3 -2
  50. package/lib/module/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
  51. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +3 -2
  52. package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
  53. package/lib/module/domain/groupChannelSettings/module/moduleContext.js +9 -11
  54. package/lib/module/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
  55. package/lib/module/domain/groupChannelUserList/types.js.map +1 -1
  56. package/lib/module/fragments/createGroupChannelCreateFragment.js +7 -6
  57. package/lib/module/fragments/createGroupChannelCreateFragment.js.map +1 -1
  58. package/lib/module/fragments/createGroupChannelFragment.js +12 -12
  59. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  60. package/lib/module/fragments/createGroupChannelMembersFragment.js +4 -4
  61. package/lib/module/fragments/createGroupChannelMembersFragment.js.map +1 -1
  62. package/lib/module/hooks/useConnection.js +35 -35
  63. package/lib/module/hooks/useConnection.js.map +1 -1
  64. package/lib/module/hooks/usePushTokenRegistration.js +2 -2
  65. package/lib/module/hooks/usePushTokenRegistration.js.map +1 -1
  66. package/lib/module/index.js +1 -0
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/module/libs/InternalLocalCacheStorage.js +7 -0
  69. package/lib/module/libs/InternalLocalCacheStorage.js.map +1 -1
  70. package/lib/module/platform/createFileService.native.js +1 -2
  71. package/lib/module/platform/createFileService.native.js.map +1 -1
  72. package/lib/module/version.js +1 -1
  73. package/lib/module/version.js.map +1 -1
  74. package/lib/typescript/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.d.ts +2 -2
  75. package/lib/typescript/src/components/MessageRenderer/index.d.ts +1 -1
  76. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  77. package/lib/typescript/src/contexts/SendbirdChat.d.ts +1 -1
  78. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/index.d.ts +3 -3
  79. package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +6 -6
  80. package/lib/typescript/src/domain/groupChannel/types.d.ts +3 -3
  81. package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +2 -2
  82. package/lib/typescript/src/hooks/useContext.d.ts +5 -5
  83. package/lib/typescript/src/index.d.ts +1 -0
  84. package/lib/typescript/src/libs/InternalLocalCacheStorage.d.ts +2 -0
  85. package/lib/typescript/src/version.d.ts +1 -1
  86. package/package.json +8 -8
  87. package/src/components/ChatFlatList.tsx +5 -4
  88. package/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.tsx +5 -3
  89. package/src/containers/SendbirdUIKitContainer.tsx +13 -9
  90. package/src/contexts/SendbirdChat.tsx +18 -13
  91. package/src/domain/groupChannel/component/GroupChannelInput/index.tsx +5 -5
  92. package/src/domain/groupChannel/types.ts +6 -6
  93. package/src/domain/groupChannelList/component/GroupChannelListList.tsx +3 -2
  94. package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +3 -2
  95. package/src/domain/groupChannelSettings/module/moduleContext.tsx +7 -15
  96. package/src/domain/groupChannelUserList/types.ts +3 -3
  97. package/src/fragments/createGroupChannelCreateFragment.tsx +8 -7
  98. package/src/fragments/createGroupChannelFragment.tsx +4 -12
  99. package/src/fragments/createGroupChannelMembersFragment.tsx +4 -3
  100. package/src/hooks/useConnection.ts +40 -43
  101. package/src/hooks/usePushTokenRegistration.ts +2 -2
  102. package/src/index.ts +1 -0
  103. package/src/libs/InternalLocalCacheStorage.ts +5 -0
  104. package/src/platform/createFileService.native.ts +1 -2
  105. package/src/version.ts +1 -1
@@ -1,8 +1,10 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
2
  import { Platform } from 'react-native';
3
3
  import { SafeAreaProvider } from 'react-native-safe-area-context';
4
- import Sendbird from 'sendbird';
5
4
 
5
+ import Sendbird from '@sendbird/chat';
6
+ import { GroupChannelModule } from '@sendbird/chat/groupChannel';
7
+ import { OpenChannelModule } from '@sendbird/chat/openChannel';
6
8
  import type { HeaderStyleContextType, UIKitTheme } from '@sendbird/uikit-react-native-foundation';
7
9
  import {
8
10
  DialogProvider,
@@ -87,23 +89,25 @@ const SendbirdUIKitContainer = ({
87
89
  const getSendbirdSDK = () => {
88
90
  let sdk: SendbirdChatSDK;
89
91
 
90
- if (chatOptions?.localCacheStorage) {
91
- sdk = new Sendbird({ appId, localCacheEnabled: true });
92
- sdk.useAsyncStorageAsDatabase(new InternalLocalCacheStorage(chatOptions.localCacheStorage));
93
- } else {
94
- sdk = new Sendbird({ appId });
95
- }
92
+ sdk = Sendbird.init({
93
+ appId,
94
+ modules: [new GroupChannelModule(), new OpenChannelModule()],
95
+ localCacheEnabled: Boolean(chatOptions?.localCacheStorage),
96
+ // @ts-ignore
97
+ useAsyncStorageStore: chatOptions?.localCacheStorage
98
+ ? new InternalLocalCacheStorage(chatOptions.localCacheStorage)
99
+ : undefined,
100
+ });
96
101
 
97
102
  if (chatOptions?.onInitialized) {
98
103
  sdk = chatOptions?.onInitialized(sdk);
99
104
  }
100
105
 
101
106
  if (SendbirdUIKit.VERSION) {
102
- // @ts-ignore
103
107
  sdk.addExtension('sb_uikit', SendbirdUIKit.VERSION);
104
108
  }
109
+
105
110
  if (SendbirdUIKit.PLATFORM) {
106
- // @ts-ignore
107
111
  sdk.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);
108
112
  }
109
113
 
@@ -2,8 +2,13 @@ import React, { useCallback, useEffect, useState } from 'react';
2
2
  import { AppState, AppStateStatus } from 'react-native';
3
3
 
4
4
  import { useAppFeatures } from '@sendbird/uikit-chat-hooks';
5
- import type { SendbirdChatSDK, SendbirdGroupChannel, SendbirdUser } from '@sendbird/uikit-utils';
6
- import { useForceUpdate } from '@sendbird/uikit-utils';
5
+ import type {
6
+ SendbirdChatSDK,
7
+ SendbirdGroupChannel,
8
+ SendbirdUser,
9
+ SendbirdUserUpdateParams,
10
+ } from '@sendbird/uikit-utils';
11
+ import { confirmAndMarkAsDelivered, useForceUpdate } from '@sendbird/uikit-utils';
7
12
 
8
13
  import type { FileType } from '../platform/types';
9
14
 
@@ -21,7 +26,7 @@ type Context = {
21
26
  setCurrentUser: React.Dispatch<React.SetStateAction<SendbirdUser | undefined>>;
22
27
 
23
28
  // helper functions
24
- updateCurrentUserInfo: (nickname: string, profile?: string | FileType) => Promise<SendbirdUser>;
29
+ updateCurrentUserInfo: (nickname?: string, profile?: string | FileType) => Promise<SendbirdUser>;
25
30
  markAsDeliveredWithChannel: (channel: SendbirdGroupChannel) => void;
26
31
 
27
32
  features: {
@@ -62,16 +67,18 @@ export const SendbirdChatProvider = ({
62
67
 
63
68
  if (!user) throw new Error('Current user is not defined, please connect using `useConnection()` hook first');
64
69
 
65
- if (typeof profile === 'undefined') {
66
- user = await sdkInstance.updateCurrentUserInfo(nickname, sdkInstance.currentUser.profileUrl);
67
- } else if (typeof profile === 'string') {
68
- user = await sdkInstance.updateCurrentUserInfo(nickname, profile);
70
+ const params: SendbirdUserUpdateParams = { nickname };
71
+
72
+ if (typeof profile === 'string') {
73
+ params.profileUrl = profile;
69
74
  } else if (typeof profile === 'object') {
70
- user = await sdkInstance.updateCurrentUserInfoWithProfileImage(nickname, profile);
75
+ params.profileImage = profile;
71
76
  } else {
72
77
  throw new Error(`Cannot update profile, not supported profile type(${typeof profile})`);
73
78
  }
74
79
 
80
+ user = await sdkInstance.updateCurrentUserInfo(params);
81
+
75
82
  setCurrentUser(user);
76
83
  return user;
77
84
  },
@@ -80,9 +87,7 @@ export const SendbirdChatProvider = ({
80
87
 
81
88
  const markAsDeliveredWithChannel: Context['markAsDeliveredWithChannel'] = useCallback(
82
89
  (channel: SendbirdGroupChannel) => {
83
- if (appFeatures.deliveryReceiptEnabled && channel.unreadMessageCount > 0) {
84
- sdkInstance.markAsDelivered(channel.url);
85
- }
90
+ if (appFeatures.deliveryReceiptEnabled) confirmAndMarkAsDelivered(sdkInstance, channel);
86
91
  },
87
92
  [sdkInstance, appFeatures.deliveryReceiptEnabled],
88
93
  );
@@ -90,8 +95,8 @@ export const SendbirdChatProvider = ({
90
95
  useEffect(() => {
91
96
  const listener = (status: AppStateStatus) => {
92
97
  // 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
93
- if (status === 'active') sdkInstance.getConnectionState() === 'CLOSED' && sdkInstance.setForegroundState();
94
- else sdkInstance.getConnectionState() === 'OPEN' && sdkInstance.setBackgroundState();
98
+ if (status === 'active') sdkInstance.connectionState === 'CLOSED' && sdkInstance.setForegroundState();
99
+ else sdkInstance.connectionState === 'OPEN' && sdkInstance.setBackgroundState();
95
100
  };
96
101
 
97
102
  const subscriber = AppState.addEventListener('change', listener);
@@ -3,7 +3,7 @@ import { KeyboardAvoidingView, Platform, View } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
5
  import { useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
6
- import { groupChannelChatUnavailable, useIIFE } from '@sendbird/uikit-utils';
6
+ import { isGroupChannelChatUnavailable, useIIFE } from '@sendbird/uikit-utils';
7
7
 
8
8
  import { GroupChannelContexts } from '../../module/moduleContext';
9
9
  import type { GroupChannelProps } from '../../types';
@@ -20,7 +20,7 @@ const GroupChannelInput = (props: GroupChannelProps['Input']) => {
20
20
 
21
21
  const [text, setText] = useState('');
22
22
  const textTmpRef = useRef('');
23
- const disabled = groupChannelChatUnavailable(channel);
23
+ const isChatUnavailable = isGroupChannelChatUnavailable(channel);
24
24
 
25
25
  useEffect(() => {
26
26
  if (text.length === 0) channel.endTyping();
@@ -28,13 +28,13 @@ const GroupChannelInput = (props: GroupChannelProps['Input']) => {
28
28
  }, [text]);
29
29
 
30
30
  useEffect(() => {
31
- if (disabled) {
31
+ if (isChatUnavailable) {
32
32
  textTmpRef.current = text;
33
33
  setText('');
34
34
  } else {
35
35
  setText(textTmpRef.current);
36
36
  }
37
- }, [disabled]);
37
+ }, [isChatUnavailable]);
38
38
 
39
39
  const inputMode = useIIFE(() => {
40
40
  if (!editMessage) return 'send';
@@ -49,7 +49,7 @@ const GroupChannelInput = (props: GroupChannelProps['Input']) => {
49
49
  >
50
50
  <View style={{ paddingLeft: left, paddingRight: right, backgroundColor: colors.background }}>
51
51
  <View style={{ justifyContent: 'center', width: '100%' }}>
52
- {inputMode === 'send' && <SendInput {...props} text={text} setText={setText} disabled={disabled} />}
52
+ {inputMode === 'send' && <SendInput {...props} text={text} setText={setText} disabled={isChatUnavailable} />}
53
53
  {inputMode === 'edit' && editMessage && (
54
54
  <EditInput
55
55
  {...props}
@@ -4,12 +4,12 @@ import type { FlatListProps } from 'react-native';
4
4
  import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
5
5
  import type {
6
6
  SendbirdFileMessage,
7
- SendbirdFileMessageParams,
7
+ SendbirdFileMessageCreateParams,
8
8
  SendbirdGroupChannel,
9
9
  SendbirdMessage,
10
10
  SendbirdUser,
11
11
  SendbirdUserMessage,
12
- SendbirdUserMessageParams,
12
+ SendbirdUserMessageCreateParams,
13
13
  } from '@sendbird/uikit-utils';
14
14
 
15
15
  import type { FileType } from '../../platform/types';
@@ -23,11 +23,11 @@ export interface GroupChannelProps {
23
23
  onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];
24
24
 
25
25
  onBeforeSendFileMessage?: (
26
- params: SendbirdFileMessageParams,
27
- ) => SendbirdFileMessageParams | Promise<SendbirdFileMessageParams>;
26
+ params: SendbirdFileMessageCreateParams,
27
+ ) => SendbirdFileMessageCreateParams | Promise<SendbirdFileMessageCreateParams>;
28
28
  onBeforeSendUserMessage?: (
29
- params: SendbirdUserMessageParams,
30
- ) => SendbirdUserMessageParams | Promise<SendbirdUserMessageParams>;
29
+ params: SendbirdUserMessageCreateParams,
30
+ ) => SendbirdUserMessageCreateParams | Promise<SendbirdUserMessageCreateParams>;
31
31
  onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];
32
32
 
33
33
  renderMessage?: GroupChannelProps['MessageList']['renderMessage'];
@@ -2,6 +2,7 @@ import React, { useCallback } from 'react';
2
2
  import { FlatList, ListRenderItem } from 'react-native';
3
3
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
4
4
 
5
+ import { PushTriggerOption } from '@sendbird/chat';
5
6
  import { useActionMenu, useToast } from '@sendbird/uikit-react-native-foundation';
6
7
  import { PASS, SendbirdGroupChannel, useFreshCallback } from '@sendbird/uikit-utils';
7
8
 
@@ -29,9 +30,9 @@ const GroupChannelListList = ({
29
30
  title: STRINGS.GROUP_CHANNEL_LIST.DIALOG_CHANNEL_NOTIFICATION(channel),
30
31
  onPress: async () => {
31
32
  if (action === 'on') {
32
- await channel.setMyPushTriggerOption('default');
33
+ await channel.setMyPushTriggerOption(PushTriggerOption.DEFAULT);
33
34
  } else {
34
- await channel.setMyPushTriggerOption('off');
35
+ await channel.setMyPushTriggerOption(PushTriggerOption.OFF);
35
36
  }
36
37
  },
37
38
  onError: () => {
@@ -1,6 +1,7 @@
1
1
  import React, { useContext } from 'react';
2
2
  import { View } from 'react-native';
3
3
 
4
+ import { PushTriggerOption } from '@sendbird/chat';
4
5
  import type { MenuBarProps } from '@sendbird/uikit-react-native-foundation';
5
6
  import { Icon, MenuBar, Switch, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
6
7
 
@@ -20,9 +21,9 @@ const GroupChannelSettingsMenu = ({
20
21
 
21
22
  const toggleNotification = async () => {
22
23
  if (channel.myPushTriggerOption === 'off') {
23
- await channel.setMyPushTriggerOption('default');
24
+ await channel.setMyPushTriggerOption(PushTriggerOption.DEFAULT);
24
25
  } else {
25
- await channel.setMyPushTriggerOption('off');
26
+ await channel.setMyPushTriggerOption(PushTriggerOption.OFF);
26
27
  }
27
28
  };
28
29
 
@@ -4,9 +4,9 @@ import { useActiveGroupChannel, useChannelHandler } from '@sendbird/uikit-chat-h
4
4
  import { useActionMenu, useAlert, useBottomSheet, usePrompt, useToast } from '@sendbird/uikit-react-native-foundation';
5
5
  import {
6
6
  NOOP,
7
+ SendbirdBaseChannel,
7
8
  SendbirdGroupChannel,
8
- SendbirdGroupChannelParams,
9
- SendbirdOpenChannel,
9
+ SendbirdGroupChannelUpdateParams,
10
10
  isDifferentChannel,
11
11
  useForceUpdate,
12
12
  useUniqId,
@@ -38,7 +38,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
38
38
 
39
39
  const { activeChannel, setActiveChannel } = useActiveGroupChannel(sdk, channel);
40
40
 
41
- const onChannelChanged = (channel: SendbirdGroupChannel | SendbirdOpenChannel) => {
41
+ const onChannelChanged = (channel: SendbirdBaseChannel) => {
42
42
  if (isDifferentChannel(channel, activeChannel) || !channel.isGroupChannel()) return;
43
43
  setActiveChannel(channel);
44
44
  forceUpdate();
@@ -56,7 +56,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
56
56
  const { openMenu } = useActionMenu();
57
57
 
58
58
  const updateChannel = useCallback(
59
- async (params: SendbirdGroupChannelParams) => {
59
+ async (params: SendbirdGroupChannelUpdateParams) => {
60
60
  const updatedChannel = await activeChannel.updateChannel(params);
61
61
  setActiveChannel(updatedChannel);
62
62
  forceUpdate();
@@ -70,11 +70,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
70
70
  submitLabel: STRINGS.GROUP_CHANNEL_SETTINGS.DIALOG_CHANGE_NAME_PROMPT_OK,
71
71
  placeholder: STRINGS.GROUP_CHANNEL_SETTINGS.DIALOG_CHANGE_NAME_PROMPT_PLACEHOLDER,
72
72
  defaultValue: activeChannel.name,
73
- onSubmit: async (channelName) => {
74
- const params = new sdk.GroupChannelParams();
75
- params.name = channelName;
76
- await updateChannel(params);
77
- },
73
+ onSubmit: (channelName) => updateChannel({ name: channelName }),
78
74
  });
79
75
  }, [STRINGS, updateChannel, activeChannel.name]);
80
76
 
@@ -101,9 +97,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
101
97
  });
102
98
  if (!file) return;
103
99
 
104
- const params = new sdk.GroupChannelParams();
105
- params.coverImage = file;
106
- await updateChannel(params);
100
+ await updateChannel({ coverImage: file });
107
101
  },
108
102
  },
109
103
  {
@@ -126,9 +120,7 @@ export const GroupChannelSettingsContextsProvider: GroupChannelSettingsModule['P
126
120
  });
127
121
  if (!files || !files[0]) return;
128
122
 
129
- const params = new sdk.GroupChannelParams();
130
- params.coverImage = files[0];
131
- await updateChannel(params);
123
+ await updateChannel({ coverImage: files[0] });
132
124
  },
133
125
  },
134
126
  ],
@@ -1,5 +1,5 @@
1
1
  import type { UseUserListOptions } from '@sendbird/uikit-chat-hooks';
2
- import type { SendbirdGroupChannel, SendbirdGroupChannelParams } from '@sendbird/uikit-utils';
2
+ import type { SendbirdGroupChannel, SendbirdGroupChannelCreateParams } from '@sendbird/uikit-utils';
3
3
 
4
4
  import type { CommonComponent } from '../../types';
5
5
  import type { GroupChannelType } from '../groupChannelList/types';
@@ -14,9 +14,9 @@ export interface GroupChannelCreateProps<User> {
14
14
  channelType?: GroupChannelType;
15
15
  userIdsGenerator?: (users: User[]) => UserIds;
16
16
  onBeforeCreateChannel?: (
17
- params: SendbirdGroupChannelParams,
17
+ params: SendbirdGroupChannelCreateParams,
18
18
  users: User[],
19
- ) => SendbirdGroupChannelParams | Promise<SendbirdGroupChannelParams>;
19
+ ) => SendbirdGroupChannelCreateParams | Promise<SendbirdGroupChannelCreateParams>;
20
20
  sortComparator?: UseUserListOptions<User>['sortComparator'];
21
21
  queryCreator?: UseUserListOptions<User>['queryCreator'];
22
22
  renderUser?: UserListProps<User>['List']['renderUser'];
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { TouchableOpacity } from 'react-native';
3
3
 
4
4
  import { useUserList } from '@sendbird/uikit-chat-hooks';
5
- import { Logger, PASS, SendbirdUser, useFreshCallback } from '@sendbird/uikit-utils';
5
+ import { Logger, PASS, SendbirdGroupChannelCreateParams, SendbirdUser, useFreshCallback } from '@sendbird/uikit-utils';
6
6
 
7
7
  import StatusComposition from '../components/StatusComposition';
8
8
  import UserSelectableBar from '../components/UserSelectableBar';
@@ -95,18 +95,19 @@ const createGroupChannelCreateFragment = <UserType,>(
95
95
  <UserListModule.Header
96
96
  onPressHeaderLeft={onPressHeaderLeft}
97
97
  onPressHeaderRight={async (users) => {
98
- const params = new sdk.GroupChannelParams();
98
+ const params: SendbirdGroupChannelCreateParams = {
99
+ invitedUserIds: userIdsGenerator(users),
100
+ name: '',
101
+ coverUrl: '',
102
+ isDistinct: false,
103
+ };
99
104
 
100
105
  if (channelType === 'BROADCAST') params.isBroadcast = true;
101
106
  if (channelType === 'SUPER_GROUP') params.isSuper = true;
102
107
  if (currentUser) params.operatorUserIds = [currentUser.userId];
103
- params.addUserIds(userIdsGenerator(users));
104
- params.name = '';
105
- params.coverUrl = '';
106
- params.isDistinct = false;
107
108
 
108
109
  const processedParams = await onBeforeCreateChannel(params, users);
109
- const channel = await sdk.GroupChannel.createChannel(processedParams);
110
+ const channel = await sdk.groupChannel.createChannel(processedParams);
110
111
  onCreateChannel(channel);
111
112
  }}
112
113
  />
@@ -73,30 +73,22 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
73
73
  );
74
74
 
75
75
  const onSendFileMessage: GroupChannelProps['Input']['onSendFileMessage'] = useFreshCallback(async (file) => {
76
- const params = new sdk.FileMessageParams();
77
- params.file = file;
78
- const processedParams = await onBeforeSendFileMessage(params);
76
+ const processedParams = await onBeforeSendFileMessage({ file });
79
77
  await sendFileMessage(processedParams);
80
78
  });
81
79
  const onSendUserMessage: GroupChannelProps['Input']['onSendUserMessage'] = useFreshCallback(async (text) => {
82
- const params = new sdk.UserMessageParams();
83
- params.message = text;
84
- const processedParams = await onBeforeSendUserMessage(params);
80
+ const processedParams = await onBeforeSendUserMessage({ message: text });
85
81
  await sendUserMessage(processedParams);
86
82
  });
87
83
  const onUpdateFileMessage: GroupChannelProps['Input']['onUpdateFileMessage'] = useFreshCallback(
88
84
  async (editedFile, message) => {
89
- const params = new sdk.FileMessageParams();
90
- params.file = editedFile;
91
- const processedParams = await onBeforeSendFileMessage(params);
85
+ const processedParams = await onBeforeSendFileMessage({ file: editedFile });
92
86
  await updateFileMessage(message.messageId, processedParams);
93
87
  },
94
88
  );
95
89
  const onUpdateUserMessage: GroupChannelProps['Input']['onUpdateUserMessage'] = useFreshCallback(
96
90
  async (editedText, message) => {
97
- const params = new sdk.UserMessageParams();
98
- params.message = editedText;
99
- const processedParams = await onBeforeSendUserMessage(params);
91
+ const processedParams = await onBeforeSendUserMessage({ message: editedText });
100
92
  await updateUserMessage(message.messageId, processedParams);
101
93
  },
102
94
  );
@@ -27,9 +27,10 @@ const createGroupChannelMembersFragment = (
27
27
  const { STRINGS } = useLocalization();
28
28
 
29
29
  useChannelHandler(sdk, `${name}_${uniqId}`, {
30
- onUserEntered(channel) {
31
- if (channel.url === activeChannel.url) forceUpdate();
32
- },
30
+ // Note: Removed from v4
31
+ // onUserEntered(channel) {
32
+ // if (channel.url === activeChannel.url) forceUpdate();
33
+ // },
33
34
  onUserLeft(channel) {
34
35
  if (channel.url === activeChannel.url) forceUpdate();
35
36
  },
@@ -1,13 +1,12 @@
1
1
  import { useCallback } from 'react';
2
- import type Sendbird from 'sendbird';
3
2
 
4
- import { Logger, SendbirdUser } from '@sendbird/uikit-utils';
3
+ import { Logger, SendbirdError, SendbirdUser } from '@sendbird/uikit-utils';
5
4
 
6
5
  import { useSendbirdChat } from './useContext';
7
6
  import usePushTokenRegistration from './usePushTokenRegistration';
8
7
 
9
8
  type ConnectOptions = { nickname?: string; accessToken?: string };
10
- const cacheStrictCodes = [400300, 400301, 400302, 400310];
9
+ const cacheRestrictCodes = [400300, 400301, 400302, 400310];
11
10
 
12
11
  const useConnection = () => {
13
12
  const { sdk, setCurrentUser, features } = useSendbirdChat();
@@ -15,48 +14,47 @@ const useConnection = () => {
15
14
 
16
15
  const connect = useCallback(
17
16
  async (userId: string, opts?: ConnectOptions): Promise<SendbirdUser> => {
18
- return new Promise((resolve, reject) => {
19
- const callback: Sendbird.userCallback = async (user, error) => {
20
- if (error && sdk.isCacheEnabled && cacheStrictCodes.some((code) => error.code === code)) {
21
- Logger.warn('[useConnection]', 'connect failure', error.message, error.code);
17
+ try {
18
+ Logger.debug('[useConnection]', 'connect start:', userId);
19
+ let user = await sdk.connect(userId, opts?.accessToken);
20
+
21
+ if (opts?.nickname) {
22
+ Logger.debug('[useConnection]', 'nickname-sync start:', opts.nickname);
23
+ await sdk
24
+ .updateCurrentUserInfo({ nickname: opts.nickname })
25
+ .then((updatedUser) => (user = updatedUser))
26
+ .catch((e) => Logger.warn('[useConnection]', 'nickname-sync failure', e));
27
+ }
28
+
29
+ if (features.autoPushTokenRegistrationEnabled) {
30
+ Logger.debug('[useConnection]', 'autoPushTokenRegistration enabled, register for current user');
31
+ await registerPushTokenForCurrentUser().catch((e) => {
32
+ Logger.warn('[useConnection]', 'autoPushToken Registration failure', e);
33
+ });
34
+ }
35
+
36
+ Logger.debug('[useConnection]', 'connected! (online)');
37
+ setCurrentUser(user);
38
+
39
+ return user;
40
+ } catch (e) {
41
+ const error = e as unknown as SendbirdError;
42
+
43
+ if (sdk.isCacheEnabled) {
44
+ if (cacheRestrictCodes.some((code) => error.code === code)) {
45
+ Logger.warn('[useConnection]', 'offline connect restricted', error.message, error.code);
22
46
  Logger.warn('[useConnection]', 'clear cached-data');
23
47
  await sdk.clearCachedData().catch((e) => Logger.warn('[useConnection]', 'clear cached-data failure', e));
24
- return reject(error);
25
- }
26
-
27
- if (user) {
28
- let _user = user;
29
-
30
- if (opts?.nickname) {
31
- Logger.debug('[useConnection]', 'nickname-sync start:', opts.nickname);
32
- await sdk
33
- .updateCurrentUserInfo(opts.nickname, sdk.currentUser.profileUrl)
34
- .then((updatedUser) => (_user = updatedUser))
35
- .catch((e) => Logger.warn('[useConnection]', 'nickname-sync failure', e));
36
- }
37
-
38
- if (features.autoPushTokenRegistrationEnabled) {
39
- Logger.debug('[useConnection]', 'autoPushTokenRegistration enabled, register for current user');
40
- await registerPushTokenForCurrentUser().catch((e) => {
41
- Logger.warn('[useConnection]', 'autoPushToken Registration failure', e);
42
- });
43
- }
44
-
45
- Logger.debug('[useConnection]', 'connected!');
46
- setCurrentUser(_user);
47
- return resolve(_user);
48
+ } else if (sdk.currentUser) {
49
+ Logger.debug('[useConnection]', 'connected! (offline)');
50
+ setCurrentUser(sdk.currentUser);
51
+ return sdk.currentUser;
48
52
  }
53
+ }
49
54
 
50
- if (error) {
51
- Logger.warn('[useConnection]', 'connect failure', error.message, error.code);
52
- return reject(error);
53
- }
54
- };
55
-
56
- Logger.debug('[useConnection]', 'connect start:', userId);
57
- if (opts?.accessToken) sdk.connect(userId, opts.accessToken, callback);
58
- else sdk.connect(userId, callback);
59
- });
55
+ Logger.warn('[useConnection]', 'connect failure', error.message, error.code);
56
+ throw error;
57
+ }
60
58
  },
61
59
  [sdk, registerPushTokenForCurrentUser, features.autoPushTokenRegistrationEnabled],
62
60
  );
@@ -71,8 +69,7 @@ const useConnection = () => {
71
69
  });
72
70
  }
73
71
 
74
- await sdk.disconnect();
75
- setCurrentUser(undefined);
72
+ await sdk.disconnect().then(() => setCurrentUser(undefined));
76
73
  Logger.debug('[useConnection]', 'disconnected!');
77
74
  }, [sdk, unregisterPushTokenForCurrentUser, features.autoPushTokenRegistrationEnabled]);
78
75
 
@@ -14,11 +14,11 @@ const usePushTokenRegistration = () => {
14
14
  return [
15
15
  Platform.select({
16
16
  ios: (token: string) => sdk.registerAPNSPushTokenForCurrentUser(token),
17
- default: (token: string) => sdk.registerGCMPushTokenForCurrentUser(token),
17
+ default: (token: string) => sdk.registerFCMPushTokenForCurrentUser(token),
18
18
  }),
19
19
  Platform.select({
20
20
  ios: (token: string) => sdk.unregisterAPNSPushTokenForCurrentUser(token),
21
- default: (token: string) => sdk.unregisterGCMPushTokenForCurrentUser(token),
21
+ default: (token: string) => sdk.unregisterFCMPushTokenForCurrentUser(token),
22
22
  }),
23
23
  Platform.select({
24
24
  ios: notificationService.getAPNSToken,
package/src/index.ts CHANGED
@@ -101,6 +101,7 @@ export {
101
101
  SendbirdUIKit,
102
102
  SendbirdUIKitContainerProps,
103
103
  } from './containers/SendbirdUIKitContainer';
104
+ export { default as SBUError } from './libs/SBUError';
104
105
 
105
106
  export * from './types';
106
107
 
@@ -1,3 +1,5 @@
1
+ import { ASYNC_NOOP } from '@sendbird/uikit-utils';
2
+
1
3
  import type { KeyValuePairGet, KeyValuePairSet, LocalCacheStorage } from '../types';
2
4
 
3
5
  export default class InternalLocalCacheStorage implements LocalCacheStorage {
@@ -42,4 +44,7 @@ export default class InternalLocalCacheStorage implements LocalCacheStorage {
42
44
  await Promise.all(keyValuePairs.map(([key, value]) => this.storage.setItem(key, value)));
43
45
  }
44
46
  }
47
+
48
+ clear = ASYNC_NOOP;
49
+ flushGetRequests = ASYNC_NOOP;
45
50
  }
@@ -6,8 +6,7 @@ import type * as ImagePicker from 'react-native-image-picker';
6
6
  import type * as Permissions from 'react-native-permissions';
7
7
  import type { Permission } from 'react-native-permissions';
8
8
 
9
- import { getFileExtension, getFileType } from '@sendbird/uikit-utils';
10
- import { normalizeFileName } from '@sendbird/uikit-utils/src/shared/regex';
9
+ import { getFileExtension, getFileType, normalizeFileName } from '@sendbird/uikit-utils';
11
10
 
12
11
  import SBUError from '../libs/SBUError';
13
12
  import fileTypeGuard from '../utils/fileTypeGuard';
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '1.1.2';
1
+ const VERSION = '2.0.0-rc.0';
2
2
  export default VERSION;