@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.
- package/README.md +1 -1
- package/lib/commonjs/components/ChatFlatList.js +10 -8
- package/lib/commonjs/components/ChatFlatList.js.map +1 -1
- package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +3 -1
- package/lib/commonjs/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
- package/lib/commonjs/containers/SendbirdUIKitContainer.js +12 -15
- package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/commonjs/contexts/SendbirdChat.js +9 -9
- package/lib/commonjs/contexts/SendbirdChat.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js +4 -4
- package/lib/commonjs/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js +4 -2
- package/lib/commonjs/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +4 -2
- package/lib/commonjs/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js +9 -11
- package/lib/commonjs/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
- package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelCreateFragment.js +7 -6
- package/lib/commonjs/fragments/createGroupChannelCreateFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +12 -12
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelMembersFragment.js +4 -4
- package/lib/commonjs/fragments/createGroupChannelMembersFragment.js.map +1 -1
- package/lib/commonjs/hooks/useConnection.js +35 -34
- package/lib/commonjs/hooks/useConnection.js.map +1 -1
- package/lib/commonjs/hooks/usePushTokenRegistration.js +2 -2
- package/lib/commonjs/hooks/usePushTokenRegistration.js.map +1 -1
- package/lib/commonjs/index.js +10 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/libs/InternalLocalCacheStorage.js +8 -0
- package/lib/commonjs/libs/InternalLocalCacheStorage.js.map +1 -1
- package/lib/commonjs/platform/createFileService.native.js +1 -3
- package/lib/commonjs/platform/createFileService.native.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChatFlatList.js +10 -8
- package/lib/module/components/ChatFlatList.js.map +1 -1
- package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js +3 -1
- package/lib/module/components/MessageRenderer/UserMessage/OpenGraphUserMessage.js.map +1 -1
- package/lib/module/containers/SendbirdUIKitContainer.js +10 -15
- package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -1
- package/lib/module/contexts/SendbirdChat.js +10 -10
- package/lib/module/contexts/SendbirdChat.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js +5 -5
- package/lib/module/domain/groupChannel/component/GroupChannelInput/index.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/domain/groupChannelList/component/GroupChannelListList.js +3 -2
- package/lib/module/domain/groupChannelList/component/GroupChannelListList.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js +3 -2
- package/lib/module/domain/groupChannelSettings/component/GroupChannelSettingsMenu.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/module/moduleContext.js +9 -11
- package/lib/module/domain/groupChannelSettings/module/moduleContext.js.map +1 -1
- package/lib/module/domain/groupChannelUserList/types.js.map +1 -1
- package/lib/module/fragments/createGroupChannelCreateFragment.js +7 -6
- package/lib/module/fragments/createGroupChannelCreateFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +12 -12
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelMembersFragment.js +4 -4
- package/lib/module/fragments/createGroupChannelMembersFragment.js.map +1 -1
- package/lib/module/hooks/useConnection.js +35 -35
- package/lib/module/hooks/useConnection.js.map +1 -1
- package/lib/module/hooks/usePushTokenRegistration.js +2 -2
- package/lib/module/hooks/usePushTokenRegistration.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/libs/InternalLocalCacheStorage.js +7 -0
- package/lib/module/libs/InternalLocalCacheStorage.js.map +1 -1
- package/lib/module/platform/createFileService.native.js +1 -2
- package/lib/module/platform/createFileService.native.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.d.ts +2 -2
- package/lib/typescript/src/components/MessageRenderer/index.d.ts +1 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/contexts/SendbirdChat.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput/index.d.ts +3 -3
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +6 -6
- package/lib/typescript/src/domain/groupChannel/types.d.ts +3 -3
- package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +2 -2
- package/lib/typescript/src/hooks/useContext.d.ts +5 -5
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/libs/InternalLocalCacheStorage.d.ts +2 -0
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +8 -8
- package/src/components/ChatFlatList.tsx +5 -4
- package/src/components/MessageRenderer/UserMessage/OpenGraphUserMessage.tsx +5 -3
- package/src/containers/SendbirdUIKitContainer.tsx +13 -9
- package/src/contexts/SendbirdChat.tsx +18 -13
- package/src/domain/groupChannel/component/GroupChannelInput/index.tsx +5 -5
- package/src/domain/groupChannel/types.ts +6 -6
- package/src/domain/groupChannelList/component/GroupChannelListList.tsx +3 -2
- package/src/domain/groupChannelSettings/component/GroupChannelSettingsMenu.tsx +3 -2
- package/src/domain/groupChannelSettings/module/moduleContext.tsx +7 -15
- package/src/domain/groupChannelUserList/types.ts +3 -3
- package/src/fragments/createGroupChannelCreateFragment.tsx +8 -7
- package/src/fragments/createGroupChannelFragment.tsx +4 -12
- package/src/fragments/createGroupChannelMembersFragment.tsx +4 -3
- package/src/hooks/useConnection.ts +40 -43
- package/src/hooks/usePushTokenRegistration.ts +2 -2
- package/src/index.ts +1 -0
- package/src/libs/InternalLocalCacheStorage.ts +5 -0
- package/src/platform/createFileService.native.ts +1 -2
- 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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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 {
|
|
6
|
-
|
|
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
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
70
|
+
const params: SendbirdUserUpdateParams = { nickname };
|
|
71
|
+
|
|
72
|
+
if (typeof profile === 'string') {
|
|
73
|
+
params.profileUrl = profile;
|
|
69
74
|
} else if (typeof profile === 'object') {
|
|
70
|
-
|
|
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
|
|
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.
|
|
94
|
-
else sdkInstance.
|
|
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 {
|
|
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
|
|
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 (
|
|
31
|
+
if (isChatUnavailable) {
|
|
32
32
|
textTmpRef.current = text;
|
|
33
33
|
setText('');
|
|
34
34
|
} else {
|
|
35
35
|
setText(textTmpRef.current);
|
|
36
36
|
}
|
|
37
|
-
}, [
|
|
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={
|
|
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
|
-
|
|
7
|
+
SendbirdFileMessageCreateParams,
|
|
8
8
|
SendbirdGroupChannel,
|
|
9
9
|
SendbirdMessage,
|
|
10
10
|
SendbirdUser,
|
|
11
11
|
SendbirdUserMessage,
|
|
12
|
-
|
|
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:
|
|
27
|
-
) =>
|
|
26
|
+
params: SendbirdFileMessageCreateParams,
|
|
27
|
+
) => SendbirdFileMessageCreateParams | Promise<SendbirdFileMessageCreateParams>;
|
|
28
28
|
onBeforeSendUserMessage?: (
|
|
29
|
-
params:
|
|
30
|
-
) =>
|
|
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(
|
|
33
|
+
await channel.setMyPushTriggerOption(PushTriggerOption.DEFAULT);
|
|
33
34
|
} else {
|
|
34
|
-
await channel.setMyPushTriggerOption(
|
|
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(
|
|
24
|
+
await channel.setMyPushTriggerOption(PushTriggerOption.DEFAULT);
|
|
24
25
|
} else {
|
|
25
|
-
await channel.setMyPushTriggerOption(
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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:
|
|
17
|
+
params: SendbirdGroupChannelCreateParams,
|
|
18
18
|
users: User[],
|
|
19
|
-
) =>
|
|
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 =
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
31
|
-
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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.
|
|
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.
|
|
21
|
+
default: (token: string) => sdk.unregisterFCMPushTokenForCurrentUser(token),
|
|
22
22
|
}),
|
|
23
23
|
Platform.select({
|
|
24
24
|
ios: notificationService.getAPNSToken,
|
package/src/index.ts
CHANGED
|
@@ -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
|
+
const VERSION = '2.0.0-rc.0';
|
|
2
2
|
export default VERSION;
|