We have changed how priority gets saved in the server, so now instead of post.props we are using post.metadata.priority. This commit adds the relevant changes for posts' priority to work in the mobile app.
163 lines
6.3 KiB
TypeScript
163 lines
6.3 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import React from 'react';
|
|
import {View} from 'react-native';
|
|
|
|
import CustomStatusEmoji from '@components/custom_status/custom_status_emoji';
|
|
import FormattedTime from '@components/formatted_time';
|
|
import PostPriorityLabel from '@components/post_priority/post_priority_label';
|
|
import {CHANNEL, THREAD} from '@constants/screens';
|
|
import {useTheme} from '@context/theme';
|
|
import {postUserDisplayName} from '@utils/post';
|
|
import {makeStyleSheetFromTheme} from '@utils/theme';
|
|
import {typography} from '@utils/typography';
|
|
import {displayUsername, getUserCustomStatus, getUserTimezone, isCustomStatusExpired} from '@utils/user';
|
|
|
|
import HeaderCommentedOn from './commented_on';
|
|
import HeaderDisplayName from './display_name';
|
|
import HeaderReply from './reply';
|
|
import HeaderTag from './tag';
|
|
|
|
import type PostModel from '@typings/database/models/servers/post';
|
|
import type UserModel from '@typings/database/models/servers/user';
|
|
|
|
type HeaderProps = {
|
|
author?: UserModel;
|
|
commentCount: number;
|
|
currentUser: UserModel;
|
|
enablePostUsernameOverride: boolean;
|
|
isAutoResponse: boolean;
|
|
isCRTEnabled?: boolean;
|
|
isCustomStatusEnabled: boolean;
|
|
isEphemeral: boolean;
|
|
isMilitaryTime: boolean;
|
|
isPendingOrFailed: boolean;
|
|
isSystemPost: boolean;
|
|
isTimezoneEnabled: boolean;
|
|
isWebHook: boolean;
|
|
location: string;
|
|
post: PostModel;
|
|
rootPostAuthor?: UserModel;
|
|
showPostPriority: boolean;
|
|
shouldRenderReplyButton?: boolean;
|
|
teammateNameDisplay: string;
|
|
}
|
|
|
|
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
|
|
return {
|
|
container: {
|
|
flex: 1,
|
|
marginTop: 10,
|
|
},
|
|
pendingPost: {
|
|
opacity: 0.5,
|
|
},
|
|
wrapper: {
|
|
flex: 1,
|
|
flexDirection: 'row',
|
|
},
|
|
time: {
|
|
color: theme.centerChannelColor,
|
|
marginTop: 5,
|
|
opacity: 0.5,
|
|
...typography('Body', 75, 'Regular'),
|
|
},
|
|
postPriority: {
|
|
alignSelf: 'center',
|
|
marginLeft: 6,
|
|
},
|
|
customStatusEmoji: {
|
|
color: theme.centerChannelColor,
|
|
marginRight: 4,
|
|
marginTop: 2,
|
|
},
|
|
};
|
|
});
|
|
|
|
const Header = (props: HeaderProps) => {
|
|
const {
|
|
author, commentCount = 0, currentUser, enablePostUsernameOverride, isAutoResponse, isCRTEnabled, isCustomStatusEnabled,
|
|
isEphemeral, isMilitaryTime, isPendingOrFailed, isSystemPost, isTimezoneEnabled, isWebHook,
|
|
location, post, rootPostAuthor, showPostPriority, shouldRenderReplyButton, teammateNameDisplay,
|
|
} = props;
|
|
const theme = useTheme();
|
|
const style = getStyleSheet(theme);
|
|
const pendingPostStyle = isPendingOrFailed ? style.pendingPost : undefined;
|
|
const isReplyPost = Boolean(post.rootId && !isEphemeral);
|
|
const showReply = !isReplyPost && (location !== THREAD) && (shouldRenderReplyButton && (!rootPostAuthor && commentCount > 0));
|
|
const displayName = postUserDisplayName(post, author, teammateNameDisplay, enablePostUsernameOverride);
|
|
const rootAuthorDisplayName = rootPostAuthor ? displayUsername(rootPostAuthor, currentUser.locale, teammateNameDisplay, true) : undefined;
|
|
const customStatus = getUserCustomStatus(author);
|
|
const customStatusExpired = isCustomStatusExpired(author);
|
|
const showCustomStatusEmoji = Boolean(
|
|
isCustomStatusEnabled && displayName && customStatus &&
|
|
!(isSystemPost || author?.isBot || isAutoResponse || isWebHook),
|
|
);
|
|
|
|
return (
|
|
<>
|
|
<View style={[style.container, pendingPostStyle]}>
|
|
<View style={style.wrapper}>
|
|
<HeaderDisplayName
|
|
channelId={post.channelId}
|
|
commentCount={commentCount}
|
|
displayName={displayName}
|
|
location={location}
|
|
rootPostAuthor={rootAuthorDisplayName}
|
|
shouldRenderReplyButton={shouldRenderReplyButton}
|
|
theme={theme}
|
|
userIconOverride={post.props?.override_icon_url}
|
|
userId={post.userId}
|
|
usernameOverride={post.props?.override_username}
|
|
/>
|
|
{showCustomStatusEmoji && !customStatusExpired && Boolean(customStatus?.emoji) && (
|
|
<CustomStatusEmoji
|
|
customStatus={customStatus!}
|
|
style={style.customStatusEmoji}
|
|
testID='post_header'
|
|
/>
|
|
)}
|
|
{(!isSystemPost || isAutoResponse) &&
|
|
<HeaderTag
|
|
isAutoResponder={isAutoResponse}
|
|
isAutomation={isWebHook || author?.isBot}
|
|
isGuest={author?.isGuest}
|
|
/>
|
|
}
|
|
<FormattedTime
|
|
timezone={isTimezoneEnabled ? getUserTimezone(currentUser) : ''}
|
|
isMilitaryTime={isMilitaryTime}
|
|
value={post.createAt}
|
|
style={style.time}
|
|
testID='post_header.date_time'
|
|
/>
|
|
{showPostPriority && post.metadata?.priority?.priority && (
|
|
<View style={style.postPriority}>
|
|
<PostPriorityLabel
|
|
label={post.metadata.priority.priority}
|
|
/>
|
|
</View>
|
|
)}
|
|
{!isCRTEnabled && showReply && commentCount > 0 &&
|
|
<HeaderReply
|
|
commentCount={commentCount}
|
|
location={location}
|
|
post={post}
|
|
theme={theme}
|
|
/>
|
|
}
|
|
</View>
|
|
</View>
|
|
{Boolean(rootAuthorDisplayName) && location === CHANNEL &&
|
|
<HeaderCommentedOn
|
|
locale={currentUser.locale}
|
|
name={rootAuthorDisplayName!}
|
|
theme={theme}
|
|
/>
|
|
}
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default Header;
|