From f522df7a2e964759f935aee4b024571a6a8223a3 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Wed, 26 Sep 2018 11:43:33 -0300 Subject: [PATCH] Refactor postlist to include Android Pie fixes and smoother scrolling (#2161) --- android/app/build.gradle | 1 + .../mattermost/rnbeta/MainApplication.java | 4 +- android/settings.gradle | 2 + .../post_body_additional_content/index.js | 2 +- .../post_body_additional_content.js | 14 +- app/components/post_list/index.js | 10 +- app/components/post_list/post_list.android.js | 125 ++++++ app/components/post_list/post_list.ios.js | 137 +++++++ .../{post_list.js => post_list_base.js} | 384 +++++------------- app/components/post_list/with_layout.js | 41 -- .../channel_post_list/channel_post_list.js | 65 +-- app/screens/permalink/permalink.js | 10 +- package-lock.json | 7 + package.json | 1 + packager/moduleNames.js | 2 +- packager/modulePaths.js | 43 +- 16 files changed, 446 insertions(+), 402 deletions(-) create mode 100644 app/components/post_list/post_list.android.js create mode 100644 app/components/post_list/post_list.ios.js rename app/components/post_list/{post_list.js => post_list_base.js} (50%) delete mode 100644 app/components/post_list/with_layout.js diff --git a/android/app/build.gradle b/android/app/build.gradle index 2d7b62f50..7aca1db54 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -212,6 +212,7 @@ dependencies { implementation project(':react-native-sentry') implementation project(':react-native-exception-handler') implementation project(':rn-fetch-blob') + implementation project(':react-native-recyclerview-list') // For animated GIF support implementation 'com.facebook.fresco:animated-base-support:1.3.0' diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java index caafee9e0..fc706d21f 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java @@ -18,6 +18,7 @@ import com.masteratul.exceptionhandler.ReactNativeExceptionHandlerPackage; import com.RNFetchBlob.RNFetchBlobPackage; import com.gantix.JailMonkey.JailMonkeyPackage; import io.tradle.react.LocalAuthPackage; +import com.github.godness84.RNRecyclerViewList.RNRecyclerviewListPackage; import com.facebook.react.ReactPackage; import com.facebook.soloader.SoLoader; @@ -75,7 +76,8 @@ public class MainApplication extends NavigationApplication implements INotificat new ReactNativeDocumentPicker(), new SharePackage(this), new KeychainPackage(), - new InitializationPackage(this) + new InitializationPackage(this), + new RNRecyclerviewListPackage() ); } diff --git a/android/settings.gradle b/android/settings.gradle index e257dd140..7b3d22475 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -39,3 +39,5 @@ include ':react-native-svg' project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') include ':react-native-linear-gradient' project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android') +include ':react-native-recyclerview-list' +project(':react-native-recyclerview-list').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-recyclerview-list/android') diff --git a/app/components/post_body_additional_content/index.js b/app/components/post_body_additional_content/index.js index 7852e92c8..ffc1a737d 100644 --- a/app/components/post_body_additional_content/index.js +++ b/app/components/post_body_additional_content/index.js @@ -44,7 +44,7 @@ function makeMapStateToProps() { return { ...getDimensions(state), - config, + googleDeveloperKey: config.GoogleDeveloperKey, link, openGraphData: getOpenGraphMetadataForUrl(state, link), showLinkPreviews: previewsEnabled && config.EnableLinkPreviews === 'true', diff --git a/app/components/post_body_additional_content/post_body_additional_content.js b/app/components/post_body_additional_content/post_body_additional_content.js index 55aa1afe6..cb31e28f0 100644 --- a/app/components/post_body_additional_content/post_body_additional_content.js +++ b/app/components/post_body_additional_content/post_body_additional_content.js @@ -37,7 +37,7 @@ export default class PostBodyAdditionalContent extends PureComponent { }).isRequired, baseTextStyle: CustomPropTypes.Style, blockStyles: PropTypes.object, - config: PropTypes.object, + googleDeveloperKey: PropTypes.string, deviceHeight: PropTypes.number.isRequired, deviceWidth: PropTypes.number.isRequired, isReplyPost: PropTypes.bool, @@ -198,7 +198,7 @@ export default class PostBodyAdditionalContent extends PureComponent { return ( @@ -225,13 +225,13 @@ export default class PostBodyAdditionalContent extends PureComponent { return ( { const postIds = preparePostIds(state, ownProps); - const measureCellLayout = postIds.indexOf(START_OF_NEW_MESSAGES) > -1 || Boolean(ownProps.highlightPostId); - - const {deviceHeight} = state.device.dimension; + let initialIndex = postIds.indexOf(START_OF_NEW_MESSAGES); + if (ownProps.highlightPostId) { + initialIndex = postIds.indexOf(ownProps.highlightPostId); + } return { deepLinkURL: state.views.root.deepLinkURL, - deviceHeight, - measureCellLayout, postIds, + initialIndex, serverURL: getCurrentUrl(state), siteURL: getConfig(state).SiteURL, theme: getTheme(state), diff --git a/app/components/post_list/post_list.android.js b/app/components/post_list/post_list.android.js new file mode 100644 index 000000000..56d25e5f3 --- /dev/null +++ b/app/components/post_list/post_list.android.js @@ -0,0 +1,125 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {StyleSheet} from 'react-native'; +import RecyclerViewList, {DataSource, RecyclerRefreshControl} from 'react-native-recyclerview-list'; + +import {ListTypes} from 'app/constants'; + +import PostListBase from './post_list_base'; + +const SCROLL_UP_MULTIPLIER = 3.5; + +export default class PostList extends PostListBase { + constructor(props) { + super(props); + + this.contentOffsetY = 0; + + this.state = { + refreshing: false, + managedConfig: {}, + dataSource: new DataSource(props.postIds, this.keyExtractor), + }; + } + + componentWillReceiveProps(nextProps) { + if (this.props.channelId !== nextProps.channelId) { + this.contentOffsetY = 0; + this.contentHeight = 0; + } + + if (nextProps.postIds !== this.props.postIds) { + this.setState({ + dataSource: new DataSource(nextProps.postIds, this.keyExtractor), + }); + } + } + + handleLayout = (layoutHeight, contentWidth, contentHeight) => { + if (layoutHeight && contentHeight < layoutHeight) { + // We still have less than 1 screen of posts loaded with more to get, so load more + this.props.onLoadMoreUp(); + } + }; + + handleScroll = (event) => { + const {layoutMeasurement, contentOffset, contentSize} = event.nativeEvent; + + if (!this.postListHeight) { + this.handleLayout(layoutMeasurement.height, contentSize.width, contentSize.height); + } + + this.postListHeight = layoutMeasurement.height; + + if (contentOffset.y >= 0) { + const definedHeight = Math.round(this.postListHeight) * SCROLL_UP_MULTIPLIER; + const pageOffsetY = contentOffset.y; + const direction = (this.contentOffsetY < pageOffsetY) ? + ListTypes.VISIBILITY_SCROLL_DOWN : + ListTypes.VISIBILITY_SCROLL_UP; + this.contentOffsetY = contentOffset.y; + + switch (direction) { + case ListTypes.VISIBILITY_SCROLL_UP: + if (Math.round(pageOffsetY) < definedHeight) { + this.props.onLoadMoreUp(); + } + break; + } + } + }; + + render() { + const { + channelId, + initialIndex, + postIds, + } = this.props; + + const otherProps = {}; + if (postIds.length) { + otherProps.ListFooterComponent = this.props.renderFooter(); + } else { + otherProps.ListEmptyComponent = this.props.renderFooter(); + } + + const hasPostsKey = postIds.length ? 'true' : 'false'; + return ( + + + + ); + } +} + +const styles = StyleSheet.create({ + flex: { + flex: 1, + }, + postListContent: { + paddingTop: 5, + }, +}); diff --git a/app/components/post_list/post_list.ios.js b/app/components/post_list/post_list.ios.js new file mode 100644 index 000000000..04992e8ba --- /dev/null +++ b/app/components/post_list/post_list.ios.js @@ -0,0 +1,137 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {FlatList, StyleSheet} from 'react-native'; + +import {ListTypes} from 'app/constants'; +import {makeExtraData} from 'app/utils/list_view'; + +import PostListBase from './post_list_base'; + +const INITIAL_BATCH_TO_RENDER = 15; +const SCROLL_UP_MULTIPLIER = 3.5; + +export default class PostList extends PostListBase { + constructor(props) { + super(props); + + this.hasDoneInitialScroll = false; + this.contentOffsetY = 0; + this.makeExtraData = makeExtraData(); + + this.state = { + managedConfig: {}, + postListHeight: 0, + }; + } + + componentWillReceiveProps(nextProps) { + if (this.props.channelId !== nextProps.channelId) { + this.contentOffsetY = 0; + this.hasDoneInitialScroll = false; + } + } + + handleContentSizeChange = (contentWidth, contentHeight) => { + this.scrollToInitialIndexIfNeeded(contentWidth, contentHeight); + + if (this.state.postListHeight && contentHeight < this.state.postListHeight && this.props.extraData) { + // We still have less than 1 screen of posts loaded with more to get, so load more + this.props.onLoadMoreUp(); + } + }; + + handleLayout = (event) => { + const {height} = event.nativeEvent.layout; + this.setState({postListHeight: height}); + }; + + handleScroll = (event) => { + const pageOffsetY = event.nativeEvent.contentOffset.y; + if (pageOffsetY > 0) { + const contentHeight = event.nativeEvent.contentSize.height; + const direction = (this.contentOffsetY < pageOffsetY) ? + ListTypes.VISIBILITY_SCROLL_UP : + ListTypes.VISIBILITY_SCROLL_DOWN; + + this.contentOffsetY = pageOffsetY; + if ( + direction === ListTypes.VISIBILITY_SCROLL_UP && + (contentHeight - pageOffsetY) < (this.state.postListHeight * SCROLL_UP_MULTIPLIER) + ) { + this.props.onLoadMoreUp(); + } + } + }; + + handleScrollToIndexFailed = () => { + requestAnimationFrame(() => { + this.hasDoneInitialScroll = false; + this.scrollToInitialIndexIfNeeded(1, 1); + }); + }; + + scrollToInitialIndexIfNeeded = (width, height) => { + if ( + width > 0 && + height > 0 && + this.props.initialIndex > 0 && + !this.hasDoneInitialScroll + ) { + this.refs.list.scrollToIndex({ + animated: false, + index: this.props.initialIndex, + viewPosition: 0.5, + }); + this.hasDoneInitialScroll = true; + } + }; + + render() { + const { + channelId, + highlightPostId, + postIds, + } = this.props; + + const refreshControl = { + refreshing: false, + }; + + if (channelId) { + refreshControl.onRefresh = this.handleRefresh; + } + + const hasPostsKey = postIds.length ? 'true' : 'false'; + + return ( + + ); + } +} + +const styles = StyleSheet.create({ + postListContent: { + paddingTop: 5, + }, +}); diff --git a/app/components/post_list/post_list.js b/app/components/post_list/post_list_base.js similarity index 50% rename from app/components/post_list/post_list.js rename to app/components/post_list/post_list_base.js index 8803d4869..47973de0d 100644 --- a/app/components/post_list/post_list.js +++ b/app/components/post_list/post_list_base.js @@ -3,34 +3,18 @@ import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; -import { - FlatList, - InteractionManager, - Platform, - StyleSheet, -} from 'react-native'; - -import EventEmitter from 'mattermost-redux/utils/event_emitter'; import Post from 'app/components/post'; import {START_OF_NEW_MESSAGES} from 'app/selectors/post_list'; import mattermostManaged from 'app/mattermost_managed'; -import {makeExtraData} from 'app/utils/list_view'; import {changeOpacity} from 'app/utils/theme'; import {matchPermalink} from 'app/utils/url'; import DateHeader from './date_header'; import {isDateLine} from './date_header/utils'; import NewMessagesDivider from './new_messages_divider'; -import withLayout from './with_layout'; -const PostWithLayout = withLayout(Post); - -const INITIAL_BATCH_TO_RENDER = 15; -const NEW_MESSAGES_HEIGHT = 28; -const DATE_HEADER_HEIGHT = 28; - -export default class PostList extends PureComponent { +export default class PostListBase extends PureComponent { static propTypes = { actions: PropTypes.shape({ loadChannelsByTeamName: PropTypes.func.isRequired, @@ -39,19 +23,14 @@ export default class PostList extends PureComponent { setDeepLinkURL: PropTypes.func.isRequired, }).isRequired, channelId: PropTypes.string, - currentUserId: PropTypes.string, deepLinkURL: PropTypes.string, - deviceHeight: PropTypes.number.isRequired, extraData: PropTypes.any, highlightPostId: PropTypes.string, - indicateNewMessages: PropTypes.bool, + initialIndex: PropTypes.number, isSearchResult: PropTypes.bool, lastViewedAt: PropTypes.number, // Used by container // eslint-disable-line no-unused-prop-types - measureCellLayout: PropTypes.bool, navigator: PropTypes.object, - onContentSizeChange: PropTypes.func, - onEndReached: PropTypes.func, - onHashtagPress: PropTypes.func, + onLoadMoreUp: PropTypes.func, onPermalinkPress: PropTypes.func, onPostPress: PropTypes.func, onRefresh: PropTypes.func, @@ -65,47 +44,20 @@ export default class PostList extends PureComponent { }; static defaultProps = { - loadMore: () => true, + onLoadMoreUp: () => true, + renderFooter: () => null, }; - constructor(props) { - super(props); - - this.newMessagesIndex = -1; - this.makeExtraData = makeExtraData(); - this.itemMeasurements = {}; - - this.state = { - managedConfig: {}, - scrollToMessage: false, - }; - } - componentWillMount() { this.listenerId = mattermostManaged.addEventListener('change', this.setManagedConfig); } componentDidMount() { - EventEmitter.on('reset_channel', this.scrollToBottomOffset); + this.mounted = true; this.setManagedConfig(); } - componentWillReceiveProps(nextProps) { - if (nextProps.postIds !== this.props.postIds) { - this.newMessagesIndex = -1; - } - if (this.props.channelId !== nextProps.channelId) { - this.itemMeasurements = {}; - this.newMessageScrolledTo = false; - this.scrollToBottomOffset(); - } - } - componentDidUpdate() { - if ((this.props.measureCellLayout || this.props.isSearchResult) && this.state.scrollToMessage) { - this.scrollListToMessageOffset(); - } - if (this.props.deepLinkURL) { this.handleDeepLink(this.props.deepLinkURL); this.props.actions.setDeepLinkURL(''); @@ -113,7 +65,7 @@ export default class PostList extends PureComponent { } componentWillUnmount() { - EventEmitter.off('reset_channel', this.scrollToBottomOffset); + this.mounted = false; mattermostManaged.removeEventListener(this.listenerId); } @@ -135,6 +87,22 @@ export default class PostList extends PureComponent { } }; + handleRefresh = () => { + const { + actions, + channelId, + onRefresh, + } = this.props; + + if (channelId) { + actions.refreshChannelWithRetry(channelId); + } + + if (onRefresh) { + onRefresh(); + } + }; + handlePermalinkPress = (postId, teamName) => { const {actions, onPermalinkPress} = this.props; @@ -146,12 +114,87 @@ export default class PostList extends PureComponent { } }; - showPermalinkView = (postId) => { + keyExtractor = (item) => { + // All keys are strings (either post IDs or special keys) + return item; + }; + + renderItem = ({item, index}) => { + if (item === START_OF_NEW_MESSAGES) { + // postIds includes a date item after the new message indicator so 2 + // needs to be added to the index for the length check to be correct. + const moreNewMessages = this.props.postIds.length === index + 2; + + return ( + + ); + } else if (isDateLine(item)) { + return ( + + ); + } + + const postId = item; + + // Remember that the list is rendered with item 0 at the bottom so the "previous" post + // comes after this one in the list + const previousPostId = index < this.props.postIds.length - 1 ? this.props.postIds[index + 1] : null; + const nextPostId = index > 0 ? this.props.postIds[index - 1] : null; + + return this.renderPost(postId, previousPostId, nextPostId); + }; + + renderPost = (postId, previousPostId, nextPostId) => { const { - actions, + highlightPostId, + isSearchResult, navigator, - onHashtagPress, + onPostPress, + renderReplies, + shouldRenderReplyButton, } = this.props; + const {managedConfig} = this.state; + + const highlight = highlightPostId === postId; + return ( + + ); + }; + + setManagedConfig = async (config) => { + let nextConfig = config; + if (!nextConfig) { + nextConfig = await mattermostManaged.getLocalConfig(); + } + + if (this.mounted) { + this.setState({ + managedConfig: nextConfig, + }); + } + }; + + showPermalinkView = (postId) => { + const {actions, navigator} = this.props; actions.selectFocusedPostId(postId); @@ -169,7 +212,6 @@ export default class PostList extends PureComponent { passProps: { isPermalink: true, onClose: this.handleClosePermalink, - onHashtagPress, onPermalinkPress: this.handlePermalinkPress, }, }; @@ -178,229 +220,5 @@ export default class PostList extends PureComponent { navigator.showModal(options); } }; - - scrollToBottomOffset = () => { - InteractionManager.runAfterInteractions(() => { - if (this.refs.list) { - this.refs.list.scrollToOffset({offset: 0, animated: false}); - } - }); - }; - - getMeasurementOffset = (index) => { - const orderedKeys = Object.keys(this.itemMeasurements).sort((a, b) => { - const numA = Number(a); - const numB = Number(b); - - if (numA > numB) { - return 1; - } else if (numA < numB) { - return -1; - } - - return 0; - }).slice(0, index); - - return orderedKeys.map((i) => this.itemMeasurements[i]).reduce((a, b) => a + b, 0); - }; - - scrollListToMessageOffset = () => { - const index = this.moreNewMessages ? this.props.postIds.length - 1 : this.newMessagesIndex; - if (index !== -1) { - let offset = this.getMeasurementOffset(index) + this.itemMeasurements[index]; - const windowHeight = this.state.postListHeight; - - if (offset < windowHeight) { - return; - } - - const upperBound = offset + windowHeight; - offset = offset - ((upperBound - offset) / 2); - - InteractionManager.runAfterInteractions(() => { - if (this.refs.list) { - if (!this.moreNewMessages) { - this.newMessageScrolledTo = true; - } - - this.refs.list.scrollToOffset({offset, animated: true}); - this.newMessagesIndex = -1; - this.moreNewMessages = false; - this.setState({ - scrollToMessage: false, - }); - } - }); - } - }; - - setManagedConfig = async (config) => { - let nextConfig = config; - if (!nextConfig) { - nextConfig = await mattermostManaged.getLocalConfig(); - } - - if (Object.keys(nextConfig).length) { - this.setState({ - managedConfig: nextConfig, - }); - } - }; - - keyExtractor = (item) => { - // All keys are strings (either post IDs or special keys) - return item; - }; - - onRefresh = () => { - const { - actions, - channelId, - onRefresh, - } = this.props; - - if (channelId) { - actions.refreshChannelWithRetry(channelId); - } - - if (onRefresh) { - onRefresh(); - } - }; - - measureItem = (index, height) => { - this.itemMeasurements[index] = height; - if (this.props.postIds.length === Object.values(this.itemMeasurements).length) { - if (this.newMessagesIndex !== -1 && !this.newMessageScrolledTo) { - this.setState({ - scrollToMessage: true, - }); - } - } - }; - - renderItem = ({item, index}) => { - if (item === START_OF_NEW_MESSAGES) { - this.newMessagesIndex = index; - - // postIds includes a date item after the new message indicator so 2 - // needs to be added to the index for the length check to be correct. - this.moreNewMessages = this.props.postIds.length === index + 2; - - this.itemMeasurements[index] = NEW_MESSAGES_HEIGHT; - return ( - - ); - } else if (isDateLine(item)) { - this.itemMeasurements[index] = DATE_HEADER_HEIGHT; - return ( - - ); - } - - const postId = item; - - // Remember that the list is rendered with item 0 at the bottom so the "previous" post - // comes after this one in the list - const previousPostId = index < this.props.postIds.length - 1 ? this.props.postIds[index + 1] : null; - const nextPostId = index > 0 ? this.props.postIds[index - 1] : null; - - return this.renderPost(postId, previousPostId, nextPostId, index); - }; - - renderPost = (postId, previousPostId, nextPostId, index) => { - const { - highlightPostId, - isSearchResult, - navigator, - onHashtagPress, - onPostPress, - renderReplies, - shouldRenderReplyButton, - } = this.props; - const {managedConfig} = this.state; - - const highlight = highlightPostId === postId; - if (highlight) { - this.newMessagesIndex = index; - } - - return ( - - ); - }; - - onLayout = (event) => { - const {height} = event.nativeEvent.layout; - this.setState({ - postListHeight: height, - }); - }; - - render() { - const { - channelId, - highlightPostId, - onEndReached, - postIds, - } = this.props; - - const refreshControl = { - refreshing: false, - }; - - if (channelId) { - refreshControl.onRefresh = this.onRefresh; - } - - return ( - - ); - } } -const styles = StyleSheet.create({ - postListContent: { - paddingTop: 5, - }, -}); diff --git a/app/components/post_list/with_layout.js b/app/components/post_list/with_layout.js deleted file mode 100644 index 5ed73e34a..000000000 --- a/app/components/post_list/with_layout.js +++ /dev/null @@ -1,41 +0,0 @@ -// 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 {View} from 'react-native'; - -import {emptyFunction} from 'app/utils/general'; - -function withLayout(WrappedComponent) { - return class WithLayoutComponent extends PureComponent { - static propTypes = { - index: PropTypes.number.isRequired, - onLayoutCalled: PropTypes.func, - shouldCallOnLayout: PropTypes.bool, - }; - - static defaultProps = { - onLayoutCalled: emptyFunction, - }; - - onLayout = (event) => { - const {height} = event.nativeEvent.layout; - const {shouldCallOnLayout} = this.props; - if (shouldCallOnLayout) { - this.props.onLayoutCalled(this.props.index, height); - } - }; - - render() { - const {index, onLayoutCalled, shouldCallOnLayout, ...otherProps} = this.props; //eslint-disable-line no-unused-vars - return ( - - - - ); - } - }; -} - -export default withLayout; diff --git a/app/screens/channel/channel_post_list/channel_post_list.js b/app/screens/channel/channel_post_list/channel_post_list.js index 774ddb659..ee67f476b 100644 --- a/app/screens/channel/channel_post_list/channel_post_list.js +++ b/app/screens/channel/channel_post_list/channel_post_list.js @@ -7,15 +7,13 @@ import { Platform, StyleSheet, View, - InteractionManager, } from 'react-native'; -import {debounce} from 'mattermost-redux/actions/helpers'; - import AnnouncementBanner from 'app/components/announcement_banner'; import PostList from 'app/components/post_list'; import PostListRetry from 'app/components/post_list_retry'; import RetryBarIndicator from 'app/components/retry_bar_indicator'; +import {ViewTypes} from 'app/constants'; import tracker from 'app/utils/time_tracker'; let ChannelIntro = null; @@ -34,7 +32,6 @@ export default class ChannelPostList extends PureComponent { channelId: PropTypes.string.isRequired, channelRefreshingFailed: PropTypes.bool, currentUserId: PropTypes.string, - deviceHeight: PropTypes.number.isRequired, lastViewedAt: PropTypes.number, loadMorePostsVisible: PropTypes.bool.isRequired, navigator: PropTypes.object, @@ -44,7 +41,7 @@ export default class ChannelPostList extends PureComponent { }; static defaultProps = { - postVisibility: 15, + postVisibility: ViewTypes.POST_VISIBILITY_CHUNK_SIZE, }; constructor(props) { @@ -52,39 +49,20 @@ export default class ChannelPostList extends PureComponent { this.state = { visiblePostIds: this.getVisiblePostIds(props), - loading: true, }; this.contentHeight = 0; } - componentDidMount() { - this.mounted = true; - InteractionManager.runAfterInteractions(() => { - if (this.mounted === true) { - this.setState({loading: false}); - } - }); - } - componentWillReceiveProps(nextProps) { const {postIds: nextPostIds} = nextProps; let visiblePostIds = this.state.visiblePostIds; - const channelSwitch = nextProps.channelId !== this.props.channelId; - if (nextPostIds !== this.props.postIds || nextProps.postVisibility !== this.props.postVisibility) { visiblePostIds = this.getVisiblePostIds(nextProps); } - this.setState({ - visiblePostIds, - loading: channelSwitch, - }, () => InteractionManager.runAfterInteractions(() => { - if (channelSwitch) { - this.setState({loading: false}); - } - })); + this.setState({visiblePostIds}); } componentDidUpdate(prevProps) { @@ -93,10 +71,6 @@ export default class ChannelPostList extends PureComponent { } } - componentWillUnmount() { - this.mounted = false; - } - getVisiblePostIds = (props) => { return props.postIds.slice(0, props.postVisibility); }; @@ -131,21 +105,15 @@ export default class ChannelPostList extends PureComponent { } }; - handleContentSizeChange = (contentWidth, contentHeight) => { - this.contentHeight = contentHeight; - }; - - loadMorePosts = debounce(() => { - if (this.props.loadMorePostsVisible) { - const {actions, channelId} = this.props; + loadMorePostsTop = async () => { + const {actions, channelId} = this.props; + if (!this.isLoadingMoreTop) { + this.isLoadingMoreTop = true; actions.increasePostVisibility(channelId).then((hasMore) => { - if (hasMore && this.contentHeight < this.props.deviceHeight) { - // We still have less than 1 screen of posts loaded with more to get, so load more - this.loadMorePosts(); - } + this.isLoadingMoreTop = !hasMore; }); } - }, 100); + }; loadPostsRetry = () => { const {actions, channelId} = this.props; @@ -165,7 +133,7 @@ export default class ChannelPostList extends PureComponent { return ( ); @@ -196,15 +164,7 @@ export default class ChannelPostList extends PureComponent { theme, } = this.props; - const { - visiblePostIds, - loading, - } = this.state; - - if (loading) { - return null; - } - + const {visiblePostIds} = this.state; let component; if (!postIds.length && channelRefreshingFailed) { @@ -219,8 +179,7 @@ export default class ChannelPostList extends PureComponent { { diff --git a/package-lock.json b/package-lock.json index b7f8b944f..0b085c33e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14382,6 +14382,13 @@ "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-1.1.1.tgz", "integrity": "sha512-t0Ujm177bagjUOSzhpmkSz+LqFW04HnY9TeZFavDCmV521fQvFz82aD+POXqWsAdsJVOK3umJYBNNqCjC3g0hQ==" }, + "react-native-recyclerview-list": { + "version": "github:enahum/react-native-recyclerview-list#a05429439c49c41c73f42bb1d8ddc86eb8af5d35", + "from": "github:enahum/react-native-recyclerview-list#a05429439c49c41c73f42bb1d8ddc86eb8af5d35", + "requires": { + "prop-types": "^15.6.0" + } + }, "react-native-safe-area": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/react-native-safe-area/-/react-native-safe-area-0.5.0.tgz", diff --git a/package.json b/package.json index 0b865f635..466730a7d 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "react-native-notifications": "github:enahum/react-native-notifications#e5bf431716613b6abf312698dde194537420f966", "react-native-passcode-status": "1.1.1", "react-native-permissions": "1.1.1", + "react-native-recyclerview-list": "enahum/react-native-recyclerview-list.git#a05429439c49c41c73f42bb1d8ddc86eb8af5d35", "react-native-safe-area": "0.5.0", "react-native-section-list-get-item-layout": "2.2.3", "react-native-sentry": "0.38.3", diff --git a/packager/moduleNames.js b/packager/moduleNames.js index 55427ec1b..f95d4a430 100644 --- a/packager/moduleNames.js +++ b/packager/moduleNames.js @@ -1,3 +1,3 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -module.exports = ['app/app.js', 'app/components/announcement_banner/announcement_banner.js', 'app/components/announcement_banner/index.js', 'app/components/app_icon.js', 'app/components/at_mention/at_mention.js', 'app/components/at_mention/index.js', 'app/components/attachment_button.js', 'app/components/autocomplete/at_mention/at_mention.js', 'app/components/autocomplete/at_mention/index.js', 'app/components/autocomplete/at_mention_item/at_mention_item.js', 'app/components/autocomplete/at_mention_item/index.js', 'app/components/autocomplete/autocomplete.js', 'app/components/autocomplete/autocomplete_divider/autocomplete_divider.js', 'app/components/autocomplete/autocomplete_divider/index.js', 'app/components/autocomplete/autocomplete_section_header.js', 'app/components/autocomplete/channel_mention/channel_mention.js', 'app/components/autocomplete/channel_mention/index.js', 'app/components/autocomplete/channel_mention_item/channel_mention_item.js', 'app/components/autocomplete/channel_mention_item/index.js', 'app/components/autocomplete/date_suggestion/date_suggestion.js', 'app/components/autocomplete/date_suggestion/index.js', 'app/components/autocomplete/emoji_suggestion/emoji_suggestion.js', 'app/components/autocomplete/emoji_suggestion/index.js', 'app/components/autocomplete/index.js', 'app/components/autocomplete/slash_suggestion/index.js', 'app/components/autocomplete/slash_suggestion/slash_suggestion.js', 'app/components/autocomplete/slash_suggestion/slash_suggestion_item.js', 'app/components/autocomplete/special_mention_item.js', 'app/components/badge.js', 'app/components/channel_icon.js', 'app/components/channel_link/channel_link.js', 'app/components/channel_link/index.js', 'app/components/channel_loader/channel_loader.js', 'app/components/channel_loader/index.js', 'app/components/combined_system_message/combined_system_message.js', 'app/components/combined_system_message/index.js', 'app/components/combined_system_message/last_users.js', 'app/components/emoji/emoji.js', 'app/components/emoji/index.js', 'app/components/error_text.js', 'app/components/file_attachment_list/file_attachment_icon.js', 'app/components/file_attachment_list/file_attachment_image.js', 'app/components/file_upload_preview/file_upload_item/file_upload_item.js', 'app/components/file_upload_preview/file_upload_item/index.js', 'app/components/file_upload_preview/file_upload_preview.js', 'app/components/file_upload_preview/file_upload_remove.js', 'app/components/file_upload_preview/file_upload_retry.js', 'app/components/file_upload_preview/index.js', 'app/components/flag_icon.js', 'app/components/formatted_date.js', 'app/components/formatted_markdown_text.js', 'app/components/formatted_text.js', 'app/components/formatted_time.js', 'app/components/layout/keyboard_layout/index.js', 'app/components/layout/keyboard_layout/keyboard_layout.js', 'app/components/loading.js', 'app/components/markdown/index.js', 'app/components/markdown/markdown.js', 'app/components/markdown/markdown_block_quote.js', 'app/components/markdown/markdown_code_block/index.js', 'app/components/markdown/markdown_code_block/markdown_code_block.js', 'app/components/markdown/markdown_image/index.js', 'app/components/markdown/markdown_image/markdown_image.js', 'app/components/markdown/markdown_link/index.js', 'app/components/markdown/markdown_link/markdown_link.js', 'app/components/markdown/markdown_list.js', 'app/components/markdown/markdown_list_item.js', 'app/components/markdown/markdown_table/index.js', 'app/components/markdown/markdown_table/markdown_table.js', 'app/components/markdown/markdown_table_cell/index.js', 'app/components/markdown/markdown_table_cell/markdown_table_cell.js', 'app/components/markdown/markdown_table_image/index.js', 'app/components/markdown/markdown_table_image/markdown_table_image.js', 'app/components/markdown/markdown_table_row/index.js', 'app/components/markdown/markdown_table_row/markdown_table_row.js', 'app/components/offline_indicator/index.js', 'app/components/offline_indicator/offline_indicator.js', 'app/components/options_context/index.js', 'app/components/options_context/options_context.android.js', 'app/components/paper_plane.js', 'app/components/post/index.js', 'app/components/post/post.js', 'app/components/post_body/index.js', 'app/components/post_body/post_body.js', 'app/components/post_header/index.js', 'app/components/post_header/post_header.js', 'app/components/post_list/date_header/date_header.js', 'app/components/post_list/date_header/index.js', 'app/components/post_list/index.js', 'app/components/post_list/new_messages_divider.js', 'app/components/post_list/post_list.js', 'app/components/post_list/with_layout.js', 'app/components/post_list_retry.js', 'app/components/post_profile_picture/index.js', 'app/components/post_profile_picture/post_profile_picture.js', 'app/components/post_textbox/components/typing/index.js', 'app/components/post_textbox/components/typing/typing.js', 'app/components/post_textbox/index.js', 'app/components/post_textbox/post_textbox.js', 'app/components/profile_picture/index.js', 'app/components/profile_picture/profile_picture.js', 'app/components/progressive_image/index.js', 'app/components/progressive_image/progressive_image.js', 'app/components/quick_text_input.js', 'app/components/remove_markdown.js', 'app/components/reply_icon.js', 'app/components/retry_bar_indicator/index.js', 'app/components/retry_bar_indicator/retry_bar_indicator.js', 'app/components/safe_area_view/index.js', 'app/components/safe_area_view/safe_area_view.android.js', 'app/components/search_bar/index.js', 'app/components/search_bar/search_bar.android.js', 'app/components/show_more_button/index.js', 'app/components/show_more_button/show_more_button.js', 'app/components/sidebars/main/channels_list/channel_item/channel_item.js', 'app/components/sidebars/main/channels_list/channel_item/index.js', 'app/components/sidebars/main/channels_list/channels_list.js', 'app/components/sidebars/main/channels_list/index.js', 'app/components/sidebars/main/channels_list/list/index.js', 'app/components/sidebars/main/channels_list/list/list.js', 'app/components/sidebars/main/channels_list/switch_teams_button/index.js', 'app/components/sidebars/main/channels_list/switch_teams_button/switch_teams_button.js', 'app/components/sidebars/main/drawer_swipper/drawer_swiper.js', 'app/components/sidebars/main/drawer_swipper/index.js', 'app/components/sidebars/main/index.js', 'app/components/sidebars/main/main_sidebar.js', 'app/components/sidebars/main/teams_list/index.js', 'app/components/sidebars/main/teams_list/teams_list.js', 'app/components/sidebars/main/teams_list/teams_list_item/index.js', 'app/components/sidebars/main/teams_list/teams_list_item/teams_list_item.js', 'app/components/sidebars/settings/drawer_item.js', 'app/components/sidebars/settings/index.js', 'app/components/sidebars/settings/settings_sidebar.js', 'app/components/sidebars/settings/status_label/index.js', 'app/components/sidebars/settings/status_label/status_label.js', 'app/components/sidebars/settings/user_info/index.js', 'app/components/sidebars/settings/user_info/user_info.js', 'app/components/start/empty_toolbar.js', 'app/components/status_bar/index.js', 'app/components/status_bar/status_bar.js', 'app/components/swiper.js', 'app/components/team_icon/index.js', 'app/components/team_icon/team_icon.js', 'app/components/user_status/index.js', 'app/components/user_status/user_status.js', 'app/components/vector_icon.js', 'app/constants/custom_prop_types.js', 'app/constants/device.js', 'app/constants/index.js', 'app/constants/list.js', 'app/constants/navigation.js', 'app/constants/permissions.js', 'app/constants/view.js', 'app/fetch_preconfig.js', 'app/initial_state.js', 'app/mattermost.js', 'app/mattermost_bucket/index.js', 'app/mattermost_managed/index.js', 'app/mattermost_managed/mattermost-managed.android.js', 'app/push_notifications/index.js', 'app/push_notifications/push_notifications.android.js', 'app/reducers/app/build.js', 'app/reducers/app/index.js', 'app/reducers/app/version.js', 'app/reducers/device/connection.js', 'app/reducers/device/dimension.js', 'app/reducers/device/index.js', 'app/reducers/device/is_tablet.js', 'app/reducers/device/orientation.js', 'app/reducers/device/status_bar.js', 'app/reducers/device/websocket.js', 'app/reducers/index.js', 'app/reducers/navigation/index.js', 'app/reducers/views/announcement.js', 'app/reducers/views/channel.js', 'app/reducers/views/client_upgrade.js', 'app/reducers/views/emoji.js', 'app/reducers/views/extension.js', 'app/reducers/views/i18n.js', 'app/reducers/views/index.js', 'app/reducers/views/login.js', 'app/reducers/views/recent_emojis.js', 'app/reducers/views/root.js', 'app/reducers/views/search.js', 'app/reducers/views/select_server.js', 'app/reducers/views/team.js', 'app/reducers/views/thread.js', 'app/reducers/views/user.js', 'app/screens/channel/channel.js', 'app/screens/channel/channel_nav_bar/channel_drawer_button.js', 'app/screens/channel/channel_nav_bar/channel_nav_bar.js', 'app/screens/channel/channel_nav_bar/channel_search_button/channel_search_button.js', 'app/screens/channel/channel_nav_bar/channel_search_button/index.js', 'app/screens/channel/channel_nav_bar/channel_title/channel_title.js', 'app/screens/channel/channel_nav_bar/channel_title/index.js', 'app/screens/channel/channel_nav_bar/index.js', 'app/screens/channel/channel_nav_bar/settings_drawer_button.js', 'app/screens/channel/channel_post_list/channel_post_list.js', 'app/screens/channel/channel_post_list/index.js', 'app/screens/channel/index.js', 'app/screens/entry/entry.js', 'app/screens/entry/index.js', 'app/screens/index.js', 'app/screens/select_server/index.js', 'app/screens/select_server/select_server.js', 'app/selectors/client_upgrade.js', 'app/store/index.js', 'app/store/middleware.js', 'app/utils/avoid_native_bridge.js', 'app/utils/client_upgrade.js', 'app/utils/general.js', 'app/utils/image_cache_manager.js', 'app/utils/network.js', 'app/utils/push_notifications.js', 'app/utils/sentry/middleware.js', 'app/utils/theme.js', 'app/utils/time_tracker.js', 'dist/assets/config.json', 'dist/assets/images/icons/audio.png', 'dist/assets/images/icons/code.png', 'dist/assets/images/icons/excel.png', 'dist/assets/images/icons/generic.png', 'dist/assets/images/icons/image.png', 'dist/assets/images/icons/patch.png', 'dist/assets/images/icons/pdf.png', 'dist/assets/images/icons/ppt.png', 'dist/assets/images/icons/video.png', 'dist/assets/images/icons/webhook.jpg', 'dist/assets/images/icons/word.png', 'dist/assets/images/profile.jpg', 'dist/assets/images/status/away.png', 'dist/assets/images/status/dnd.png', 'dist/assets/images/status/offline.png', 'dist/assets/images/status/online.png', 'dist/assets/images/thumb.png', 'index.js', 'node_modules/base-64/base64.js', 'node_modules/clamp/index.js', 'node_modules/color-convert/conversions.js', 'node_modules/color-convert/index.js', 'node_modules/color-convert/route.js', 'node_modules/color-name/index.js', 'node_modules/color/index.js', 'node_modules/commonmark-react-renderer/src/commonmark-react-renderer.js', 'node_modules/component-emitter/index.js', 'node_modules/create-react-class/factory.js', 'node_modules/create-react-class/index.js', 'node_modules/event-target-shim/lib/commons.js', 'node_modules/event-target-shim/lib/custom-event-target.js', 'node_modules/event-target-shim/lib/event-target.js', 'node_modules/fbjs/lib/emptyFunction.js', 'node_modules/fbjs/lib/invariant.js', 'node_modules/fbjs/lib/warning.js', 'node_modules/fuse.js/dist/fuse.js', 'node_modules/global/window.js', 'node_modules/hoist-non-react-statics/index.js', 'node_modules/intl-format-cache/index.js', 'node_modules/intl-format-cache/lib/memoizer.js', 'node_modules/intl-messageformat-parser/index.js', 'node_modules/intl-messageformat-parser/lib/parser.js', 'node_modules/intl-messageformat/index.js', 'node_modules/intl-messageformat/lib/core.js', 'node_modules/intl-messageformat/lib/en.js', 'node_modules/intl-messageformat/lib/es5.js', 'node_modules/intl-messageformat/lib/locales.js', 'node_modules/intl-messageformat/lib/main.js', 'node_modules/intl-relativeformat/index.js', 'node_modules/intl-relativeformat/lib/core.js', 'node_modules/intl-relativeformat/lib/en.js', 'node_modules/intl-relativeformat/lib/es5.js', 'node_modules/intl-relativeformat/lib/locales.js', 'node_modules/intl-relativeformat/lib/main.js', 'node_modules/invariant/browser.js', 'node_modules/jail-monkey/index.js', 'node_modules/json-stringify-safe/stringify.js', 'node_modules/keymirror/index.js', 'node_modules/linked-list/_source/linked-list.js', 'node_modules/linked-list/index.js', 'node_modules/lodash.clonedeep/index.js', 'node_modules/lodash.forin/index.js', 'node_modules/lodash.get/index.js', 'node_modules/lodash.isempty/index.js', 'node_modules/lodash.pickby/index.js', 'node_modules/lodash.set/index.js', 'node_modules/lodash.unset/index.js', 'node_modules/lodash/_Symbol.js', 'node_modules/lodash/_apply.js', 'node_modules/lodash/_arrayIncludes.js', 'node_modules/lodash/_arrayPush.js', 'node_modules/lodash/_assignValue.js', 'node_modules/lodash/_baseAssignValue.js', 'node_modules/lodash/_baseDifference.js', 'node_modules/lodash/_baseFindIndex.js', 'node_modules/lodash/_baseFlatten.js', 'node_modules/lodash/_baseGetTag.js', 'node_modules/lodash/_baseIsNative.js', 'node_modules/lodash/_baseIteratee.js', 'node_modules/lodash/_baseRest.js', 'node_modules/lodash/_baseSetToString.js', 'node_modules/lodash/_coreJsData.js', 'node_modules/lodash/_createAssigner.js', 'node_modules/lodash/_createFind.js', 'node_modules/lodash/_defineProperty.js', 'node_modules/lodash/_flatRest.js', 'node_modules/lodash/_freeGlobal.js', 'node_modules/lodash/_getNative.js', 'node_modules/lodash/_getPrototype.js', 'node_modules/lodash/_getValue.js', 'node_modules/lodash/_isMasked.js', 'node_modules/lodash/_isPrototype.js', 'node_modules/lodash/_objectToString.js', 'node_modules/lodash/_overArg.js', 'node_modules/lodash/_overRest.js', 'node_modules/lodash/_root.js', 'node_modules/lodash/_setToString.js', 'node_modules/lodash/_shortOut.js', 'node_modules/lodash/_toSource.js', 'node_modules/lodash/assign.js', 'node_modules/lodash/constant.js', 'node_modules/lodash/difference.js', 'node_modules/lodash/find.js', 'node_modules/lodash/findIndex.js', 'node_modules/lodash/flatten.js', 'node_modules/lodash/identity.js', 'node_modules/lodash/isArrayLike.js', 'node_modules/lodash/isArrayLikeObject.js', 'node_modules/lodash/isEqual.js', 'node_modules/lodash/isFunction.js', 'node_modules/lodash/isLength.js', 'node_modules/lodash/isObject.js', 'node_modules/lodash/isObjectLike.js', 'node_modules/lodash/isPlainObject.js', 'node_modules/lodash/isString.js', 'node_modules/lodash/lodash.js', 'node_modules/lodash/mapValues.js', 'node_modules/lodash/omit.js', 'node_modules/lodash/pick.js', 'node_modules/lodash/union.js', 'node_modules/mattermost-redux/action_types/admin.js', 'node_modules/mattermost-redux/action_types/alerts.js', 'node_modules/mattermost-redux/action_types/channels.js', 'node_modules/mattermost-redux/action_types/emojis.js', 'node_modules/mattermost-redux/action_types/errors.js', 'node_modules/mattermost-redux/action_types/files.js', 'node_modules/mattermost-redux/action_types/general.js', 'node_modules/mattermost-redux/action_types/gifs.js', 'node_modules/mattermost-redux/action_types/index.js', 'node_modules/mattermost-redux/action_types/integrations.js', 'node_modules/mattermost-redux/action_types/jobs.js', 'node_modules/mattermost-redux/action_types/posts.js', 'node_modules/mattermost-redux/action_types/preferences.js', 'node_modules/mattermost-redux/action_types/roles.js', 'node_modules/mattermost-redux/action_types/schemes.js', 'node_modules/mattermost-redux/action_types/search.js', 'node_modules/mattermost-redux/action_types/teams.js', 'node_modules/mattermost-redux/action_types/users.js', 'node_modules/mattermost-redux/client/client4.js', 'node_modules/mattermost-redux/client/fetch_etag.js', 'node_modules/mattermost-redux/client/index.js', 'node_modules/mattermost-redux/constants/alerts.js', 'node_modules/mattermost-redux/constants/emoji.js', 'node_modules/mattermost-redux/constants/files.js', 'node_modules/mattermost-redux/constants/general.js', 'node_modules/mattermost-redux/constants/index.js', 'node_modules/mattermost-redux/constants/permissions.js', 'node_modules/mattermost-redux/constants/plugins.js', 'node_modules/mattermost-redux/constants/posts.js', 'node_modules/mattermost-redux/constants/preferences.js', 'node_modules/mattermost-redux/constants/request_status.js', 'node_modules/mattermost-redux/constants/stats.js', 'node_modules/mattermost-redux/constants/teams.js', 'node_modules/mattermost-redux/constants/websocket.js', 'node_modules/mattermost-redux/node_modules/mime-db/db.json', 'node_modules/mattermost-redux/node_modules/mime-db/index.js', 'node_modules/mattermost-redux/node_modules/redux-batched-actions/lib/index.js', 'node_modules/mattermost-redux/node_modules/redux-persist/lib/constants.js', 'node_modules/mattermost-redux/node_modules/redux-thunk/lib/index.js', 'node_modules/mattermost-redux/reducers/entities/admin.js', 'node_modules/mattermost-redux/reducers/entities/alerts.js', 'node_modules/mattermost-redux/reducers/entities/channels.js', 'node_modules/mattermost-redux/reducers/entities/emojis.js', 'node_modules/mattermost-redux/reducers/entities/files.js', 'node_modules/mattermost-redux/reducers/entities/general.js', 'node_modules/mattermost-redux/reducers/entities/gifs.js', 'node_modules/mattermost-redux/reducers/entities/index.js', 'node_modules/mattermost-redux/reducers/entities/integrations.js', 'node_modules/mattermost-redux/reducers/entities/jobs.js', 'node_modules/mattermost-redux/reducers/entities/posts.js', 'node_modules/mattermost-redux/reducers/entities/preferences.js', 'node_modules/mattermost-redux/reducers/entities/roles.js', 'node_modules/mattermost-redux/reducers/entities/schemes.js', 'node_modules/mattermost-redux/reducers/entities/search.js', 'node_modules/mattermost-redux/reducers/entities/teams.js', 'node_modules/mattermost-redux/reducers/entities/typing.js', 'node_modules/mattermost-redux/reducers/entities/users.js', 'node_modules/mattermost-redux/reducers/errors/index.js', 'node_modules/mattermost-redux/reducers/index.js', 'node_modules/mattermost-redux/reducers/requests/admin.js', 'node_modules/mattermost-redux/reducers/requests/channels.js', 'node_modules/mattermost-redux/reducers/requests/emojis.js', 'node_modules/mattermost-redux/reducers/requests/files.js', 'node_modules/mattermost-redux/reducers/requests/general.js', 'node_modules/mattermost-redux/reducers/requests/helpers.js', 'node_modules/mattermost-redux/reducers/requests/index.js', 'node_modules/mattermost-redux/reducers/requests/integrations.js', 'node_modules/mattermost-redux/reducers/requests/jobs.js', 'node_modules/mattermost-redux/reducers/requests/posts.js', 'node_modules/mattermost-redux/reducers/requests/preferences.js', 'node_modules/mattermost-redux/reducers/requests/roles.js', 'node_modules/mattermost-redux/reducers/requests/schemes.js', 'node_modules/mattermost-redux/reducers/requests/search.js', 'node_modules/mattermost-redux/reducers/requests/teams.js', 'node_modules/mattermost-redux/reducers/requests/users.js', 'node_modules/mattermost-redux/selectors/entities/emojis.js', 'node_modules/mattermost-redux/selectors/entities/general.js', 'node_modules/mattermost-redux/selectors/entities/integrations.js', 'node_modules/mattermost-redux/selectors/entities/teams.js', 'node_modules/mattermost-redux/store/configureStore.dev.js', 'node_modules/mattermost-redux/store/helpers.js', 'node_modules/mattermost-redux/store/index.js', 'node_modules/mattermost-redux/store/initial_state.js', 'node_modules/mattermost-redux/store/reducer_registry.js', 'node_modules/mattermost-redux/utils/deep_freeze.js', 'node_modules/mattermost-redux/utils/event_emitter.js', 'node_modules/mattermost-redux/utils/file_utils.js', 'node_modules/mattermost-redux/utils/helpers.js', 'node_modules/mattermost-redux/utils/key_mirror.js', 'node_modules/mattermost-redux/utils/theme_utils.js', 'node_modules/object-assign/index.js', 'node_modules/pascalcase/index.js', 'node_modules/path-to-regexp/index.js', 'node_modules/path-to-regexp/node_modules/isarray/index.js', 'node_modules/pegjs/lib/compiler/asts.js', 'node_modules/pegjs/lib/compiler/index.js', 'node_modules/pegjs/lib/compiler/js.js', 'node_modules/pegjs/lib/compiler/opcodes.js', 'node_modules/pegjs/lib/compiler/passes/generate-bytecode.js', 'node_modules/pegjs/lib/compiler/passes/generate-js.js', 'node_modules/pegjs/lib/compiler/passes/remove-proxy-rules.js', 'node_modules/pegjs/lib/compiler/passes/report-duplicate-labels.js', 'node_modules/pegjs/lib/compiler/passes/report-duplicate-rules.js', 'node_modules/pegjs/lib/compiler/passes/report-infinite-recursion.js', 'node_modules/pegjs/lib/compiler/passes/report-infinite-repetition.js', 'node_modules/pegjs/lib/compiler/passes/report-undefined-rules.js', 'node_modules/pegjs/lib/compiler/visitor.js', 'node_modules/pegjs/lib/grammar-error.js', 'node_modules/pegjs/lib/parser.js', 'node_modules/pegjs/lib/peg.js', 'node_modules/pegjs/lib/utils/arrays.js', 'node_modules/pegjs/lib/utils/classes.js', 'node_modules/pegjs/lib/utils/objects.js', 'node_modules/promise/setimmediate/core.js', 'node_modules/promise/setimmediate/done.js', 'node_modules/promise/setimmediate/es6-extensions.js', 'node_modules/promise/setimmediate/rejection-tracking.js', 'node_modules/prop-types/checkPropTypes.js', 'node_modules/prop-types/factoryWithTypeCheckers.js', 'node_modules/prop-types/index.js', 'node_modules/prop-types/lib/ReactPropTypesSecret.js', 'node_modules/querystring/decode.js', 'node_modules/querystring/encode.js', 'node_modules/querystring/index.js', 'node_modules/querystringify/index.js', 'node_modules/react-deep-force-update/lib/index.js', 'node_modules/react-devtools-core/build/backend.js', 'node_modules/react-intl/lib/index.js', 'node_modules/react-intl/locale-data/index.js', 'node_modules/react-intl/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js', 'node_modules/react-lifecycles-compat/react-lifecycles-compat.cjs.js', 'node_modules/react-native-bottom-sheet/index.js', 'node_modules/react-native-button/Button.js', 'node_modules/react-native-button/coalesceNonElementChildren.js', 'node_modules/react-native-device-info/deviceinfo.js', 'node_modules/react-native-drawer-layout/dist/DrawerLayout.js', 'node_modules/react-native-image-picker/index.js', 'node_modules/react-native-linear-gradient/index.android.js', 'node_modules/react-native-linear-gradient/nativeLinearGradient.js', 'node_modules/react-native-local-auth/LocalAuth.android.js', 'node_modules/react-native-local-auth/index.js', 'node_modules/react-native-navigation/src/NativeEventsReceiver.js', 'node_modules/react-native-navigation/src/Navigation.js', 'node_modules/react-native-navigation/src/PropRegistry.js', 'node_modules/react-native-navigation/src/Screen.js', 'node_modules/react-native-navigation/src/ScreenVisibilityListener.js', 'node_modules/react-native-navigation/src/deprecated/indexDeprecated.android.js', 'node_modules/react-native-navigation/src/deprecated/platformSpecificDeprecated.android.js', 'node_modules/react-native-navigation/src/index.js', 'node_modules/react-native-navigation/src/platformSpecific.android.js', 'node_modules/react-native-navigation/src/views/sharedElementTransition.android.js', 'node_modules/react-native-notifications/index.android.js', 'node_modules/react-native-notifications/notification.android.js', 'node_modules/react-native-permissions/index.js', 'node_modules/react-native-permissions/lib/permissions.android.js', 'node_modules/react-native-svg/elements/Circle.js', 'node_modules/react-native-svg/elements/ClipPath.js', 'node_modules/react-native-svg/elements/Defs.js', 'node_modules/react-native-svg/elements/Ellipse.js', 'node_modules/react-native-svg/elements/G.js', 'node_modules/react-native-svg/elements/Image.js', 'node_modules/react-native-svg/elements/Line.js', 'node_modules/react-native-svg/elements/LinearGradient.js', 'node_modules/react-native-svg/elements/Path.js', 'node_modules/react-native-svg/elements/Polygon.js', 'node_modules/react-native-svg/elements/Polyline.js', 'node_modules/react-native-svg/elements/RadialGradient.js', 'node_modules/react-native-svg/elements/Rect.js', 'node_modules/react-native-svg/elements/Shape.js', 'node_modules/react-native-svg/elements/Stop.js', 'node_modules/react-native-svg/elements/Svg.js', 'node_modules/react-native-svg/elements/Symbol.js', 'node_modules/react-native-svg/elements/TSpan.js', 'node_modules/react-native-svg/elements/Text.js', 'node_modules/react-native-svg/elements/TextPath.js', 'node_modules/react-native-svg/elements/Use.js', 'node_modules/react-native-svg/index.js', 'node_modules/react-native-svg/lib/Matrix2D.js', 'node_modules/react-native-svg/lib/PATTERN_UNITS.js', 'node_modules/react-native-svg/lib/SvgTouchableMixin.js', 'node_modules/react-native-svg/lib/attributes.js', 'node_modules/react-native-svg/lib/extract/extractBrush.js', 'node_modules/react-native-svg/lib/extract/extractClipPath.js', 'node_modules/react-native-svg/lib/extract/extractFill.js', 'node_modules/react-native-svg/lib/extract/extractGradient.js', 'node_modules/react-native-svg/lib/extract/extractLengthList.js', 'node_modules/react-native-svg/lib/extract/extractOpacity.js', 'node_modules/react-native-svg/lib/extract/extractPolyPoints.js', 'node_modules/react-native-svg/lib/extract/extractProps.js', 'node_modules/react-native-svg/lib/extract/extractResponder.js', 'node_modules/react-native-svg/lib/extract/extractStroke.js', 'node_modules/react-native-svg/lib/extract/extractText.js', 'node_modules/react-native-svg/lib/extract/extractTransform.js', 'node_modules/react-native-svg/lib/extract/extractViewBox.js', 'node_modules/react-native-svg/lib/extract/patternReg.js', 'node_modules/react-native-svg/lib/percentToFloat.js', 'node_modules/react-native-svg/lib/props.js', 'node_modules/react-native-vector-icons/FontAwesome.js', 'node_modules/react-native-vector-icons/Foundation.js', 'node_modules/react-native-vector-icons/Ionicons.js', 'node_modules/react-native-vector-icons/MaterialIcons.js', 'node_modules/react-native-vector-icons/glyphmaps/FontAwesome.json', 'node_modules/react-native-vector-icons/glyphmaps/Foundation.json', 'node_modules/react-native-vector-icons/glyphmaps/Ionicons.json', 'node_modules/react-native-vector-icons/glyphmaps/MaterialIcons.json', 'node_modules/react-native-vector-icons/lib/create-icon-set.js', 'node_modules/react-native-vector-icons/lib/ensure-native-module-available.js', 'node_modules/react-native-vector-icons/lib/icon-button.js', 'node_modules/react-native-vector-icons/lib/react-native.js', 'node_modules/react-native-vector-icons/lib/tab-bar-item-ios.js', 'node_modules/react-native-vector-icons/lib/toolbar-android.js', 'node_modules/react-native-video/TextTrackType.js', 'node_modules/react-native-video/Video.js', 'node_modules/react-native-video/VideoResizeMode.js', 'node_modules/react-native/Libraries/Animated/src/Animated.js', 'node_modules/react-native/Libraries/Animated/src/AnimatedEvent.js', 'node_modules/react-native/Libraries/Animated/src/AnimatedImplementation.js', 'node_modules/react-native/Libraries/Animated/src/Easing.js', 'node_modules/react-native/Libraries/Animated/src/createAnimatedComponent.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedInterpolation.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedNode.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedProps.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedValue.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedValueXY.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedWithChildren.js', 'node_modules/react-native/Libraries/AppState/AppState.js', 'node_modules/react-native/Libraries/BatchedBridge/BatchedBridge.js', 'node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js', 'node_modules/react-native/Libraries/BatchedBridge/NativeModules.js', 'node_modules/react-native/Libraries/Color/normalizeColor.js', 'node_modules/react-native/Libraries/Components/AppleTV/TVViewPropTypes.js', 'node_modules/react-native/Libraries/Components/ScrollResponder.js', 'node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js', 'node_modules/react-native/Libraries/Components/Subscribable.js', 'node_modules/react-native/Libraries/Components/TextInput/TextInputState.js', 'node_modules/react-native/Libraries/Components/Touchable/Touchable.js', 'node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.js', 'node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.js', 'node_modules/react-native/Libraries/Components/View/PlatformViewPropTypes.js', 'node_modules/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js', 'node_modules/react-native/Libraries/Components/View/ReactNativeViewAttributes.js', 'node_modules/react-native/Libraries/Components/View/ShadowPropTypesIOS.js', 'node_modules/react-native/Libraries/Components/View/View.js', 'node_modules/react-native/Libraries/Components/View/ViewAccessibility.js', 'node_modules/react-native/Libraries/Components/View/ViewNativeComponent.js', 'node_modules/react-native/Libraries/Components/View/ViewPropTypes.js', 'node_modules/react-native/Libraries/Components/View/ViewStylePropTypes.js', 'node_modules/react-native/Libraries/Core/Devtools/getDevServer.js', 'node_modules/react-native/Libraries/Core/Devtools/parseErrorStack.js', 'node_modules/react-native/Libraries/Core/Devtools/setupDevtools.js', 'node_modules/react-native/Libraries/Core/ExceptionsManager.js', 'node_modules/react-native/Libraries/Core/InitializeCore.js', 'node_modules/react-native/Libraries/Core/ReactNativeVersion.js', 'node_modules/react-native/Libraries/Core/ReactNativeVersionCheck.js', 'node_modules/react-native/Libraries/Core/Timers/JSTimers.js', 'node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.js', 'node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.js', 'node_modules/react-native/Libraries/EventEmitter/RCTEventEmitter.js', 'node_modules/react-native/Libraries/Image/AssetRegistry.js', 'node_modules/react-native/Libraries/Image/AssetSourceResolver.js', 'node_modules/react-native/Libraries/Image/Image.android.js', 'node_modules/react-native/Libraries/Image/ImageBackground.js', 'node_modules/react-native/Libraries/Image/ImageResizeMode.js', 'node_modules/react-native/Libraries/Image/ImageSourcePropType.js', 'node_modules/react-native/Libraries/Image/ImageStylePropTypes.js', 'node_modules/react-native/Libraries/Image/resolveAssetSource.js', 'node_modules/react-native/Libraries/Interaction/PanResponder.js', 'node_modules/react-native/Libraries/JSInspector/InspectorAgent.js', 'node_modules/react-native/Libraries/JSInspector/JSInspector.js', 'node_modules/react-native/Libraries/JSInspector/NetworkAgent.js', 'node_modules/react-native/Libraries/Linking/Linking.js', 'node_modules/react-native/Libraries/Lists/FlatList.js', 'node_modules/react-native/Libraries/Lists/SectionList.js', 'node_modules/react-native/Libraries/Lists/VirtualizedList.js', 'node_modules/react-native/Libraries/Lists/VirtualizedSectionList.js', 'node_modules/react-native/Libraries/Network/NetInfo.js', 'node_modules/react-native/Libraries/Performance/Systrace.js', 'node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js', 'node_modules/react-native/Libraries/Promise.js', 'node_modules/react-native/Libraries/ReactNative/AppRegistry.js', 'node_modules/react-native/Libraries/ReactNative/I18nManager.js', 'node_modules/react-native/Libraries/ReactNative/UIManager.js', 'node_modules/react-native/Libraries/ReactNative/requireNativeComponent.js', 'node_modules/react-native/Libraries/Renderer/oss/ReactNativeRenderer-dev.js', 'node_modules/react-native/Libraries/Renderer/shims/NativeMethodsMixin.js', 'node_modules/react-native/Libraries/Renderer/shims/ReactNative.js', 'node_modules/react-native/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js', 'node_modules/react-native/Libraries/Renderer/shims/createReactNativeComponentClass.js', 'node_modules/react-native/Libraries/Storage/AsyncStorage.js', 'node_modules/react-native/Libraries/StyleSheet/ColorPropType.js', 'node_modules/react-native/Libraries/StyleSheet/EdgeInsetsPropType.js', 'node_modules/react-native/Libraries/StyleSheet/LayoutPropTypes.js', 'node_modules/react-native/Libraries/StyleSheet/PointPropType.js', 'node_modules/react-native/Libraries/StyleSheet/StyleSheet.js', 'node_modules/react-native/Libraries/StyleSheet/StyleSheetPropType.js', 'node_modules/react-native/Libraries/StyleSheet/StyleSheetValidation.js', 'node_modules/react-native/Libraries/StyleSheet/TransformPropTypes.js', 'node_modules/react-native/Libraries/StyleSheet/flattenStyle.js', 'node_modules/react-native/Libraries/StyleSheet/processColor.js', 'node_modules/react-native/Libraries/StyleSheet/processTransform.js', 'node_modules/react-native/Libraries/Text/Text.js', 'node_modules/react-native/Libraries/Text/TextPropTypes.js', 'node_modules/react-native/Libraries/Text/TextStylePropTypes.js', 'node_modules/react-native/Libraries/Utilities/BackHandler.android.js', 'node_modules/react-native/Libraries/Utilities/DeviceInfo.js', 'node_modules/react-native/Libraries/Utilities/Dimensions.js', 'node_modules/react-native/Libraries/Utilities/HMRClient.js', 'node_modules/react-native/Libraries/Utilities/PixelRatio.js', 'node_modules/react-native/Libraries/Utilities/Platform.android.js', 'node_modules/react-native/Libraries/Utilities/PolyfillFunctions.js', 'node_modules/react-native/Libraries/Utilities/createStrictShapeTypeChecker.js', 'node_modules/react-native/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev.js', 'node_modules/react-native/Libraries/Utilities/defineLazyObjectProperty.js', 'node_modules/react-native/Libraries/Utilities/deprecatedPropType.js', 'node_modules/react-native/Libraries/Utilities/differ/deepDiffer.js', 'node_modules/react-native/Libraries/Utilities/differ/sizesDiffer.js', 'node_modules/react-native/Libraries/Utilities/logError.js', 'node_modules/react-native/Libraries/WebSocket/WebSocket.js', 'node_modules/react-native/Libraries/react-native/React.js', 'node_modules/react-native/Libraries/react-native/react-native-implementation.js', 'node_modules/react-native/Libraries/vendor/core/ErrorUtils.js', 'node_modules/react-native/Libraries/vendor/core/Map.js', 'node_modules/react-native/Libraries/vendor/core/_shouldPolyfillES6Collection.js', 'node_modules/react-native/Libraries/vendor/emitter/EmitterSubscription.js', 'node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js', 'node_modules/react-native/Libraries/vendor/emitter/EventSubscription.js', 'node_modules/react-native/Libraries/vendor/emitter/EventSubscriptionVendor.js', 'node_modules/react-native/node_modules/fbjs/lib/Promise.native.js', 'node_modules/react-native/node_modules/fbjs/lib/invariant.js', 'node_modules/react-native/node_modules/fbjs/lib/keyMirror.js', 'node_modules/react-native/node_modules/regenerator-runtime/runtime.js', 'node_modules/react-navigation-stack/dist/index.js', 'node_modules/react-navigation-stack/dist/navigators/createContainedStackNavigator.js', 'node_modules/react-navigation-stack/dist/navigators/createStackNavigator.js', 'node_modules/react-navigation-stack/dist/utils/ReactNativeFeatures.js', 'node_modules/react-navigation-stack/dist/utils/getSceneIndicesForInterpolationInputRange.js', 'node_modules/react-navigation-stack/dist/utils/invariant.js', 'node_modules/react-navigation-stack/dist/utils/shallowEqual.js', 'node_modules/react-navigation-stack/dist/views/Header/Header.js', 'node_modules/react-navigation-stack/dist/views/Header/HeaderBackButton.js', 'node_modules/react-navigation-stack/dist/views/Header/HeaderStyleInterpolator.js', 'node_modules/react-navigation-stack/dist/views/Header/HeaderTitle.js', 'node_modules/react-navigation-stack/dist/views/Header/ModularHeaderBackButton.js', 'node_modules/react-navigation-stack/dist/views/ScenesReducer.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackView.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewCard.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewLayout.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewStyleInterpolator.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewTransitionConfigs.js', 'node_modules/react-navigation-stack/dist/views/StackView/createPointerEventsContainer.js', 'node_modules/react-navigation-stack/dist/views/TouchableItem.js', 'node_modules/react-navigation-stack/dist/views/Transitioner.js', 'node_modules/react-navigation-stack/dist/views/assets/back-icon.png', 'node_modules/react-navigation/src/NavigationActions.js', 'node_modules/react-navigation/src/StateUtils.js', 'node_modules/react-navigation/src/createNavigationContainer.js', 'node_modules/react-navigation/src/getChildEventSubscriber.js', 'node_modules/react-navigation/src/getChildNavigation.js', 'node_modules/react-navigation/src/getChildRouter.js', 'node_modules/react-navigation/src/getNavigation.js', 'node_modules/react-navigation/src/navigators/createKeyboardAwareNavigator.js', 'node_modules/react-navigation/src/navigators/createNavigator.js', 'node_modules/react-navigation/src/react-navigation.js', 'node_modules/react-navigation/src/routers/StackActions.js', 'node_modules/react-navigation/src/routers/StackRouter.js', 'node_modules/react-navigation/src/routers/createConfigGetter.js', 'node_modules/react-navigation/src/routers/getNavigationActionCreators.js', 'node_modules/react-navigation/src/routers/getScreenForRouteName.js', 'node_modules/react-navigation/src/routers/pathUtils.js', 'node_modules/react-navigation/src/routers/validateRouteConfigMap.js', 'node_modules/react-navigation/src/routers/validateScreenOptions.js', 'node_modules/react-navigation/src/utils/docsUrl.js', 'node_modules/react-navigation/src/utils/invariant.js', 'node_modules/react-navigation/src/views/TouchableItem.js', 'node_modules/react-navigation/src/views/withOrientation.js', 'node_modules/react-proxy/modules/bindAutoBindMethods.js', 'node_modules/react-proxy/modules/createClassProxy.js', 'node_modules/react-proxy/modules/createPrototypeProxy.js', 'node_modules/react-proxy/modules/deleteUnknownAutoBindMethods.js', 'node_modules/react-proxy/modules/index.js', 'node_modules/react-proxy/modules/supportsProtoAssignment.js', 'node_modules/react-redux/lib/components/Provider.js', 'node_modules/react-redux/lib/components/connectAdvanced.js', 'node_modules/react-redux/lib/connect/connect.js', 'node_modules/react-redux/lib/connect/mapDispatchToProps.js', 'node_modules/react-redux/lib/connect/mapStateToProps.js', 'node_modules/react-redux/lib/connect/mergeProps.js', 'node_modules/react-redux/lib/connect/selectorFactory.js', 'node_modules/react-redux/lib/connect/verifySubselectors.js', 'node_modules/react-redux/lib/connect/wrapMapToProps.js', 'node_modules/react-redux/lib/index.js', 'node_modules/react-redux/lib/utils/PropTypes.js', 'node_modules/react-redux/lib/utils/Subscription.js', 'node_modules/react-redux/lib/utils/shallowEqual.js', 'node_modules/react-redux/lib/utils/verifyPlainObject.js', 'node_modules/react-redux/lib/utils/warning.js', 'node_modules/react-timer-mixin/TimerMixin.js', 'node_modules/react-transform-hmr/lib/index.js', 'node_modules/react/cjs/react.development.js', 'node_modules/react/index.js', 'node_modules/redux-action-buffer/index.js', 'node_modules/redux-devtools-instrument/lib/instrument.js', 'node_modules/redux-offline/lib/actions.js', 'node_modules/redux-offline/lib/config.js', 'node_modules/redux-offline/lib/constants.js', 'node_modules/redux-offline/lib/defaults/batch.js', 'node_modules/redux-offline/lib/defaults/detectNetwork.native.js', 'node_modules/redux-offline/lib/defaults/discard.js', 'node_modules/redux-offline/lib/defaults/effect.js', 'node_modules/redux-offline/lib/defaults/index.js', 'node_modules/redux-offline/lib/defaults/persist.native.js', 'node_modules/redux-offline/lib/defaults/retry.js', 'node_modules/redux-offline/lib/index.js', 'node_modules/redux-offline/lib/middleware.js', 'node_modules/redux-offline/lib/updater.js', 'node_modules/redux-persist-transform-filter/dist/index.js', 'node_modules/redux-persist/lib/autoRehydrate.js', 'node_modules/redux-persist/lib/constants.js', 'node_modules/redux-persist/lib/createPersistor.js', 'node_modules/redux-persist/lib/createTransform.js', 'node_modules/redux-persist/lib/defaults/asyncLocalStorage.js', 'node_modules/redux-persist/lib/getStoredState.js', 'node_modules/redux-persist/lib/index.js', 'node_modules/redux-persist/lib/persistStore.js', 'node_modules/redux-persist/lib/purgeStoredState.js', 'node_modules/redux-persist/lib/utils/isStatePlainEnough.js', 'node_modules/redux-persist/lib/utils/setImmediate.js', 'node_modules/redux/lib/redux.js', 'node_modules/remote-redux-devtools/lib/configureStore.js', 'node_modules/remote-redux-devtools/lib/devTools.js', 'node_modules/remote-redux-devtools/lib/index.js', 'node_modules/remotedev-utils/lib/catchErrors.js', 'node_modules/remotedev-utils/lib/filters.js', 'node_modules/reselect/lib/index.js', 'node_modules/rn-fetch-blob/android.js', 'node_modules/rn-fetch-blob/cba/index.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobFile.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobReadStream.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobSession.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobWriteStream.js', 'node_modules/rn-fetch-blob/fs.js', 'node_modules/rn-fetch-blob/index.js', 'node_modules/rn-fetch-blob/ios.js', 'node_modules/rn-fetch-blob/json-stream.js', 'node_modules/rn-fetch-blob/lib/oboe-browser.min.js', 'node_modules/rn-fetch-blob/polyfill/Blob.js', 'node_modules/rn-fetch-blob/polyfill/Event.js', 'node_modules/rn-fetch-blob/polyfill/EventTarget.js', 'node_modules/rn-fetch-blob/polyfill/Fetch.js', 'node_modules/rn-fetch-blob/polyfill/File.js', 'node_modules/rn-fetch-blob/polyfill/FileReader.js', 'node_modules/rn-fetch-blob/polyfill/ProgressEvent.js', 'node_modules/rn-fetch-blob/polyfill/XMLHttpRequest.js', 'node_modules/rn-fetch-blob/polyfill/XMLHttpRequestEventTarget.js', 'node_modules/rn-fetch-blob/polyfill/index.js', 'node_modules/rn-fetch-blob/utils/log.js', 'node_modules/rn-fetch-blob/utils/unicode.js', 'node_modules/rn-fetch-blob/utils/uri.js', 'node_modules/rn-fetch-blob/utils/uuid.js', 'node_modules/rn-host-detect/index.js', 'node_modules/rn-placeholder/index.js', 'node_modules/rn-placeholder/src/animation/animations.js', 'node_modules/rn-placeholder/src/animation/fade.js', 'node_modules/rn-placeholder/src/animation/shine.js', 'node_modules/rn-placeholder/src/box/box.style.js', 'node_modules/rn-placeholder/src/imageContent/imageContent.js', 'node_modules/rn-placeholder/src/line/line.style.js', 'node_modules/rn-placeholder/src/media/media.style.js', 'node_modules/rn-placeholder/src/multiWords/multiWords.js', 'node_modules/rn-placeholder/src/paragraph/paragraph.js', 'node_modules/rn-placeholder/src/placeholder.js', 'node_modules/rn-placeholder/src/placeholderContainer.js', 'node_modules/rn-placeholder/src/placeholderStylify.js', 'node_modules/sc-formatter/index.js', 'node_modules/schedule/cjs/schedule-tracking.development.js', 'node_modules/schedule/tracking.js', 'node_modules/semver/semver.js', 'node_modules/shallow-equals/index.js', 'node_modules/socketcluster-client/index.js', 'node_modules/socketcluster-client/lib/auth.js', 'node_modules/socketcluster-client/lib/factory.js', 'node_modules/socketcluster-client/lib/scclientsocket.js', 'node_modules/socketcluster-client/lib/sctransport.js', 'node_modules/socketcluster-client/node_modules/sc-errors/decycle.js', 'node_modules/socketcluster-client/node_modules/sc-errors/index.js', 'node_modules/stacktrace-parser/index.js', 'node_modules/stacktrace-parser/lib/stacktrace-parser.js', 'node_modules/symbol-observable/lib/index.js', 'node_modules/symbol-observable/lib/ponyfill.js', 'node_modules/tinycolor2/tinycolor.js', 'node_modules/url-parse/index.js', 'share_extension/android/extension.js', 'share_extension/android/extension_channels/extension_channel_item.js', 'share_extension/android/extension_channels/extension_channels.js', 'share_extension/android/extension_channels/index.js', 'share_extension/android/extension_post/channel_button/channel_button.js', 'share_extension/android/extension_post/channel_button/index.js', 'share_extension/android/extension_post/extension_post.js', 'share_extension/android/extension_post/index.js', 'share_extension/android/extension_post/team_button/index.js', 'share_extension/android/extension_post/team_button/team_button.js', 'share_extension/android/extension_teams/extension_teams.js', 'share_extension/android/extension_teams/index.js', 'share_extension/android/extension_teams/team_item/index.js', 'share_extension/android/extension_teams/team_item/team_item.js', 'share_extension/android/index.js', 'share_extension/android/navigation.js', 'share_extension/common/icons/channel_type.js', 'share_extension/common/icons/excel.js', 'share_extension/common/icons/generic.js', 'share_extension/common/icons/index.js', 'share_extension/common/icons/pdf.js', 'share_extension/common/icons/ppt.js', 'share_extension/common/icons/zip.js']; +module.exports = ['app/app.js', 'app/components/announcement_banner/announcement_banner.js', 'app/components/announcement_banner/index.js', 'app/components/app_icon.js', 'app/components/at_mention/at_mention.js', 'app/components/at_mention/index.js', 'app/components/attachment_button.js', 'app/components/autocomplete/at_mention/at_mention.js', 'app/components/autocomplete/at_mention/index.js', 'app/components/autocomplete/at_mention_item/at_mention_item.js', 'app/components/autocomplete/at_mention_item/index.js', 'app/components/autocomplete/autocomplete.js', 'app/components/autocomplete/autocomplete_divider/autocomplete_divider.js', 'app/components/autocomplete/autocomplete_divider/index.js', 'app/components/autocomplete/autocomplete_section_header.js', 'app/components/autocomplete/channel_mention/channel_mention.js', 'app/components/autocomplete/channel_mention/index.js', 'app/components/autocomplete/channel_mention_item/channel_mention_item.js', 'app/components/autocomplete/channel_mention_item/index.js', 'app/components/autocomplete/date_suggestion/date_suggestion.js', 'app/components/autocomplete/date_suggestion/index.js', 'app/components/autocomplete/emoji_suggestion/emoji_suggestion.js', 'app/components/autocomplete/emoji_suggestion/index.js', 'app/components/autocomplete/index.js', 'app/components/autocomplete/slash_suggestion/index.js', 'app/components/autocomplete/slash_suggestion/slash_suggestion.js', 'app/components/autocomplete/slash_suggestion/slash_suggestion_item.js', 'app/components/autocomplete/special_mention_item.js', 'app/components/badge.js', 'app/components/channel_icon.js', 'app/components/channel_link/channel_link.js', 'app/components/channel_link/index.js', 'app/components/channel_loader/channel_loader.js', 'app/components/channel_loader/index.js', 'app/components/combined_system_message/combined_system_message.js', 'app/components/combined_system_message/index.js', 'app/components/combined_system_message/last_users.js', 'app/components/emoji/emoji.js', 'app/components/emoji/index.js', 'app/components/error_text.js', 'app/components/file_attachment_list/file_attachment_icon.js', 'app/components/file_attachment_list/file_attachment_image.js', 'app/components/file_upload_preview/file_upload_item/file_upload_item.js', 'app/components/file_upload_preview/file_upload_item/index.js', 'app/components/file_upload_preview/file_upload_preview.js', 'app/components/file_upload_preview/file_upload_remove.js', 'app/components/file_upload_preview/file_upload_retry.js', 'app/components/file_upload_preview/index.js', 'app/components/flag_icon.js', 'app/components/formatted_date.js', 'app/components/formatted_markdown_text.js', 'app/components/formatted_text.js', 'app/components/formatted_time.js', 'app/components/layout/keyboard_layout/index.js', 'app/components/layout/keyboard_layout/keyboard_layout.js', 'app/components/loading.js', 'app/components/markdown/hashtag.js', 'app/components/markdown/index.js', 'app/components/markdown/markdown.js', 'app/components/markdown/markdown_block_quote.js', 'app/components/markdown/markdown_code_block/index.js', 'app/components/markdown/markdown_code_block/markdown_code_block.js', 'app/components/markdown/markdown_image/index.js', 'app/components/markdown/markdown_image/markdown_image.js', 'app/components/markdown/markdown_link/index.js', 'app/components/markdown/markdown_link/markdown_link.js', 'app/components/markdown/markdown_list.js', 'app/components/markdown/markdown_list_item.js', 'app/components/markdown/markdown_table/index.js', 'app/components/markdown/markdown_table/markdown_table.js', 'app/components/markdown/markdown_table_cell/index.js', 'app/components/markdown/markdown_table_cell/markdown_table_cell.js', 'app/components/markdown/markdown_table_image/index.js', 'app/components/markdown/markdown_table_image/markdown_table_image.js', 'app/components/markdown/markdown_table_row/index.js', 'app/components/markdown/markdown_table_row/markdown_table_row.js', 'app/components/offline_indicator/index.js', 'app/components/offline_indicator/offline_indicator.js', 'app/components/options_context/index.js', 'app/components/options_context/options_context.android.js', 'app/components/paper_plane.js', 'app/components/post/index.js', 'app/components/post/post.js', 'app/components/post_body/index.js', 'app/components/post_body/post_body.js', 'app/components/post_header/index.js', 'app/components/post_header/post_header.js', 'app/components/post_list/date_header/date_header.js', 'app/components/post_list/date_header/index.js', 'app/components/post_list/index.js', 'app/components/post_list/new_messages_divider.js', 'app/components/post_list/post_list.android.js', 'app/components/post_list/post_list_base.js', 'app/components/post_list_retry.js', 'app/components/post_profile_picture/index.js', 'app/components/post_profile_picture/post_profile_picture.js', 'app/components/post_textbox/components/typing/index.js', 'app/components/post_textbox/components/typing/typing.js', 'app/components/post_textbox/index.js', 'app/components/post_textbox/post_textbox.js', 'app/components/profile_picture/index.js', 'app/components/profile_picture/profile_picture.js', 'app/components/progressive_image/index.js', 'app/components/progressive_image/progressive_image.js', 'app/components/remove_markdown.js', 'app/components/reply_icon.js', 'app/components/retry_bar_indicator/index.js', 'app/components/retry_bar_indicator/retry_bar_indicator.js', 'app/components/safe_area_view/index.js', 'app/components/safe_area_view/safe_area_view.android.js', 'app/components/search_bar/index.js', 'app/components/search_bar/search_bar.android.js', 'app/components/show_more_button/index.js', 'app/components/show_more_button/show_more_button.js', 'app/components/sidebars/main/channels_list/channel_item/channel_item.js', 'app/components/sidebars/main/channels_list/channel_item/index.js', 'app/components/sidebars/main/channels_list/channels_list.js', 'app/components/sidebars/main/channels_list/index.js', 'app/components/sidebars/main/channels_list/list/index.js', 'app/components/sidebars/main/channels_list/list/list.js', 'app/components/sidebars/main/channels_list/switch_teams_button/index.js', 'app/components/sidebars/main/channels_list/switch_teams_button/switch_teams_button.js', 'app/components/sidebars/main/drawer_swipper/drawer_swiper.js', 'app/components/sidebars/main/drawer_swipper/index.js', 'app/components/sidebars/main/index.js', 'app/components/sidebars/main/main_sidebar.js', 'app/components/sidebars/main/teams_list/index.js', 'app/components/sidebars/main/teams_list/teams_list.js', 'app/components/sidebars/main/teams_list/teams_list_item/index.js', 'app/components/sidebars/main/teams_list/teams_list_item/teams_list_item.js', 'app/components/sidebars/settings/drawer_item.js', 'app/components/sidebars/settings/index.js', 'app/components/sidebars/settings/settings_sidebar.js', 'app/components/sidebars/settings/status_label/index.js', 'app/components/sidebars/settings/status_label/status_label.js', 'app/components/sidebars/settings/user_info/index.js', 'app/components/sidebars/settings/user_info/user_info.js', 'app/components/start/empty_toolbar.js', 'app/components/status_bar/index.js', 'app/components/status_bar/status_bar.js', 'app/components/swiper.js', 'app/components/team_icon/index.js', 'app/components/team_icon/team_icon.js', 'app/components/user_status/index.js', 'app/components/user_status/user_status.js', 'app/components/vector_icon.js', 'app/constants/custom_prop_types.js', 'app/constants/device.js', 'app/constants/index.js', 'app/constants/list.js', 'app/constants/navigation.js', 'app/constants/permissions.js', 'app/constants/view.js', 'app/fetch_preconfig.js', 'app/initial_state.js', 'app/mattermost.js', 'app/mattermost_bucket/index.js', 'app/mattermost_managed/index.js', 'app/mattermost_managed/mattermost-managed.android.js', 'app/push_notifications/index.js', 'app/push_notifications/push_notifications.android.js', 'app/reducers/app/build.js', 'app/reducers/app/index.js', 'app/reducers/app/version.js', 'app/reducers/device/connection.js', 'app/reducers/device/dimension.js', 'app/reducers/device/index.js', 'app/reducers/device/is_tablet.js', 'app/reducers/device/orientation.js', 'app/reducers/device/status_bar.js', 'app/reducers/device/websocket.js', 'app/reducers/index.js', 'app/reducers/navigation/index.js', 'app/reducers/views/announcement.js', 'app/reducers/views/channel.js', 'app/reducers/views/client_upgrade.js', 'app/reducers/views/emoji.js', 'app/reducers/views/extension.js', 'app/reducers/views/i18n.js', 'app/reducers/views/index.js', 'app/reducers/views/login.js', 'app/reducers/views/post.js', 'app/reducers/views/recent_emojis.js', 'app/reducers/views/root.js', 'app/reducers/views/search.js', 'app/reducers/views/select_server.js', 'app/reducers/views/team.js', 'app/reducers/views/thread.js', 'app/reducers/views/user.js', 'app/screens/channel/channel.js', 'app/screens/channel/channel_nav_bar/channel_drawer_button.js', 'app/screens/channel/channel_nav_bar/channel_nav_bar.js', 'app/screens/channel/channel_nav_bar/channel_search_button/channel_search_button.js', 'app/screens/channel/channel_nav_bar/channel_search_button/index.js', 'app/screens/channel/channel_nav_bar/channel_title/channel_title.js', 'app/screens/channel/channel_nav_bar/channel_title/index.js', 'app/screens/channel/channel_nav_bar/index.js', 'app/screens/channel/channel_nav_bar/settings_drawer_button.js', 'app/screens/channel/channel_post_list/channel_post_list.js', 'app/screens/channel/channel_post_list/index.js', 'app/screens/channel/index.js', 'app/screens/entry/entry.js', 'app/screens/entry/index.js', 'app/screens/index.js', 'app/screens/select_server/index.js', 'app/screens/select_server/select_server.js', 'app/selectors/client_upgrade.js', 'app/store/index.js', 'app/store/middleware.js', 'app/utils/avoid_native_bridge.js', 'app/utils/client_upgrade.js', 'app/utils/general.js', 'app/utils/i18n.js', 'app/utils/image_cache_manager.js', 'app/utils/network.js', 'app/utils/push_notifications.js', 'app/utils/sentry/middleware.js', 'app/utils/theme.js', 'app/utils/time_tracker.js', 'dist/assets/config.json', 'dist/assets/images/icons/audio.png', 'dist/assets/images/icons/code.png', 'dist/assets/images/icons/excel.png', 'dist/assets/images/icons/generic.png', 'dist/assets/images/icons/image.png', 'dist/assets/images/icons/patch.png', 'dist/assets/images/icons/pdf.png', 'dist/assets/images/icons/ppt.png', 'dist/assets/images/icons/video.png', 'dist/assets/images/icons/webhook.jpg', 'dist/assets/images/icons/word.png', 'dist/assets/images/profile.jpg', 'dist/assets/images/status/away.png', 'dist/assets/images/status/dnd.png', 'dist/assets/images/status/offline.png', 'dist/assets/images/status/online.png', 'dist/assets/images/thumb.png', 'index.js', 'node_modules/@babel/runtime/helpers/arrayWithHoles.js', 'node_modules/@babel/runtime/helpers/arrayWithoutHoles.js', 'node_modules/@babel/runtime/helpers/assertThisInitialized.js', 'node_modules/@babel/runtime/helpers/classCallCheck.js', 'node_modules/@babel/runtime/helpers/createClass.js', 'node_modules/@babel/runtime/helpers/defineProperty.js', 'node_modules/@babel/runtime/helpers/extends.js', 'node_modules/@babel/runtime/helpers/get.js', 'node_modules/@babel/runtime/helpers/getPrototypeOf.js', 'node_modules/@babel/runtime/helpers/inherits.js', 'node_modules/@babel/runtime/helpers/interopRequireDefault.js', 'node_modules/@babel/runtime/helpers/interopRequireWildcard.js', 'node_modules/@babel/runtime/helpers/objectSpread.js', 'node_modules/@babel/runtime/helpers/objectWithoutProperties.js', 'node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js', 'node_modules/@babel/runtime/helpers/possibleConstructorReturn.js', 'node_modules/@babel/runtime/helpers/setPrototypeOf.js', 'node_modules/@babel/runtime/helpers/slicedToArray.js', 'node_modules/@babel/runtime/helpers/toConsumableArray.js', 'node_modules/@babel/runtime/helpers/typeof.js', 'node_modules/@babel/runtime/regenerator/index.js', 'node_modules/base-64/base64.js', 'node_modules/clamp/index.js', 'node_modules/color-convert/conversions.js', 'node_modules/color-convert/index.js', 'node_modules/color-convert/route.js', 'node_modules/color-name/index.js', 'node_modules/color/index.js', 'node_modules/commonmark-react-renderer/src/commonmark-react-renderer.js', 'node_modules/component-emitter/index.js', 'node_modules/create-react-class/factory.js', 'node_modules/create-react-class/index.js', 'node_modules/event-target-shim/lib/commons.js', 'node_modules/event-target-shim/lib/custom-event-target.js', 'node_modules/event-target-shim/lib/event-target.js', 'node_modules/fbjs/lib/emptyFunction.js', 'node_modules/fbjs/lib/invariant.js', 'node_modules/fbjs/lib/warning.js', 'node_modules/fuse.js/dist/fuse.js', 'node_modules/global/window.js', 'node_modules/hoist-non-react-statics/index.js', 'node_modules/intl-format-cache/index.js', 'node_modules/intl-format-cache/lib/memoizer.js', 'node_modules/intl-messageformat-parser/index.js', 'node_modules/intl-messageformat-parser/lib/parser.js', 'node_modules/intl-messageformat/index.js', 'node_modules/intl-messageformat/lib/core.js', 'node_modules/intl-messageformat/lib/en.js', 'node_modules/intl-messageformat/lib/es5.js', 'node_modules/intl-messageformat/lib/locales.js', 'node_modules/intl-messageformat/lib/main.js', 'node_modules/intl-relativeformat/index.js', 'node_modules/intl-relativeformat/lib/core.js', 'node_modules/intl-relativeformat/lib/en.js', 'node_modules/intl-relativeformat/lib/es5.js', 'node_modules/intl-relativeformat/lib/locales.js', 'node_modules/intl-relativeformat/lib/main.js', 'node_modules/invariant/browser.js', 'node_modules/jail-monkey/index.js', 'node_modules/json-stringify-safe/stringify.js', 'node_modules/keymirror/index.js', 'node_modules/linked-list/_source/linked-list.js', 'node_modules/linked-list/index.js', 'node_modules/lodash.clonedeep/index.js', 'node_modules/lodash.forin/index.js', 'node_modules/lodash.get/index.js', 'node_modules/lodash.isempty/index.js', 'node_modules/lodash.pickby/index.js', 'node_modules/lodash.set/index.js', 'node_modules/lodash.unset/index.js', 'node_modules/lodash/_Symbol.js', 'node_modules/lodash/_apply.js', 'node_modules/lodash/_arrayIncludes.js', 'node_modules/lodash/_arrayPush.js', 'node_modules/lodash/_assignValue.js', 'node_modules/lodash/_baseAssignValue.js', 'node_modules/lodash/_baseDifference.js', 'node_modules/lodash/_baseFindIndex.js', 'node_modules/lodash/_baseFlatten.js', 'node_modules/lodash/_baseGetTag.js', 'node_modules/lodash/_baseIsNative.js', 'node_modules/lodash/_baseIteratee.js', 'node_modules/lodash/_baseRest.js', 'node_modules/lodash/_baseSetToString.js', 'node_modules/lodash/_coreJsData.js', 'node_modules/lodash/_createAssigner.js', 'node_modules/lodash/_createFind.js', 'node_modules/lodash/_defineProperty.js', 'node_modules/lodash/_flatRest.js', 'node_modules/lodash/_freeGlobal.js', 'node_modules/lodash/_getNative.js', 'node_modules/lodash/_getPrototype.js', 'node_modules/lodash/_getValue.js', 'node_modules/lodash/_isMasked.js', 'node_modules/lodash/_isPrototype.js', 'node_modules/lodash/_objectToString.js', 'node_modules/lodash/_overArg.js', 'node_modules/lodash/_overRest.js', 'node_modules/lodash/_root.js', 'node_modules/lodash/_setToString.js', 'node_modules/lodash/_shortOut.js', 'node_modules/lodash/_toSource.js', 'node_modules/lodash/assign.js', 'node_modules/lodash/constant.js', 'node_modules/lodash/difference.js', 'node_modules/lodash/find.js', 'node_modules/lodash/findIndex.js', 'node_modules/lodash/flatten.js', 'node_modules/lodash/identity.js', 'node_modules/lodash/isArrayLike.js', 'node_modules/lodash/isArrayLikeObject.js', 'node_modules/lodash/isEqual.js', 'node_modules/lodash/isFunction.js', 'node_modules/lodash/isLength.js', 'node_modules/lodash/isObject.js', 'node_modules/lodash/isObjectLike.js', 'node_modules/lodash/isPlainObject.js', 'node_modules/lodash/isString.js', 'node_modules/lodash/lodash.js', 'node_modules/lodash/mapValues.js', 'node_modules/lodash/omit.js', 'node_modules/lodash/pick.js', 'node_modules/lodash/union.js', 'node_modules/mattermost-redux/action_types/admin.js', 'node_modules/mattermost-redux/action_types/alerts.js', 'node_modules/mattermost-redux/action_types/channels.js', 'node_modules/mattermost-redux/action_types/emojis.js', 'node_modules/mattermost-redux/action_types/errors.js', 'node_modules/mattermost-redux/action_types/files.js', 'node_modules/mattermost-redux/action_types/general.js', 'node_modules/mattermost-redux/action_types/gifs.js', 'node_modules/mattermost-redux/action_types/index.js', 'node_modules/mattermost-redux/action_types/integrations.js', 'node_modules/mattermost-redux/action_types/jobs.js', 'node_modules/mattermost-redux/action_types/posts.js', 'node_modules/mattermost-redux/action_types/preferences.js', 'node_modules/mattermost-redux/action_types/roles.js', 'node_modules/mattermost-redux/action_types/schemes.js', 'node_modules/mattermost-redux/action_types/search.js', 'node_modules/mattermost-redux/action_types/teams.js', 'node_modules/mattermost-redux/action_types/users.js', 'node_modules/mattermost-redux/client/client4.js', 'node_modules/mattermost-redux/client/fetch_etag.js', 'node_modules/mattermost-redux/client/index.js', 'node_modules/mattermost-redux/constants/alerts.js', 'node_modules/mattermost-redux/constants/emoji.js', 'node_modules/mattermost-redux/constants/files.js', 'node_modules/mattermost-redux/constants/general.js', 'node_modules/mattermost-redux/constants/index.js', 'node_modules/mattermost-redux/constants/permissions.js', 'node_modules/mattermost-redux/constants/plugins.js', 'node_modules/mattermost-redux/constants/posts.js', 'node_modules/mattermost-redux/constants/preferences.js', 'node_modules/mattermost-redux/constants/request_status.js', 'node_modules/mattermost-redux/constants/stats.js', 'node_modules/mattermost-redux/constants/teams.js', 'node_modules/mattermost-redux/constants/websocket.js', 'node_modules/mattermost-redux/node_modules/mime-db/db.json', 'node_modules/mattermost-redux/node_modules/mime-db/index.js', 'node_modules/mattermost-redux/node_modules/redux-batched-actions/lib/index.js', 'node_modules/mattermost-redux/node_modules/redux-persist/lib/constants.js', 'node_modules/mattermost-redux/node_modules/redux-thunk/lib/index.js', 'node_modules/mattermost-redux/reducers/entities/admin.js', 'node_modules/mattermost-redux/reducers/entities/alerts.js', 'node_modules/mattermost-redux/reducers/entities/channels.js', 'node_modules/mattermost-redux/reducers/entities/emojis.js', 'node_modules/mattermost-redux/reducers/entities/files.js', 'node_modules/mattermost-redux/reducers/entities/general.js', 'node_modules/mattermost-redux/reducers/entities/gifs.js', 'node_modules/mattermost-redux/reducers/entities/index.js', 'node_modules/mattermost-redux/reducers/entities/integrations.js', 'node_modules/mattermost-redux/reducers/entities/jobs.js', 'node_modules/mattermost-redux/reducers/entities/posts.js', 'node_modules/mattermost-redux/reducers/entities/preferences.js', 'node_modules/mattermost-redux/reducers/entities/roles.js', 'node_modules/mattermost-redux/reducers/entities/schemes.js', 'node_modules/mattermost-redux/reducers/entities/search.js', 'node_modules/mattermost-redux/reducers/entities/teams.js', 'node_modules/mattermost-redux/reducers/entities/typing.js', 'node_modules/mattermost-redux/reducers/entities/users.js', 'node_modules/mattermost-redux/reducers/errors/index.js', 'node_modules/mattermost-redux/reducers/index.js', 'node_modules/mattermost-redux/reducers/requests/admin.js', 'node_modules/mattermost-redux/reducers/requests/channels.js', 'node_modules/mattermost-redux/reducers/requests/emojis.js', 'node_modules/mattermost-redux/reducers/requests/files.js', 'node_modules/mattermost-redux/reducers/requests/general.js', 'node_modules/mattermost-redux/reducers/requests/helpers.js', 'node_modules/mattermost-redux/reducers/requests/index.js', 'node_modules/mattermost-redux/reducers/requests/integrations.js', 'node_modules/mattermost-redux/reducers/requests/jobs.js', 'node_modules/mattermost-redux/reducers/requests/posts.js', 'node_modules/mattermost-redux/reducers/requests/preferences.js', 'node_modules/mattermost-redux/reducers/requests/roles.js', 'node_modules/mattermost-redux/reducers/requests/schemes.js', 'node_modules/mattermost-redux/reducers/requests/search.js', 'node_modules/mattermost-redux/reducers/requests/teams.js', 'node_modules/mattermost-redux/reducers/requests/users.js', 'node_modules/mattermost-redux/selectors/entities/emojis.js', 'node_modules/mattermost-redux/selectors/entities/general.js', 'node_modules/mattermost-redux/selectors/entities/integrations.js', 'node_modules/mattermost-redux/selectors/entities/teams.js', 'node_modules/mattermost-redux/store/configureStore.dev.js', 'node_modules/mattermost-redux/store/helpers.js', 'node_modules/mattermost-redux/store/index.js', 'node_modules/mattermost-redux/store/initial_state.js', 'node_modules/mattermost-redux/store/reducer_registry.js', 'node_modules/mattermost-redux/utils/deep_freeze.js', 'node_modules/mattermost-redux/utils/event_emitter.js', 'node_modules/mattermost-redux/utils/file_utils.js', 'node_modules/mattermost-redux/utils/helpers.js', 'node_modules/mattermost-redux/utils/key_mirror.js', 'node_modules/mattermost-redux/utils/theme_utils.js', 'node_modules/object-assign/index.js', 'node_modules/pascalcase/index.js', 'node_modules/path-to-regexp/index.js', 'node_modules/path-to-regexp/node_modules/isarray/index.js', 'node_modules/pegjs/lib/compiler/asts.js', 'node_modules/pegjs/lib/compiler/index.js', 'node_modules/pegjs/lib/compiler/js.js', 'node_modules/pegjs/lib/compiler/opcodes.js', 'node_modules/pegjs/lib/compiler/passes/generate-bytecode.js', 'node_modules/pegjs/lib/compiler/passes/generate-js.js', 'node_modules/pegjs/lib/compiler/passes/remove-proxy-rules.js', 'node_modules/pegjs/lib/compiler/passes/report-duplicate-labels.js', 'node_modules/pegjs/lib/compiler/passes/report-duplicate-rules.js', 'node_modules/pegjs/lib/compiler/passes/report-infinite-recursion.js', 'node_modules/pegjs/lib/compiler/passes/report-infinite-repetition.js', 'node_modules/pegjs/lib/compiler/passes/report-undefined-rules.js', 'node_modules/pegjs/lib/compiler/visitor.js', 'node_modules/pegjs/lib/grammar-error.js', 'node_modules/pegjs/lib/parser.js', 'node_modules/pegjs/lib/peg.js', 'node_modules/pegjs/lib/utils/arrays.js', 'node_modules/pegjs/lib/utils/classes.js', 'node_modules/pegjs/lib/utils/objects.js', 'node_modules/promise/setimmediate/core.js', 'node_modules/promise/setimmediate/done.js', 'node_modules/promise/setimmediate/es6-extensions.js', 'node_modules/promise/setimmediate/rejection-tracking.js', 'node_modules/prop-types/checkPropTypes.js', 'node_modules/prop-types/factoryWithTypeCheckers.js', 'node_modules/prop-types/index.js', 'node_modules/prop-types/lib/ReactPropTypesSecret.js', 'node_modules/querystring/decode.js', 'node_modules/querystring/encode.js', 'node_modules/querystring/index.js', 'node_modules/querystringify/index.js', 'node_modules/react-deep-force-update/lib/index.js', 'node_modules/react-devtools-core/build/backend.js', 'node_modules/react-intl/lib/index.js', 'node_modules/react-intl/locale-data/index.js', 'node_modules/react-intl/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js', 'node_modules/react-lifecycles-compat/react-lifecycles-compat.cjs.js', 'node_modules/react-native-bottom-sheet/index.js', 'node_modules/react-native-button/Button.js', 'node_modules/react-native-button/coalesceNonElementChildren.js', 'node_modules/react-native-device-info/deviceinfo.js', 'node_modules/react-native-drawer-layout/dist/DrawerLayout.js', 'node_modules/react-native-image-picker/index.js', 'node_modules/react-native-linear-gradient/index.android.js', 'node_modules/react-native-linear-gradient/nativeLinearGradient.js', 'node_modules/react-native-local-auth/LocalAuth.android.js', 'node_modules/react-native-local-auth/index.js', 'node_modules/react-native-navigation/src/NativeEventsReceiver.js', 'node_modules/react-native-navigation/src/Navigation.js', 'node_modules/react-native-navigation/src/PropRegistry.js', 'node_modules/react-native-navigation/src/Screen.js', 'node_modules/react-native-navigation/src/ScreenVisibilityListener.js', 'node_modules/react-native-navigation/src/deprecated/indexDeprecated.android.js', 'node_modules/react-native-navigation/src/deprecated/platformSpecificDeprecated.android.js', 'node_modules/react-native-navigation/src/index.js', 'node_modules/react-native-navigation/src/platformSpecific.android.js', 'node_modules/react-native-navigation/src/views/sharedElementTransition.android.js', 'node_modules/react-native-notifications/index.android.js', 'node_modules/react-native-notifications/notification.android.js', 'node_modules/react-native-permissions/index.js', 'node_modules/react-native-permissions/lib/permissions.android.js', 'node_modules/react-native-recyclerview-list/index.js', 'node_modules/react-native-recyclerview-list/src/Constants.js', 'node_modules/react-native-recyclerview-list/src/DataSource.js', 'node_modules/react-native-recyclerview-list/src/RecyclerRefresh.js', 'node_modules/react-native-recyclerview-list/src/RecyclerViewList.js', 'node_modules/react-native-svg/elements/Circle.js', 'node_modules/react-native-svg/elements/ClipPath.js', 'node_modules/react-native-svg/elements/Defs.js', 'node_modules/react-native-svg/elements/Ellipse.js', 'node_modules/react-native-svg/elements/G.js', 'node_modules/react-native-svg/elements/Image.js', 'node_modules/react-native-svg/elements/Line.js', 'node_modules/react-native-svg/elements/LinearGradient.js', 'node_modules/react-native-svg/elements/Mask.js', 'node_modules/react-native-svg/elements/Path.js', 'node_modules/react-native-svg/elements/Pattern.js', 'node_modules/react-native-svg/elements/Polygon.js', 'node_modules/react-native-svg/elements/Polyline.js', 'node_modules/react-native-svg/elements/RadialGradient.js', 'node_modules/react-native-svg/elements/Rect.js', 'node_modules/react-native-svg/elements/Shape.js', 'node_modules/react-native-svg/elements/Stop.js', 'node_modules/react-native-svg/elements/Svg.js', 'node_modules/react-native-svg/elements/Symbol.js', 'node_modules/react-native-svg/elements/TSpan.js', 'node_modules/react-native-svg/elements/Text.js', 'node_modules/react-native-svg/elements/TextPath.js', 'node_modules/react-native-svg/elements/Use.js', 'node_modules/react-native-svg/index.js', 'node_modules/react-native-svg/lib/Matrix2D.js', 'node_modules/react-native-svg/lib/PATTERN_UNITS.js', 'node_modules/react-native-svg/lib/SvgTouchableMixin.js', 'node_modules/react-native-svg/lib/attributes.js', 'node_modules/react-native-svg/lib/extract/extractBrush.js', 'node_modules/react-native-svg/lib/extract/extractClipPath.js', 'node_modules/react-native-svg/lib/extract/extractFill.js', 'node_modules/react-native-svg/lib/extract/extractGradient.js', 'node_modules/react-native-svg/lib/extract/extractLengthList.js', 'node_modules/react-native-svg/lib/extract/extractOpacity.js', 'node_modules/react-native-svg/lib/extract/extractPolyPoints.js', 'node_modules/react-native-svg/lib/extract/extractProps.js', 'node_modules/react-native-svg/lib/extract/extractResponder.js', 'node_modules/react-native-svg/lib/extract/extractStroke.js', 'node_modules/react-native-svg/lib/extract/extractText.js', 'node_modules/react-native-svg/lib/extract/extractTransform.js', 'node_modules/react-native-svg/lib/extract/extractViewBox.js', 'node_modules/react-native-svg/lib/extract/patternReg.js', 'node_modules/react-native-svg/lib/percentToFloat.js', 'node_modules/react-native-svg/lib/props.js', 'node_modules/react-native-vector-icons/FontAwesome.js', 'node_modules/react-native-vector-icons/Foundation.js', 'node_modules/react-native-vector-icons/Ionicons.js', 'node_modules/react-native-vector-icons/MaterialIcons.js', 'node_modules/react-native-vector-icons/glyphmaps/FontAwesome.json', 'node_modules/react-native-vector-icons/glyphmaps/Foundation.json', 'node_modules/react-native-vector-icons/glyphmaps/Ionicons.json', 'node_modules/react-native-vector-icons/glyphmaps/MaterialIcons.json', 'node_modules/react-native-vector-icons/lib/create-icon-set.js', 'node_modules/react-native-vector-icons/lib/ensure-native-module-available.js', 'node_modules/react-native-vector-icons/lib/icon-button.js', 'node_modules/react-native-vector-icons/lib/react-native.js', 'node_modules/react-native-vector-icons/lib/tab-bar-item-ios.js', 'node_modules/react-native-vector-icons/lib/toolbar-android.js', 'node_modules/react-native-video/TextTrackType.js', 'node_modules/react-native-video/Video.js', 'node_modules/react-native-video/VideoResizeMode.js', 'node_modules/react-native/Libraries/Animated/src/Animated.js', 'node_modules/react-native/Libraries/Animated/src/AnimatedEvent.js', 'node_modules/react-native/Libraries/Animated/src/AnimatedImplementation.js', 'node_modules/react-native/Libraries/Animated/src/Easing.js', 'node_modules/react-native/Libraries/Animated/src/createAnimatedComponent.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedInterpolation.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedNode.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedProps.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedValue.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedValueXY.js', 'node_modules/react-native/Libraries/Animated/src/nodes/AnimatedWithChildren.js', 'node_modules/react-native/Libraries/AppState/AppState.js', 'node_modules/react-native/Libraries/BatchedBridge/BatchedBridge.js', 'node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js', 'node_modules/react-native/Libraries/BatchedBridge/NativeModules.js', 'node_modules/react-native/Libraries/Color/normalizeColor.js', 'node_modules/react-native/Libraries/Components/AppleTV/TVViewPropTypes.js', 'node_modules/react-native/Libraries/Components/ScrollResponder.js', 'node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js', 'node_modules/react-native/Libraries/Components/Subscribable.js', 'node_modules/react-native/Libraries/Components/TextInput/TextInputState.js', 'node_modules/react-native/Libraries/Components/Touchable/Touchable.js', 'node_modules/react-native/Libraries/Components/Touchable/TouchableOpacity.js', 'node_modules/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.js', 'node_modules/react-native/Libraries/Components/View/PlatformViewPropTypes.js', 'node_modules/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js', 'node_modules/react-native/Libraries/Components/View/ReactNativeViewAttributes.js', 'node_modules/react-native/Libraries/Components/View/ShadowPropTypesIOS.js', 'node_modules/react-native/Libraries/Components/View/View.js', 'node_modules/react-native/Libraries/Components/View/ViewAccessibility.js', 'node_modules/react-native/Libraries/Components/View/ViewNativeComponent.js', 'node_modules/react-native/Libraries/Components/View/ViewPropTypes.js', 'node_modules/react-native/Libraries/Components/View/ViewStylePropTypes.js', 'node_modules/react-native/Libraries/Core/Devtools/getDevServer.js', 'node_modules/react-native/Libraries/Core/Devtools/parseErrorStack.js', 'node_modules/react-native/Libraries/Core/Devtools/setupDevtools.js', 'node_modules/react-native/Libraries/Core/ExceptionsManager.js', 'node_modules/react-native/Libraries/Core/InitializeCore.js', 'node_modules/react-native/Libraries/Core/ReactNativeVersion.js', 'node_modules/react-native/Libraries/Core/ReactNativeVersionCheck.js', 'node_modules/react-native/Libraries/Core/Timers/JSTimers.js', 'node_modules/react-native/Libraries/EventEmitter/NativeEventEmitter.js', 'node_modules/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.js', 'node_modules/react-native/Libraries/EventEmitter/RCTEventEmitter.js', 'node_modules/react-native/Libraries/Image/AssetRegistry.js', 'node_modules/react-native/Libraries/Image/AssetSourceResolver.js', 'node_modules/react-native/Libraries/Image/Image.android.js', 'node_modules/react-native/Libraries/Image/ImageBackground.js', 'node_modules/react-native/Libraries/Image/ImageResizeMode.js', 'node_modules/react-native/Libraries/Image/ImageSourcePropType.js', 'node_modules/react-native/Libraries/Image/ImageStylePropTypes.js', 'node_modules/react-native/Libraries/Image/resolveAssetSource.js', 'node_modules/react-native/Libraries/Interaction/PanResponder.js', 'node_modules/react-native/Libraries/JSInspector/InspectorAgent.js', 'node_modules/react-native/Libraries/JSInspector/JSInspector.js', 'node_modules/react-native/Libraries/JSInspector/NetworkAgent.js', 'node_modules/react-native/Libraries/Linking/Linking.js', 'node_modules/react-native/Libraries/Lists/FlatList.js', 'node_modules/react-native/Libraries/Lists/SectionList.js', 'node_modules/react-native/Libraries/Lists/VirtualizedList.js', 'node_modules/react-native/Libraries/Lists/VirtualizedSectionList.js', 'node_modules/react-native/Libraries/Network/NetInfo.js', 'node_modules/react-native/Libraries/Performance/Systrace.js', 'node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js', 'node_modules/react-native/Libraries/Promise.js', 'node_modules/react-native/Libraries/ReactNative/AppRegistry.js', 'node_modules/react-native/Libraries/ReactNative/I18nManager.js', 'node_modules/react-native/Libraries/ReactNative/UIManager.js', 'node_modules/react-native/Libraries/ReactNative/requireNativeComponent.js', 'node_modules/react-native/Libraries/Renderer/oss/ReactNativeRenderer-dev.js', 'node_modules/react-native/Libraries/Renderer/shims/NativeMethodsMixin.js', 'node_modules/react-native/Libraries/Renderer/shims/ReactNative.js', 'node_modules/react-native/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js', 'node_modules/react-native/Libraries/Renderer/shims/createReactNativeComponentClass.js', 'node_modules/react-native/Libraries/Storage/AsyncStorage.js', 'node_modules/react-native/Libraries/StyleSheet/ColorPropType.js', 'node_modules/react-native/Libraries/StyleSheet/EdgeInsetsPropType.js', 'node_modules/react-native/Libraries/StyleSheet/LayoutPropTypes.js', 'node_modules/react-native/Libraries/StyleSheet/PointPropType.js', 'node_modules/react-native/Libraries/StyleSheet/StyleSheet.js', 'node_modules/react-native/Libraries/StyleSheet/StyleSheetPropType.js', 'node_modules/react-native/Libraries/StyleSheet/StyleSheetValidation.js', 'node_modules/react-native/Libraries/StyleSheet/TransformPropTypes.js', 'node_modules/react-native/Libraries/StyleSheet/flattenStyle.js', 'node_modules/react-native/Libraries/StyleSheet/processColor.js', 'node_modules/react-native/Libraries/StyleSheet/processTransform.js', 'node_modules/react-native/Libraries/Text/Text.js', 'node_modules/react-native/Libraries/Text/TextPropTypes.js', 'node_modules/react-native/Libraries/Text/TextStylePropTypes.js', 'node_modules/react-native/Libraries/Utilities/BackHandler.android.js', 'node_modules/react-native/Libraries/Utilities/DeviceInfo.js', 'node_modules/react-native/Libraries/Utilities/Dimensions.js', 'node_modules/react-native/Libraries/Utilities/HMRClient.js', 'node_modules/react-native/Libraries/Utilities/PixelRatio.js', 'node_modules/react-native/Libraries/Utilities/Platform.android.js', 'node_modules/react-native/Libraries/Utilities/PolyfillFunctions.js', 'node_modules/react-native/Libraries/Utilities/createStrictShapeTypeChecker.js', 'node_modules/react-native/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev.js', 'node_modules/react-native/Libraries/Utilities/defineLazyObjectProperty.js', 'node_modules/react-native/Libraries/Utilities/deprecatedPropType.js', 'node_modules/react-native/Libraries/Utilities/differ/deepDiffer.js', 'node_modules/react-native/Libraries/Utilities/differ/sizesDiffer.js', 'node_modules/react-native/Libraries/Utilities/logError.js', 'node_modules/react-native/Libraries/WebSocket/WebSocket.js', 'node_modules/react-native/Libraries/react-native/React.js', 'node_modules/react-native/Libraries/react-native/react-native-implementation.js', 'node_modules/react-native/Libraries/vendor/core/ErrorUtils.js', 'node_modules/react-native/Libraries/vendor/core/Map.js', 'node_modules/react-native/Libraries/vendor/core/_shouldPolyfillES6Collection.js', 'node_modules/react-native/Libraries/vendor/emitter/EmitterSubscription.js', 'node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js', 'node_modules/react-native/Libraries/vendor/emitter/EventSubscription.js', 'node_modules/react-native/Libraries/vendor/emitter/EventSubscriptionVendor.js', 'node_modules/react-native/node_modules/fbjs/lib/Promise.native.js', 'node_modules/react-native/node_modules/fbjs/lib/invariant.js', 'node_modules/react-native/node_modules/fbjs/lib/keyMirror.js', 'node_modules/react-native/node_modules/regenerator-runtime/runtime.js', 'node_modules/react-navigation-stack/dist/index.js', 'node_modules/react-navigation-stack/dist/navigators/createContainedStackNavigator.js', 'node_modules/react-navigation-stack/dist/navigators/createStackNavigator.js', 'node_modules/react-navigation-stack/dist/utils/ReactNativeFeatures.js', 'node_modules/react-navigation-stack/dist/utils/getSceneIndicesForInterpolationInputRange.js', 'node_modules/react-navigation-stack/dist/utils/invariant.js', 'node_modules/react-navigation-stack/dist/utils/shallowEqual.js', 'node_modules/react-navigation-stack/dist/views/Header/Header.js', 'node_modules/react-navigation-stack/dist/views/Header/HeaderBackButton.js', 'node_modules/react-navigation-stack/dist/views/Header/HeaderStyleInterpolator.js', 'node_modules/react-navigation-stack/dist/views/Header/HeaderTitle.js', 'node_modules/react-navigation-stack/dist/views/Header/ModularHeaderBackButton.js', 'node_modules/react-navigation-stack/dist/views/ScenesReducer.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackView.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewCard.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewLayout.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewStyleInterpolator.js', 'node_modules/react-navigation-stack/dist/views/StackView/StackViewTransitionConfigs.js', 'node_modules/react-navigation-stack/dist/views/StackView/createPointerEventsContainer.js', 'node_modules/react-navigation-stack/dist/views/TouchableItem.js', 'node_modules/react-navigation-stack/dist/views/Transitioner.js', 'node_modules/react-navigation-stack/dist/views/assets/back-icon.png', 'node_modules/react-navigation/src/NavigationActions.js', 'node_modules/react-navigation/src/StateUtils.js', 'node_modules/react-navigation/src/createNavigationContainer.js', 'node_modules/react-navigation/src/getChildEventSubscriber.js', 'node_modules/react-navigation/src/getChildNavigation.js', 'node_modules/react-navigation/src/getChildRouter.js', 'node_modules/react-navigation/src/getNavigation.js', 'node_modules/react-navigation/src/navigators/createKeyboardAwareNavigator.js', 'node_modules/react-navigation/src/navigators/createNavigator.js', 'node_modules/react-navigation/src/react-navigation.js', 'node_modules/react-navigation/src/routers/StackActions.js', 'node_modules/react-navigation/src/routers/StackRouter.js', 'node_modules/react-navigation/src/routers/createConfigGetter.js', 'node_modules/react-navigation/src/routers/getNavigationActionCreators.js', 'node_modules/react-navigation/src/routers/getScreenForRouteName.js', 'node_modules/react-navigation/src/routers/pathUtils.js', 'node_modules/react-navigation/src/routers/validateRouteConfigMap.js', 'node_modules/react-navigation/src/routers/validateScreenOptions.js', 'node_modules/react-navigation/src/utils/docsUrl.js', 'node_modules/react-navigation/src/utils/invariant.js', 'node_modules/react-navigation/src/views/TouchableItem.js', 'node_modules/react-navigation/src/views/withOrientation.js', 'node_modules/react-proxy/modules/bindAutoBindMethods.js', 'node_modules/react-proxy/modules/createClassProxy.js', 'node_modules/react-proxy/modules/createPrototypeProxy.js', 'node_modules/react-proxy/modules/deleteUnknownAutoBindMethods.js', 'node_modules/react-proxy/modules/index.js', 'node_modules/react-proxy/modules/supportsProtoAssignment.js', 'node_modules/react-redux/lib/components/Provider.js', 'node_modules/react-redux/lib/components/connectAdvanced.js', 'node_modules/react-redux/lib/connect/connect.js', 'node_modules/react-redux/lib/connect/mapDispatchToProps.js', 'node_modules/react-redux/lib/connect/mapStateToProps.js', 'node_modules/react-redux/lib/connect/mergeProps.js', 'node_modules/react-redux/lib/connect/selectorFactory.js', 'node_modules/react-redux/lib/connect/verifySubselectors.js', 'node_modules/react-redux/lib/connect/wrapMapToProps.js', 'node_modules/react-redux/lib/index.js', 'node_modules/react-redux/lib/utils/PropTypes.js', 'node_modules/react-redux/lib/utils/Subscription.js', 'node_modules/react-redux/lib/utils/shallowEqual.js', 'node_modules/react-redux/lib/utils/verifyPlainObject.js', 'node_modules/react-redux/lib/utils/warning.js', 'node_modules/react-timer-mixin/TimerMixin.js', 'node_modules/react-transform-hmr/lib/index.js', 'node_modules/react/cjs/react.development.js', 'node_modules/react/index.js', 'node_modules/redux-action-buffer/index.js', 'node_modules/redux-devtools-instrument/lib/instrument.js', 'node_modules/redux-offline/lib/actions.js', 'node_modules/redux-offline/lib/config.js', 'node_modules/redux-offline/lib/constants.js', 'node_modules/redux-offline/lib/defaults/batch.js', 'node_modules/redux-offline/lib/defaults/detectNetwork.native.js', 'node_modules/redux-offline/lib/defaults/discard.js', 'node_modules/redux-offline/lib/defaults/effect.js', 'node_modules/redux-offline/lib/defaults/index.js', 'node_modules/redux-offline/lib/defaults/persist.native.js', 'node_modules/redux-offline/lib/defaults/retry.js', 'node_modules/redux-offline/lib/index.js', 'node_modules/redux-offline/lib/middleware.js', 'node_modules/redux-offline/lib/updater.js', 'node_modules/redux-persist-transform-filter/dist/index.js', 'node_modules/redux-persist/lib/autoRehydrate.js', 'node_modules/redux-persist/lib/constants.js', 'node_modules/redux-persist/lib/createPersistor.js', 'node_modules/redux-persist/lib/createTransform.js', 'node_modules/redux-persist/lib/defaults/asyncLocalStorage.js', 'node_modules/redux-persist/lib/getStoredState.js', 'node_modules/redux-persist/lib/index.js', 'node_modules/redux-persist/lib/persistStore.js', 'node_modules/redux-persist/lib/purgeStoredState.js', 'node_modules/redux-persist/lib/utils/isStatePlainEnough.js', 'node_modules/redux-persist/lib/utils/setImmediate.js', 'node_modules/redux/lib/redux.js', 'node_modules/regenerator-runtime/runtime-module.js', 'node_modules/regenerator-runtime/runtime.js', 'node_modules/remote-redux-devtools/lib/configureStore.js', 'node_modules/remote-redux-devtools/lib/devTools.js', 'node_modules/remote-redux-devtools/lib/index.js', 'node_modules/remotedev-utils/lib/catchErrors.js', 'node_modules/remotedev-utils/lib/filters.js', 'node_modules/reselect/lib/index.js', 'node_modules/rn-fetch-blob/android.js', 'node_modules/rn-fetch-blob/cba/index.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobFile.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobReadStream.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobSession.js', 'node_modules/rn-fetch-blob/class/RNFetchBlobWriteStream.js', 'node_modules/rn-fetch-blob/fs.js', 'node_modules/rn-fetch-blob/index.js', 'node_modules/rn-fetch-blob/ios.js', 'node_modules/rn-fetch-blob/json-stream.js', 'node_modules/rn-fetch-blob/lib/oboe-browser.min.js', 'node_modules/rn-fetch-blob/polyfill/Blob.js', 'node_modules/rn-fetch-blob/polyfill/Event.js', 'node_modules/rn-fetch-blob/polyfill/EventTarget.js', 'node_modules/rn-fetch-blob/polyfill/Fetch.js', 'node_modules/rn-fetch-blob/polyfill/File.js', 'node_modules/rn-fetch-blob/polyfill/FileReader.js', 'node_modules/rn-fetch-blob/polyfill/ProgressEvent.js', 'node_modules/rn-fetch-blob/polyfill/XMLHttpRequest.js', 'node_modules/rn-fetch-blob/polyfill/XMLHttpRequestEventTarget.js', 'node_modules/rn-fetch-blob/polyfill/index.js', 'node_modules/rn-fetch-blob/utils/log.js', 'node_modules/rn-fetch-blob/utils/unicode.js', 'node_modules/rn-fetch-blob/utils/uri.js', 'node_modules/rn-fetch-blob/utils/uuid.js', 'node_modules/rn-host-detect/index.js', 'node_modules/rn-placeholder/index.js', 'node_modules/rn-placeholder/src/animation/animations.js', 'node_modules/rn-placeholder/src/animation/fade.js', 'node_modules/rn-placeholder/src/animation/shine.js', 'node_modules/rn-placeholder/src/box/box.style.js', 'node_modules/rn-placeholder/src/imageContent/imageContent.js', 'node_modules/rn-placeholder/src/line/line.style.js', 'node_modules/rn-placeholder/src/media/media.style.js', 'node_modules/rn-placeholder/src/multiWords/multiWords.js', 'node_modules/rn-placeholder/src/paragraph/paragraph.js', 'node_modules/rn-placeholder/src/placeholder.js', 'node_modules/rn-placeholder/src/placeholderContainer.js', 'node_modules/rn-placeholder/src/placeholderStylify.js', 'node_modules/sc-formatter/index.js', 'node_modules/schedule/cjs/schedule-tracking.development.js', 'node_modules/schedule/tracking.js', 'node_modules/semver/semver.js', 'node_modules/shallow-equals/index.js', 'node_modules/socketcluster-client/index.js', 'node_modules/socketcluster-client/lib/auth.js', 'node_modules/socketcluster-client/lib/factory.js', 'node_modules/socketcluster-client/lib/scclientsocket.js', 'node_modules/socketcluster-client/lib/sctransport.js', 'node_modules/socketcluster-client/node_modules/sc-errors/decycle.js', 'node_modules/socketcluster-client/node_modules/sc-errors/index.js', 'node_modules/stacktrace-parser/index.js', 'node_modules/stacktrace-parser/lib/stacktrace-parser.js', 'node_modules/symbol-observable/lib/index.js', 'node_modules/symbol-observable/lib/ponyfill.js', 'node_modules/tinycolor2/tinycolor.js', 'node_modules/url-parse/index.js', 'share_extension/android/extension.js', 'share_extension/android/extension_channels/extension_channel_item.js', 'share_extension/android/extension_channels/extension_channels.js', 'share_extension/android/extension_channels/index.js', 'share_extension/android/extension_post/channel_button/channel_button.js', 'share_extension/android/extension_post/channel_button/index.js', 'share_extension/android/extension_post/extension_post.js', 'share_extension/android/extension_post/index.js', 'share_extension/android/extension_post/team_button/index.js', 'share_extension/android/extension_post/team_button/team_button.js', 'share_extension/android/extension_teams/extension_teams.js', 'share_extension/android/extension_teams/index.js', 'share_extension/android/extension_teams/team_item/index.js', 'share_extension/android/extension_teams/team_item/team_item.js', 'share_extension/android/index.js', 'share_extension/android/navigation.js', 'share_extension/common/icons/channel_type.js', 'share_extension/common/icons/excel.js', 'share_extension/common/icons/generic.js', 'share_extension/common/icons/index.js', 'share_extension/common/icons/pdf.js', 'share_extension/common/icons/ppt.js', 'share_extension/common/icons/zip.js']; diff --git a/packager/modulePaths.js b/packager/modulePaths.js index 9a7b7f8cb..f7c4143d5 100644 --- a/packager/modulePaths.js +++ b/packager/modulePaths.js @@ -2,6 +2,8 @@ // See LICENSE.txt for license information. module.exports = ['./node_modules/app/app.js', './node_modules/app/components/app_icon.js', + './node_modules/app/components/at_mention/at_mention.js', + './node_modules/app/components/at_mention/index.js', './node_modules/app/components/attachment_button.js', './node_modules/app/components/badge.js', './node_modules/app/components/channel_icon.js', @@ -25,6 +27,7 @@ module.exports = ['./node_modules/app/app.js', './node_modules/app/components/layout/keyboard_layout/index.js', './node_modules/app/components/layout/keyboard_layout/keyboard_layout.js', './node_modules/app/components/loading.js', + './node_modules/app/components/markdown/hashtag.js', './node_modules/app/components/markdown/index.js', './node_modules/app/components/markdown/markdown.js', './node_modules/app/components/markdown/markdown_block_quote.js', @@ -55,8 +58,8 @@ module.exports = ['./node_modules/app/app.js', './node_modules/app/components/post_list/date_header/index.js', './node_modules/app/components/post_list/index.js', './node_modules/app/components/post_list/new_messages_divider.js', - './node_modules/app/components/post_list/post_list.js', - './node_modules/app/components/post_list/with_layout.js', + './node_modules/app/components/post_list/post_list.android.js', + './node_modules/app/components/post_list/post_list_base.js', './node_modules/app/components/post_list_retry.js', './node_modules/app/components/post_profile_picture/index.js', './node_modules/app/components/post_profile_picture/post_profile_picture.js', @@ -68,7 +71,6 @@ module.exports = ['./node_modules/app/app.js', './node_modules/app/components/profile_picture/profile_picture.js', './node_modules/app/components/progressive_image/index.js', './node_modules/app/components/progressive_image/progressive_image.js', - './node_modules/app/components/quick_text_input.js', './node_modules/app/components/reply_icon.js', './node_modules/app/components/safe_area_view/index.js', './node_modules/app/components/safe_area_view/safe_area_view.android.js', @@ -115,6 +117,7 @@ module.exports = ['./node_modules/app/app.js', './node_modules/app/reducers/views/i18n.js', './node_modules/app/reducers/views/index.js', './node_modules/app/reducers/views/login.js', + './node_modules/app/reducers/views/post.js', './node_modules/app/reducers/views/recent_emojis.js', './node_modules/app/reducers/views/root.js', './node_modules/app/reducers/views/search.js', @@ -145,14 +148,35 @@ module.exports = ['./node_modules/app/app.js', './node_modules/app/utils/avoid_native_bridge.js', './node_modules/app/utils/client_upgrade.js', './node_modules/app/utils/general.js', + './node_modules/app/utils/i18n.js', './node_modules/app/utils/image_cache_manager.js', './node_modules/app/utils/network.js', './node_modules/app/utils/push_notifications.js', './node_modules/app/utils/sentry/middleware.js', - './node_modules/app/utils/i18n.js', './node_modules/app/utils/theme.js', './node_modules/app/utils/time_tracker.js', './node_modules/index.js', + './node_modules/node_modules/@babel/runtime/helpers/arrayWithHoles.js', + './node_modules/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js', + './node_modules/node_modules/@babel/runtime/helpers/assertThisInitialized.js', + './node_modules/node_modules/@babel/runtime/helpers/classCallCheck.js', + './node_modules/node_modules/@babel/runtime/helpers/createClass.js', + './node_modules/node_modules/@babel/runtime/helpers/defineProperty.js', + './node_modules/node_modules/@babel/runtime/helpers/extends.js', + './node_modules/node_modules/@babel/runtime/helpers/get.js', + './node_modules/node_modules/@babel/runtime/helpers/getPrototypeOf.js', + './node_modules/node_modules/@babel/runtime/helpers/inherits.js', + './node_modules/node_modules/@babel/runtime/helpers/interopRequireDefault.js', + './node_modules/node_modules/@babel/runtime/helpers/interopRequireWildcard.js', + './node_modules/node_modules/@babel/runtime/helpers/objectSpread.js', + './node_modules/node_modules/@babel/runtime/helpers/objectWithoutProperties.js', + './node_modules/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js', + './node_modules/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js', + './node_modules/node_modules/@babel/runtime/helpers/setPrototypeOf.js', + './node_modules/node_modules/@babel/runtime/helpers/slicedToArray.js', + './node_modules/node_modules/@babel/runtime/helpers/toConsumableArray.js', + './node_modules/node_modules/@babel/runtime/helpers/typeof.js', + './node_modules/node_modules/@babel/runtime/regenerator/index.js', './node_modules/node_modules/base-64/base64.js', './node_modules/node_modules/clamp/index.js', './node_modules/node_modules/color-convert/conversions.js', @@ -408,6 +432,11 @@ module.exports = ['./node_modules/app/app.js', './node_modules/node_modules/react-native-notifications/notification.android.js', './node_modules/node_modules/react-native-permissions/index.js', './node_modules/node_modules/react-native-permissions/lib/permissions.android.js', + './node_modules/node_modules/react-native-recyclerview-list/index.js', + './node_modules/node_modules/react-native-recyclerview-list/src/Constants.js', + './node_modules/node_modules/react-native-recyclerview-list/src/DataSource.js', + './node_modules/node_modules/react-native-recyclerview-list/src/RecyclerRefresh.js', + './node_modules/node_modules/react-native-recyclerview-list/src/RecyclerViewList.js', './node_modules/node_modules/react-native-svg/elements/Circle.js', './node_modules/node_modules/react-native-svg/elements/ClipPath.js', './node_modules/node_modules/react-native-svg/elements/Defs.js', @@ -416,7 +445,9 @@ module.exports = ['./node_modules/app/app.js', './node_modules/node_modules/react-native-svg/elements/Image.js', './node_modules/node_modules/react-native-svg/elements/Line.js', './node_modules/node_modules/react-native-svg/elements/LinearGradient.js', + './node_modules/node_modules/react-native-svg/elements/Mask.js', './node_modules/node_modules/react-native-svg/elements/Path.js', + './node_modules/node_modules/react-native-svg/elements/Pattern.js', './node_modules/node_modules/react-native-svg/elements/Polygon.js', './node_modules/node_modules/react-native-svg/elements/Polyline.js', './node_modules/node_modules/react-native-svg/elements/RadialGradient.js', @@ -668,6 +699,8 @@ module.exports = ['./node_modules/app/app.js', './node_modules/node_modules/redux-persist/lib/utils/isStatePlainEnough.js', './node_modules/node_modules/redux-persist/lib/utils/setImmediate.js', './node_modules/node_modules/redux/lib/redux.js', + './node_modules/node_modules/regenerator-runtime/runtime-module.js', + './node_modules/node_modules/regenerator-runtime/runtime.js', './node_modules/node_modules/reselect/lib/index.js', './node_modules/node_modules/rn-fetch-blob/android.js', './node_modules/node_modules/rn-fetch-blob/cba/index.js', @@ -713,8 +746,6 @@ module.exports = ['./node_modules/app/app.js', './node_modules/node_modules/schedule/tracking.js', './node_modules/node_modules/semver/semver.js', './node_modules/node_modules/shallow-equals/index.js', - './node_modules/node_modules/stacktrace-parser/index.js', - './node_modules/node_modules/stacktrace-parser/lib/stacktrace-parser.js', './node_modules/node_modules/symbol-observable/lib/index.js', './node_modules/node_modules/symbol-observable/lib/ponyfill.js', './node_modules/node_modules/tinycolor2/tinycolor.js',