1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import React from 'react';
- import { Provider } from 'react-redux';
- import PropTypes from 'prop-types';
- import configureStore from '../store/configureStore';
- import { BrowserRouter, Route } from 'react-router-dom';
- import { ScrollContext } from 'react-router-scroll-4';
- import UI from '../features/ui';
- import { fetchCustomEmojis } from '../actions/custom_emojis';
- import { hydrateStore } from '../actions/store';
- import { connectUserStream } from '../actions/streaming';
- import { IntlProvider, addLocaleData } from 'react-intl';
- import { getLocale } from '../locales';
- import initialState from '../initial_state';
- import ErrorBoundary from '../components/error_boundary';
- const { localeData, messages } = getLocale();
- addLocaleData(localeData);
- export const store = configureStore();
- const hydrateAction = hydrateStore(initialState);
- store.dispatch(hydrateAction);
- store.dispatch(fetchCustomEmojis());
- const createIdentityContext = state => ({
- signedIn: !!state.meta.me,
- accountId: state.meta.me,
- accessToken: state.meta.access_token,
- permissions: state.role.permissions,
- });
- export default class Mastodon extends React.PureComponent {
- static propTypes = {
- locale: PropTypes.string.isRequired,
- };
- static childContextTypes = {
- identity: PropTypes.shape({
- signedIn: PropTypes.bool.isRequired,
- accountId: PropTypes.string,
- accessToken: PropTypes.string,
- }).isRequired,
- };
- identity = createIdentityContext(initialState);
- getChildContext() {
- return {
- identity: this.identity,
- };
- }
- componentDidMount() {
- if (this.identity.signedIn) {
- this.disconnect = store.dispatch(connectUserStream());
- }
- }
- componentWillUnmount () {
- if (this.disconnect) {
- this.disconnect();
- this.disconnect = null;
- }
- }
- shouldUpdateScroll (prevRouterProps, { location }) {
- return !(location.state?.mastodonModalKey && location.state?.mastodonModalKey !== prevRouterProps?.location?.state?.mastodonModalKey);
- }
- render () {
- const { locale } = this.props;
- return (
- <IntlProvider locale={locale} messages={messages}>
- <Provider store={store}>
- <ErrorBoundary>
- <BrowserRouter basename='/web'>
- <ScrollContext shouldUpdateScroll={this.shouldUpdateScroll}>
- <Route path='/' component={UI} />
- </ScrollContext>
- </BrowserRouter>
- </ErrorBoundary>
- </Provider>
- </IntlProvider>
- );
- }
- }
|