* start upgrade to RN 74 * migrate react-native-fs to expo-file-system * exclude expo-asset module * fix database manager remove directory * fix: android network helper * include expo on android * temporarily disable android dep lock * replace react-native-create-thumbnail with expo-video-thumnails * update patches file version * fix android build on 74 * create local library to replace MattermostManaged, Notifications and SplitView modules with new arch support * migrate app to use new mattermost-rnutils library * remove unused flipper class for android unsigned * fix mattermost-rnutils android foldedObserver lifecycle * use mattermost-rnutils on Android * use mattermost-rnutils on iOS * path react-native-navigation to not crash when activity is not NavigationActivity * create local library for android share extension with new arch support * Replace ShareModule with @mattermost/rnshare library * remove ShareModule from android native code * update react-intl * update nodejs to 20.x.x npm to 10.x.x and dev deps * update @gorhom/bottom-sheet * use MattermostShare conditionally based on the platform * update @react-native-camera-roll/camera-roll * remove unused react-native-calendars * fix metro config * fix terminate session race condition * remove unused analytics * replace react-native-device-info with expo-application and expo-device * update @react-native-clipboard/clipboard * update @react-native-community/datetimepicker * update @react-native-community/netinfo * update @sentry/react-native * update react-native-document-picker * update react-native-gesture-handler * update react-native-share * update react-native-svg and react-native-svg-transformer * update react-native-vector-icons * update babel * update react-native-shadow-2 * update semver * remove react-native-svg-transformer and convert svg files to svg components * fix @mattermost/rnshare new-arch build on android * remove react-native-create-thumbnail resolution in build.gradle * create @mattermost/hardware-keyboard library to replace hw-keyboard-events * fix hardware-keyboard library * fix rnutils library * create @mattermost/keyboard-tracker library * replace react-native-keyboard-tracking-view with @mattermost/keyboard-tracker * fix: rnutils to not crash on lateinit context * fix: rnutils delete database * revert changes to session_manager * Removed react-native-webview and added expo-web-browser instead With expo-web-browser we no longer need the webview for SSO login the SSO login is now done by using "custom Chrome tabs" on Android and ASWebAuthenticationSession on iOS * remove patch for react-native-keyboard-tracking-view * replace react-native-linear-gradient with expo-linear-gradient * replace react-native-in-app-review with expo-store-review * fix: shared group database directory on ios * replace react-native-fast-image with expo-image * remove unusued type def for react-native-keyboard-tracking-view * replace react-native-elements and react-native-button with @rneui * node version * update sizzling methods * fix tests using jest-expo * replace jail-monkey with expo-device * update babel deps * update typescript eslint * update rn and expo * react-native-document-picker @react-native-camera-roll/camera-roll @react-native-community/datetimepicker react-native-reanimated react-native-safe-area-context * update patches * update @sentry/react-native * upgrade react-native-navigation * update expo & expo-image * upgrade to working version of @sentry/react-native * update node, cocoapods, bundler, fastlane versions * @testing-library/react-native and eslint-plugin-jest * fix: FloatingTextInput causing a crash with reanimated * update sentry, localize, @types/lodash and uuid * fix floating text input label * update react-native-video * fix: cannot calculate shadow efficiently on some components * fix: reduce motion warning for bottomSheet * fix: shadow on YouTube component * update react-native-webrtc expo and @typescript-eslint * audit fix * fix swizzling bad merge * temp use of github dependency for @mattermost libraries * feedback review * feedback review * npm audit fix * update bundle deps * update @mattermost/react-native-turbo-log * update deps
234 lines
7.2 KiB
TypeScript
234 lines
7.2 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import React, {useCallback, useState} from 'react';
|
|
import {type LayoutChangeEvent, type StyleProp, View, type ViewStyle} from 'react-native';
|
|
|
|
import Files from '@components/files';
|
|
import FormattedText from '@components/formatted_text';
|
|
import JumboEmoji from '@components/jumbo_emoji';
|
|
import {Screens} from '@constants';
|
|
import {THREAD} from '@constants/screens';
|
|
import {isEdited as postEdited, isPostFailed} from '@utils/post';
|
|
import {makeStyleSheetFromTheme} from '@utils/theme';
|
|
|
|
import Acknowledgements from './acknowledgements';
|
|
import AddMembers from './add_members';
|
|
import Content from './content';
|
|
import Failed from './failed';
|
|
import Message from './message';
|
|
import Reactions from './reactions';
|
|
|
|
import type PostModel from '@typings/database/models/servers/post';
|
|
import type {SearchPattern} from '@typings/global/markdown';
|
|
|
|
type BodyProps = {
|
|
appsEnabled: boolean;
|
|
hasFiles: boolean;
|
|
hasReactions: boolean;
|
|
highlight: boolean;
|
|
highlightReplyBar: boolean;
|
|
isCRTEnabled?: boolean;
|
|
isEphemeral: boolean;
|
|
isFirstReply?: boolean;
|
|
isJumboEmoji: boolean;
|
|
isLastReply?: boolean;
|
|
isPendingOrFailed: boolean;
|
|
isPostAcknowledgementEnabled?: boolean;
|
|
isPostAddChannelMember: boolean;
|
|
location: string;
|
|
post: PostModel;
|
|
searchPatterns?: SearchPattern[];
|
|
showAddReaction?: boolean;
|
|
theme: Theme;
|
|
};
|
|
|
|
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
|
|
return {
|
|
ackAndReactionsContainer: {
|
|
flex: 1,
|
|
flexDirection: 'row',
|
|
flexWrap: 'wrap',
|
|
alignContent: 'flex-start',
|
|
marginTop: 12,
|
|
},
|
|
messageBody: {
|
|
paddingVertical: 2,
|
|
flex: 1,
|
|
},
|
|
messageContainer: {width: '100%'},
|
|
replyBar: {
|
|
backgroundColor: theme.centerChannelColor,
|
|
opacity: 0.1,
|
|
marginLeft: 1,
|
|
marginRight: 7,
|
|
width: 3,
|
|
flexBasis: 3,
|
|
},
|
|
replyBarFirst: {paddingTop: 10},
|
|
replyBarLast: {paddingBottom: 10},
|
|
replyMention: {
|
|
backgroundColor: theme.mentionHighlightBg,
|
|
opacity: 1,
|
|
},
|
|
message: {
|
|
color: theme.centerChannelColor,
|
|
fontSize: 15,
|
|
lineHeight: 20,
|
|
},
|
|
messageContainerWithReplyBar: {
|
|
flexDirection: 'row',
|
|
width: '100%',
|
|
},
|
|
};
|
|
});
|
|
|
|
const Body = ({
|
|
appsEnabled, hasFiles, hasReactions, highlight, highlightReplyBar,
|
|
isCRTEnabled, isEphemeral, isFirstReply, isJumboEmoji, isLastReply, isPendingOrFailed, isPostAcknowledgementEnabled, isPostAddChannelMember,
|
|
location, post, searchPatterns, showAddReaction, theme,
|
|
}: BodyProps) => {
|
|
const style = getStyleSheet(theme);
|
|
const isEdited = postEdited(post);
|
|
const isFailed = isPostFailed(post);
|
|
const [layoutWidth, setLayoutWidth] = useState(0);
|
|
const hasBeenDeleted = Boolean(post.deleteAt);
|
|
let body;
|
|
let message;
|
|
|
|
const isReplyPost = Boolean(post.rootId && (!isEphemeral || !hasBeenDeleted) && location !== THREAD);
|
|
const hasContent = Boolean((post.metadata?.embeds?.length || (appsEnabled && post.props?.app_bindings?.length)) || post.props?.attachments?.length);
|
|
|
|
const replyBarStyle = useCallback((): StyleProp<ViewStyle>|undefined => {
|
|
if (!isReplyPost || (isCRTEnabled && location === Screens.PERMALINK)) {
|
|
return undefined;
|
|
}
|
|
|
|
const barStyle: StyleProp<ViewStyle> = [style.replyBar];
|
|
|
|
if (isFirstReply) {
|
|
barStyle.push(style.replyBarFirst);
|
|
}
|
|
|
|
if (isLastReply) {
|
|
barStyle.push(style.replyBarLast);
|
|
}
|
|
|
|
if (highlightReplyBar) {
|
|
barStyle.push(style.replyMention);
|
|
}
|
|
|
|
return barStyle;
|
|
}, []);
|
|
|
|
const onLayout = useCallback((e: LayoutChangeEvent) => {
|
|
if (location === Screens.SAVED_MESSAGES) {
|
|
setLayoutWidth(e.nativeEvent.layout.width);
|
|
}
|
|
}, [location]);
|
|
|
|
if (hasBeenDeleted) {
|
|
body = (
|
|
<FormattedText
|
|
style={style.message}
|
|
id='post_body.deleted'
|
|
defaultMessage='(message deleted)'
|
|
/>
|
|
);
|
|
} else if (isPostAddChannelMember) {
|
|
message = (
|
|
<AddMembers
|
|
location={location}
|
|
post={post}
|
|
theme={theme}
|
|
/>
|
|
);
|
|
} else if (isJumboEmoji) {
|
|
message = (
|
|
<JumboEmoji
|
|
baseTextStyle={style.message}
|
|
isEdited={isEdited}
|
|
value={post.message}
|
|
/>
|
|
);
|
|
} else if (post.message.length) {
|
|
message = (
|
|
<Message
|
|
highlight={highlight}
|
|
isEdited={isEdited}
|
|
isPendingOrFailed={isPendingOrFailed}
|
|
isReplyPost={isReplyPost}
|
|
layoutWidth={layoutWidth}
|
|
location={location}
|
|
post={post}
|
|
searchPatterns={searchPatterns}
|
|
theme={theme}
|
|
/>
|
|
);
|
|
}
|
|
|
|
const acknowledgementsVisible = isPostAcknowledgementEnabled && post.metadata?.priority?.requested_ack;
|
|
const reactionsVisible = hasReactions && showAddReaction;
|
|
if (!hasBeenDeleted) {
|
|
body = (
|
|
<View style={style.messageBody}>
|
|
{message}
|
|
{hasContent &&
|
|
<Content
|
|
isReplyPost={isReplyPost}
|
|
layoutWidth={layoutWidth}
|
|
location={location}
|
|
post={post}
|
|
theme={theme}
|
|
/>
|
|
}
|
|
{hasFiles &&
|
|
<Files
|
|
failed={isFailed}
|
|
layoutWidth={layoutWidth}
|
|
location={location}
|
|
post={post}
|
|
isReplyPost={isReplyPost}
|
|
/>
|
|
}
|
|
{(acknowledgementsVisible || reactionsVisible) && (
|
|
<View style={style.ackAndReactionsContainer}>
|
|
{acknowledgementsVisible && (
|
|
<Acknowledgements
|
|
hasReactions={hasReactions}
|
|
location={location}
|
|
post={post}
|
|
theme={theme}
|
|
/>
|
|
)}
|
|
{reactionsVisible && (
|
|
<Reactions
|
|
location={location}
|
|
post={post}
|
|
theme={theme}
|
|
/>
|
|
)}
|
|
</View>
|
|
)}
|
|
</View>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<View
|
|
style={style.messageContainerWithReplyBar}
|
|
onLayout={onLayout}
|
|
>
|
|
<View style={replyBarStyle()}/>
|
|
{body}
|
|
{isFailed &&
|
|
<Failed
|
|
post={post}
|
|
theme={theme}
|
|
/>
|
|
}
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default Body;
|