Skip to content

Commit

Permalink
Rework providers and the rest root components (#1148)
Browse files Browse the repository at this point in the history
  • Loading branch information
borisyankov committed Sep 10, 2017
1 parent 59324dd commit 5b16724
Show file tree
Hide file tree
Showing 21 changed files with 196 additions and 172 deletions.
39 changes: 0 additions & 39 deletions src/Providers.js

This file was deleted.

24 changes: 22 additions & 2 deletions src/ZulipMobile.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,14 @@ import React from 'react';
import { Sentry } from 'react-native-sentry';

import '../vendor/intl/intl';
import StoreHydrator from './StoreHydrator';
import config from './config';
import StoreProvider from './boot/StoreProvider';
import TranslationProvider from './boot/TranslationProvider';
import StylesProvider from './boot/StylesProvider';
import CompatibilityChecker from './boot/CompatibilityChecker';
import AppEventHandlers from './boot/AppEventHandlers';
import AppDataFetcher from './boot/AppDataFetcher';
import AppWithNavigationState from './nav/AppWithNavigationState';

require('./i18n/locale');

Expand All @@ -14,4 +20,18 @@ if (config.enableSentry) {
Sentry.config(config.sentryKey).install();
}

export default () => <StoreHydrator />;
export default () => (
<StoreProvider>
<TranslationProvider>
<StylesProvider>
<CompatibilityChecker>
<AppEventHandlers>
<AppDataFetcher>
<AppWithNavigationState />
</AppDataFetcher>
</AppEventHandlers>
</CompatibilityChecker>
</StylesProvider>
</TranslationProvider>
</StoreProvider>
);
37 changes: 37 additions & 0 deletions src/boot/AppDataFetcher.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/* @flow */
import { PureComponent } from 'react';
import { connect } from 'react-redux';

import { Actions } from '../types';
import boundActions from '../boundActions';

class AppDataFetcher extends PureComponent {
props: {
needsInitialFetch: boolean,
actions: Actions,
children?: any,
};

componentWillMount = () => this.init(this.props);

componentWillReceiveProps = nextProps => this.init(nextProps);

init = props => {
const { actions, needsInitialFetch } = props;

if (needsInitialFetch) {
actions.doInitialFetch();
}
};

render() {
return this.props.children;
}
}

export default connect(
state => ({
needsInitialFetch: state.app.needsInitialFetch,
}),
boundActions,
)(AppDataFetcher);
34 changes: 7 additions & 27 deletions src/nav/AppContainer.js → src/boot/AppEventHandlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,18 @@ import { connect } from 'react-redux';

import { Auth, Actions } from '../types';
import boundActions from '../boundActions';
import AppWithNavigationState from './AppWithNavigationState';
import { getAuth, getNavigationIndex } from '../selectors';
import { registerAppActivity } from '../utils/activity';
import LoadingScreen from '../start/LoadingScreen';

type Props = {
auth: Auth,
navIndex: number,
isHydrated: boolean,
needsInitialFetch: boolean,
actions: Actions,
children?: any,
};

class AppContainer extends PureComponent {
class AppEventHandlers extends PureComponent {
static contextTypes = {
styles: () => null,
};
Expand Down Expand Up @@ -67,32 +65,15 @@ class AppContainer extends PureComponent {

componentWillUnmount() {
NetInfo.isConnected.removeEventListener('change', this.handleConnectivityChange);
AppState.addEventListener('change', this.handleAppStateChange);
AppState.addEventListener('memoryWarning', this.handleMemoryWarning);
AppState.removeEventListener('change', this.handleAppStateChange);
AppState.removeEventListener('memoryWarning', this.handleMemoryWarning);
BackHandler.removeEventListener('hardwareBackPress', this.handleBackButtonPress);
}

componentWillMount = () => this.init(this.props);

componentWillReceiveProps = nextProps => this.init(nextProps);

init = props => {
const { actions, needsInitialFetch } = props;

if (needsInitialFetch) {
actions.doInitialFetch();
}
};

render() {
const { isHydrated } = this.props;

if (!isHydrated) {
return <LoadingScreen />;
}

return (
<View style={this.context.styles.screen} onLayout={this.handleLayout}>
<AppWithNavigationState />
{this.props.children}
</View>
);
}
Expand All @@ -101,9 +82,8 @@ class AppContainer extends PureComponent {
export default connect(
state => ({
auth: getAuth(state),
isHydrated: state.app.isHydrated,
needsInitialFetch: state.app.needsInitialFetch,
navIndex: getNavigationIndex(state),
}),
boundActions,
)(AppContainer);
)(AppEventHandlers);
File renamed without changes.
13 changes: 2 additions & 11 deletions src/StoreHydrator.js → src/boot/StoreProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,9 @@ import React, { PureComponent } from 'react';
import { Provider } from 'react-redux';

import store, { restore } from './store';
import timing from './utils/timing';
import Providers from './Providers';
import timing from '../utils/timing';

export default class StoreHydrator extends PureComponent {
state: {
isHydrated: boolean,
};

componentWillMount() {
timing.start('Store hydration');
restore(() => {
Expand All @@ -19,10 +14,6 @@ export default class StoreHydrator extends PureComponent {
}

render() {
return (
<Provider store={store}>
<Providers />
</Provider>
);
return <Provider store={store}>{this.props.children}</Provider>;
}
}
21 changes: 15 additions & 6 deletions src/StylesProvider.js → src/boot/StylesProvider.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
/* @flow */
import { Children, PureComponent } from 'react';
import React, { PureComponent } from 'react';
import { StyleSheet } from 'react-native';
import { connect } from 'react-redux';

import themeCreator from './styles/theme';
import themeDark from './styles/themeDark';
import themeLight from './styles/themeLight';
import themeCreator from '../styles/theme';
import themeDark from '../styles/themeDark';
import themeLight from '../styles/themeLight';

const themeNameToObject = {
default: themeLight,
light: themeLight,
night: themeDark,
};

export default class StyleProvider extends PureComponent {
const Dummy = props => props.children;

class StyleProvider extends PureComponent {
props: {
theme: string,
children?: any,
Expand All @@ -34,6 +37,12 @@ export default class StyleProvider extends PureComponent {
}

render() {
return Children.only(this.props.children);
const { children, theme } = this.props;

return <Dummy key={theme}>{children}</Dummy>;
}
}

export default connect(state => ({
theme: state.settings.theme,
}))(StyleProvider);
31 changes: 31 additions & 0 deletions src/boot/TranslationProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/* @flow */
import React, { PureComponent } from 'react';
import { Text } from 'react-native';
import { connect } from 'react-redux';
import { IntlProvider } from 'react-intl';

import '../../vendor/intl/intl';
import messages from '../i18n/messages';

require('../i18n/locale');

class TranslationProvider extends PureComponent {
props: {
locale: string,
children?: any,
};

render() {
const { locale, children } = this.props;

return (
<IntlProvider key={locale} locale={locale} textComponent={Text} messages={messages[locale]}>
{children}
</IntlProvider>
);
}
}

export default connect(state => ({
locale: state.settings.locale,
}))(TranslationProvider);
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import { View } from 'react-native';

import { rendererWithStyle } from '../utils/tests';
import { rendererWithStyle } from '../../utils/tests';

describe('StylesProvider', () => {
test('renders', () => {
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion src/middleware.js → src/boot/middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { createLogger } from 'redux-logger';
import { REHYDRATE } from 'redux-persist/constants';
import createActionBuffer from 'redux-action-buffer';

import config from './config';
import config from '../config';

const middleware = [thunk, createActionBuffer(REHYDRATE)];

Expand Down
59 changes: 59 additions & 0 deletions src/boot/reducers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/* @flow */
import { combineReducers } from 'redux';

import config from '../config';
import { enableBatching, logSlowReducers } from '../utils/redux';

import accounts from '../account/accountReducers';
import alertWords from '../alertWords/alertWordsReducer';
import app from '../app/appReducers';
import caughtUp from '../caughtup/caughtUpReducers';
import chat from '../chat/chatReducers';
import fetching from '../chat/fetchingReducers';
import flags from '../chat/flagsReducers';
import mute from '../mute/muteReducers';
import nav from '../nav/navReducers';
import realm from '../realm/realmReducers';
import outbox from '../outbox/outboxReducers';
import drafts from '../drafts/draftsReducers';
import settings from '../settings/settingsReducers';
import streams from '../streams/streamsReducers';
import subscriptions from '../subscriptions/subscriptionsReducers';
import typing from '../typing/typingReducers';
import unreadStreams from '../unread/unreadStreamsReducers';
import unreadPms from '../unread/unreadPmsReducers';
import unreadHuddles from '../unread/unreadHuddlesReducers';
import unreadMentions from '../unread/unreadMentionsReducers';
import users from '../users/usersReducers';
import presence from '../presence/presenceReducers';

const reducers = {
accounts,
alertWords,
app,
caughtUp,
chat,
fetching,
drafts,
flags,
mute,
nav,
presence,
realm,
outbox,
settings,
streams,
subscriptions,
typing,
unread: combineReducers({
streams: unreadStreams,
pms: unreadPms,
huddles: unreadHuddles,
mentions: unreadMentions,
}),
users,
};

export default enableBatching(
combineReducers(config.enableReduxSlowReducerWarnings ? logSlowReducers(reducers) : reducers),
);
File renamed without changes.
2 changes: 1 addition & 1 deletion src/html/__tests__/HtmlNodeTag-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import ReactTestRenderer from 'react-test-renderer';
import { Provider } from 'react-redux';

import store from '../../store';
import store from '../../boot/store';
import HtmlNodeTag from '../HtmlNodeTag';

describe('HtmlNodeTag', () => {
Expand Down
11 changes: 0 additions & 11 deletions src/html/__tests__/HtmlNodeText-test.js

This file was deleted.

2 changes: 1 addition & 1 deletion src/html/__tests__/renderHtmlChildren-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { View } from 'react-native';
import ReactTestRenderer from 'react-test-renderer';
import { Provider } from 'react-redux';

import store from '../../store';
import store from '../../boot/store';
import htmlToDomTree from '../htmlToDomTree';
import renderHtmlChildren from '../renderHtmlChildren';

Expand Down

0 comments on commit 5b16724

Please sign in to comment.