@sendbird/uikit-react-native 3.3.0 → 3.4.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 (154) hide show
  1. package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
  2. package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
  3. package/lib/commonjs/components/FileViewer/FileViewerContent.js +140 -0
  4. package/lib/commonjs/components/FileViewer/FileViewerContent.js.map +1 -0
  5. package/lib/commonjs/components/FileViewer/FileViewerFooter.js +82 -0
  6. package/lib/commonjs/components/FileViewer/FileViewerFooter.js.map +1 -0
  7. package/lib/commonjs/components/FileViewer/FileViewerHeader.js +93 -0
  8. package/lib/commonjs/components/FileViewer/FileViewerHeader.js.map +1 -0
  9. package/lib/commonjs/components/FileViewer/index.js +133 -0
  10. package/lib/commonjs/components/FileViewer/index.js.map +1 -0
  11. package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -1
  12. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +10 -9
  13. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  14. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  15. package/lib/commonjs/domain/groupChannelBannedUsers/types.js.map +1 -1
  16. package/lib/commonjs/domain/groupChannelList/types.js.map +1 -1
  17. package/lib/commonjs/domain/groupChannelModeration/types.js.map +1 -1
  18. package/lib/commonjs/domain/groupChannelMutedMembers/types.js.map +1 -1
  19. package/lib/commonjs/domain/groupChannelNotifications/types.js.map +1 -1
  20. package/lib/commonjs/domain/groupChannelOperators/types.js.map +1 -1
  21. package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -1
  22. package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -1
  23. package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js +4 -1
  24. package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js.map +1 -1
  25. package/lib/commonjs/domain/messageSearch/types.js.map +1 -1
  26. package/lib/commonjs/domain/openChannel/types.js.map +1 -1
  27. package/lib/commonjs/domain/openChannelBannedUsers/types.js.map +1 -1
  28. package/lib/commonjs/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js +4 -2
  29. package/lib/commonjs/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js.map +1 -1
  30. package/lib/commonjs/domain/openChannelCreate/types.js.map +1 -1
  31. package/lib/commonjs/domain/openChannelList/types.js.map +1 -1
  32. package/lib/commonjs/domain/openChannelModeration/types.js.map +1 -1
  33. package/lib/commonjs/domain/openChannelMutedParticipants/types.js.map +1 -1
  34. package/lib/commonjs/domain/openChannelOperators/types.js.map +1 -1
  35. package/lib/commonjs/domain/openChannelSettings/types.js.map +1 -1
  36. package/lib/commonjs/domain/openChannelUserList/types.js.map +1 -1
  37. package/lib/commonjs/fragments/createGroupChannelFragment.js +32 -16
  38. package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
  39. package/lib/commonjs/fragments/createGroupChannelListFragment.js +25 -11
  40. package/lib/commonjs/fragments/createGroupChannelListFragment.js.map +1 -1
  41. package/lib/commonjs/types.js.map +1 -1
  42. package/lib/commonjs/version.js +1 -1
  43. package/lib/commonjs/version.js.map +1 -1
  44. package/lib/module/components/ChannelInput/index.js.map +1 -1
  45. package/lib/module/components/ChannelMessageList/index.js.map +1 -1
  46. package/lib/module/components/FileViewer/FileViewerContent.js +130 -0
  47. package/lib/module/components/FileViewer/FileViewerContent.js.map +1 -0
  48. package/lib/module/components/FileViewer/FileViewerFooter.js +74 -0
  49. package/lib/module/components/FileViewer/FileViewerFooter.js.map +1 -0
  50. package/lib/module/components/FileViewer/FileViewerHeader.js +85 -0
  51. package/lib/module/components/FileViewer/FileViewerHeader.js.map +1 -0
  52. package/lib/module/components/FileViewer/index.js +123 -0
  53. package/lib/module/components/FileViewer/index.js.map +1 -0
  54. package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -1
  55. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +10 -9
  56. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  57. package/lib/module/domain/groupChannel/types.js.map +1 -1
  58. package/lib/module/domain/groupChannelBannedUsers/types.js.map +1 -1
  59. package/lib/module/domain/groupChannelList/types.js.map +1 -1
  60. package/lib/module/domain/groupChannelModeration/types.js.map +1 -1
  61. package/lib/module/domain/groupChannelMutedMembers/types.js.map +1 -1
  62. package/lib/module/domain/groupChannelNotifications/types.js.map +1 -1
  63. package/lib/module/domain/groupChannelOperators/types.js.map +1 -1
  64. package/lib/module/domain/groupChannelSettings/types.js.map +1 -1
  65. package/lib/module/domain/groupChannelUserList/types.js.map +1 -1
  66. package/lib/module/domain/messageSearch/component/MessageSearchHeader.js +4 -1
  67. package/lib/module/domain/messageSearch/component/MessageSearchHeader.js.map +1 -1
  68. package/lib/module/domain/messageSearch/types.js.map +1 -1
  69. package/lib/module/domain/openChannel/types.js.map +1 -1
  70. package/lib/module/domain/openChannelBannedUsers/types.js.map +1 -1
  71. package/lib/module/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js +4 -2
  72. package/lib/module/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js.map +1 -1
  73. package/lib/module/domain/openChannelCreate/types.js.map +1 -1
  74. package/lib/module/domain/openChannelList/types.js.map +1 -1
  75. package/lib/module/domain/openChannelModeration/types.js.map +1 -1
  76. package/lib/module/domain/openChannelMutedParticipants/types.js.map +1 -1
  77. package/lib/module/domain/openChannelOperators/types.js.map +1 -1
  78. package/lib/module/domain/openChannelSettings/types.js.map +1 -1
  79. package/lib/module/domain/openChannelUserList/types.js.map +1 -1
  80. package/lib/module/fragments/createGroupChannelFragment.js +33 -17
  81. package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
  82. package/lib/module/fragments/createGroupChannelListFragment.js +26 -12
  83. package/lib/module/fragments/createGroupChannelListFragment.js.map +1 -1
  84. package/lib/module/types.js.map +1 -1
  85. package/lib/module/version.js +1 -1
  86. package/lib/module/version.js.map +1 -1
  87. package/lib/typescript/src/components/ChannelInput/index.d.ts +2 -2
  88. package/lib/typescript/src/components/ChannelMessageList/index.d.ts +5 -6
  89. package/lib/typescript/src/components/FileViewer/FileViewerContent.d.ts +13 -0
  90. package/lib/typescript/src/components/FileViewer/FileViewerFooter.d.ts +9 -0
  91. package/lib/typescript/src/components/FileViewer/FileViewerHeader.d.ts +10 -0
  92. package/lib/typescript/src/components/{FileViewer.d.ts → FileViewer/index.d.ts} +5 -1
  93. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  94. package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +2 -2
  95. package/lib/typescript/src/domain/groupChannel/types.d.ts +15 -4
  96. package/lib/typescript/src/domain/groupChannelBannedUsers/types.d.ts +1 -1
  97. package/lib/typescript/src/domain/groupChannelList/types.d.ts +13 -2
  98. package/lib/typescript/src/domain/groupChannelModeration/types.d.ts +1 -1
  99. package/lib/typescript/src/domain/groupChannelMutedMembers/types.d.ts +1 -1
  100. package/lib/typescript/src/domain/groupChannelNotifications/types.d.ts +1 -1
  101. package/lib/typescript/src/domain/groupChannelOperators/types.d.ts +1 -1
  102. package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +1 -1
  103. package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +3 -2
  104. package/lib/typescript/src/domain/messageSearch/types.d.ts +1 -1
  105. package/lib/typescript/src/domain/openChannel/types.d.ts +1 -1
  106. package/lib/typescript/src/domain/openChannelBannedUsers/types.d.ts +1 -1
  107. package/lib/typescript/src/domain/openChannelCreate/types.d.ts +1 -1
  108. package/lib/typescript/src/domain/openChannelList/types.d.ts +1 -1
  109. package/lib/typescript/src/domain/openChannelModeration/types.d.ts +1 -1
  110. package/lib/typescript/src/domain/openChannelMutedParticipants/types.d.ts +1 -1
  111. package/lib/typescript/src/domain/openChannelOperators/types.d.ts +1 -1
  112. package/lib/typescript/src/domain/openChannelSettings/types.d.ts +1 -1
  113. package/lib/typescript/src/domain/openChannelUserList/types.d.ts +3 -3
  114. package/lib/typescript/src/types.d.ts +4 -4
  115. package/lib/typescript/src/version.d.ts +1 -1
  116. package/package.json +8 -7
  117. package/src/components/ChannelInput/index.tsx +2 -2
  118. package/src/components/ChannelMessageList/index.tsx +5 -11
  119. package/src/components/FileViewer/FileViewerContent.tsx +141 -0
  120. package/src/components/FileViewer/FileViewerFooter.tsx +73 -0
  121. package/src/components/FileViewer/FileViewerHeader.tsx +86 -0
  122. package/src/components/FileViewer/index.tsx +139 -0
  123. package/src/components/ReactionAddons/BottomSheetReactionAddon.tsx +3 -2
  124. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +7 -6
  125. package/src/domain/groupChannel/types.ts +16 -4
  126. package/src/domain/groupChannelBannedUsers/types.ts +1 -1
  127. package/src/domain/groupChannelList/types.ts +13 -2
  128. package/src/domain/groupChannelModeration/types.ts +1 -1
  129. package/src/domain/groupChannelMutedMembers/types.ts +1 -1
  130. package/src/domain/groupChannelNotifications/types.ts +1 -1
  131. package/src/domain/groupChannelOperators/types.ts +1 -1
  132. package/src/domain/groupChannelSettings/types.ts +1 -1
  133. package/src/domain/groupChannelUserList/types.ts +2 -2
  134. package/src/domain/messageSearch/component/MessageSearchHeader.tsx +4 -1
  135. package/src/domain/messageSearch/types.ts +1 -1
  136. package/src/domain/openChannel/types.ts +1 -1
  137. package/src/domain/openChannelBannedUsers/types.ts +1 -1
  138. package/src/domain/openChannelCreate/component/OpenChannelCreateProfileInput.tsx +4 -2
  139. package/src/domain/openChannelCreate/types.ts +1 -1
  140. package/src/domain/openChannelList/types.ts +1 -1
  141. package/src/domain/openChannelModeration/types.ts +1 -1
  142. package/src/domain/openChannelMutedParticipants/types.ts +1 -1
  143. package/src/domain/openChannelOperators/types.ts +1 -1
  144. package/src/domain/openChannelSettings/types.ts +1 -1
  145. package/src/domain/openChannelUserList/types.ts +4 -3
  146. package/src/fragments/createGroupChannelFragment.tsx +35 -17
  147. package/src/fragments/createGroupChannelListFragment.tsx +27 -9
  148. package/src/types.ts +2 -2
  149. package/src/version.ts +1 -1
  150. package/lib/commonjs/components/FileViewer.js +0 -300
  151. package/lib/commonjs/components/FileViewer.js.map +0 -1
  152. package/lib/module/components/FileViewer.js +0 -291
  153. package/lib/module/components/FileViewer.js.map +0 -1
  154. package/src/components/FileViewer.tsx +0 -288
