// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import PropTypes from 'prop-types'; import React, {PureComponent} from 'react'; import {intlShape} from 'react-intl'; import { DeviceEventEmitter, FlatList, StyleSheet, View, } from 'react-native'; import {Navigation} from 'react-native-navigation'; import {SafeAreaView} from 'react-native-safe-area-context'; import {dismissModal} from '@actions/navigation'; import ChannelLoader from '@components/channel_loader'; import FailedNetworkAction from '@components/failed_network_action'; import NoResults from '@components/no_results'; import DateSeparator from '@components/post_list/date_separator'; import PostSeparator from '@components/post_separator'; import StatusBar from '@components/status_bar'; import {isDateLine, getDateForDateLine} from '@mm-redux/utils/post_list'; import ChannelDisplayName from '@screens/search/channel_display_name'; import SearchResultPost from '@screens/search/search_result_post'; export default class SavedPosts extends PureComponent { static propTypes = { actions: PropTypes.shape({ clearSearch: PropTypes.func.isRequired, getFlaggedPosts: 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; } keyExtractor = (item) => item; onViewableItemsChanged = ({viewableItems}) => { if (!viewableItems.length) { return; } const viewableItemsMap = viewableItems.reduce((acc, {item, isViewable}) => { if (isViewable) { acc[item] = true; } return acc; }, {}); DeviceEventEmitter.emit('scrolled', viewableItemsMap); }; 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, }, });