@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
@@ -1,14 +1,14 @@
1
1
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
2
 
3
+ import { MessageCollection, MessageFilter } from '@sendbird/chat/groupChannel';
3
4
  import { ReplyType } from '@sendbird/chat/message';
4
- import { useGroupChannelMessages } from '@sendbird/uikit-chat-hooks';
5
5
  import { Box } from '@sendbird/uikit-react-native-foundation';
6
+ import { useGroupChannelMessages } from '@sendbird/uikit-tools';
7
+ import type { SendbirdFileMessage, SendbirdGroupChannel, SendbirdUserMessage } from '@sendbird/uikit-utils';
6
8
  import {
7
9
  NOOP,
8
10
  PASS,
9
- SendbirdFileMessage,
10
- SendbirdGroupChannel,
11
- SendbirdUserMessage,
11
+ confirmAndMarkAsRead,
12
12
  messageComparator,
13
13
  useFreshCallback,
14
14
  useIIFE,
@@ -51,9 +51,10 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
51
51
  onBeforeUpdateFileMessage = PASS,
52
52
  channel,
53
53
  keyboardAvoidOffset,
54
- collectionCreator,
55
54
  sortComparator = messageComparator,
56
55
  flatListProps,
56
+ messageListQueryParams,
57
+ collectionCreator,
57
58
  }) => {
58
59
  const { playerService, recorderService } = usePlatformService();
59
60
  const { sdk, currentUser, sbOptions } = useSendbirdChat();
@@ -75,8 +76,8 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
75
76
  messages,
76
77
  newMessages,
77
78
  resetNewMessages,
78
- next,
79
- prev,
79
+ loadNext,
80
+ loadPrevious,
80
81
  hasNext,
81
82
  sendFileMessage,
82
83
  sendUserMessage,
@@ -85,7 +86,7 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
85
86
  resendMessage,
86
87
  deleteMessage,
87
88
  resetWithStartingPoint,
88
- } = useGroupChannelMessages(sdk, channel, currentUser?.userId, {
89
+ } = useGroupChannelMessages(sdk, channel, {
89
90
  shouldCountNewMessages: () => scrolledAwayFromBottomRef.current,
90
91
  onMessagesReceived(messages) {
91
92
  groupChannelPubSub.publish({ type: 'MESSAGES_RECEIVED', data: { messages } });
@@ -93,12 +94,13 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
93
94
  onMessagesUpdated(messages) {
94
95
  groupChannelPubSub.publish({ type: 'MESSAGES_UPDATED', data: { messages } });
95
96
  },
96
- collectionCreator,
97
- sortComparator,
98
97
  onChannelDeleted,
98
+ onCurrentUserBanned: onChannelDeleted,
99
+ collectionCreator: getCollectionCreator(channel, messageListQueryParams, collectionCreator),
100
+ sortComparator,
101
+ markAsRead: confirmAndMarkAsRead,
99
102
  replyType,
100
103
  startingPoint: internalSearchItem?.startingPoint,
101
- enableCollectionWithoutLocalCache: true,
102
104
  });
103
105
 
104
106
  const onBlurFragment = () => {
@@ -144,12 +146,12 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
144
146
  [flatListProps],
145
147
  );
146
148
 
147
- const onResetMessageList = useCallback((callback?: () => void) => {
148
- resetWithStartingPoint(Number.MAX_SAFE_INTEGER, callback);
149
+ const onResetMessageList = useCallback(async () => {
150
+ return await resetWithStartingPoint(Number.MAX_SAFE_INTEGER);
149
151
  }, []);
150
152
 
151
- const onResetMessageListWithStartingPoint = useCallback((startingPoint: number, callback?: () => void) => {
152
- resetWithStartingPoint(startingPoint, callback);
153
+ const onResetMessageListWithStartingPoint = useCallback(async (startingPoint: number) => {
154
+ return await resetWithStartingPoint(startingPoint);
153
155
  }, []);
154
156
 
155
157
  // Changing the search item will trigger the focus animation on messages.
@@ -224,8 +226,8 @@ const createGroupChannelFragment = (initModule?: Partial<GroupChannelModule>): G
224
226
  renderMessage={renderItem}
225
227
  messages={messages}
226
228
  newMessages={newMessages}
227
- onTopReached={prev}
228
- onBottomReached={next}
229
+ onTopReached={loadPrevious}
230
+ onBottomReached={loadNext}
229
231
  hasNext={hasNext}
230
232
  scrolledAwayFromBottom={scrolledAwayFromBottom}
231
233
  onScrolledAwayFromBottom={onScrolledAwayFromBottom}
@@ -258,4 +260,20 @@ function shouldRenderInput(channel: SendbirdGroupChannel) {
258
260
  return true;
259
261
  }
260
262
 
263
+ function getCollectionCreator(
264
+ channel: SendbirdGroupChannel,
265
+ messageListQueryParams?: GroupChannelProps['Fragment']['messageListQueryParams'],
266
+ deprecatedCreatorProp?: () => MessageCollection,
267
+ ) {
268
+ if (!messageListQueryParams && deprecatedCreatorProp) return deprecatedCreatorProp;
269
+
270
+ return (defaultParams: GroupChannelProps['Fragment']['messageListQueryParams']) => {
271
+ const params = { ...defaultParams, ...messageListQueryParams };
272
+ return channel.createMessageCollection({
273
+ ...params,
274
+ filter: new MessageFilter(params),
275
+ });
276
+ };
277
+ }
278
+
261
279
  export default createGroupChannelFragment;
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
 
3
- import { useGroupChannelList } from '@sendbird/uikit-chat-hooks';
4
- import { PASS, useAppState, useFreshCallback } from '@sendbird/uikit-utils';
3
+ import { GroupChannelCollection, GroupChannelFilter } from '@sendbird/chat/groupChannel';
4
+ import { useGroupChannelList } from '@sendbird/uikit-tools';
5
+ import { PASS, SendbirdChatSDK, confirmAndMarkAsDelivered, useAppState, useFreshCallback } from '@sendbird/uikit-utils';
5
6
 
6
7
  import StatusComposition from '../components/StatusComposition';
7
8
  import GroupChannelPreviewContainer from '../containers/GroupChannelPreviewContainer';
@@ -18,16 +19,17 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
18
19
  return ({
19
20
  onPressChannel,
20
21
  onPressCreateChannel,
21
- collectionCreator,
22
22
  renderGroupChannelPreview,
23
23
  skipTypeSelection = false,
24
24
  flatListProps = {},
25
25
  menuItemCreator = PASS,
26
+ channelListQueryParams,
27
+ collectionCreator,
26
28
  }) => {
27
- const { sdk, currentUser, sbOptions, markAsDeliveredWithChannel } = useSendbirdChat();
28
- const { groupChannels, next, loading } = useGroupChannelList(sdk, currentUser?.userId, {
29
- collectionCreator,
30
- enableCollectionWithoutLocalCache: true,
29
+ const { sdk, sbOptions, markAsDeliveredWithChannel } = useSendbirdChat();
30
+ const { groupChannels, loadMore, initialized } = useGroupChannelList(sdk, {
31
+ collectionCreator: getCollectionCreator(sdk, channelListQueryParams, collectionCreator),
32
+ markAsDelivered: confirmAndMarkAsDelivered,
31
33
  });
32
34
 
33
35
  if (sbOptions.appInfo.deliveryReceiptEnabled) {
@@ -49,13 +51,13 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
49
51
  return (
50
52
  <GroupChannelListModule.Provider>
51
53
  <GroupChannelListModule.Header />
52
- <StatusComposition loading={loading} LoadingComponent={<GroupChannelListModule.StatusLoading />}>
54
+ <StatusComposition loading={!initialized} LoadingComponent={<GroupChannelListModule.StatusLoading />}>
53
55
  <GroupChannelListModule.List
54
56
  onPressChannel={onPressChannel}
55
57
  menuItemCreator={menuItemCreator}
56
58
  renderGroupChannelPreview={_renderGroupChannelPreview}
57
59
  groupChannels={groupChannels}
58
- onLoadNext={next}
60
+ onLoadNext={loadMore}
59
61
  flatListProps={{
60
62
  ListEmptyComponent: <GroupChannelListModule.StatusEmpty />,
61
63
  contentContainerStyle: { flexGrow: 1 },
@@ -72,4 +74,20 @@ const createGroupChannelListFragment = (initModule?: Partial<GroupChannelListMod
72
74
  };
73
75
  };
74
76
 
77
+ function getCollectionCreator(
78
+ sdk: SendbirdChatSDK,
79
+ channelListQueryParams?: GroupChannelListProps['Fragment']['channelListQueryParams'],
80
+ deprecatedCreatorProp?: () => GroupChannelCollection,
81
+ ) {
82
+ if (!channelListQueryParams && deprecatedCreatorProp) return deprecatedCreatorProp;
83
+
84
+ return (defaultParams: GroupChannelListProps['Fragment']['channelListQueryParams']) => {
85
+ const params = { ...defaultParams, ...channelListQueryParams };
86
+ return sdk.groupChannel.createGroupChannelCollection({
87
+ ...params,
88
+ filter: new GroupChannelFilter(params),
89
+ });
90
+ };
91
+ }
92
+
75
93
  export default createGroupChannelListFragment;
package/src/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ErrorInfo, ReactNode } from 'react';
1
+ import type { ComponentType, ErrorInfo, ReactNode } from 'react';
2
2
 
3
3
  import type { SendbirdUser } from '@sendbird/uikit-utils';
4
4
 
@@ -17,7 +17,7 @@ export interface LocalCacheStorage {
17
17
 
18
18
  export type ErrorBoundaryProps = { error: Error; errorInfo: ErrorInfo; reset: () => void };
19
19
 
20
- export type CommonComponent<P = {}> = (props: P & { children?: ReactNode }) => null | ReactNode;
20
+ export type CommonComponent<P = {}> = ComponentType<P & { children?: ReactNode | undefined }>;
21
21
 
22
22
  export type MentionedUser = {
23
23
  range: Range;
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.3.0';
1
+ const VERSION = '3.4.1';
2
2
  export default VERSION;
@@ -1,300 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
8
- var _reactNative = require("react-native");
9
- var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
10
- var _uikitReactNativeFoundation = require("@sendbird/uikit-react-native-foundation");
11
- var _uikitUtils = require("@sendbird/uikit-utils");
12
- var _useContext = require("../hooks/useContext");
13
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
- const FileViewer = _ref => {
16
- let {
17
- headerShown = true,
18
- deleteMessage,
19
- headerTopInset,
20
- fileMessage,
21
- onPressDownload,
22
- onPressDelete,
23
- onClose
24
- } = _ref;
25
- const [loading, setLoading] = (0, _react.useState)(true);
26
- const {
27
- bottom
28
- } = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
29
- const {
30
- currentUser
31
- } = (0, _useContext.useSendbirdChat)();
32
- const {
33
- palette
34
- } = (0, _uikitReactNativeFoundation.useUIKitTheme)();
35
- const {
36
- topInset,
37
- statusBarTranslucent,
38
- defaultHeight
39
- } = (0, _uikitReactNativeFoundation.useHeaderStyle)();
40
- const {
41
- STRINGS
42
- } = (0, _useContext.useLocalization)();
43
- const {
44
- fileService,
45
- mediaService
46
- } = (0, _useContext.usePlatformService)();
47
- const toast = (0, _uikitReactNativeFoundation.useToast)();
48
- const {
49
- alert
50
- } = (0, _uikitReactNativeFoundation.useAlert)();
51
- const basicTopInset = statusBarTranslucent ? topInset : 0;
52
- const canDelete = (0, _uikitUtils.isMyMessage)(fileMessage, currentUser === null || currentUser === void 0 ? void 0 : currentUser.userId);
53
- const fileType = (0, _uikitUtils.getFileType)(fileMessage.type || (0, _uikitUtils.getFileExtension)(fileMessage.url));
54
- (0, _react.useEffect)(() => {
55
- if (fileType === 'file') onClose();
56
- }, []);
57
- const fileViewer = (0, _uikitUtils.useIIFE)(() => {
58
- switch (fileType) {
59
- case 'image':
60
- {
61
- return /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Image, {
62
- source: {
63
- uri: fileMessage.url
64
- },
65
- style: _reactNative.StyleSheet.absoluteFill,
66
- resizeMode: 'contain',
67
- onLoadEnd: () => setLoading(false)
68
- });
69
- }
70
- case 'video':
71
- case 'audio':
72
- {
73
- return /*#__PURE__*/_react.default.createElement(mediaService.VideoComponent, {
74
- source: {
75
- uri: fileMessage.url
76
- },
77
- style: [_reactNative.StyleSheet.absoluteFill, {
78
- top: basicTopInset + defaultHeight,
79
- bottom: defaultHeight + bottom
80
- }],
81
- resizeMode: 'contain',
82
- onLoad: () => setLoading(false)
83
- });
84
- }
85
- default:
86
- {
87
- return null;
88
- }
89
- }
90
- });
91
- const _onPressDelete = () => {
92
- if (!canDelete) return;
93
- if (onPressDelete) {
94
- onPressDelete(fileMessage);
95
- } else {
96
- alert({
97
- title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,
98
- buttons: [{
99
- text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL
100
- }, {
101
- text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,
102
- style: 'destructive',
103
- onPress: () => {
104
- deleteMessage().then(() => {
105
- onClose();
106
- }).catch(() => {
107
- toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');
108
- });
109
- }
110
- }]
111
- });
112
- }
113
- };
114
- const _onPressDownload = () => {
115
- if (onPressDownload) {
116
- onPressDownload(fileMessage);
117
- } else {
118
- if ((0, _uikitUtils.toMegabyte)(fileMessage.size) > 4) {
119
- toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');
120
- }
121
- fileService.save({
122
- fileUrl: fileMessage.url,
123
- fileName: fileMessage.name,
124
- fileType: fileMessage.type
125
- }).then(response => {
126
- toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');
127
- _uikitUtils.Logger.log('File saved to', response);
128
- }).catch(err => {
129
- toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');
130
- _uikitUtils.Logger.log('File save failure', err);
131
- });
132
- }
133
- };
134
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
135
- style: {
136
- flex: 1,
137
- backgroundColor: palette.background700
138
- }
139
- }, /*#__PURE__*/_react.default.createElement(_reactNative.StatusBar, {
140
- barStyle: 'light-content',
141
- animated: true
142
- }), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
143
- style: {
144
- flex: 1,
145
- alignItems: 'center',
146
- justifyContent: 'center'
147
- }
148
- }, fileViewer, loading && /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.LoadingSpinner, {
149
- style: {
150
- position: 'absolute'
151
- },
152
- size: 40,
153
- color: palette.primary300
154
- })), headerShown && /*#__PURE__*/_react.default.createElement(FileViewerHeader, {
155
- title: STRINGS.FILE_VIEWER.TITLE(fileMessage),
156
- subtitle: STRINGS.FILE_VIEWER.SUBTITLE(fileMessage),
157
- topInset: headerTopInset ?? basicTopInset,
158
- onClose: onClose
159
- }), /*#__PURE__*/_react.default.createElement(FileViewerFooter, {
160
- bottomInset: bottom,
161
- deleteShown: canDelete,
162
- onPressDelete: _onPressDelete,
163
- onPressDownload: _onPressDownload
164
- }));
165
- };
166
- const FileViewerHeader = _ref2 => {
167
- let {
168
- topInset,
169
- onClose,
170
- subtitle,
171
- title
172
- } = _ref2;
173
- const {
174
- palette
175
- } = (0, _uikitReactNativeFoundation.useUIKitTheme)();
176
- const {
177
- defaultHeight
178
- } = (0, _uikitReactNativeFoundation.useHeaderStyle)();
179
- const {
180
- left,
181
- right
182
- } = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
183
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
184
- style: [styles.headerContainer, {
185
- paddingLeft: styles.headerContainer.paddingHorizontal + left,
186
- paddingRight: styles.headerContainer.paddingHorizontal + right
187
- }, {
188
- paddingTop: topInset,
189
- height: defaultHeight + topInset,
190
- backgroundColor: palette.overlay01
191
- }]
192
- }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
193
- onPress: onClose,
194
- style: styles.barButton
195
- }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Icon, {
196
- icon: 'close',
197
- size: 24,
198
- color: palette.onBackgroundDark01
199
- })), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
200
- style: styles.barTitleContainer
201
- }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Text, {
202
- h2: true,
203
- color: palette.onBackgroundDark01,
204
- style: styles.headerTitle,
205
- numberOfLines: 1
206
- }, (0, _uikitUtils.truncate)(title, {
207
- mode: 'mid',
208
- maxLen: 18
209
- })), /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Text, {
210
- caption2: true,
211
- color: palette.onBackgroundDark01,
212
- numberOfLines: 1
213
- }, subtitle)), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
214
- style: styles.barButton
215
- }));
216
- };
217
- const FileViewerFooter = _ref3 => {
218
- let {
219
- bottomInset,
220
- deleteShown,
221
- onPressDelete,
222
- onPressDownload
223
- } = _ref3;
224
- const {
225
- palette
226
- } = (0, _uikitReactNativeFoundation.useUIKitTheme)();
227
- const {
228
- defaultHeight
229
- } = (0, _uikitReactNativeFoundation.useHeaderStyle)();
230
- const {
231
- left,
232
- right
233
- } = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
234
- return /*#__PURE__*/_react.default.createElement(_reactNative.View, {
235
- style: [styles.footerContainer, {
236
- paddingLeft: styles.headerContainer.paddingHorizontal + left,
237
- paddingRight: styles.headerContainer.paddingHorizontal + right
238
- }, {
239
- paddingBottom: bottomInset,
240
- height: defaultHeight + bottomInset,
241
- backgroundColor: palette.overlay01
242
- }]
243
- }, /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
244
- onPress: onPressDownload,
245
- style: styles.barButton
246
- }, /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Icon, {
247
- icon: 'download',
248
- size: 24,
249
- color: palette.onBackgroundDark01
250
- })), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
251
- style: styles.barTitleContainer
252
- }), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
253
- onPress: onPressDelete,
254
- style: styles.barButton,
255
- disabled: !deleteShown
256
- }, deleteShown && /*#__PURE__*/_react.default.createElement(_uikitReactNativeFoundation.Icon, {
257
- icon: 'delete',
258
- size: 24,
259
- color: palette.onBackgroundDark01
260
- })));
261
- };
262
- const styles = (0, _uikitReactNativeFoundation.createStyleSheet)({
263
- headerContainer: {
264
- top: 0,
265
- left: 0,
266
- right: 0,
267
- position: 'absolute',
268
- flexDirection: 'row',
269
- alignItems: 'center',
270
- justifyContent: 'center',
271
- paddingHorizontal: 12
272
- },
273
- barButton: {
274
- width: 32,
275
- height: 32,
276
- alignItems: 'center',
277
- justifyContent: 'center'
278
- },
279
- barTitleContainer: {
280
- flex: 1,
281
- alignItems: 'center',
282
- justifyContent: 'center'
283
- },
284
- headerTitle: {
285
- marginBottom: 2
286
- },
287
- footerContainer: {
288
- position: 'absolute',
289
- left: 0,
290
- right: 0,
291
- bottom: 0,
292
- flexDirection: 'row',
293
- alignItems: 'center',
294
- justifyContent: 'center',
295
- paddingHorizontal: 12
296
- }
297
- });
298
- var _default = FileViewer;
299
- exports.default = _default;
300
- //# sourceMappingURL=FileViewer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeSafeAreaContext","_uikitReactNativeFoundation","_uikitUtils","_useContext","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","FileViewer","_ref","headerShown","deleteMessage","headerTopInset","fileMessage","onPressDownload","onPressDelete","onClose","loading","setLoading","useState","bottom","useSafeAreaInsets","currentUser","useSendbirdChat","palette","useUIKitTheme","topInset","statusBarTranslucent","defaultHeight","useHeaderStyle","STRINGS","useLocalization","fileService","mediaService","usePlatformService","toast","useToast","alert","useAlert","basicTopInset","canDelete","isMyMessage","userId","fileType","getFileType","type","getFileExtension","url","useEffect","fileViewer","useIIFE","createElement","Image","source","uri","style","StyleSheet","absoluteFill","resizeMode","onLoadEnd","VideoComponent","top","onLoad","_onPressDelete","title","LABELS","CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE","buttons","text","CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL","CHANNEL_MESSAGE_DELETE_CONFIRM_OK","onPress","then","catch","show","TOAST","DELETE_MSG_ERROR","_onPressDownload","toMegabyte","size","DOWNLOAD_START","save","fileUrl","fileName","name","response","DOWNLOAD_OK","Logger","log","err","DOWNLOAD_ERROR","View","flex","backgroundColor","background700","StatusBar","barStyle","animated","alignItems","justifyContent","LoadingSpinner","position","color","primary300","FileViewerHeader","FILE_VIEWER","TITLE","subtitle","SUBTITLE","FileViewerFooter","bottomInset","deleteShown","_ref2","left","right","styles","headerContainer","paddingLeft","paddingHorizontal","paddingRight","paddingTop","height","overlay01","TouchableOpacity","barButton","Icon","icon","onBackgroundDark01","barTitleContainer","Text","h2","headerTitle","numberOfLines","truncate","mode","maxLen","caption2","_ref3","footerContainer","paddingBottom","disabled","createStyleSheet","flexDirection","width","marginBottom","_default","exports"],"sources":["FileViewer.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { StatusBar, StyleSheet, TouchableOpacity, View } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\nimport {\n Icon,\n Image,\n LoadingSpinner,\n Text,\n createStyleSheet,\n useAlert,\n useHeaderStyle,\n useToast,\n useUIKitTheme,\n} from '@sendbird/uikit-react-native-foundation';\nimport type { SendbirdFileMessage } from '@sendbird/uikit-utils';\nimport {\n Logger,\n getFileExtension,\n getFileType,\n isMyMessage,\n toMegabyte,\n truncate,\n useIIFE,\n} from '@sendbird/uikit-utils';\n\nimport { useLocalization, usePlatformService, useSendbirdChat } from '../hooks/useContext';\n\ntype Props = {\n fileMessage: SendbirdFileMessage;\n deleteMessage: () => Promise<void>;\n\n onClose: () => void;\n onPressDownload?: (message: SendbirdFileMessage) => void;\n onPressDelete?: (message: SendbirdFileMessage) => void;\n\n headerShown?: boolean;\n headerTopInset?: number;\n};\nconst FileViewer = ({\n headerShown = true,\n deleteMessage,\n headerTopInset,\n fileMessage,\n onPressDownload,\n onPressDelete,\n onClose,\n}: Props) => {\n const [loading, setLoading] = useState(true);\n\n const { bottom } = useSafeAreaInsets();\n\n const { currentUser } = useSendbirdChat();\n const { palette } = useUIKitTheme();\n const { topInset, statusBarTranslucent, defaultHeight } = useHeaderStyle();\n const { STRINGS } = useLocalization();\n const { fileService, mediaService } = usePlatformService();\n const toast = useToast();\n const { alert } = useAlert();\n\n const basicTopInset = statusBarTranslucent ? topInset : 0;\n const canDelete = isMyMessage(fileMessage, currentUser?.userId);\n const fileType = getFileType(fileMessage.type || getFileExtension(fileMessage.url));\n\n useEffect(() => {\n if (fileType === 'file') onClose();\n }, []);\n\n const fileViewer = useIIFE(() => {\n switch (fileType) {\n case 'image': {\n return (\n <Image\n source={{ uri: fileMessage.url }}\n style={StyleSheet.absoluteFill}\n resizeMode={'contain'}\n onLoadEnd={() => setLoading(false)}\n />\n );\n }\n\n case 'video':\n case 'audio': {\n return (\n <mediaService.VideoComponent\n source={{ uri: fileMessage.url }}\n style={[StyleSheet.absoluteFill, { top: basicTopInset + defaultHeight, bottom: defaultHeight + bottom }]}\n resizeMode={'contain'}\n onLoad={() => setLoading(false)}\n />\n );\n }\n\n default: {\n return null;\n }\n }\n });\n\n const _onPressDelete = () => {\n if (!canDelete) return;\n\n if (onPressDelete) {\n onPressDelete(fileMessage);\n } else {\n alert({\n title: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_TITLE,\n buttons: [\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_CANCEL,\n },\n {\n text: STRINGS.LABELS.CHANNEL_MESSAGE_DELETE_CONFIRM_OK,\n style: 'destructive',\n onPress: () => {\n deleteMessage()\n .then(() => {\n onClose();\n })\n .catch(() => {\n toast.show(STRINGS.TOAST.DELETE_MSG_ERROR, 'error');\n });\n },\n },\n ],\n });\n }\n };\n\n const _onPressDownload = () => {\n if (onPressDownload) {\n onPressDownload(fileMessage);\n } else {\n if (toMegabyte(fileMessage.size) > 4) {\n toast.show(STRINGS.TOAST.DOWNLOAD_START, 'success');\n }\n\n fileService\n .save({ fileUrl: fileMessage.url, fileName: fileMessage.name, fileType: fileMessage.type })\n .then((response) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_OK, 'success');\n Logger.log('File saved to', response);\n })\n .catch((err) => {\n toast.show(STRINGS.TOAST.DOWNLOAD_ERROR, 'error');\n Logger.log('File save failure', err);\n });\n }\n };\n\n return (\n <View style={{ flex: 1, backgroundColor: palette.background700 }}>\n <StatusBar barStyle={'light-content'} animated />\n <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>\n {fileViewer}\n {loading && <LoadingSpinner style={{ position: 'absolute' }} size={40} color={palette.primary300} />}\n </View>\n {headerShown && (\n <FileViewerHeader\n title={STRINGS.FILE_VIEWER.TITLE(fileMessage)}\n subtitle={STRINGS.FILE_VIEWER.SUBTITLE(fileMessage)}\n topInset={headerTopInset ?? basicTopInset}\n onClose={onClose}\n />\n )}\n <FileViewerFooter\n bottomInset={bottom}\n deleteShown={canDelete}\n onPressDelete={_onPressDelete}\n onPressDownload={_onPressDownload}\n />\n </View>\n );\n};\n\ntype HeaderProps = {\n topInset: number;\n onClose: () => void;\n title: string;\n subtitle: string;\n};\nconst FileViewerHeader = ({ topInset, onClose, subtitle, title }: HeaderProps) => {\n const { palette } = useUIKitTheme();\n const { defaultHeight } = useHeaderStyle();\n const { left, right } = useSafeAreaInsets();\n\n return (\n <View\n style={[\n styles.headerContainer,\n {\n paddingLeft: styles.headerContainer.paddingHorizontal + left,\n paddingRight: styles.headerContainer.paddingHorizontal + right,\n },\n { paddingTop: topInset, height: defaultHeight + topInset, backgroundColor: palette.overlay01 },\n ]}\n >\n <TouchableOpacity onPress={onClose} style={styles.barButton}>\n <Icon icon={'close'} size={24} color={palette.onBackgroundDark01} />\n </TouchableOpacity>\n <View style={styles.barTitleContainer}>\n <Text h2 color={palette.onBackgroundDark01} style={styles.headerTitle} numberOfLines={1}>\n {truncate(title, { mode: 'mid', maxLen: 18 })}\n </Text>\n <Text caption2 color={palette.onBackgroundDark01} numberOfLines={1}>\n {subtitle}\n </Text>\n </View>\n <View style={styles.barButton} />\n </View>\n );\n};\n\ntype FooterProps = {\n bottomInset: number;\n deleteShown: boolean;\n onPressDelete: () => void;\n onPressDownload: () => void;\n};\nconst FileViewerFooter = ({ bottomInset, deleteShown, onPressDelete, onPressDownload }: FooterProps) => {\n const { palette } = useUIKitTheme();\n const { defaultHeight } = useHeaderStyle();\n const { left, right } = useSafeAreaInsets();\n\n return (\n <View\n style={[\n styles.footerContainer,\n {\n paddingLeft: styles.headerContainer.paddingHorizontal + left,\n paddingRight: styles.headerContainer.paddingHorizontal + right,\n },\n {\n paddingBottom: bottomInset,\n height: defaultHeight + bottomInset,\n backgroundColor: palette.overlay01,\n },\n ]}\n >\n <TouchableOpacity onPress={onPressDownload} style={styles.barButton}>\n <Icon icon={'download'} size={24} color={palette.onBackgroundDark01} />\n </TouchableOpacity>\n <View style={styles.barTitleContainer} />\n <TouchableOpacity onPress={onPressDelete} style={styles.barButton} disabled={!deleteShown}>\n {deleteShown && <Icon icon={'delete'} size={24} color={palette.onBackgroundDark01} />}\n </TouchableOpacity>\n </View>\n );\n};\n\nconst styles = createStyleSheet({\n headerContainer: {\n top: 0,\n left: 0,\n right: 0,\n position: 'absolute',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 12,\n },\n barButton: {\n width: 32,\n height: 32,\n alignItems: 'center',\n justifyContent: 'center',\n },\n barTitleContainer: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerTitle: {\n marginBottom: 2,\n },\n footerContainer: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 12,\n },\n});\n\nexport default FileViewer;\n"],"mappings":"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"}