@@ -8,6 +8,10 @@ type Props = {
8
8
  onPressDelete?: (message: SendbirdFileMessage) => void;
9
9
  headerShown?: boolean;
10
10
  headerTopInset?: number;
11
+ /** This prop is only available on the Image viewer */
12
+ minZoom?: number;
13
+ /** This prop is only available on the Image viewer */
14
+ maxZoom?: number;
11
15
  };
12
- declare const FileViewer: ({ headerShown, deleteMessage, headerTopInset, fileMessage, onPressDownload, onPressDelete, onClose, }: Props) => React.JSX.Element;
16
+ declare const FileViewer: ({ headerShown, maxZoom, minZoom, headerTopInset, fileMessage, onClose, onPressDownload, onPressDelete, deleteMessage, }: Props) => React.JSX.Element;
13
17
  export default FileViewer;
@@ -13,7 +13,7 @@ import type { StringSet } from '../localization/StringSet.type';
13
13
  import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInterface, NotificationServiceInterface, PlayerServiceInterface, RecorderServiceInterface } from '../platform/types';
14
14
  import type { ErrorBoundaryProps, LocalCacheStorage } from '../types';
15
15
  export declare const SendbirdUIKit: Readonly<{
16
- VERSION: "3.3.0";
16
+ VERSION: "3.4.1";
17
17
  PLATFORM: string;
18
18
  DEFAULT: {
19
19
  AUTO_PUSH_TOKEN_REGISTRATION: boolean;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  declare const _default: React.MemoExoticComponent<(props: Pick<import("../../../components/ChannelMessageList").ChannelMessageListProps<import("@sendbird/chat/groupChannel").GroupChannel>, "channel" | "onTopReached" | "onBottomReached" | "onScrolledAwayFromBottom" | "currentUserId" | "enableMessageGrouping" | "searchItem" | "hasNext" | "onDeleteMessage" | "onResendFailedMessage" | "onPressMediaMessage" | "renderNewMessagesButton" | "renderScrollToBottomButton" | "renderMessage" | "messages" | "newMessages" | "scrolledAwayFromBottom" | "flatListProps"> & {
3
- onResetMessageList: (callback?: (() => void) | undefined) => void;
4
- onResetMessageListWithStartingPoint: (startingPoint: number, callback?: (() => void) | undefined) => void;
3
+ onResetMessageList: () => Promise<void>;
4
+ onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;
5
5
  onUpdateSearchItem: (searchItem?: {
6
6
  startingPoint: number;
7
7
  } | undefined) => void;
@@ -1,11 +1,13 @@
1
1
  import type React from 'react';
2
2
  import type { FlatList } from 'react-native';
3
+ import type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';
3
4
  import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
4
5
  import type { OnBeforeHandler, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdGroupChannel, SendbirdMessage, SendbirdUser, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams } from '@sendbird/uikit-utils';
5
6
  import type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';
6
7
  import type { ChannelMessageListProps } from '../../components/ChannelMessageList';
7
8
  import type { CommonComponent } from '../../types';
8
9
  import type { PubSub } from '../../utils/pubsub';
10
+ export type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;
9
11
  export interface GroupChannelProps {
10
12
  Fragment: {
11
13
  channel: SendbirdGroupChannel;
@@ -25,8 +27,17 @@ export interface GroupChannelProps {
25
27
  keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];
26
28
  flatListProps?: GroupChannelProps['MessageList']['flatListProps'];
27
29
  sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];
28
- collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];
29
30
  searchItem?: GroupChannelProps['MessageList']['searchItem'];
31
+ /**
32
+ * @description You can specify the query parameters for the message list.
33
+ * @example
34
+ * ```
35
+ * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />
36
+ * ```
37
+ * */
38
+ messageListQueryParams?: MessageListQueryParamsType;
39
+ /** @deprecated Please use `messageListQueryParams` instead */
40
+ collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];
30
41
  };
31
42
  Header: {
32
43
  shouldHideRight: () => boolean;
@@ -34,8 +45,8 @@ export interface GroupChannelProps {
34
45
  onPressHeaderRight: () => void;
35
46
  };
36
47
  MessageList: Pick<ChannelMessageListProps<SendbirdGroupChannel>, 'enableMessageGrouping' | 'currentUserId' | 'channel' | 'messages' | 'newMessages' | 'scrolledAwayFromBottom' | 'onScrolledAwayFromBottom' | 'onTopReached' | 'onBottomReached' | 'onResendFailedMessage' | 'onDeleteMessage' | 'onPressMediaMessage' | 'renderMessage' | 'renderNewMessagesButton' | 'renderScrollToBottomButton' | 'flatListProps' | 'hasNext' | 'searchItem'> & {
37
- onResetMessageList: (callback?: () => void) => void;
38
- onResetMessageListWithStartingPoint: (startingPoint: number, callback?: () => void) => void;
48
+ onResetMessageList: () => Promise<void>;
49
+ onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;
39
50
  onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;
40
51
  };
41
52
  Input: Pick<ChannelInputProps, 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'SuggestedMentionList' | 'AttachmentsButton'>;
@@ -120,7 +131,7 @@ export interface GroupChannelModule {
120
131
  StatusEmpty: CommonComponent;
121
132
  StatusLoading: CommonComponent;
122
133
  }
123
- export type GroupChannelFragment = CommonComponent<GroupChannelProps['Fragment']>;
134
+ export type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;
124
135
  export type GroupChannelPubSubContextPayload = {
125
136
  type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';
126
137
  data: {
@@ -46,4 +46,4 @@ export interface GroupChannelBannedUsersModule {
46
46
  StatusLoading: CommonComponent;
47
47
  StatusError: CommonComponent<GroupChannelBannedUsersProps['StatusError']>;
48
48
  }
49
- export type GroupChannelBannedUsersFragment = CommonComponent<GroupChannelBannedUsersProps['Fragment']>;
49
+ export type GroupChannelBannedUsersFragment = React.FC<GroupChannelBannedUsersProps['Fragment']>;
@@ -1,18 +1,29 @@
1
1
  import type React from 'react';
2
2
  import type { FlatListProps } from 'react-native';
3
+ import type { GroupChannelCollectionParams, GroupChannelFilterParams } from '@sendbird/chat/groupChannel';
3
4
  import type { UseGroupChannelListOptions } from '@sendbird/uikit-chat-hooks';
4
5
  import type { ActionMenuItem } from '@sendbird/uikit-react-native-foundation';
5
6
  import type { SendbirdGroupChannel } from '@sendbird/uikit-utils';
6
7
  import type { CommonComponent } from '../../types';
8
+ export type ChannelListQueryParamsType = Omit<GroupChannelCollectionParams, 'filter'> & GroupChannelFilterParams;
7
9
  export interface GroupChannelListProps {
8
10
  Fragment: {
9
11
  onPressChannel: GroupChannelListProps['List']['onPressChannel'];
10
12
  onPressCreateChannel: (channelType: GroupChannelType) => void;
11
13
  renderGroupChannelPreview?: GroupChannelListProps['List']['renderGroupChannelPreview'];
12
14
  skipTypeSelection?: boolean;
13
- collectionCreator?: UseGroupChannelListOptions['collectionCreator'];
14
15
  flatListProps?: GroupChannelListProps['List']['flatListProps'];
15
16
  menuItemCreator?: GroupChannelListProps['List']['menuItemCreator'];
17
+ /**
18
+ * @description You can specify the query parameters for the channel list.
19
+ * @example
20
+ * ```
21
+ * <GroupChannelListFragment channelListQueryParams={{ limit: 20, includeEmpty: false }} />
22
+ * ```
23
+ * */
24
+ channelListQueryParams?: ChannelListQueryParamsType;
25
+ /** @deprecated Please use `channelListQueryParams` instead */
26
+ collectionCreator?: UseGroupChannelListOptions['collectionCreator'];
16
27
  };
17
28
  Header: {};
18
29
  List: {
@@ -56,5 +67,5 @@ export interface GroupChannelListModule {
56
67
  StatusEmpty: CommonComponent;
57
68
  StatusLoading: CommonComponent;
58
69
  }
59
- export type GroupChannelListFragment = CommonComponent<GroupChannelListProps['Fragment']>;
70
+ export type GroupChannelListFragment = React.FC<GroupChannelListProps['Fragment']>;
60
71
  export type GroupChannelType = 'GROUP' | 'SUPER_GROUP' | 'BROADCAST';
@@ -40,4 +40,4 @@ export interface GroupChannelModerationModule {
40
40
  Header: CommonComponent<GroupChannelModerationProps['Header']>;
41
41
  Menu: CommonComponent<GroupChannelModerationProps['Menu']>;
42
42
  }
43
- export type GroupChannelModerationFragment = CommonComponent<GroupChannelModerationProps['Fragment']>;
43
+ export type GroupChannelModerationFragment = React.FC<GroupChannelModerationProps['Fragment']>;
@@ -46,4 +46,4 @@ export interface GroupChannelMutedMembersModule {
46
46
  StatusLoading: CommonComponent;
47
47
  StatusError: CommonComponent<GroupChannelMutedMembersProps['StatusError']>;
48
48
  }
49
- export type GroupChannelMutedMembersFragment = CommonComponent<GroupChannelMutedMembersProps['Fragment']>;
49
+ export type GroupChannelMutedMembersFragment = React.FC<GroupChannelMutedMembersProps['Fragment']>;
@@ -30,4 +30,4 @@ export interface GroupChannelNotificationsModule {
30
30
  Header: CommonComponent<GroupChannelNotificationsProps['Header']>;
31
31
  View: CommonComponent<GroupChannelNotificationsProps['View']>;
32
32
  }
33
- export type GroupChannelNotificationsFragment = CommonComponent<GroupChannelNotificationsProps['Fragment']>;
33
+ export type GroupChannelNotificationsFragment = React.FC<GroupChannelNotificationsProps['Fragment']>;
@@ -48,4 +48,4 @@ export interface GroupChannelOperatorsModule {
48
48
  StatusLoading: CommonComponent;
49
49
  StatusError: CommonComponent<GroupChannelOperatorsProps['StatusError']>;
50
50
  }
51
- export type GroupChannelOperatorsFragment = CommonComponent<GroupChannelOperatorsProps['Fragment']>;
51
+ export type GroupChannelOperatorsFragment = React.FC<GroupChannelOperatorsProps['Fragment']>;
@@ -48,4 +48,4 @@ export interface GroupChannelSettingsModule {
48
48
  Info: CommonComponent<GroupChannelSettingsProps['Info']>;
49
49
  Menu: CommonComponent<GroupChannelSettingsProps['Menu']>;
50
50
  }
51
- export type GroupChannelSettingsFragment = CommonComponent<GroupChannelSettingsProps['Fragment']>;
51
+ export type GroupChannelSettingsFragment = React.FC<GroupChannelSettingsProps['Fragment']>;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import type { UseUserListOptions } from '@sendbird/uikit-chat-hooks';
2
3
  import type { SendbirdGroupChannel, SendbirdGroupChannelCreateParams, SendbirdMember, UserStruct } from '@sendbird/uikit-utils';
3
4
  import type { CommonComponent } from '../../types';
@@ -36,7 +37,7 @@ export interface GroupChannelMembersProps {
36
37
  queryCreator?: UseUserListOptions<SendbirdMember>['queryCreator'];
37
38
  };
38
39
  }
39
- export type GroupChannelMembersFragment = CommonComponent<GroupChannelMembersProps['Fragment']>;
40
+ export type GroupChannelMembersFragment = React.FC<GroupChannelMembersProps['Fragment']>;
40
41
  export interface GroupChannelRegisterOperatorProps {
41
42
  Fragment: {
42
43
  channel: SendbirdGroupChannel;
@@ -47,4 +48,4 @@ export interface GroupChannelRegisterOperatorProps {
47
48
  queryCreator?: UseUserListOptions<SendbirdMember>['queryCreator'];
48
49
  };
49
50
  }
50
- export type GroupChannelRegisterOperatorFragment = CommonComponent<GroupChannelRegisterOperatorProps['Fragment']>;
51
+ export type GroupChannelRegisterOperatorFragment = React.FC<GroupChannelRegisterOperatorProps['Fragment']>;
@@ -50,4 +50,4 @@ export interface MessageSearchModule {
50
50
  StatusLoading: CommonComponent;
51
51
  StatusError: CommonComponent<MessageSearchProps['StatusError']>;
52
52
  }
53
- export type MessageSearchFragment = CommonComponent<MessageSearchProps['Fragment']>;
53
+ export type MessageSearchFragment = React.FC<MessageSearchProps['Fragment']>;
@@ -63,7 +63,7 @@ export interface OpenChannelModule {
63
63
  StatusEmpty: CommonComponent;
64
64
  StatusLoading: CommonComponent;
65
65
  }
66
- export type OpenChannelFragment = CommonComponent<OpenChannelProps['Fragment']>;
66
+ export type OpenChannelFragment = React.FC<OpenChannelProps['Fragment']>;
67
67
  export type OpenChannelPubSubContextPayload = {
68
68
  type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';
69
69
  data: {
@@ -46,4 +46,4 @@ export interface OpenChannelBannedUsersModule {
46
46
  StatusLoading: CommonComponent;
47
47
  StatusError: CommonComponent<OpenChannelBannedUsersProps['StatusError']>;
48
48
  }
49
- export type OpenChannelBannedUsersFragment = CommonComponent<OpenChannelBannedUsersProps['Fragment']>;
49
+ export type OpenChannelBannedUsersFragment = React.FC<OpenChannelBannedUsersProps['Fragment']>;
@@ -37,4 +37,4 @@ export interface OpenChannelCreateModule {
37
37
  ProfileInput: CommonComponent<OpenChannelCreateProps['ProfileInput']>;
38
38
  StatusLoading: CommonComponent;
39
39
  }
40
- export type OpenChannelCreateFragment = CommonComponent<OpenChannelCreateProps['Fragment']>;
40
+ export type OpenChannelCreateFragment = React.FC<OpenChannelCreateProps['Fragment']>;
@@ -48,4 +48,4 @@ export interface OpenChannelListModule {
48
48
  StatusLoading: CommonComponent;
49
49
  StatusError: CommonComponent<OpenChannelListProps['StatusError']>;
50
50
  }
51
- export type OpenChannelListFragment = CommonComponent<OpenChannelListProps['Fragment']>;
51
+ export type OpenChannelListFragment = React.FC<OpenChannelListProps['Fragment']>;
@@ -40,4 +40,4 @@ export interface OpenChannelModerationModule {
40
40
  Header: CommonComponent<OpenChannelModerationProps['Header']>;
41
41
  Menu: CommonComponent<OpenChannelModerationProps['Menu']>;
42
42
  }
43
- export type OpenChannelModerationFragment = CommonComponent<OpenChannelModerationProps['Fragment']>;
43
+ export type OpenChannelModerationFragment = React.FC<OpenChannelModerationProps['Fragment']>;
@@ -46,4 +46,4 @@ export interface OpenChannelMutedParticipantsModule {
46
46
  StatusLoading: CommonComponent;
47
47
  StatusError: CommonComponent<OpenChannelMutedParticipantsProps['StatusError']>;
48
48
  }
49
- export type OpenChannelMutedParticipantsFragment = CommonComponent<OpenChannelMutedParticipantsProps['Fragment']>;
49
+ export type OpenChannelMutedParticipantsFragment = React.FC<OpenChannelMutedParticipantsProps['Fragment']>;
@@ -48,4 +48,4 @@ export interface OpenChannelOperatorsModule {
48
48
  StatusLoading: CommonComponent;
49
49
  StatusError: CommonComponent<OpenChannelOperatorsProps['StatusError']>;
50
50
  }
51
- export type OpenChannelOperatorsFragment = CommonComponent<OpenChannelOperatorsProps['Fragment']>;
51
+ export type OpenChannelOperatorsFragment = React.FC<OpenChannelOperatorsProps['Fragment']>;
@@ -46,4 +46,4 @@ export interface OpenChannelSettingsModule {
46
46
  Info: CommonComponent<OpenChannelSettingsProps['Info']>;
47
47
  Menu: CommonComponent<OpenChannelSettingsProps['Menu']>;
48
48
  }
49
- export type OpenChannelSettingsFragment = CommonComponent<OpenChannelSettingsProps['Fragment']>;
49
+ export type OpenChannelSettingsFragment = React.FC<OpenChannelSettingsProps['Fragment']>;
@@ -1,6 +1,6 @@
1
+ import type React from 'react';
1
2
  import type { UseUserListOptions } from '@sendbird/uikit-chat-hooks';
2
3
  import type { SendbirdOpenChannel, SendbirdParticipant, SendbirdUser } from '@sendbird/uikit-utils';
3
- import type { CommonComponent } from '../../types';
4
4
  import type { UserListProps } from '../userList/types';
5
5
  export interface OpenChannelParticipantsProps {
6
6
  Fragment: {
@@ -11,7 +11,7 @@ export interface OpenChannelParticipantsProps {
11
11
  sortComparator?: UseUserListOptions<SendbirdUser | SendbirdParticipant>['sortComparator'];
12
12
  };
13
13
  }
14
- export type OpenChannelParticipantsFragment = CommonComponent<OpenChannelParticipantsProps['Fragment']>;
14
+ export type OpenChannelParticipantsFragment = React.FC<OpenChannelParticipantsProps['Fragment']>;
15
15
  export interface OpenChannelRegisterOperatorProps {
16
16
  Fragment: {
17
17
  channel: SendbirdOpenChannel;
@@ -22,4 +22,4 @@ export interface OpenChannelRegisterOperatorProps {
22
22
  sortComparator?: UseUserListOptions<SendbirdUser | SendbirdParticipant>['sortComparator'];
23
23
  };
24
24
  }
25
- export type OpenChannelRegisterOperatorFragment = CommonComponent<OpenChannelRegisterOperatorProps['Fragment']>;
25
+ export type OpenChannelRegisterOperatorFragment = React.FC<OpenChannelRegisterOperatorProps['Fragment']>;
@@ -1,4 +1,4 @@
1
- import type { ErrorInfo, ReactNode } from 'react';
1
+ import type { ComponentType, ErrorInfo, ReactNode } from 'react';
2
2
  import type { SendbirdUser } from '@sendbird/uikit-utils';
3
3
  export type KeyValuePairGet = [string, string | null];
4
4
  export type KeyValuePairSet = [string, string];
@@ -16,9 +16,9 @@ export type ErrorBoundaryProps = {
16
16
  errorInfo: ErrorInfo;
17
17
  reset: () => void;
18
18
  };
19
- export type CommonComponent<P = {}> = (props: P & {
20
- children?: ReactNode;
21
- }) => null | ReactNode;
19
+ export type CommonComponent<P = {}> = ComponentType<P & {
20
+ children?: ReactNode | undefined;
21
+ }>;
22
22
  export type MentionedUser = {
23
23
  range: Range;
24
24
  user: SendbirdUser;
@@ -1,2 +1,2 @@
1
- declare const VERSION = "3.3.0";
1
+ declare const VERSION = "3.4.1";
2
2
  export default VERSION;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-react-native",
3
- "version": "3.3.0",
3
+ "version": "3.4.1",
4
4
  "description": "Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -59,10 +59,11 @@
59
59
  "access": "public"
60
60
  },
61
61
  "dependencies": {
62
- "@sendbird/uikit-chat-hooks": "3.3.0",
63
- "@sendbird/uikit-react-native-foundation": "3.3.0",
64
- "@sendbird/uikit-tools": "0.0.1-alpha.42",
65
- "@sendbird/uikit-utils": "3.3.0"
62
+ "@openspacelabs/react-native-zoomable-view": "^2.1.5",
63
+ "@sendbird/uikit-chat-hooks": "3.4.1",
64
+ "@sendbird/uikit-react-native-foundation": "3.4.1",
65
+ "@sendbird/uikit-tools": "0.0.1-alpha.58",
66
+ "@sendbird/uikit-utils": "3.4.1"
66
67
  },
67
68
  "devDependencies": {
68
69
  "@bam.tech/react-native-image-resizer": "^3.0.4",
@@ -107,7 +108,7 @@
107
108
  "@react-native-clipboard/clipboard": ">=1.8.5",
108
109
  "@react-native-community/netinfo": ">=9.3.0",
109
110
  "@react-native-firebase/messaging": ">=14.4.0",
110
- "@sendbird/chat": "^4.9.8",
111
+ "@sendbird/chat": "^4.10.7",
111
112
  "@sendbird/react-native-scrollview-enhancer": "*",
112
113
  "date-fns": ">=2.28.0",
113
114
  "expo-av": ">=12.0.4",
@@ -202,5 +203,5 @@
202
203
  ]
203
204
  ]
204
205
  },
205
- "gitHead": "51adda5f33a7bb450b51ce30f505dcc9884e9586"
206
+ "gitHead": "b3f416e3d5ab51ce020ca21f21c09ad0157722d9"
206
207
  }
@@ -19,7 +19,7 @@ import {
19
19
 
20
20
  import { useSendbirdChat } from '../../hooks/useContext';
21
21
  import useMentionTextInput from '../../hooks/useMentionTextInput';
22
- import type { MentionedUser, Range } from '../../types';
22
+ import type { CommonComponent, MentionedUser, Range } from '../../types';
23
23
  import type { AttachmentsButtonProps } from './AttachmentsButton';
24
24
  import AttachmentsButton from './AttachmentsButton';
25
25
  import EditInput from './EditInput';
@@ -67,7 +67,7 @@ export type ChannelInputProps = {
67
67
  setMessageToReply?: (message?: undefined | SendbirdUserMessage | SendbirdFileMessage) => void;
68
68
 
69
69
  // mention
70
- SuggestedMentionList?: (props: SuggestedMentionListProps) => React.ReactNode | null;
70
+ SuggestedMentionList?: CommonComponent<SuggestedMentionListProps>;
71
71
 
72
72
  // sub-components
73
73
  AttachmentsButton?: (props: AttachmentsButtonProps) => React.ReactNode | null;
@@ -32,7 +32,6 @@ import {
32
32
  import type { UserProfileContextType } from '../../contexts/UserProfileCtx';
33
33
  import { useLocalization, usePlatformService, useSendbirdChat, useUserProfile } from '../../hooks/useContext';
34
34
  import SBUUtils from '../../libs/SBUUtils';
35
- import type { CommonComponent } from '../../types';
36
35
  import ChatFlatList from '../ChatFlatList';
37
36
  import { ReactionAddons } from '../ReactionAddons';
38
37
 
@@ -59,7 +58,7 @@ export type ChannelMessageListProps<T extends SendbirdGroupChannel | SendbirdOpe
59
58
  onEditMessage: (message: HandleableMessage) => void;
60
59
  onReplyMessage?: (message: HandleableMessage) => void; // only available on group channel
61
60
  onDeleteMessage: (message: HandleableMessage) => Promise<void>;
62
- onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<void>;
61
+ onResendFailedMessage: (failedMessage: HandleableMessage) => Promise<HandleableMessage | void>;
63
62
  onPressParentMessage?: (parentMessage: SendbirdMessage) => void;
64
63
  onPressMediaMessage?: (message: SendbirdFileMessage, deleteMessage: () => Promise<void>, uri: string) => void;
65
64
 
@@ -78,15 +77,10 @@ export type ChannelMessageListProps<T extends SendbirdGroupChannel | SendbirdOpe
78
77
  bottomSheetItem?: BottomSheetItem;
79
78
  isFirstItem: boolean;
80
79
  }) => React.ReactElement | null;
81
- renderNewMessagesButton: null | CommonComponent<{
82
- visible: boolean;
83
- onPress: () => void;
84
- newMessages: SendbirdMessage[];
85
- }>;
86
- renderScrollToBottomButton: null | CommonComponent<{
87
- visible: boolean;
88
- onPress: () => void;
89
- }>;
80
+ renderNewMessagesButton:
81
+ | null
82
+ | ((props: { visible: boolean; onPress: () => void; newMessages: SendbirdMessage[] }) => React.ReactElement | null);
83
+ renderScrollToBottomButton: null | ((props: { visible: boolean; onPress: () => void }) => React.ReactElement | null);
90
84
  flatListProps?: Omit<FlatListProps<SendbirdMessage>, 'data' | 'renderItem'>;
91
85
  } & {
92
86
  ref?: Ref<FlatList<SendbirdMessage>> | undefined;
@@ -0,0 +1,141 @@
1
+ import { ReactNativeZoomableView, ReactNativeZoomableViewProps } from '@openspacelabs/react-native-zoomable-view';
2
+ import React, { useLayoutEffect, useRef, useState } from 'react';
3
+ import { ImageProps, ImageStyle, ImageURISource, StyleProp, StyleSheet, useWindowDimensions } from 'react-native';
4
+
5
+ import {
6
+ Box,
7
+ Image,
8
+ LoadingSpinner,
9
+ createStyleSheet,
10
+ useHeaderStyle,
11
+ useUIKitTheme,
12
+ } from '@sendbird/uikit-react-native-foundation';
13
+ import { FileType, useIIFE } from '@sendbird/uikit-utils';
14
+
15
+ import { usePlatformService } from '../../hooks/useContext';
16
+ import SBUUtils from '../../libs/SBUUtils';
17
+
18
+ type Props = {
19
+ type: FileType;
20
+ src: string;
21
+ topInset?: number;
22
+ bottomInset?: number;
23
+ maxZoom?: number;
24
+ minZoom?: number;
25
+ onPress?: () => void;
26
+ };
27
+ const FileViewerContent = ({ type, src, topInset = 0, bottomInset = 0, maxZoom = 4, minZoom = 1, onPress }: Props) => {
28
+ const [loading, setLoading] = useState(true);
29
+
30
+ const { defaultHeight } = useHeaderStyle();
31
+ const { mediaService } = usePlatformService();
32
+ const { palette } = useUIKitTheme();
33
+
34
+ const source = { uri: src };
35
+ const onLoadEnd = () => setLoading(false);
36
+ const mediaViewer = useIIFE(() => {
37
+ switch (type) {
38
+ case 'image': {
39
+ return (
40
+ <ZoomableImageView
41
+ source={source}
42
+ style={StyleSheet.absoluteFill}
43
+ resizeMode={'contain'}
44
+ onLoadEnd={onLoadEnd}
45
+ zoomProps={{
46
+ minZoom,
47
+ maxZoom,
48
+ onTouchEnd: onPress,
49
+ }}
50
+ />
51
+ );
52
+ }
53
+
54
+ case 'video':
55
+ case 'audio': {
56
+ return (
57
+ <mediaService.VideoComponent
58
+ source={source}
59
+ style={[StyleSheet.absoluteFill, { top: topInset, bottom: defaultHeight + bottomInset }]}
60
+ resizeMode={'contain'}
61
+ onLoad={onLoadEnd}
62
+ />
63
+ );
64
+ }
65
+
66
+ default: {
67
+ return null;
68
+ }
69
+ }
70
+ });
71
+
72
+ return (
73
+ <Box style={styles.container}>
74
+ {mediaViewer}
75
+ {loading && <LoadingSpinner style={{ position: 'absolute' }} size={40} color={palette.primary300} />}
76
+ </Box>
77
+ );
78
+ };
79
+
80
+ const ZoomableImageView = ({
81
+ zoomProps,
82
+ ...props
83
+ }: {
84
+ source: ImageURISource;
85
+ style: StyleProp<ImageStyle>;
86
+ resizeMode: ImageProps['resizeMode'];
87
+ onLoadEnd: () => void;
88
+ zoomProps?: ReactNativeZoomableViewProps;
89
+ }) => {
90
+ const { width, height } = useWindowDimensions();
91
+
92
+ const imageSize = useRef<{ width: number; height: number }>();
93
+ const [contentSizeProps, setContentSizeProps] = useState<ReactNativeZoomableViewProps>({
94
+ contentWidth: width,
95
+ contentHeight: height,
96
+ });
97
+
98
+ useLayoutEffect(() => {
99
+ SBUUtils.safeRun(async () => {
100
+ if (props.source.uri) {
101
+ const image = imageSize.current ?? (await SBUUtils.getImageSize(props.source.uri));
102
+ imageSize.current = image;
103
+
104
+ const viewRatio = width / height;
105
+ const imageRatio = image.width / image.height;
106
+
107
+ const fitDirection = viewRatio > imageRatio ? 'height' : 'width';
108
+ const ratio = fitDirection === 'height' ? height / image.height : width / image.width;
109
+ const actualSize = { width: image.width * ratio, height: image.height * ratio };
110
+
111
+ setContentSizeProps({
112
+ contentWidth: actualSize.width,
113
+ contentHeight: actualSize.height,
114
+ });
115
+ }
116
+ });
117
+ }, [props.source.uri, width, height]);
118
+
119
+ return (
120
+ <ReactNativeZoomableView
121
+ visualTouchFeedbackEnabled={false}
122
+ style={{ width, height }}
123
+ initialZoom={1}
124
+ {...contentSizeProps}
125
+ {...zoomProps}
126
+ >
127
+ <Image {...props} />
128
+ </ReactNativeZoomableView>
129
+ );
130
+ };
131
+
132
+ const styles = createStyleSheet({
133
+ container: {
134
+ zIndex: -1,
135
+ flex: 1,
136
+ alignItems: 'center',
137
+ justifyContent: 'center',
138
+ },
139
+ });
140
+
141
+ export default FileViewerContent;
@@ -0,0 +1,73 @@
1
+ import React from 'react';
2
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
3
+
4
+ import {
5
+ Box,
6
+ Icon,
7
+ PressBox,
8
+ createStyleSheet,
9
+ useHeaderStyle,
10
+ useUIKitTheme,
11
+ } from '@sendbird/uikit-react-native-foundation';
12
+
13
+ type Props = {
14
+ bottomInset: number;
15
+ deleteShown: boolean;
16
+ onPressDelete: () => void;
17
+ onPressDownload: () => void;
18
+ };
19
+
20
+ const FileViewerFooter = ({ bottomInset, deleteShown, onPressDelete, onPressDownload }: Props) => {
21
+ const { palette } = useUIKitTheme();
22
+ const { defaultHeight } = useHeaderStyle();
23
+ const { left, right } = useSafeAreaInsets();
24
+
25
+ return (
26
+ <Box
27
+ style={[
28
+ styles.container,
29
+ {
30
+ paddingLeft: styles.container.paddingHorizontal + left,
31
+ paddingRight: styles.container.paddingHorizontal + right,
32
+ paddingBottom: bottomInset,
33
+ height: defaultHeight + bottomInset,
34
+ backgroundColor: palette.overlay01,
35
+ },
36
+ ]}
37
+ >
38
+ <PressBox activeOpacity={0.75} onPress={onPressDownload} style={styles.buttonContainer}>
39
+ <Icon icon={'download'} size={24} color={palette.onBackgroundDark01} />
40
+ </PressBox>
41
+ <Box style={styles.titleContainer} />
42
+ <PressBox activeOpacity={0.75} onPress={onPressDelete} style={styles.buttonContainer} disabled={!deleteShown}>
43
+ {deleteShown && <Icon icon={'delete'} size={24} color={palette.onBackgroundDark01} />}
44
+ </PressBox>
45
+ </Box>
46
+ );
47
+ };
48
+
49
+ const styles = createStyleSheet({
50
+ container: {
51
+ position: 'absolute',
52
+ left: 0,
53
+ right: 0,
54
+ bottom: 0,
55
+ flexDirection: 'row',
56
+ alignItems: 'center',
57
+ justifyContent: 'center',
58
+ paddingHorizontal: 12,
59
+ },
60
+ buttonContainer: {
61
+ width: 32,
62
+ height: 32,
63
+ alignItems: 'center',
64
+ justifyContent: 'center',
65
+ },
66
+ titleContainer: {
67
+ flex: 1,
68
+ alignItems: 'center',
69
+ justifyContent: 'center',
70
+ },
71
+ });
72
+
73
+ export default FileViewerFooter;