@sendbird/uikit-react-native 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/lib/commonjs/components/FileViewer.js +3 -10
  2. package/lib/commonjs/components/FileViewer.js.map +1 -1
  3. package/lib/commonjs/components/MessageRenderer/MessageOutgoingStatus.js +20 -56
  4. package/lib/commonjs/components/MessageRenderer/MessageOutgoingStatus.js.map +1 -1
  5. package/lib/commonjs/{components → containers}/GroupChannelPreviewContainer.js +30 -53
  6. package/lib/commonjs/containers/GroupChannelPreviewContainer.js.map +1 -0
  7. package/lib/commonjs/{InternalErrorBoundary.js → containers/InternalErrorBoundaryContainer.js} +5 -5
  8. package/lib/commonjs/containers/InternalErrorBoundaryContainer.js.map +1 -0
  9. package/lib/commonjs/{SendbirdUIKitContainer.js → containers/SendbirdUIKitContainer.js} +10 -10
  10. package/lib/commonjs/containers/SendbirdUIKitContainer.js.map +1 -0
  11. package/lib/commonjs/domain/groupChannelList/types.js.map +1 -1
  12. package/lib/commonjs/fragments/createGroupChannelFragment.js +1 -1
  13. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  14. package/lib/commonjs/fragments/createGroupChannelListFragment.js +5 -5
  15. package/lib/commonjs/fragments/createGroupChannelListFragment.js.map +1 -1
  16. package/lib/commonjs/index.js +1 -1
  17. package/lib/commonjs/index.js.map +1 -1
  18. package/lib/commonjs/{InternalLocalCacheStorage.js → libs/InternalLocalCacheStorage.js} +0 -0
  19. package/lib/commonjs/libs/InternalLocalCacheStorage.js.map +1 -0
  20. package/lib/commonjs/version.js +1 -1
  21. package/lib/commonjs/version.js.map +1 -1
  22. package/lib/module/components/FileViewer.js +4 -8
  23. package/lib/module/components/FileViewer.js.map +1 -1
  24. package/lib/module/components/MessageRenderer/MessageOutgoingStatus.js +17 -51
  25. package/lib/module/components/MessageRenderer/MessageOutgoingStatus.js.map +1 -1
  26. package/lib/module/{components → containers}/GroupChannelPreviewContainer.js +28 -51
  27. package/lib/module/containers/GroupChannelPreviewContainer.js.map +1 -0
  28. package/lib/module/{InternalErrorBoundary.js → containers/InternalErrorBoundaryContainer.js} +5 -5
  29. package/lib/module/containers/InternalErrorBoundaryContainer.js.map +1 -0
  30. package/lib/module/{SendbirdUIKitContainer.js → containers/SendbirdUIKitContainer.js} +10 -10
  31. package/lib/module/containers/SendbirdUIKitContainer.js.map +1 -0
  32. package/lib/module/domain/groupChannelList/types.js.map +1 -1
  33. package/lib/module/fragments/createGroupChannelFragment.js +1 -1
  34. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  35. package/lib/module/fragments/createGroupChannelListFragment.js +5 -5
  36. package/lib/module/fragments/createGroupChannelListFragment.js.map +1 -1
  37. package/lib/module/index.js +1 -1
  38. package/lib/module/index.js.map +1 -1
  39. package/lib/module/{InternalLocalCacheStorage.js → libs/InternalLocalCacheStorage.js} +0 -0
  40. package/lib/module/libs/InternalLocalCacheStorage.js.map +1 -0
  41. package/lib/module/version.js +1 -1
  42. package/lib/module/version.js.map +1 -1
  43. package/lib/typescript/src/{components → containers}/GroupChannelPreviewContainer.d.ts +0 -0
  44. package/lib/typescript/src/{InternalErrorBoundary.d.ts → containers/InternalErrorBoundaryContainer.d.ts} +3 -3
  45. package/lib/typescript/src/{SendbirdUIKitContainer.d.ts → containers/SendbirdUIKitContainer.d.ts} +4 -4
  46. package/lib/typescript/src/domain/groupChannelList/types.d.ts +2 -2
  47. package/lib/typescript/src/index.d.ts +1 -1
  48. package/lib/typescript/src/{InternalLocalCacheStorage.d.ts → libs/InternalLocalCacheStorage.d.ts} +2 -2
  49. package/lib/typescript/src/version.d.ts +1 -1
  50. package/package.json +5 -5
  51. package/src/components/FileViewer.tsx +7 -8
  52. package/src/components/MessageRenderer/MessageOutgoingStatus.tsx +13 -46
  53. package/src/{components → containers}/GroupChannelPreviewContainer.tsx +20 -37
  54. package/src/{InternalErrorBoundary.tsx → containers/InternalErrorBoundaryContainer.tsx} +4 -4
  55. package/src/{SendbirdUIKitContainer.tsx → containers/SendbirdUIKitContainer.tsx} +13 -13
  56. package/src/domain/groupChannelList/types.ts +2 -2
  57. package/src/fragments/createGroupChannelFragment.tsx +1 -1
  58. package/src/fragments/createGroupChannelListFragment.tsx +5 -5
  59. package/src/index.ts +1 -1
  60. package/src/{InternalLocalCacheStorage.ts → libs/InternalLocalCacheStorage.ts} +1 -1
  61. package/src/version.ts +1 -1
  62. package/lib/commonjs/InternalErrorBoundary.js.map +0 -1
  63. package/lib/commonjs/InternalLocalCacheStorage.js.map +0 -1
  64. package/lib/commonjs/SendbirdUIKitContainer.js.map +0 -1
  65. package/lib/commonjs/components/GroupChannelPreviewContainer.js.map +0 -1
  66. package/lib/commonjs/components/SBUPressable.js +0 -45
  67. package/lib/commonjs/components/SBUPressable.js.map +0 -1
  68. package/lib/module/InternalErrorBoundary.js.map +0 -1
  69. package/lib/module/InternalLocalCacheStorage.js.map +0 -1
  70. package/lib/module/SendbirdUIKitContainer.js.map +0 -1
  71. package/lib/module/components/GroupChannelPreviewContainer.js.map +0 -1
  72. package/lib/module/components/SBUPressable.js +0 -33
  73. package/lib/module/components/SBUPressable.js.map +0 -1
  74. package/lib/typescript/src/components/SBUPressable.d.ts +0 -18
  75. package/src/components/SBUPressable.tsx +0 -40
@@ -1,8 +1,8 @@
1
- import React, { useEffect } from 'react';
1
+ import React from 'react';
2
2
 
