// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {intlShape} from 'react-intl'; import { Keyboard, FlatList, StyleSheet, View, } from 'react-native'; import {Navigation} from 'react-native-navigation'; import {dismissModal, goToScreen, showSearchModal} from '@actions/navigation'; import ChannelLoader from '@components/channel_loader'; import DateHeader from '@components/post_list/date_header'; import FailedNetworkAction from '@components/failed_network_action'; import NoResults from '@components/no_results'; import PostSeparator from '@components/post_separator'; import StatusBar from '@components/status_bar'; import {isDateLine, getDateForDateLine} from '@mm-redux/utils/post_list'; import SearchResultPost from '@screens/search/search_result_post'; import ChannelDisplayName from '@screens/search/channel_display_name'; import mattermostManaged from 'app/mattermost_managed'; export default class FlaggedPosts extends PureComponent { static propTypes = { actions: PropTypes.shape({ clearSearch: PropTypes.func.isRequired, getPostThread: PropTypes.func.isRequired, getFlaggedPosts: PropTypes.func.isRequired, selectPost: PropTypes.func.isRequired, showPermalink: PropTypes.func.isRequired, }).isRequired, postIds: PropTypes.array, theme: PropTypes.object.isRequired, }; static defaultProps = { postIds: [], }; static contextTypes = { intl: intlShape.isRequired, }; constructor(props) { super(props); props.actions.clearSearch(); this.state = { didFail: false, isLoading: false, }; } getFlaggedPosts = async () => { const {actions} = this.props; this.setState({isLoading: true}); const {error} = await actions.getFlaggedPosts(); this.setState({ isLoading: false, didFail: Boolean(error), }); } componentDidMount() { this.navigationEventListener = Navigation.events().bindComponent(this); this.getFlaggedPosts(); } navigationButtonPressed({buttonId}) { if (buttonId === 'close-settings') { dismissModal(); } } setListRef = (ref) => { this.listRef = ref; } goToThread = (post) => { const {actions} = this.props; const channelId = post.channel_id; const rootId = (post.root_id || post.id); const screen = 'Thread'; const title = ''; const passProps = { channelId, rootId, }; Keyboard.dismiss(); actions.getPostThread(rootId); actions.selectPost(rootId); goToScreen(screen, title, passProps); }; handlePermalinkPress = (postId, teamName) => { this.props.actions.showPermalink(this.context.intl, teamName, postId); }; handleHashtagPress = async (hashtag) => { await dismissModal(); showSearchModal('#' + hashtag); }; keyExtractor = (item) => item; previewPost = (post) => { const {showPermalink} = this.props.actions; Keyboard.dismiss(); showPermalink(this.context.intl, '', post.id, false); }; renderEmpty = () => { const {formatMessage} = this.context.intl; const {theme} = this.props; return ( ); }; renderPost = ({item, index}) => { const {postIds, theme} = this.props; if (isDateLine(item)) { return ( ); } let separator; const nextPost = postIds[index + 1]; if (nextPost && !isDateLine(nextPost)) { separator = ; } return ( {separator} ); }; retry = () => { this.getFlaggedPosts(); }; render() { const {postIds, theme} = this.props; const {didFail, isLoading} = this.state; let component; if (didFail) { component = ( ); } else if (isLoading) { component = ( ); } else if (postIds.length) { component = ( ); } else { component = this.renderEmpty(); } return ( {component} ); } } const style = StyleSheet.create({ container: { flex: 1, }, });