89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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,
 | |
| });
 | |
| 
 | |
| 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>
 | |
|     );
 | |
|   }
 | |
| 
 | |
| }
 |