// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React, {useCallback, useMemo} from 'react'; import {useIntl} from 'react-intl'; import {Keyboard, TouchableHighlight, View} from 'react-native'; import {switchToThread} from '@actions/local/thread'; import {switchToChannelById} from '@actions/remote/channel'; import BoRLabel from '@components/burn_on_read_label'; import DraftAndScheduledPostHeader from '@components/draft_scheduled_post_header'; import Header from '@components/post_draft/draft_input/header'; import {Screens} from '@constants'; import {DRAFT_TYPE_DRAFT, DRAFT_TYPE_SCHEDULED, type DraftType} from '@constants/draft'; import {useServerUrl} from '@context/server'; import {useTheme} from '@context/theme'; import {DRAFT_OPTIONS_BUTTON} from '@screens/draft_scheduled_post_options'; import {openAsBottomSheet} from '@screens/navigation'; import {isBoRPost} from '@utils/bor'; import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme'; import DraftAndScheduledPostContainer from './draft_scheduled_post_container'; import type ChannelModel from '@typings/database/models/servers/channel'; import type DraftModel from '@typings/database/models/servers/draft'; import type ScheduledPostModel from '@typings/database/models/servers/scheduled_post'; import type UserModel from '@typings/database/models/servers/user'; import type {AvailableScreens} from '@typings/screens/navigation'; type Props = { channel: ChannelModel; location: AvailableScreens; postReceiverUser?: UserModel; post: DraftModel | ScheduledPostModel; layoutWidth: number; isPostPriorityEnabled: boolean; draftType: DraftType; firstItem?: boolean; borUserTimeLimit?: number; } const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => { return { container: { position: 'relative', }, postContainer: { paddingHorizontal: 20, paddingVertical: 16, width: '100%', }, postContainerBorderTop: { borderTopColor: changeOpacity(theme.centerChannelColor, 0.16), borderTopWidth: 1, }, pressInContainer: { backgroundColor: changeOpacity(theme.centerChannelColor, 0.16), }, indicatorContainer: { display: 'flex', flexDirection: 'row', alignItems: 'flex-end', gap: 7, }, priorityIndicator: { marginLeft: -12, }, indicatorItem: { marginTop: 10, }, errorLine: { backgroundColor: theme.errorTextColor, position: 'absolute', width: 1, top: 0, left: 0, height: '100%', }, borIndicator: { paddingVertical: 2, }, }; }); const DraftAndScheduledPost: React.FC = ({ channel, location, post, postReceiverUser, layoutWidth, isPostPriorityEnabled, draftType, firstItem, borUserTimeLimit, }) => { const intl = useIntl(); const theme = useTheme(); const style = getStyleSheet(theme); const serverUrl = useServerUrl(); const showPostPriority = Boolean(isPostPriorityEnabled && post.metadata?.priority && post.metadata?.priority?.priority); const onLongPress = useCallback(() => { Keyboard.dismiss(); let title; if (draftType === DRAFT_TYPE_DRAFT) { title = intl.formatMessage({id: 'draft.options.title', defaultMessage: 'Draft Options'}); } else { title = intl.formatMessage({id: 'scheduled_post.options.title', defaultMessage: 'Message actions'}); } openAsBottomSheet({ closeButtonId: DRAFT_OPTIONS_BUTTON, screen: Screens.DRAFT_SCHEDULED_POST_OPTIONS, theme, title, props: {channel, rootId: post.rootId, draftType, draft: post, draftReceiverUserName: postReceiverUser?.username}, }); }, [intl, draftType, theme, channel, post, postReceiverUser?.username]); const onPress = useCallback(() => { if (post.rootId) { switchToThread(serverUrl, post.rootId, false); return; } switchToChannelById(serverUrl, channel.id, channel.teamId, false); }, [channel.id, channel.teamId, post.rootId, serverUrl]); const borPost = useMemo(() => isBoRPost(post), [post]); return ( {draftType === DRAFT_TYPE_SCHEDULED && (post as ScheduledPostModel).errorCode !== '' && } {showPostPriority && post.metadata?.priority &&
} {borPost && borUserTimeLimit !== undefined && Boolean(borUserTimeLimit) && } ); }; export default DraftAndScheduledPost;