@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.
- package/lib/commonjs/components/ChannelInput/index.js.map +1 -1
- package/lib/commonjs/components/ChannelMessageList/index.js.map +1 -1
- package/lib/commonjs/components/FileViewer/FileViewerContent.js +140 -0
- package/lib/commonjs/components/FileViewer/FileViewerContent.js.map +1 -0
- package/lib/commonjs/components/FileViewer/FileViewerFooter.js +82 -0
- package/lib/commonjs/components/FileViewer/FileViewerFooter.js.map +1 -0
- package/lib/commonjs/components/FileViewer/FileViewerHeader.js +93 -0
- package/lib/commonjs/components/FileViewer/FileViewerHeader.js.map +1 -0
- package/lib/commonjs/components/FileViewer/index.js +133 -0
- package/lib/commonjs/components/FileViewer/index.js.map +1 -0
- package/lib/commonjs/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +10 -9
- package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelBannedUsers/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelList/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelModeration/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelMutedMembers/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelNotifications/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelOperators/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelSettings/types.js.map +1 -1
- package/lib/commonjs/domain/groupChannelUserList/types.js.map +1 -1
- package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js +4 -1
- package/lib/commonjs/domain/messageSearch/component/MessageSearchHeader.js.map +1 -1
- package/lib/commonjs/domain/messageSearch/types.js.map +1 -1
- package/lib/commonjs/domain/openChannel/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelBannedUsers/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js +4 -2
- package/lib/commonjs/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js.map +1 -1
- package/lib/commonjs/domain/openChannelCreate/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelList/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelModeration/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelMutedParticipants/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelOperators/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelSettings/types.js.map +1 -1
- package/lib/commonjs/domain/openChannelUserList/types.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelFragment.js +32 -16
- package/lib/commonjs/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/commonjs/fragments/createGroupChannelListFragment.js +25 -11
- package/lib/commonjs/fragments/createGroupChannelListFragment.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/module/components/ChannelInput/index.js.map +1 -1
- package/lib/module/components/ChannelMessageList/index.js.map +1 -1
- package/lib/module/components/FileViewer/FileViewerContent.js +130 -0
- package/lib/module/components/FileViewer/FileViewerContent.js.map +1 -0
- package/lib/module/components/FileViewer/FileViewerFooter.js +74 -0
- package/lib/module/components/FileViewer/FileViewerFooter.js.map +1 -0
- package/lib/module/components/FileViewer/FileViewerHeader.js +85 -0
- package/lib/module/components/FileViewer/FileViewerHeader.js.map +1 -0
- package/lib/module/components/FileViewer/index.js +123 -0
- package/lib/module/components/FileViewer/index.js.map +1 -0
- package/lib/module/components/ReactionAddons/BottomSheetReactionAddon.js.map +1 -1
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +10 -9
- package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
- package/lib/module/domain/groupChannel/types.js.map +1 -1
- package/lib/module/domain/groupChannelBannedUsers/types.js.map +1 -1
- package/lib/module/domain/groupChannelList/types.js.map +1 -1
- package/lib/module/domain/groupChannelModeration/types.js.map +1 -1
- package/lib/module/domain/groupChannelMutedMembers/types.js.map +1 -1
- package/lib/module/domain/groupChannelNotifications/types.js.map +1 -1
- package/lib/module/domain/groupChannelOperators/types.js.map +1 -1
- package/lib/module/domain/groupChannelSettings/types.js.map +1 -1
- package/lib/module/domain/groupChannelUserList/types.js.map +1 -1
- package/lib/module/domain/messageSearch/component/MessageSearchHeader.js +4 -1
- package/lib/module/domain/messageSearch/component/MessageSearchHeader.js.map +1 -1
- package/lib/module/domain/messageSearch/types.js.map +1 -1
- package/lib/module/domain/openChannel/types.js.map +1 -1
- package/lib/module/domain/openChannelBannedUsers/types.js.map +1 -1
- package/lib/module/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js +4 -2
- package/lib/module/domain/openChannelCreate/component/OpenChannelCreateProfileInput.js.map +1 -1
- package/lib/module/domain/openChannelCreate/types.js.map +1 -1
- package/lib/module/domain/openChannelList/types.js.map +1 -1
- package/lib/module/domain/openChannelModeration/types.js.map +1 -1
- package/lib/module/domain/openChannelMutedParticipants/types.js.map +1 -1
- package/lib/module/domain/openChannelOperators/types.js.map +1 -1
- package/lib/module/domain/openChannelSettings/types.js.map +1 -1
- package/lib/module/domain/openChannelUserList/types.js.map +1 -1
- package/lib/module/fragments/createGroupChannelFragment.js +33 -17
- package/lib/module/fragments/createGroupChannelFragment.js.map +1 -1
- package/lib/module/fragments/createGroupChannelListFragment.js +26 -12
- package/lib/module/fragments/createGroupChannelListFragment.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/typescript/src/components/ChannelInput/index.d.ts +2 -2
- package/lib/typescript/src/components/ChannelMessageList/index.d.ts +5 -6
- package/lib/typescript/src/components/FileViewer/FileViewerContent.d.ts +13 -0
- package/lib/typescript/src/components/FileViewer/FileViewerFooter.d.ts +9 -0
- package/lib/typescript/src/components/FileViewer/FileViewerHeader.d.ts +10 -0
- package/lib/typescript/src/components/{FileViewer.d.ts → FileViewer/index.d.ts} +5 -1
- package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannel/component/GroupChannelMessageList.d.ts +2 -2
- package/lib/typescript/src/domain/groupChannel/types.d.ts +15 -4
- package/lib/typescript/src/domain/groupChannelBannedUsers/types.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelList/types.d.ts +13 -2
- package/lib/typescript/src/domain/groupChannelModeration/types.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelMutedMembers/types.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelNotifications/types.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelOperators/types.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelSettings/types.d.ts +1 -1
- package/lib/typescript/src/domain/groupChannelUserList/types.d.ts +3 -2
- package/lib/typescript/src/domain/messageSearch/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannel/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelBannedUsers/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelCreate/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelList/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelModeration/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelMutedParticipants/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelOperators/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelSettings/types.d.ts +1 -1
- package/lib/typescript/src/domain/openChannelUserList/types.d.ts +3 -3
- package/lib/typescript/src/types.d.ts +4 -4
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +8 -7
- package/src/components/ChannelInput/index.tsx +2 -2
- package/src/components/ChannelMessageList/index.tsx +5 -11
- package/src/components/FileViewer/FileViewerContent.tsx +141 -0
- package/src/components/FileViewer/FileViewerFooter.tsx +73 -0
- package/src/components/FileViewer/FileViewerHeader.tsx +86 -0
- package/src/components/FileViewer/index.tsx +139 -0
- package/src/components/ReactionAddons/BottomSheetReactionAddon.tsx +3 -2
- package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +7 -6
- package/src/domain/groupChannel/types.ts +16 -4
- package/src/domain/groupChannelBannedUsers/types.ts +1 -1
- package/src/domain/groupChannelList/types.ts +13 -2
- package/src/domain/groupChannelModeration/types.ts +1 -1
- package/src/domain/groupChannelMutedMembers/types.ts +1 -1
- package/src/domain/groupChannelNotifications/types.ts +1 -1
- package/src/domain/groupChannelOperators/types.ts +1 -1
- package/src/domain/groupChannelSettings/types.ts +1 -1
- package/src/domain/groupChannelUserList/types.ts +2 -2
- package/src/domain/messageSearch/component/MessageSearchHeader.tsx +4 -1
- package/src/domain/messageSearch/types.ts +1 -1
- package/src/domain/openChannel/types.ts +1 -1
- package/src/domain/openChannelBannedUsers/types.ts +1 -1
- package/src/domain/openChannelCreate/component/OpenChannelCreateProfileInput.tsx +4 -2
- package/src/domain/openChannelCreate/types.ts +1 -1
- package/src/domain/openChannelList/types.ts +1 -1
- package/src/domain/openChannelModeration/types.ts +1 -1
- package/src/domain/openChannelMutedParticipants/types.ts +1 -1
- package/src/domain/openChannelOperators/types.ts +1 -1
- package/src/domain/openChannelSettings/types.ts +1 -1
- package/src/domain/openChannelUserList/types.ts +4 -3
- package/src/fragments/createGroupChannelFragment.tsx +35 -17
- package/src/fragments/createGroupChannelListFragment.tsx +27 -9
- package/src/types.ts +2 -2
- package/src/version.ts +1 -1
- package/lib/commonjs/components/FileViewer.js +0 -300
- package/lib/commonjs/components/FileViewer.js.map +0 -1
- package/lib/module/components/FileViewer.js +0 -291
- package/lib/module/components/FileViewer.js.map +0 -1
- 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
|
-
|
|
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
|
-
|
|
79
|
-
|
|
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,
|
|
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(
|
|
148
|
-
resetWithStartingPoint(Number.MAX_SAFE_INTEGER
|
|
149
|
+
const onResetMessageList = useCallback(async () => {
|
|
150
|
+
return await resetWithStartingPoint(Number.MAX_SAFE_INTEGER);
|
|
149
151
|
}, []);
|
|
150
152
|
|
|
151
|
-
const onResetMessageListWithStartingPoint = useCallback((startingPoint: number
|
|
152
|
-
resetWithStartingPoint(startingPoint
|
|
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={
|
|
228
|
-
onBottomReached={
|
|
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 {
|
|
4
|
-
import {
|
|
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,
|
|
28
|
-
const { groupChannels,
|
|
29
|
-
collectionCreator,
|
|
30
|
-
|
|
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={
|
|
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={
|
|
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 = {}> =
|
|
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.
|
|
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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"}
|