3
+ import { useMessageOutgoingStatus } from '@sendbird/uikit-chat-hooks';
3
4
  import { Icon, LoadingSpinner, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
4
5
  import type { SendbirdGroupChannel, SendbirdMessage } from '@sendbird/uikit-utils';
5
- import { isDifferentChannel, useForceUpdate, useUniqId } from '@sendbird/uikit-utils';
6
6
 
7
7
  import { useSendbirdChat } from '../../hooks/useContext';
8
8
 
@@ -12,64 +12,31 @@ type Props = { channel: SendbirdGroupChannel; message: SendbirdMessage };
12
12
  const MessageOutgoingStatus = ({ channel, message }: Props) => {
13
13
  if (!message.isUserMessage() && !message.isFileMessage()) return null;
14
14
 
15
- const { sdk, features } = useSendbirdChat();
15
+ const { sdk } = useSendbirdChat();
16
16
  const { colors } = useUIKitTheme();
17
+ const outgoingStatus = useMessageOutgoingStatus(sdk, channel, message);
17
18
 
18
- const uniqId = useUniqId('MessageOutgoingStatus');
19
- const forceUpdate = useForceUpdate();
20
-
21
- useEffect(() => {
22
- const handlerId = `MessageOutgoingStatus_${uniqId}`;
23
-
24
- if (
25
- message.sendingStatus === 'succeeded' &&
26
- channel.getUnreadMemberCount(message) === 0 &&
27
- channel.getUndeliveredMemberCount(message) === 0
28
- ) {
29
- sdk.removeChannelHandler(handlerId);
30
- } else {
31
- const handler = new sdk.ChannelHandler();
32
-
33
- handler.onReadReceiptUpdated = (eventChannel) => {
34
- if (isDifferentChannel(channel, eventChannel)) return;
35
- forceUpdate();
36
- };
37
-
38
- if (features.deliveryReceiptEnabled) {
39
- handler.onDeliveryReceiptUpdated = (eventChannel) => {
40
- if (isDifferentChannel(channel, eventChannel)) return;
41
- forceUpdate();
42
- };
43
- }
44
-
45
- sdk.addChannelHandler(handlerId, handler);
46
- }
47
-
48
- return () => {
49
- sdk.removeChannelHandler(handlerId);
50
- };
51
- }, [message.sendingStatus]);
52
-
53
- if (message.sendingStatus === 'pending') {
19
+ if (outgoingStatus === 'PENDING') {
54
20
  return <LoadingSpinner size={SIZE} style={styles.container} />;
55
21
  }
56
22
 
57
- if (message.sendingStatus === 'failed') {
23
+ if (outgoingStatus === 'FAILED') {
58
24
  return <Icon icon={'error'} size={SIZE} color={colors.error} style={styles.container} />;
59
25
  }
60
26
 
61
- if (channel.getUnreadMemberCount(message) === 0) {
27
+ if (outgoingStatus === 'READ') {
62
28
  return <Icon icon={'done-all'} size={SIZE} color={colors.secondary} style={styles.container} />;
63
29
  }
64
30
 
65
- if (features.deliveryReceiptEnabled) {
66
- if (channel.getUndeliveredMemberCount(message) === 0) {
67
- return <Icon icon={'done-all'} size={SIZE} color={colors.onBackground03} style={styles.container} />;
68
- }
31
+ if (outgoingStatus === 'UNREAD' || outgoingStatus === 'DELIVERED') {
32
+ return <Icon icon={'done-all'} size={SIZE} color={colors.onBackground03} style={styles.container} />;
33
+ }
34
+
35
+ if (outgoingStatus === 'UNDELIVERED') {
69
36
  return <Icon icon={'done'} size={SIZE} color={colors.onBackground03} style={styles.container} />;
70
37
  }
71
38
 
72
- return <Icon icon={'done-all'} size={SIZE} color={colors.onBackground03} style={styles.container} />;
39
+ return null;
73
40
  };
74
41
 
75
42
  const styles = createStyleSheet({
@@ -1,13 +1,14 @@
1
1
  import React, { useState } from 'react';
2
+ import { Pressable } from 'react-native';
2
3
 
3
- import { useChannelHandler } from '@sendbird/uikit-chat-hooks';
4
+ import { useChannelHandler, useMessageOutgoingStatus } from '@sendbird/uikit-chat-hooks';
4
5
  import {
5
6
  GroupChannelPreview,
7
+ Icon,
6
8
  LoadingSpinner,
7
9
  createStyleSheet,
8
10
  useUIKitTheme,
9
11
  } from '@sendbird/uikit-react-native-foundation';
10
- import Icon from '@sendbird/uikit-react-native-foundation/src/ui/Icon';
11
12
  import {
12
13
  SendbirdGroupChannel,
13
14
  SendbirdUser,
@@ -15,14 +16,13 @@ import {
15
16
  getFileType,
16
17
  isDifferentChannel,
17
18
  isMyMessage,
18
- useForceUpdate,
19
19
  useIIFE,
20
20
  useUniqId,
21
21
  } from '@sendbird/uikit-utils';
22
22
 
23
+ import ChannelCover from '../components/ChannelCover';
24
+ import { DEFAULT_LONG_PRESS_DELAY } from '../constants';
23
25
  import { useLocalization, useSendbirdChat } from '../hooks/useContext';
24
- import ChannelCover from './ChannelCover';
25
- import SBUPressable from './SBUPressable';
26
26
 
27
27
  const iconMapper = { audio: 'file-audio', image: 'photo', video: 'play', file: 'file-document' } as const;
28
28
 
@@ -37,7 +37,6 @@ const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props)
37
37
  const { colors } = useUIKitTheme();
38
38
 
39
39
  const [typingUsers, setTypingUsers] = useState<SendbirdUser[]>([]);
40
- const forceUpdate = useForceUpdate();
41
40
 
42
41
  if (features.channelListTypingIndicatorEnabled) {
43
42
  const typingId = useUniqId('GroupChannelPreviewContainer');
@@ -49,25 +48,7 @@ const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props)
49
48
  });
50
49
  }
51
50
 
52
- if (features.channelListMessageReceiptStatusEnabled) {
53
- const receiptId = useUniqId('GroupChannelPreviewContainer');
54
- useChannelHandler(sdk, `GroupChannelPreviewContainer_ReceiptStatus_${receiptId}`, {
55
- onDeliveryReceiptUpdated(eventChannel) {
56
- if (isDifferentChannel(channel, eventChannel)) return;
57
- if (!eventChannel.isGroupChannel() || !eventChannel.lastMessage) return;
58
- if (!isMyMessage(eventChannel.lastMessage, currentUser?.userId)) return;
59
-
60
- forceUpdate();
61
- },
62
- onReadReceiptUpdated(eventChannel) {
63
- if (isDifferentChannel(channel, eventChannel)) return;
64
- if (!eventChannel.isGroupChannel() || !eventChannel.lastMessage) return;
65
- if (!isMyMessage(eventChannel.lastMessage, currentUser?.userId)) return;
66
-
67
- forceUpdate();
68
- },
69
- });
70
- }
51
+ const outgoingStatus = useMessageOutgoingStatus(sdk, channel, channel.lastMessage);
71
52
 
72
53
  const bodyText = useIIFE(() => {
73
54
  if (typingUsers.length > 0) return STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers) || '';
@@ -76,6 +57,7 @@ const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props)
76
57
 
77
58
  const bodyIcon = useIIFE(() => {
78
59
  if (!channel.lastMessage?.isFileMessage()) return undefined;
60
+ if (typingUsers.length > 0) return undefined;
79
61
  return iconMapper[getFileType(channel.lastMessage.type || getFileExtension(channel.lastMessage.name))];
80
62
  });
81
63
 
@@ -84,30 +66,31 @@ const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props)
84
66
  if (!features.channelListMessageReceiptStatusEnabled) return undefined;
85
67
  if (!isMyMessage(channel.lastMessage, currentUser?.userId)) return undefined;
86
68
 
87
- if (channel.lastMessage.sendingStatus === 'pending') {
69
+ if (outgoingStatus === 'PENDING') {
88
70
  return <LoadingSpinner size={16} style={styles.titleCaptionIcon} />;
89
71
  }
90
72
 
91
- if (channel.lastMessage.sendingStatus === 'failed') {
73
+ if (outgoingStatus === 'FAILED') {
92
74
  return <Icon icon={'error'} size={16} color={colors.error} style={styles.titleCaptionIcon} />;
93
75
  }
94
76
 
95
- if (channel.getUnreadMemberCount(channel.lastMessage) === 0) {
96
- return <Icon icon={'done-all'} size={16} color={colors.secondary} style={styles.titleCaptionIcon} />;
77
+ if (outgoingStatus === 'UNDELIVERED') {
78
+ return <Icon icon={'done'} size={16} color={colors.onBackground03} containerStyle={styles.titleCaptionIcon} />;
97
79
  }
98
80
 
99
- if (features.deliveryReceiptEnabled) {
100
- if (channel.getUndeliveredMemberCount(channel.lastMessage) === 0) {
101
- return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;
102
- }
103
- return <Icon icon={'done'} size={16} color={colors.onBackground03} containerStyle={styles.titleCaptionIcon} />;
81
+ if (outgoingStatus === 'DELIVERED' || outgoingStatus === 'UNREAD') {
82
+ return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;
83
+ }
84
+
85
+ if (outgoingStatus === 'READ') {
86
+ return <Icon icon={'done-all'} size={16} color={colors.secondary} style={styles.titleCaptionIcon} />;
104
87
  }
105
88
 
106
- return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;
89
+ return undefined;
107
90
  });
108
91
 
109
92
  return (
110
- <SBUPressable onPress={onPress} onLongPress={onLongPress}>
93
+ <Pressable delayLongPress={DEFAULT_LONG_PRESS_DELAY} onPress={onPress} onLongPress={onLongPress}>
111
94
  <GroupChannelPreview
112
95
  customCover={<ChannelCover channel={channel} size={56} />}
113
96
  coverUrl={channel.coverUrl}
@@ -121,7 +104,7 @@ const GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props)
121
104
  frozen={channel.isFrozen}
122
105
  notificationOff={channel.myPushTriggerOption === 'off'}
123
106
  />
124
- </SBUPressable>
107
+ </Pressable>
125
108
  );
126
109
  };
127
110
 
@@ -1,8 +1,8 @@
1
1
  import React, { ErrorInfo } from 'react';
2
2
  import { View } from 'react-native';
3
3
 
4
- import TypedPlaceholder from './components/TypedPlaceholder';
5
- import type { ErrorBoundaryProps } from './types';
4
+ import TypedPlaceholder from '../components/TypedPlaceholder';
5
+ import type { ErrorBoundaryProps } from '../types';
6
6
 
7
7
  const DefaultErrorBoundaryComponent = (props: ErrorBoundaryProps) => {
8
8
  return (
@@ -12,7 +12,7 @@ const DefaultErrorBoundaryComponent = (props: ErrorBoundaryProps) => {
12
12
  );
13
13
  };
14
14
 
15
- class InternalErrorBoundary extends React.PureComponent<{
15
+ class InternalErrorBoundaryContainer extends React.PureComponent<{
16
16
  onError?: (props: ErrorBoundaryProps) => void;
17
17
  ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;
18
18
  children?: React.ReactNode;
@@ -50,4 +50,4 @@ class InternalErrorBoundary extends React.PureComponent<{
50
50
  };
51
51
  }
52
52
 
53
- export default InternalErrorBoundary;
53
+ export default InternalErrorBoundaryContainer;
@@ -14,23 +14,23 @@ import {
14
14
  } from '@sendbird/uikit-react-native-foundation';
15
15
  import type { SendbirdChatSDK } from '@sendbird/uikit-utils';
16
16
 
17
- import InternalErrorBoundary from './InternalErrorBoundary';
18
- import InternalLocalCacheStorage from './InternalLocalCacheStorage';
19
- import { LocalizationProvider } from './contexts/Localization';
20
- import { PlatformServiceProvider } from './contexts/PlatformService';
21
- import { SendbirdChatProvider } from './contexts/SendbirdChat';
22
- import { useLocalization } from './hooks/useContext';
23
- import StringSetEn from './localization/StringSet.en';
24
- import type { StringSet } from './localization/StringSet.type';
25
- import SBUDynamicModule from './platform/dynamicModule';
17
+ import { LocalizationProvider } from '../contexts/Localization';
18
+ import { PlatformServiceProvider } from '../contexts/PlatformService';
19
+ import { SendbirdChatProvider } from '../contexts/SendbirdChat';
20
+ import { useLocalization } from '../hooks/useContext';
21
+ import InternalLocalCacheStorage from '../libs/InternalLocalCacheStorage';
22
+ import StringSetEn from '../localization/StringSet.en';
23
+ import type { StringSet } from '../localization/StringSet.type';
24
+ import SBUDynamicModule from '../platform/dynamicModule';
26
25
  import type {
27
26
  ClipboardServiceInterface,
28
27
  FileServiceInterface,
29
28
  MediaServiceInterface,
30
29
  NotificationServiceInterface,
31
- } from './platform/types';
32
- import type { ErrorBoundaryProps, LocalCacheStorage } from './types';
33
- import VERSION from './version';
30
+ } from '../platform/types';
31
+ import type { ErrorBoundaryProps, LocalCacheStorage } from '../types';
32
+ import VERSION from '../version';
33
+ import InternalErrorBoundaryContainer from './InternalErrorBoundaryContainer';
34
34
 
35
35
  const NetInfo = SBUDynamicModule.get('@react-native-community/netinfo', 'warn');
36
36
 
@@ -159,7 +159,7 @@ const SendbirdUIKitContainer = ({
159
159
  >
160
160
  <LocalizedDialogProvider>
161
161
  <ToastProvider dismissTimeout={toast?.dismissTimeout}>
162
- <InternalErrorBoundary {...errorBoundary}>{children}</InternalErrorBoundary>
162
+ <InternalErrorBoundaryContainer {...errorBoundary}>{children}</InternalErrorBoundaryContainer>
163
163
  </ToastProvider>
164
164
  </LocalizedDialogProvider>
165
165
  </HeaderStyleProvider>
@@ -27,8 +27,8 @@ export interface GroupChannelListProps {
27
27
  // skipTypeSelection?: boolean;
28
28
  /** Custom Query creator for channels query **/
29
29
  queryCreator?: UseGroupChannelListOptions['queryCreator'];
30
- /** Sort comparator for sort channels **/
31
- sortComparator?: UseGroupChannelListOptions['sortComparator'];
30
+ /** Custom Collection creator for group channel collection **/
31
+ collectionCreator?: UseGroupChannelListOptions['collectionCreator'];
32
32
  /** FlatList props for GroupChannelList.List **/
33
33
  flatListProps?: GroupChannelListProps['List']['flatListProps'];
34
34
  /** Action menu item creator for onLongPress **/
@@ -55,7 +55,7 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
55
55
  queryCreator,
56
56
  sortComparator,
57
57
  onChannelDeleted,
58
- enableCollectionWithoutLocalCache: true,
58
+ enableCollectionWithoutLocalCache: !queryCreator,
59
59
  });
60
60
 
61
61
  const _renderMessage: GroupChannelProps['MessageList']['renderMessage'] = useFreshCallback((props) => {
@@ -2,10 +2,10 @@ import React, { useEffect } from 'react';
2
2
  import { AppState } from 'react-native';
3
3
 
4
4
  import { useGroupChannelList } from '@sendbird/uikit-chat-hooks';
5
- import { Logger, PASS, channelComparator, useFreshCallback } from '@sendbird/uikit-utils';
5
+ import { Logger, PASS, useFreshCallback } from '@sendbird/uikit-utils';
6
6
 
7
- import GroupChannelPreviewContainer from '../components/GroupChannelPreviewContainer';
8
7
  import StatusComposition from '../components/StatusComposition';
8
+ import GroupChannelPreviewContainer from '../containers/GroupChannelPreviewContainer';
9
9
  import createGroupChannelListModule from '../domain/groupChannelList/module/createGroupChannelListModule';
10
10
  import type {
11
11
  GroupChannelListFragment,
@@ -21,7 +21,7 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
21
21
  onPressChannel,
22
22
  onPressCreateChannel,
23
23
  queryCreator,
24
- sortComparator = channelComparator,
24
+ collectionCreator,
25
25
  renderGroupChannelPreview,
26
26
  // skipTypeSelection = true,
27
27
  flatListProps = {},
@@ -30,8 +30,8 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
30
30
  const { sdk, currentUser, features, markAsDeliveredWithChannel } = useSendbirdChat();
31
31
  const { groupChannels, next, loading } = useGroupChannelList(sdk, currentUser?.userId, {
32
32
  queryCreator,
33
- sortComparator,
34
- enableCollectionWithoutLocalCache: true,
33
+ collectionCreator,
34
+ enableCollectionWithoutLocalCache: !queryCreator,
35
35
  });
36
36
 
37
37
  if (features.deliveryReceiptEnabled) {
package/src/index.ts CHANGED
@@ -100,7 +100,7 @@ export {
100
100
  default as SendbirdUIKitContainer,
101
101
  SendbirdUIKit,
102
102
  SendbirdUIKitContainerProps,
103
- } from './SendbirdUIKitContainer';
103
+ } from './containers/SendbirdUIKitContainer';
104
104
 
105
105
  export * from './types';
106
106
 
@@ -1,4 +1,4 @@
1
- import type { KeyValuePairGet, KeyValuePairSet, LocalCacheStorage } from './types';
1
+ import type { KeyValuePairGet, KeyValuePairSet, LocalCacheStorage } from '../types';
2
2
 
3
3
  export default class InternalLocalCacheStorage implements LocalCacheStorage {
4
4
  constructor(private storage: LocalCacheStorage) {}
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '1.1.0';
1
+ const VERSION = '1.1.1';
2
2
  export default VERSION;
@@ -1 +0,0 @@
1
- {"version":3,"names":["DefaultErrorBoundaryComponent","props","flex","justifyContent","alignItems","reset","InternalErrorBoundary","React","PureComponent","error","errorInfo","setState","onError","state","ErrorInfoComponent","children"],"sources":["InternalErrorBoundary.tsx"],"sourcesContent":["import React, { ErrorInfo } from 'react';\nimport { View } from 'react-native';\n\nimport TypedPlaceholder from './components/TypedPlaceholder';\nimport type { ErrorBoundaryProps } from './types';\n\nconst DefaultErrorBoundaryComponent = (props: ErrorBoundaryProps) => {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <TypedPlaceholder type={'error-wrong'} onPressRetry={props.reset} />\n </View>\n );\n};\n\nclass InternalErrorBoundary extends React.PureComponent<{\n onError?: (props: ErrorBoundaryProps) => void;\n ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;\n children?: React.ReactNode;\n}> {\n static defaultProps = {\n ErrorInfoComponent: DefaultErrorBoundaryComponent,\n };\n\n state: { error: Error | null; errorInfo: ErrorInfo | null } = {\n error: null,\n errorInfo: null,\n };\n\n componentDidCatch = (error: Error, errorInfo: ErrorInfo) => {\n this.setState({ error, errorInfo });\n this.props.onError?.({ error, errorInfo, reset: this.reset });\n };\n\n reset = () => {\n this.setState({ error: null, errorInfo: null });\n };\n\n render = () => {\n if (this.state.error && this.state.errorInfo) {\n return (\n this.props.ErrorInfoComponent?.({\n error: this.state.error,\n errorInfo: this.state.errorInfo,\n reset: this.reset,\n }) ?? null\n );\n }\n\n return <>{this.props.children}</>;\n };\n}\n\nexport default InternalErrorBoundary;\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;AAGA,MAAMA,6BAA6B,GAAIC,KAAD,IAA+B;EACnE,oBACE,6BAAC,iBAAD;IAAM,KAAK,EAAE;MAAEC,IAAI,EAAE,CAAR;MAAWC,cAAc,EAAE,QAA3B;MAAqCC,UAAU,EAAE;IAAjD;EAAb,gBACE,6BAAC,yBAAD;IAAkB,IAAI,EAAE,aAAxB;IAAuC,YAAY,EAAEH,KAAK,CAACI;EAA3D,EADF,CADF;AAKD,CAND;;AAQA,MAAMC,qBAAN,SAAoCC,cAAA,CAAMC,aAA1C,CAIG;EAAA;IAAA;;IAAA,+BAK6D;MAC5DC,KAAK,EAAE,IADqD;MAE5DC,SAAS,EAAE;IAFiD,CAL7D;;IAAA,2CAUmB,CAACD,KAAD,EAAeC,SAAf,KAAwC;MAAA;;MAC1D,KAAKC,QAAL,CAAc;QAAEF,KAAF;QAASC;MAAT,CAAd;MACA,2CAAKT,KAAL,EAAWW,OAAX,8FAAqB;QAAEH,KAAF;QAASC,SAAT;QAAoBL,KAAK,EAAE,KAAKA;MAAhC,CAArB;IACD,CAbA;;IAAA,+BAeO,MAAM;MACZ,KAAKM,QAAL,CAAc;QAAEF,KAAK,EAAE,IAAT;QAAeC,SAAS,EAAE;MAA1B,CAAd;IACD,CAjBA;;IAAA,gCAmBQ,MAAM;MACb,IAAI,KAAKG,KAAL,CAAWJ,KAAX,IAAoB,KAAKI,KAAL,CAAWH,SAAnC,EAA8C;QAAA;;QAC5C,OACE,+CAAKT,KAAL,EAAWa,kBAAX,mGAAgC;UAC9BL,KAAK,EAAE,KAAKI,KAAL,CAAWJ,KADY;UAE9BC,SAAS,EAAE,KAAKG,KAAL,CAAWH,SAFQ;UAG9BL,KAAK,EAAE,KAAKA;QAHkB,CAAhC,MAIM,IALR;MAOD;;MAED,oBAAO,4DAAG,KAAKJ,KAAL,CAAWc,QAAd,CAAP;IACD,CA/BA;EAAA;;AAAA;;gBAJGT,qB,kBAKkB;EACpBQ,kBAAkB,EAAEd;AADA,C;;eAiCTM,qB"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["InternalLocalCacheStorage","constructor","storage","getAllKeys","getItem","key","removeItem","setItem","value","multiGet","keys","Promise","all","map","multiRemove","multiSet","keyValuePairs"],"sources":["InternalLocalCacheStorage.ts"],"sourcesContent":["import type { KeyValuePairGet, KeyValuePairSet, LocalCacheStorage } from './types';\n\nexport default class InternalLocalCacheStorage implements LocalCacheStorage {\n constructor(private storage: LocalCacheStorage) {}\n\n getAllKeys() {\n return this.storage.getAllKeys();\n }\n\n getItem(key: string) {\n return this.storage.getItem(key);\n }\n\n removeItem(key: string) {\n return this.storage.removeItem(key);\n }\n\n setItem(key: string, value: string) {\n return this.storage.setItem(key, value);\n }\n\n async multiGet(keys: string[]) {\n if (this.storage.multiGet) {\n return this.storage.multiGet(keys);\n } else {\n return Promise.all(keys.map(async (key) => [key, await this.getItem(key)] as KeyValuePairGet));\n }\n }\n\n async multiRemove(keys: string[]) {\n if (this.storage.multiRemove) {\n await this.storage.multiRemove(keys);\n } else {\n await Promise.all(keys.map(async (key) => this.removeItem(key)));\n }\n }\n\n async multiSet(keyValuePairs: Array<KeyValuePairSet>) {\n if (this.storage.multiSet) {\n await this.storage.multiSet(keyValuePairs);\n } else {\n await Promise.all(keyValuePairs.map(([key, value]) => this.storage.setItem(key, value)));\n }\n }\n}\n"],"mappings":";;;;;;;AAEe,MAAMA,yBAAN,CAA6D;EAC1EC,WAAW,CAASC,OAAT,EAAqC;IAAA,KAA5BA,OAA4B,GAA5BA,OAA4B;EAAE;;EAElDC,UAAU,GAAG;IACX,OAAO,KAAKD,OAAL,CAAaC,UAAb,EAAP;EACD;;EAEDC,OAAO,CAACC,GAAD,EAAc;IACnB,OAAO,KAAKH,OAAL,CAAaE,OAAb,CAAqBC,GAArB,CAAP;EACD;;EAEDC,UAAU,CAACD,GAAD,EAAc;IACtB,OAAO,KAAKH,OAAL,CAAaI,UAAb,CAAwBD,GAAxB,CAAP;EACD;;EAEDE,OAAO,CAACF,GAAD,EAAcG,KAAd,EAA6B;IAClC,OAAO,KAAKN,OAAL,CAAaK,OAAb,CAAqBF,GAArB,EAA0BG,KAA1B,CAAP;EACD;;EAEa,MAARC,QAAQ,CAACC,IAAD,EAAiB;IAC7B,IAAI,KAAKR,OAAL,CAAaO,QAAjB,EAA2B;MACzB,OAAO,KAAKP,OAAL,CAAaO,QAAb,CAAsBC,IAAtB,CAAP;IACD,CAFD,MAEO;MACL,OAAOC,OAAO,CAACC,GAAR,CAAYF,IAAI,CAACG,GAAL,CAAS,MAAOR,GAAP,IAAe,CAACA,GAAD,EAAM,MAAM,KAAKD,OAAL,CAAaC,GAAb,CAAZ,CAAxB,CAAZ,CAAP;IACD;EACF;;EAEgB,MAAXS,WAAW,CAACJ,IAAD,EAAiB;IAChC,IAAI,KAAKR,OAAL,CAAaY,WAAjB,EAA8B;MAC5B,MAAM,KAAKZ,OAAL,CAAaY,WAAb,CAAyBJ,IAAzB,CAAN;IACD,CAFD,MAEO;MACL,MAAMC,OAAO,CAACC,GAAR,CAAYF,IAAI,CAACG,GAAL,CAAS,MAAOR,GAAP,IAAe,KAAKC,UAAL,CAAgBD,GAAhB,CAAxB,CAAZ,CAAN;IACD;EACF;;EAEa,MAARU,QAAQ,CAACC,aAAD,EAAwC;IACpD,IAAI,KAAKd,OAAL,CAAaa,QAAjB,EAA2B;MACzB,MAAM,KAAKb,OAAL,CAAaa,QAAb,CAAsBC,aAAtB,CAAN;IACD,CAFD,MAEO;MACL,MAAML,OAAO,CAACC,GAAR,CAAYI,aAAa,CAACH,GAAd,CAAkB;QAAA,IAAC,CAACR,GAAD,EAAMG,KAAN,CAAD;QAAA,OAAkB,KAAKN,OAAL,CAAaK,OAAb,CAAqBF,GAArB,EAA0BG,KAA1B,CAAlB;MAAA,CAAlB,CAAZ,CAAN;IACD;EACF;;AAzCyE"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["NetInfo","SBUDynamicModule","get","SendbirdUIKit","Object","freeze","VERSION","PLATFORM","Platform","OS","toLowerCase","SendbirdUIKitContainer","children","appId","chatOptions","platformServices","localization","styles","toast","errorBoundary","unsubscribes","useRef","current","getSendbirdSDK","sdk","localCacheStorage","Sendbird","localCacheEnabled","useAsyncStorageAsDatabase","InternalLocalCacheStorage","onInitialized","addExtension","addEventListener","listener","callback","callbackType","unsubscribe","state","online","Boolean","isConnected","isInternetReachable","push","setOnlineListener","onOnline","setOfflineListener","onOffline","sdkInstance","setSdkInstance","useState","useEffect","forEach","u","enableAutoPushTokenRegistration","enableChannelListTypingIndicator","enableChannelListMessageReceiptStatus","stringSet","StringSetEn","file","notification","clipboard","media","theme","LightUIKitTheme","HeaderComponent","Header","defaultHeaderTitleAlign","statusBarTranslucent","dismissTimeout","LocalizedDialogProvider","STRINGS","useLocalization","alert","ok","DIALOG","ALERT_DEFAULT_OK","prompt","PROMPT_DEFAULT_OK","cancel","PROMPT_DEFAULT_CANCEL","placeholder","PROMPT_DEFAULT_PLACEHOLDER"],"sources":["SendbirdUIKitContainer.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport { SafeAreaProvider } from 'react-native-safe-area-context';\nimport Sendbird from 'sendbird';\n\nimport type { HeaderStyleContextType, UIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport {\n DialogProvider,\n Header,\n HeaderStyleProvider,\n LightUIKitTheme,\n ToastProvider,\n UIKitThemeProvider,\n} from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdChatSDK } from '@sendbird/uikit-utils';\n\nimport InternalErrorBoundary from './InternalErrorBoundary';\nimport InternalLocalCacheStorage from './InternalLocalCacheStorage';\nimport { LocalizationProvider } from './contexts/Localization';\nimport { PlatformServiceProvider } from './contexts/PlatformService';\nimport { SendbirdChatProvider } from './contexts/SendbirdChat';\nimport { useLocalization } from './hooks/useContext';\nimport StringSetEn from './localization/StringSet.en';\nimport type { StringSet } from './localization/StringSet.type';\nimport SBUDynamicModule from './platform/dynamicModule';\nimport type {\n ClipboardServiceInterface,\n FileServiceInterface,\n MediaServiceInterface,\n NotificationServiceInterface,\n} from './platform/types';\nimport type { ErrorBoundaryProps, LocalCacheStorage } from './types';\nimport VERSION from './version';\n\nconst NetInfo = SBUDynamicModule.get('@react-native-community/netinfo', 'warn');\n\nexport const SendbirdUIKit = Object.freeze({\n VERSION,\n PLATFORM: Platform.OS.toLowerCase(),\n});\n\nexport type SendbirdUIKitContainerProps = React.PropsWithChildren<{\n appId: string;\n platformServices: {\n file: FileServiceInterface;\n notification: NotificationServiceInterface;\n clipboard: ClipboardServiceInterface;\n media?: MediaServiceInterface;\n };\n chatOptions?: {\n localCacheStorage?: LocalCacheStorage;\n onInitialized?: (sdkInstance: SendbirdChatSDK) => SendbirdChatSDK;\n enableAutoPushTokenRegistration?: boolean;\n enableChannelListTypingIndicator?: boolean;\n enableChannelListMessageReceiptStatus?: boolean;\n };\n localization?: {\n stringSet?: StringSet;\n };\n styles?: {\n theme?: UIKitTheme;\n statusBarTranslucent?: boolean;\n defaultHeaderTitleAlign?: 'left' | 'center';\n defaultHeaderHeight?: number;\n HeaderComponent?: HeaderStyleContextType['HeaderComponent'];\n };\n toast?: {\n dismissTimeout?: number;\n };\n errorBoundary?: {\n onError?: (props: ErrorBoundaryProps) => void;\n ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;\n };\n}>;\n\nconst SendbirdUIKitContainer = ({\n children,\n appId,\n chatOptions,\n platformServices,\n localization,\n styles,\n toast,\n errorBoundary,\n}: SendbirdUIKitContainerProps) => {\n const unsubscribes = useRef<(() => void)[]>([]).current;\n const getSendbirdSDK = () => {\n let sdk: SendbirdChatSDK;\n\n if (chatOptions?.localCacheStorage) {\n sdk = new Sendbird({ appId, localCacheEnabled: true });\n sdk.useAsyncStorageAsDatabase(new InternalLocalCacheStorage(chatOptions.localCacheStorage));\n } else {\n sdk = new Sendbird({ appId });\n }\n\n if (chatOptions?.onInitialized) {\n sdk = chatOptions?.onInitialized(sdk);\n }\n\n if (SendbirdUIKit.VERSION) {\n // @ts-ignore\n sdk.addExtension('sb_uikit', SendbirdUIKit.VERSION);\n }\n if (SendbirdUIKit.PLATFORM) {\n // @ts-ignore\n sdk.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);\n }\n\n if (NetInfo?.addEventListener) {\n const listener = (callback: () => void, callbackType: 'online' | 'offline') => {\n const unsubscribe = NetInfo.addEventListener((state) => {\n const online = Boolean(state.isConnected) || Boolean(state.isInternetReachable);\n if (online && callbackType === 'online') callback();\n if (!online && callbackType === 'offline') callback();\n });\n unsubscribes.push(unsubscribe);\n return unsubscribe;\n };\n sdk.setOnlineListener?.((onOnline) => listener(onOnline, 'online'));\n sdk.setOfflineListener?.((onOffline) => listener(onOffline, 'offline'));\n }\n return sdk;\n };\n\n const [sdkInstance, setSdkInstance] = useState<SendbirdChatSDK>(getSendbirdSDK);\n\n useEffect(() => {\n setSdkInstance(getSendbirdSDK);\n return () => {\n unsubscribes.forEach((u) => {\n try {\n u();\n } catch {}\n });\n };\n }, [appId, chatOptions?.localCacheStorage]);\n\n return (\n <SafeAreaProvider>\n <SendbirdChatProvider\n sdkInstance={sdkInstance}\n enableAutoPushTokenRegistration={chatOptions?.enableAutoPushTokenRegistration ?? true}\n enableChannelListTypingIndicator={chatOptions?.enableChannelListTypingIndicator ?? false}\n enableChannelListMessageReceiptStatus={chatOptions?.enableChannelListMessageReceiptStatus ?? false}\n >\n <LocalizationProvider stringSet={localization?.stringSet ?? StringSetEn}>\n <PlatformServiceProvider\n fileService={platformServices.file}\n notificationService={platformServices.notification}\n clipboardService={platformServices.clipboard}\n mediaService={platformServices.media}\n >\n <UIKitThemeProvider theme={styles?.theme ?? LightUIKitTheme}>\n <HeaderStyleProvider\n HeaderComponent={styles?.HeaderComponent ?? Header}\n defaultTitleAlign={styles?.defaultHeaderTitleAlign ?? 'left'}\n statusBarTranslucent={styles?.statusBarTranslucent ?? true}\n >\n <LocalizedDialogProvider>\n <ToastProvider dismissTimeout={toast?.dismissTimeout}>\n <InternalErrorBoundary {...errorBoundary}>{children}</InternalErrorBoundary>\n </ToastProvider>\n </LocalizedDialogProvider>\n </HeaderStyleProvider>\n </UIKitThemeProvider>\n </PlatformServiceProvider>\n </LocalizationProvider>\n </SendbirdChatProvider>\n </SafeAreaProvider>\n );\n};\n\nconst LocalizedDialogProvider = ({ children }: React.PropsWithChildren) => {\n const { STRINGS } = useLocalization();\n return (\n <DialogProvider\n defaultLabels={{\n alert: {\n ok: STRINGS.DIALOG.ALERT_DEFAULT_OK,\n },\n prompt: {\n ok: STRINGS.DIALOG.PROMPT_DEFAULT_OK,\n cancel: STRINGS.DIALOG.PROMPT_DEFAULT_CANCEL,\n placeholder: STRINGS.DIALOG.PROMPT_DEFAULT_PLACEHOLDER,\n },\n }}\n >\n {children}\n </DialogProvider>\n );\n};\n\nexport default SendbirdUIKitContainer;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["iconMapper","audio","image","video","file","GroupChannelPreviewContainer","onPress","onLongPress","channel","currentUser","sdk","features","useSendbirdChat","STRINGS","useLocalization","colors","useUIKitTheme","typingUsers","setTypingUsers","useState","forceUpdate","useForceUpdate","channelListTypingIndicatorEnabled","typingId","useUniqId","useChannelHandler","onTypingStatusUpdated","eventChannel","isDifferentChannel","getTypingUsers","channelListMessageReceiptStatusEnabled","receiptId","onDeliveryReceiptUpdated","isGroupChannel","lastMessage","isMyMessage","userId","onReadReceiptUpdated","bodyText","useIIFE","length","LABELS","TYPING_INDICATOR_TYPINGS","GROUP_CHANNEL_LIST","CHANNEL_PREVIEW_BODY","bodyIcon","isFileMessage","undefined","getFileType","type","getFileExtension","name","titleCaptionIcon","sendingStatus","styles","error","getUnreadMemberCount","secondary","deliveryReceiptEnabled","getUndeliveredMemberCount","onBackground03","coverUrl","CHANNEL_PREVIEW_TITLE","CHANNEL_PREVIEW_TITLE_CAPTION","unreadMessageCount","memberCount","isFrozen","myPushTriggerOption","createStyleSheet","marginRight"],"sources":["GroupChannelPreviewContainer.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport {\n GroupChannelPreview,\n LoadingSpinner,\n createStyleSheet,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport Icon from '@sendbird/uikit-react-native-foundation/src/ui/Icon';\nimport {\n SendbirdGroupChannel,\n SendbirdUser,\n getFileExtension,\n getFileType,\n isDifferentChannel,\n isMyMessage,\n useForceUpdate,\n useIIFE,\n useUniqId,\n} from '@sendbird/uikit-utils';\n\nimport { useLocalization, useSendbirdChat } from '../hooks/useContext';\nimport ChannelCover from './ChannelCover';\nimport SBUPressable from './SBUPressable';\n\nconst iconMapper = { audio: 'file-audio', image: 'photo', video: 'play', file: 'file-document' } as const;\n\ntype Props = {\n channel: SendbirdGroupChannel;\n onPress: () => void;\n onLongPress: () => void;\n};\nconst GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props) => {\n const { currentUser, sdk, features } = useSendbirdChat();\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n\n const [typingUsers, setTypingUsers] = useState<SendbirdUser[]>([]);\n const forceUpdate = useForceUpdate();\n\n if (features.channelListTypingIndicatorEnabled) {\n const typingId = useUniqId('GroupChannelPreviewContainer');\n useChannelHandler(sdk, `GroupChannelPreviewContainer_TypingIndicator_${typingId}`, {\n onTypingStatusUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n setTypingUsers(eventChannel.getTypingUsers());\n },\n });\n }\n\n if (features.channelListMessageReceiptStatusEnabled) {\n const receiptId = useUniqId('GroupChannelPreviewContainer');\n useChannelHandler(sdk, `GroupChannelPreviewContainer_ReceiptStatus_${receiptId}`, {\n onDeliveryReceiptUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!eventChannel.isGroupChannel() || !eventChannel.lastMessage) return;\n if (!isMyMessage(eventChannel.lastMessage, currentUser?.userId)) return;\n\n forceUpdate();\n },\n onReadReceiptUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!eventChannel.isGroupChannel() || !eventChannel.lastMessage) return;\n if (!isMyMessage(eventChannel.lastMessage, currentUser?.userId)) return;\n\n forceUpdate();\n },\n });\n }\n\n const bodyText = useIIFE(() => {\n if (typingUsers.length > 0) return STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers) || '';\n else return STRINGS.GROUP_CHANNEL_LIST.CHANNEL_PREVIEW_BODY(channel);\n });\n\n const bodyIcon = useIIFE(() => {\n if (!channel.lastMessage?.isFileMessage()) return undefined;\n return iconMapper[getFileType(channel.lastMessage.type || getFileExtension(channel.lastMessage.name))];\n });\n\n const titleCaptionIcon = useIIFE(() => {\n if (!channel.lastMessage) return undefined;\n if (!features.channelListMessageReceiptStatusEnabled) return undefined;\n if (!isMyMessage(channel.lastMessage, currentUser?.userId)) return undefined;\n\n if (channel.lastMessage.sendingStatus === 'pending') {\n return <LoadingSpinner size={16} style={styles.titleCaptionIcon} />;\n }\n\n if (channel.lastMessage.sendingStatus === 'failed') {\n return <Icon icon={'error'} size={16} color={colors.error} style={styles.titleCaptionIcon} />;\n }\n\n if (channel.getUnreadMemberCount(channel.lastMessage) === 0) {\n return <Icon icon={'done-all'} size={16} color={colors.secondary} style={styles.titleCaptionIcon} />;\n }\n\n if (features.deliveryReceiptEnabled) {\n if (channel.getUndeliveredMemberCount(channel.lastMessage) === 0) {\n return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;\n }\n return <Icon icon={'done'} size={16} color={colors.onBackground03} containerStyle={styles.titleCaptionIcon} />;\n }\n\n return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;\n });\n\n return (\n <SBUPressable onPress={onPress} onLongPress={onLongPress}>\n <GroupChannelPreview\n customCover={<ChannelCover channel={channel} size={56} />}\n coverUrl={channel.coverUrl}\n title={STRINGS.GROUP_CHANNEL_LIST.CHANNEL_PREVIEW_TITLE(currentUser?.userId ?? '', channel)}\n titleCaptionLeft={titleCaptionIcon}\n titleCaption={STRINGS.GROUP_CHANNEL_LIST.CHANNEL_PREVIEW_TITLE_CAPTION(channel)}\n body={bodyText}\n bodyIcon={bodyIcon}\n badgeCount={channel.unreadMessageCount}\n memberCount={channel.memberCount > 2 ? channel.memberCount : undefined}\n frozen={channel.isFrozen}\n notificationOff={channel.myPushTriggerOption === 'off'}\n />\n </SBUPressable>\n );\n};\n\nconst styles = createStyleSheet({\n titleCaptionIcon: {\n marginRight: 4,\n },\n});\n\nexport default GroupChannelPreviewContainer;\n"],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireDefault(require("react"));
9
-
10
- var _reactNative = require("react-native");
11
-
12
- var _constants = require("../constants");
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
17
-
18
- function getComponent(as) {
19
- switch (as) {
20
- case 'Pressable':
21
- return _reactNative.Pressable;
22
-
23
- case 'TouchableOpacity':
24
- return _reactNative.TouchableOpacity;
25
-
26
- default:
27
- return _reactNative.Pressable;
28
- }
29
- }
30
-
31
- const SBUPressable = _ref => {
32
- let {
33
- as,
34
- ...props
35
- } = _ref;
36
- const Renderer = getComponent(as); // @ts-ignore
37
-
38
- return /*#__PURE__*/_react.default.createElement(Renderer, _extends({
39
- delayLongPress: _constants.DEFAULT_LONG_PRESS_DELAY
40
- }, props));
41
- };
42
-
43
- var _default = SBUPressable;
44
- exports.default = _default;
45
- //# sourceMappingURL=SBUPressable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["getComponent","as","Pressable","TouchableOpacity","SBUPressable","props","Renderer","DEFAULT_LONG_PRESS_DELAY"],"sources":["SBUPressable.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, PressableProps, TouchableOpacity, TouchableOpacityProps } from 'react-native';\n\nimport { DEFAULT_LONG_PRESS_DELAY } from '../constants';\n\ntype Components = 'Pressable' | 'TouchableOpacity';\ntype Props<T extends Components = 'Pressable'> = {\n as?: T;\n} & ExtractProps<T, AsProps>;\n\ntype AsProps =\n | {\n type: 'Pressable';\n props: PressableProps;\n }\n | {\n type: 'TouchableOpacity';\n props: TouchableOpacityProps;\n };\n\ntype ExtractProps<T extends Components, U extends AsProps> = U extends { type: T; props: infer P } ? P : never;\n\nfunction getComponent(as?: Components) {\n switch (as) {\n case 'Pressable':\n return Pressable;\n case 'TouchableOpacity':\n return TouchableOpacity;\n default:\n return Pressable;\n }\n}\n\nconst SBUPressable = <T extends Components>({ as, ...props }: Props<T>) => {\n const Renderer = getComponent(as);\n // @ts-ignore\n return <Renderer delayLongPress={DEFAULT_LONG_PRESS_DELAY} {...props} />;\n};\n\nexport default SBUPressable;\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;AAmBA,SAASA,YAAT,CAAsBC,EAAtB,EAAuC;EACrC,QAAQA,EAAR;IACE,KAAK,WAAL;MACE,OAAOC,sBAAP;;IACF,KAAK,kBAAL;MACE,OAAOC,6BAAP;;IACF;MACE,OAAOD,sBAAP;EANJ;AAQD;;AAED,MAAME,YAAY,GAAG,QAAsD;EAAA,IAA/B;IAAEH,EAAF;IAAM,GAAGI;EAAT,CAA+B;EACzE,MAAMC,QAAQ,GAAGN,YAAY,CAACC,EAAD,CAA7B,CADyE,CAEzE;;EACA,oBAAO,6BAAC,QAAD;IAAU,cAAc,EAAEM;EAA1B,GAAwDF,KAAxD,EAAP;AACD,CAJD;;eAMeD,Y"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","View","TypedPlaceholder","DefaultErrorBoundaryComponent","props","flex","justifyContent","alignItems","reset","InternalErrorBoundary","PureComponent","error","errorInfo","setState","onError","state","ErrorInfoComponent","children"],"sources":["InternalErrorBoundary.tsx"],"sourcesContent":["import React, { ErrorInfo } from 'react';\nimport { View } from 'react-native';\n\nimport TypedPlaceholder from './components/TypedPlaceholder';\nimport type { ErrorBoundaryProps } from './types';\n\nconst DefaultErrorBoundaryComponent = (props: ErrorBoundaryProps) => {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <TypedPlaceholder type={'error-wrong'} onPressRetry={props.reset} />\n </View>\n );\n};\n\nclass InternalErrorBoundary extends React.PureComponent<{\n onError?: (props: ErrorBoundaryProps) => void;\n ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;\n children?: React.ReactNode;\n}> {\n static defaultProps = {\n ErrorInfoComponent: DefaultErrorBoundaryComponent,\n };\n\n state: { error: Error | null; errorInfo: ErrorInfo | null } = {\n error: null,\n errorInfo: null,\n };\n\n componentDidCatch = (error: Error, errorInfo: ErrorInfo) => {\n this.setState({ error, errorInfo });\n this.props.onError?.({ error, errorInfo, reset: this.reset });\n };\n\n reset = () => {\n this.setState({ error: null, errorInfo: null });\n };\n\n render = () => {\n if (this.state.error && this.state.errorInfo) {\n return (\n this.props.ErrorInfoComponent?.({\n error: this.state.error,\n errorInfo: this.state.errorInfo,\n reset: this.reset,\n }) ?? null\n );\n }\n\n return <>{this.props.children}</>;\n };\n}\n\nexport default InternalErrorBoundary;\n"],"mappings":";;AAAA,OAAOA,KAAP,MAAiC,OAAjC;AACA,SAASC,IAAT,QAAqB,cAArB;AAEA,OAAOC,gBAAP,MAA6B,+BAA7B;;AAGA,MAAMC,6BAA6B,GAAIC,KAAD,IAA+B;EACnE,oBACE,oBAAC,IAAD;IAAM,KAAK,EAAE;MAAEC,IAAI,EAAE,CAAR;MAAWC,cAAc,EAAE,QAA3B;MAAqCC,UAAU,EAAE;IAAjD;EAAb,gBACE,oBAAC,gBAAD;IAAkB,IAAI,EAAE,aAAxB;IAAuC,YAAY,EAAEH,KAAK,CAACI;EAA3D,EADF,CADF;AAKD,CAND;;AAQA,MAAMC,qBAAN,SAAoCT,KAAK,CAACU,aAA1C,CAIG;EAAA;IAAA;;IAAA,+BAK6D;MAC5DC,KAAK,EAAE,IADqD;MAE5DC,SAAS,EAAE;IAFiD,CAL7D;;IAAA,2CAUmB,CAACD,KAAD,EAAeC,SAAf,KAAwC;MAAA;;MAC1D,KAAKC,QAAL,CAAc;QAAEF,KAAF;QAASC;MAAT,CAAd;MACA,2CAAKR,KAAL,EAAWU,OAAX,8FAAqB;QAAEH,KAAF;QAASC,SAAT;QAAoBJ,KAAK,EAAE,KAAKA;MAAhC,CAArB;IACD,CAbA;;IAAA,+BAeO,MAAM;MACZ,KAAKK,QAAL,CAAc;QAAEF,KAAK,EAAE,IAAT;QAAeC,SAAS,EAAE;MAA1B,CAAd;IACD,CAjBA;;IAAA,gCAmBQ,MAAM;MACb,IAAI,KAAKG,KAAL,CAAWJ,KAAX,IAAoB,KAAKI,KAAL,CAAWH,SAAnC,EAA8C;QAAA;;QAC5C,OACE,+CAAKR,KAAL,EAAWY,kBAAX,mGAAgC;UAC9BL,KAAK,EAAE,KAAKI,KAAL,CAAWJ,KADY;UAE9BC,SAAS,EAAE,KAAKG,KAAL,CAAWH,SAFQ;UAG9BJ,KAAK,EAAE,KAAKA;QAHkB,CAAhC,MAIM,IALR;MAOD;;MAED,oBAAO,0CAAG,KAAKJ,KAAL,CAAWa,QAAd,CAAP;IACD,CA/BA;EAAA;;AAAA;;gBAJGR,qB,kBAKkB;EACpBO,kBAAkB,EAAEb;AADA,C;;AAiCxB,eAAeM,qBAAf"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["InternalLocalCacheStorage","constructor","storage","getAllKeys","getItem","key","removeItem","setItem","value","multiGet","keys","Promise","all","map","multiRemove","multiSet","keyValuePairs"],"sources":["InternalLocalCacheStorage.ts"],"sourcesContent":["import type { KeyValuePairGet, KeyValuePairSet, LocalCacheStorage } from './types';\n\nexport default class InternalLocalCacheStorage implements LocalCacheStorage {\n constructor(private storage: LocalCacheStorage) {}\n\n getAllKeys() {\n return this.storage.getAllKeys();\n }\n\n getItem(key: string) {\n return this.storage.getItem(key);\n }\n\n removeItem(key: string) {\n return this.storage.removeItem(key);\n }\n\n setItem(key: string, value: string) {\n return this.storage.setItem(key, value);\n }\n\n async multiGet(keys: string[]) {\n if (this.storage.multiGet) {\n return this.storage.multiGet(keys);\n } else {\n return Promise.all(keys.map(async (key) => [key, await this.getItem(key)] as KeyValuePairGet));\n }\n }\n\n async multiRemove(keys: string[]) {\n if (this.storage.multiRemove) {\n await this.storage.multiRemove(keys);\n } else {\n await Promise.all(keys.map(async (key) => this.removeItem(key)));\n }\n }\n\n async multiSet(keyValuePairs: Array<KeyValuePairSet>) {\n if (this.storage.multiSet) {\n await this.storage.multiSet(keyValuePairs);\n } else {\n await Promise.all(keyValuePairs.map(([key, value]) => this.storage.setItem(key, value)));\n }\n }\n}\n"],"mappings":"AAEA,eAAe,MAAMA,yBAAN,CAA6D;EAC1EC,WAAW,CAASC,OAAT,EAAqC;IAAA,KAA5BA,OAA4B,GAA5BA,OAA4B;EAAE;;EAElDC,UAAU,GAAG;IACX,OAAO,KAAKD,OAAL,CAAaC,UAAb,EAAP;EACD;;EAEDC,OAAO,CAACC,GAAD,EAAc;IACnB,OAAO,KAAKH,OAAL,CAAaE,OAAb,CAAqBC,GAArB,CAAP;EACD;;EAEDC,UAAU,CAACD,GAAD,EAAc;IACtB,OAAO,KAAKH,OAAL,CAAaI,UAAb,CAAwBD,GAAxB,CAAP;EACD;;EAEDE,OAAO,CAACF,GAAD,EAAcG,KAAd,EAA6B;IAClC,OAAO,KAAKN,OAAL,CAAaK,OAAb,CAAqBF,GAArB,EAA0BG,KAA1B,CAAP;EACD;;EAEa,MAARC,QAAQ,CAACC,IAAD,EAAiB;IAC7B,IAAI,KAAKR,OAAL,CAAaO,QAAjB,EAA2B;MACzB,OAAO,KAAKP,OAAL,CAAaO,QAAb,CAAsBC,IAAtB,CAAP;IACD,CAFD,MAEO;MACL,OAAOC,OAAO,CAACC,GAAR,CAAYF,IAAI,CAACG,GAAL,CAAS,MAAOR,GAAP,IAAe,CAACA,GAAD,EAAM,MAAM,KAAKD,OAAL,CAAaC,GAAb,CAAZ,CAAxB,CAAZ,CAAP;IACD;EACF;;EAEgB,MAAXS,WAAW,CAACJ,IAAD,EAAiB;IAChC,IAAI,KAAKR,OAAL,CAAaY,WAAjB,EAA8B;MAC5B,MAAM,KAAKZ,OAAL,CAAaY,WAAb,CAAyBJ,IAAzB,CAAN;IACD,CAFD,MAEO;MACL,MAAMC,OAAO,CAACC,GAAR,CAAYF,IAAI,CAACG,GAAL,CAAS,MAAOR,GAAP,IAAe,KAAKC,UAAL,CAAgBD,GAAhB,CAAxB,CAAZ,CAAN;IACD;EACF;;EAEa,MAARU,QAAQ,CAACC,aAAD,EAAwC;IACpD,IAAI,KAAKd,OAAL,CAAaa,QAAjB,EAA2B;MACzB,MAAM,KAAKb,OAAL,CAAaa,QAAb,CAAsBC,aAAtB,CAAN;IACD,CAFD,MAEO;MACL,MAAML,OAAO,CAACC,GAAR,CAAYI,aAAa,CAACH,GAAd,CAAkB;QAAA,IAAC,CAACR,GAAD,EAAMG,KAAN,CAAD;QAAA,OAAkB,KAAKN,OAAL,CAAaK,OAAb,CAAqBF,GAArB,EAA0BG,KAA1B,CAAlB;MAAA,CAAlB,CAAZ,CAAN;IACD;EACF;;AAzCyE"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","useEffect","useRef","useState","Platform","SafeAreaProvider","Sendbird","DialogProvider","Header","HeaderStyleProvider","LightUIKitTheme","ToastProvider","UIKitThemeProvider","InternalErrorBoundary","InternalLocalCacheStorage","LocalizationProvider","PlatformServiceProvider","SendbirdChatProvider","useLocalization","StringSetEn","SBUDynamicModule","VERSION","NetInfo","get","SendbirdUIKit","Object","freeze","PLATFORM","OS","toLowerCase","SendbirdUIKitContainer","children","appId","chatOptions","platformServices","localization","styles","toast","errorBoundary","unsubscribes","current","getSendbirdSDK","sdk","localCacheStorage","localCacheEnabled","useAsyncStorageAsDatabase","onInitialized","addExtension","addEventListener","listener","callback","callbackType","unsubscribe","state","online","Boolean","isConnected","isInternetReachable","push","setOnlineListener","onOnline","setOfflineListener","onOffline","sdkInstance","setSdkInstance","forEach","u","enableAutoPushTokenRegistration","enableChannelListTypingIndicator","enableChannelListMessageReceiptStatus","stringSet","file","notification","clipboard","media","theme","HeaderComponent","defaultHeaderTitleAlign","statusBarTranslucent","dismissTimeout","LocalizedDialogProvider","STRINGS","alert","ok","DIALOG","ALERT_DEFAULT_OK","prompt","PROMPT_DEFAULT_OK","cancel","PROMPT_DEFAULT_CANCEL","placeholder","PROMPT_DEFAULT_PLACEHOLDER"],"sources":["SendbirdUIKitContainer.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Platform } from 'react-native';\nimport { SafeAreaProvider } from 'react-native-safe-area-context';\nimport Sendbird from 'sendbird';\n\nimport type { HeaderStyleContextType, UIKitTheme } from '@sendbird/uikit-react-native-foundation';\nimport {\n DialogProvider,\n Header,\n HeaderStyleProvider,\n LightUIKitTheme,\n ToastProvider,\n UIKitThemeProvider,\n} from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdChatSDK } from '@sendbird/uikit-utils';\n\nimport InternalErrorBoundary from './InternalErrorBoundary';\nimport InternalLocalCacheStorage from './InternalLocalCacheStorage';\nimport { LocalizationProvider } from './contexts/Localization';\nimport { PlatformServiceProvider } from './contexts/PlatformService';\nimport { SendbirdChatProvider } from './contexts/SendbirdChat';\nimport { useLocalization } from './hooks/useContext';\nimport StringSetEn from './localization/StringSet.en';\nimport type { StringSet } from './localization/StringSet.type';\nimport SBUDynamicModule from './platform/dynamicModule';\nimport type {\n ClipboardServiceInterface,\n FileServiceInterface,\n MediaServiceInterface,\n NotificationServiceInterface,\n} from './platform/types';\nimport type { ErrorBoundaryProps, LocalCacheStorage } from './types';\nimport VERSION from './version';\n\nconst NetInfo = SBUDynamicModule.get('@react-native-community/netinfo', 'warn');\n\nexport const SendbirdUIKit = Object.freeze({\n VERSION,\n PLATFORM: Platform.OS.toLowerCase(),\n});\n\nexport type SendbirdUIKitContainerProps = React.PropsWithChildren<{\n appId: string;\n platformServices: {\n file: FileServiceInterface;\n notification: NotificationServiceInterface;\n clipboard: ClipboardServiceInterface;\n media?: MediaServiceInterface;\n };\n chatOptions?: {\n localCacheStorage?: LocalCacheStorage;\n onInitialized?: (sdkInstance: SendbirdChatSDK) => SendbirdChatSDK;\n enableAutoPushTokenRegistration?: boolean;\n enableChannelListTypingIndicator?: boolean;\n enableChannelListMessageReceiptStatus?: boolean;\n };\n localization?: {\n stringSet?: StringSet;\n };\n styles?: {\n theme?: UIKitTheme;\n statusBarTranslucent?: boolean;\n defaultHeaderTitleAlign?: 'left' | 'center';\n defaultHeaderHeight?: number;\n HeaderComponent?: HeaderStyleContextType['HeaderComponent'];\n };\n toast?: {\n dismissTimeout?: number;\n };\n errorBoundary?: {\n onError?: (props: ErrorBoundaryProps) => void;\n ErrorInfoComponent?: (props: ErrorBoundaryProps) => JSX.Element;\n };\n}>;\n\nconst SendbirdUIKitContainer = ({\n children,\n appId,\n chatOptions,\n platformServices,\n localization,\n styles,\n toast,\n errorBoundary,\n}: SendbirdUIKitContainerProps) => {\n const unsubscribes = useRef<(() => void)[]>([]).current;\n const getSendbirdSDK = () => {\n let sdk: SendbirdChatSDK;\n\n if (chatOptions?.localCacheStorage) {\n sdk = new Sendbird({ appId, localCacheEnabled: true });\n sdk.useAsyncStorageAsDatabase(new InternalLocalCacheStorage(chatOptions.localCacheStorage));\n } else {\n sdk = new Sendbird({ appId });\n }\n\n if (chatOptions?.onInitialized) {\n sdk = chatOptions?.onInitialized(sdk);\n }\n\n if (SendbirdUIKit.VERSION) {\n // @ts-ignore\n sdk.addExtension('sb_uikit', SendbirdUIKit.VERSION);\n }\n if (SendbirdUIKit.PLATFORM) {\n // @ts-ignore\n sdk.addExtension('device-os-platform', SendbirdUIKit.PLATFORM);\n }\n\n if (NetInfo?.addEventListener) {\n const listener = (callback: () => void, callbackType: 'online' | 'offline') => {\n const unsubscribe = NetInfo.addEventListener((state) => {\n const online = Boolean(state.isConnected) || Boolean(state.isInternetReachable);\n if (online && callbackType === 'online') callback();\n if (!online && callbackType === 'offline') callback();\n });\n unsubscribes.push(unsubscribe);\n return unsubscribe;\n };\n sdk.setOnlineListener?.((onOnline) => listener(onOnline, 'online'));\n sdk.setOfflineListener?.((onOffline) => listener(onOffline, 'offline'));\n }\n return sdk;\n };\n\n const [sdkInstance, setSdkInstance] = useState<SendbirdChatSDK>(getSendbirdSDK);\n\n useEffect(() => {\n setSdkInstance(getSendbirdSDK);\n return () => {\n unsubscribes.forEach((u) => {\n try {\n u();\n } catch {}\n });\n };\n }, [appId, chatOptions?.localCacheStorage]);\n\n return (\n <SafeAreaProvider>\n <SendbirdChatProvider\n sdkInstance={sdkInstance}\n enableAutoPushTokenRegistration={chatOptions?.enableAutoPushTokenRegistration ?? true}\n enableChannelListTypingIndicator={chatOptions?.enableChannelListTypingIndicator ?? false}\n enableChannelListMessageReceiptStatus={chatOptions?.enableChannelListMessageReceiptStatus ?? false}\n >\n <LocalizationProvider stringSet={localization?.stringSet ?? StringSetEn}>\n <PlatformServiceProvider\n fileService={platformServices.file}\n notificationService={platformServices.notification}\n clipboardService={platformServices.clipboard}\n mediaService={platformServices.media}\n >\n <UIKitThemeProvider theme={styles?.theme ?? LightUIKitTheme}>\n <HeaderStyleProvider\n HeaderComponent={styles?.HeaderComponent ?? Header}\n defaultTitleAlign={styles?.defaultHeaderTitleAlign ?? 'left'}\n statusBarTranslucent={styles?.statusBarTranslucent ?? true}\n >\n <LocalizedDialogProvider>\n <ToastProvider dismissTimeout={toast?.dismissTimeout}>\n <InternalErrorBoundary {...errorBoundary}>{children}</InternalErrorBoundary>\n </ToastProvider>\n </LocalizedDialogProvider>\n </HeaderStyleProvider>\n </UIKitThemeProvider>\n </PlatformServiceProvider>\n </LocalizationProvider>\n </SendbirdChatProvider>\n </SafeAreaProvider>\n );\n};\n\nconst LocalizedDialogProvider = ({ children }: React.PropsWithChildren) => {\n const { STRINGS } = useLocalization();\n return (\n <DialogProvider\n defaultLabels={{\n alert: {\n ok: STRINGS.DIALOG.ALERT_DEFAULT_OK,\n },\n prompt: {\n ok: STRINGS.DIALOG.PROMPT_DEFAULT_OK,\n cancel: STRINGS.DIALOG.PROMPT_DEFAULT_CANCEL,\n placeholder: STRINGS.DIALOG.PROMPT_DEFAULT_PLACEHOLDER,\n },\n }}\n >\n {children}\n </DialogProvider>\n );\n};\n\nexport default SendbirdUIKitContainer;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","useState","useChannelHandler","GroupChannelPreview","LoadingSpinner","createStyleSheet","useUIKitTheme","Icon","getFileExtension","getFileType","isDifferentChannel","isMyMessage","useForceUpdate","useIIFE","useUniqId","useLocalization","useSendbirdChat","ChannelCover","SBUPressable","iconMapper","audio","image","video","file","GroupChannelPreviewContainer","onPress","onLongPress","channel","currentUser","sdk","features","STRINGS","colors","typingUsers","setTypingUsers","forceUpdate","channelListTypingIndicatorEnabled","typingId","onTypingStatusUpdated","eventChannel","getTypingUsers","channelListMessageReceiptStatusEnabled","receiptId","onDeliveryReceiptUpdated","isGroupChannel","lastMessage","userId","onReadReceiptUpdated","bodyText","length","LABELS","TYPING_INDICATOR_TYPINGS","GROUP_CHANNEL_LIST","CHANNEL_PREVIEW_BODY","bodyIcon","isFileMessage","undefined","type","name","titleCaptionIcon","sendingStatus","styles","error","getUnreadMemberCount","secondary","deliveryReceiptEnabled","getUndeliveredMemberCount","onBackground03","coverUrl","CHANNEL_PREVIEW_TITLE","CHANNEL_PREVIEW_TITLE_CAPTION","unreadMessageCount","memberCount","isFrozen","myPushTriggerOption","marginRight"],"sources":["GroupChannelPreviewContainer.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport {\n GroupChannelPreview,\n LoadingSpinner,\n createStyleSheet,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport Icon from '@sendbird/uikit-react-native-foundation/src/ui/Icon';\nimport {\n SendbirdGroupChannel,\n SendbirdUser,\n getFileExtension,\n getFileType,\n isDifferentChannel,\n isMyMessage,\n useForceUpdate,\n useIIFE,\n useUniqId,\n} from '@sendbird/uikit-utils';\n\nimport { useLocalization, useSendbirdChat } from '../hooks/useContext';\nimport ChannelCover from './ChannelCover';\nimport SBUPressable from './SBUPressable';\n\nconst iconMapper = { audio: 'file-audio', image: 'photo', video: 'play', file: 'file-document' } as const;\n\ntype Props = {\n channel: SendbirdGroupChannel;\n onPress: () => void;\n onLongPress: () => void;\n};\nconst GroupChannelPreviewContainer = ({ onPress, onLongPress, channel }: Props) => {\n const { currentUser, sdk, features } = useSendbirdChat();\n const { STRINGS } = useLocalization();\n const { colors } = useUIKitTheme();\n\n const [typingUsers, setTypingUsers] = useState<SendbirdUser[]>([]);\n const forceUpdate = useForceUpdate();\n\n if (features.channelListTypingIndicatorEnabled) {\n const typingId = useUniqId('GroupChannelPreviewContainer');\n useChannelHandler(sdk, `GroupChannelPreviewContainer_TypingIndicator_${typingId}`, {\n onTypingStatusUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n setTypingUsers(eventChannel.getTypingUsers());\n },\n });\n }\n\n if (features.channelListMessageReceiptStatusEnabled) {\n const receiptId = useUniqId('GroupChannelPreviewContainer');\n useChannelHandler(sdk, `GroupChannelPreviewContainer_ReceiptStatus_${receiptId}`, {\n onDeliveryReceiptUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!eventChannel.isGroupChannel() || !eventChannel.lastMessage) return;\n if (!isMyMessage(eventChannel.lastMessage, currentUser?.userId)) return;\n\n forceUpdate();\n },\n onReadReceiptUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!eventChannel.isGroupChannel() || !eventChannel.lastMessage) return;\n if (!isMyMessage(eventChannel.lastMessage, currentUser?.userId)) return;\n\n forceUpdate();\n },\n });\n }\n\n const bodyText = useIIFE(() => {\n if (typingUsers.length > 0) return STRINGS.LABELS.TYPING_INDICATOR_TYPINGS(typingUsers) || '';\n else return STRINGS.GROUP_CHANNEL_LIST.CHANNEL_PREVIEW_BODY(channel);\n });\n\n const bodyIcon = useIIFE(() => {\n if (!channel.lastMessage?.isFileMessage()) return undefined;\n return iconMapper[getFileType(channel.lastMessage.type || getFileExtension(channel.lastMessage.name))];\n });\n\n const titleCaptionIcon = useIIFE(() => {\n if (!channel.lastMessage) return undefined;\n if (!features.channelListMessageReceiptStatusEnabled) return undefined;\n if (!isMyMessage(channel.lastMessage, currentUser?.userId)) return undefined;\n\n if (channel.lastMessage.sendingStatus === 'pending') {\n return <LoadingSpinner size={16} style={styles.titleCaptionIcon} />;\n }\n\n if (channel.lastMessage.sendingStatus === 'failed') {\n return <Icon icon={'error'} size={16} color={colors.error} style={styles.titleCaptionIcon} />;\n }\n\n if (channel.getUnreadMemberCount(channel.lastMessage) === 0) {\n return <Icon icon={'done-all'} size={16} color={colors.secondary} style={styles.titleCaptionIcon} />;\n }\n\n if (features.deliveryReceiptEnabled) {\n if (channel.getUndeliveredMemberCount(channel.lastMessage) === 0) {\n return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;\n }\n return <Icon icon={'done'} size={16} color={colors.onBackground03} containerStyle={styles.titleCaptionIcon} />;\n }\n\n return <Icon icon={'done-all'} size={16} color={colors.onBackground03} style={styles.titleCaptionIcon} />;\n });\n\n return (\n <SBUPressable onPress={onPress} onLongPress={onLongPress}>\n <GroupChannelPreview\n customCover={<ChannelCover channel={channel} size={56} />}\n coverUrl={channel.coverUrl}\n title={STRINGS.GROUP_CHANNEL_LIST.CHANNEL_PREVIEW_TITLE(currentUser?.userId ?? '', channel)}\n titleCaptionLeft={titleCaptionIcon}\n titleCaption={STRINGS.GROUP_CHANNEL_LIST.CHANNEL_PREVIEW_TITLE_CAPTION(channel)}\n body={bodyText}\n bodyIcon={bodyIcon}\n badgeCount={channel.unreadMessageCount}\n memberCount={channel.memberCount > 2 ? channel.memberCount : undefined}\n frozen={channel.isFrozen}\n notificationOff={channel.myPushTriggerOption === 'off'}\n />\n </SBUPressable>\n );\n};\n\nconst styles = createStyleSheet({\n titleCaptionIcon: {\n marginRight: 4,\n },\n});\n\nexport default GroupChannelPreviewContainer;\n"],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
-
3
- import React from 'react';
4
- import { Pressable, TouchableOpacity } from 'react-native';
5
- import { DEFAULT_LONG_PRESS_DELAY } from '../constants';
6
-
7
- function getComponent(as) {
8
- switch (as) {
9
- case 'Pressable':
10
- return Pressable;
11
-
12
- case 'TouchableOpacity':
13
- return TouchableOpacity;
14
-
15
- default:
16
- return Pressable;
17
- }
18
- }
19
-
20
- const SBUPressable = _ref => {
21
- let {
22
- as,
23
- ...props
24
- } = _ref;
25
- const Renderer = getComponent(as); // @ts-ignore
26
-
27
- return /*#__PURE__*/React.createElement(Renderer, _extends({
28
- delayLongPress: DEFAULT_LONG_PRESS_DELAY
29
- }, props));
30
- };
31
-
32
- export default SBUPressable;
33
- //# sourceMappingURL=SBUPressable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","Pressable","TouchableOpacity","DEFAULT_LONG_PRESS_DELAY","getComponent","as","SBUPressable","props","Renderer"],"sources":["SBUPressable.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable, PressableProps, TouchableOpacity, TouchableOpacityProps } from 'react-native';\n\nimport { DEFAULT_LONG_PRESS_DELAY } from '../constants';\n\ntype Components = 'Pressable' | 'TouchableOpacity';\ntype Props<T extends Components = 'Pressable'> = {\n as?: T;\n} & ExtractProps<T, AsProps>;\n\ntype AsProps =\n | {\n type: 'Pressable';\n props: PressableProps;\n }\n | {\n type: 'TouchableOpacity';\n props: TouchableOpacityProps;\n };\n\ntype ExtractProps<T extends Components, U extends AsProps> = U extends { type: T; props: infer P } ? P : never;\n\nfunction getComponent(as?: Components) {\n switch (as) {\n case 'Pressable':\n return Pressable;\n case 'TouchableOpacity':\n return TouchableOpacity;\n default:\n return Pressable;\n }\n}\n\nconst SBUPressable = <T extends Components>({ as, ...props }: Props<T>) => {\n const Renderer = getComponent(as);\n // @ts-ignore\n return <Renderer delayLongPress={DEFAULT_LONG_PRESS_DELAY} {...props} />;\n};\n\nexport default SBUPressable;\n"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,SAAT,EAAoCC,gBAApC,QAAmF,cAAnF;AAEA,SAASC,wBAAT,QAAyC,cAAzC;;AAmBA,SAASC,YAAT,CAAsBC,EAAtB,EAAuC;EACrC,QAAQA,EAAR;IACE,KAAK,WAAL;MACE,OAAOJ,SAAP;;IACF,KAAK,kBAAL;MACE,OAAOC,gBAAP;;IACF;MACE,OAAOD,SAAP;EANJ;AAQD;;AAED,MAAMK,YAAY,GAAG,QAAsD;EAAA,IAA/B;IAAED,EAAF;IAAM,GAAGE;EAAT,CAA+B;EACzE,MAAMC,QAAQ,GAAGJ,YAAY,CAACC,EAAD,CAA7B,CADyE,CAEzE;;EACA,oBAAO,oBAAC,QAAD;IAAU,cAAc,EAAEF;EAA1B,GAAwDI,KAAxD,EAAP;AACD,CAJD;;AAMA,eAAeD,YAAf"}