2020-03-27 13:59:38 -07:00
'use strict' ;
import React from 'react' ;
import { Provider , connect } from 'react-redux' ;
import PropTypes from 'prop-types' ;
2020-06-07 15:30:47 -07:00
import ImmutablePropTypes from 'react-immutable-proptypes' ;
2020-05-28 15:52:07 -07:00
import SoapboxPropTypes from 'soapbox/utils/soapbox_prop_types' ;
import Helmet from 'soapbox/components/helmet' ;
2020-04-21 13:05:49 -07:00
import classNames from 'classnames' ;
2020-03-27 13:59:38 -07:00
import configureStore from '../store/configureStore' ;
import { INTRODUCTION _VERSION } from '../actions/onboarding' ;
2020-04-08 16:38:22 -07:00
import { Switch , BrowserRouter , Route } from 'react-router-dom' ;
2020-03-27 13:59:38 -07:00
import { ScrollContext } from 'react-router-scroll-4' ;
import UI from '../features/ui' ;
2020-04-14 13:45:38 -07:00
// import Introduction from '../features/introduction';
2020-03-27 13:59:38 -07:00
import { fetchCustomEmojis } from '../actions/custom_emojis' ;
2020-08-24 13:23:05 -07:00
import { preload } from '../actions/preload' ;
2020-06-04 16:34:28 -07:00
import { IntlProvider } from 'react-intl' ;
2020-03-27 13:59:38 -07:00
import ErrorBoundary from '../components/error_boundary' ;
2020-05-28 15:52:07 -07:00
import { fetchInstance } from 'soapbox/actions/instance' ;
import { fetchSoapboxConfig } from 'soapbox/actions/soapbox' ;
import { fetchMe } from 'soapbox/actions/me' ;
import PublicLayout from 'soapbox/features/public_layout' ;
import { getSettings } from 'soapbox/actions/settings' ;
2020-08-23 13:56:18 -07:00
import { getSoapboxConfig } from 'soapbox/actions/soapbox' ;
2020-06-02 13:48:27 -07:00
import { generateThemeCss } from 'soapbox/utils/theme' ;
2020-06-04 16:34:28 -07:00
import messages from 'soapbox/locales/messages' ;
2020-03-27 13:59:38 -07:00
2020-06-04 19:48:45 -07:00
const validLocale = locale => Object . keys ( messages ) . includes ( locale ) ;
2020-03-27 13:59:38 -07:00
export const store = configureStore ( ) ;
2020-08-24 13:23:05 -07:00
store . dispatch ( preload ( ) ) ;
2020-04-01 19:20:47 -07:00
store . dispatch ( fetchMe ( ) ) ;
2020-04-01 13:05:52 -07:00
store . dispatch ( fetchInstance ( ) ) ;
2020-04-01 12:38:08 -07:00
store . dispatch ( fetchSoapboxConfig ( ) ) ;
2020-04-01 13:05:52 -07:00
store . dispatch ( fetchCustomEmojis ( ) ) ;
2020-03-27 13:59:38 -07:00
const mapStateToProps = ( state ) => {
2020-04-01 19:20:47 -07:00
const me = state . get ( 'me' ) ;
2020-03-27 13:59:38 -07:00
const account = state . getIn ( [ 'accounts' , me ] ) ;
const showIntroduction = account ? state . getIn ( [ 'settings' , 'introductionVersion' ] , 0 ) < INTRODUCTION _VERSION : false ;
2020-04-28 11:49:39 -07:00
const settings = getSettings ( state ) ;
2020-08-23 13:56:18 -07:00
const soapboxConfig = getSoapboxConfig ( state ) ;
2020-06-04 19:48:45 -07:00
const locale = settings . get ( 'locale' ) ;
2020-03-27 13:59:38 -07:00
return {
showIntroduction ,
2020-04-08 16:38:22 -07:00
me ,
2020-04-28 11:49:39 -07:00
reduceMotion : settings . get ( 'reduceMotion' ) ,
2021-07-28 07:03:14 -07:00
underlineLinks : settings . get ( 'underlineLinks' ) ,
2020-04-28 11:49:39 -07:00
systemFont : settings . get ( 'systemFont' ) ,
dyslexicFont : settings . get ( 'dyslexicFont' ) ,
demetricator : settings . get ( 'demetricator' ) ,
2020-06-04 19:48:45 -07:00
locale : validLocale ( locale ) ? locale : 'en' ,
2020-08-23 13:56:18 -07:00
themeCss : generateThemeCss ( soapboxConfig . get ( 'brandColor' ) ) ,
2020-06-02 10:16:26 -07:00
themeMode : settings . get ( 'themeMode' ) ,
2020-09-25 13:39:54 -07:00
halloween : settings . get ( 'halloween' ) ,
2020-08-23 13:56:18 -07:00
customCss : soapboxConfig . get ( 'customCss' ) ,
2020-04-14 11:44:40 -07:00
} ;
} ;
2020-03-27 13:59:38 -07:00
@ connect ( mapStateToProps )
2020-05-28 15:52:07 -07:00
class SoapboxMount extends React . PureComponent {
2020-03-27 13:59:38 -07:00
static propTypes = {
showIntroduction : PropTypes . bool ,
2020-04-27 11:56:26 -07:00
me : SoapboxPropTypes . me ,
2020-04-21 13:16:33 -07:00
reduceMotion : PropTypes . bool ,
2021-07-28 07:03:14 -07:00
underlineLinks : PropTypes . bool ,
2020-04-21 13:05:49 -07:00
systemFont : PropTypes . bool ,
2020-04-21 13:10:45 -07:00
dyslexicFont : PropTypes . bool ,
2020-04-21 13:14:06 -07:00
demetricator : PropTypes . bool ,
2020-04-28 13:25:10 -07:00
locale : PropTypes . string . isRequired ,
2020-05-30 17:05:01 -07:00
themeCss : PropTypes . string ,
2020-06-02 10:16:26 -07:00
themeMode : PropTypes . string ,
2020-06-07 15:30:47 -07:00
customCss : ImmutablePropTypes . list ,
2020-09-25 13:39:54 -07:00
halloween : PropTypes . bool ,
2020-05-30 17:05:01 -07:00
dispatch : PropTypes . func ,
2020-03-27 13:59:38 -07:00
} ;
2020-06-04 19:22:58 -07:00
state = {
messages : { } ,
localeLoading : true ,
}
setMessages = ( ) => {
messages [ this . props . locale ] ( ) . then ( messages => {
this . setState ( { messages , localeLoading : false } ) ;
} ) . catch ( ( ) => { } ) ;
}
maybeUpdateMessages = prevProps => {
if ( this . props . locale !== prevProps . locale ) {
this . setMessages ( ) ;
2021-08-03 12:22:51 -07:00
}
2020-06-04 19:22:58 -07:00
}
componentDidMount ( ) {
this . setMessages ( ) ;
}
componentDidUpdate ( prevProps ) {
this . maybeUpdateMessages ( prevProps ) ;
}
2020-04-14 14:47:35 -07:00
render ( ) {
2020-06-07 15:30:47 -07:00
const { me , themeCss , locale , customCss } = this . props ;
2020-04-14 13:45:38 -07:00
if ( me === null ) return null ;
2020-06-04 19:22:58 -07:00
if ( this . state . localeLoading ) return null ;
2020-04-08 16:38:22 -07:00
2020-03-27 13:59:38 -07:00
// Disabling introduction for launch
// const { showIntroduction } = this.props;
//
// if (showIntroduction) {
// return <Introduction />;
// }
2020-06-02 13:28:15 -07:00
const bodyClass = classNames ( 'app-body' , ` theme-mode- ${ this . props . themeMode } ` , {
'system-font' : this . props . systemFont ,
'no-reduce-motion' : ! this . props . reduceMotion ,
2021-07-28 07:03:14 -07:00
'underline-links' : this . props . underlineLinks ,
2020-06-02 13:28:15 -07:00
'dyslexic' : this . props . dyslexicFont ,
'demetricator' : this . props . demetricator ,
2020-09-25 13:39:54 -07:00
'halloween' : this . props . halloween ,
2020-04-21 13:05:49 -07:00
} ) ;
2020-03-27 13:59:38 -07:00
return (
2020-06-04 19:22:58 -07:00
< IntlProvider locale = { locale } messages = { this . state . messages } >
2021-04-22 11:57:47 -07:00
< ErrorBoundary >
2020-04-28 13:25:10 -07:00
< Helmet >
< body className = { bodyClass } / >
2020-05-30 17:05:01 -07:00
{ themeCss && < style id = 'theme' type = 'text/css' > { ` :root{ ${ themeCss } } ` } < / s t y l e > }
2020-06-07 15:30:47 -07:00
{ customCss && customCss . map ( css => (
< link rel = 'stylesheet' href = { css } key = { css } / >
) ) }
2020-04-28 13:25:10 -07:00
< / H e l m e t >
< BrowserRouter >
< ScrollContext >
< Switch >
{ ! me && < Route exact path = '/' component = { PublicLayout } / > }
< Route exact path = '/about/:slug?' component = { PublicLayout } / >
< Route path = '/' component = { UI } / >
< / S w i t c h >
< / S c r o l l C o n t e x t >
< / B r o w s e r R o u t e r >
2021-04-22 11:57:47 -07:00
< / E r r o r B o u n d a r y >
2020-04-28 13:25:10 -07:00
< / I n t l P r o v i d e r >
2020-03-27 13:59:38 -07:00
) ;
}
}
2020-05-28 15:52:07 -07:00
export default class Soapbox extends React . PureComponent {
2020-03-27 13:59:38 -07:00
2021-03-24 11:37:41 -07:00
printConsoleWarning = ( ) => {
/* eslint-disable no-console */
console . log ( '%cStop!' , [
'color: #ff0000' ,
'display: block' ,
'font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, "Helvetica Neue", sans-serif' ,
'font-size: 50px' ,
'font-weight: 800' ,
'padding: 4px 0' ,
] . join ( ';' ) ) ;
console . log ( '%cThis is a browser feature intended for developers. If someone told you to copy-paste something here it is a scam and will give them access to your account.' , [
'color: #111111' ,
'display: block' ,
'font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, "Helvetica Neue", sans-serif' ,
'font-size: 18px' ,
'padding: 4px 0 16px' ,
] . join ( ';' ) ) ;
/* eslint-enable no-console */
}
componentDidMount ( ) {
this . printConsoleWarning ( ) ;
}
2020-04-14 14:47:35 -07:00
render ( ) {
2020-03-27 13:59:38 -07:00
return (
2020-04-28 13:25:10 -07:00
< Provider store = { store } >
2021-04-22 11:57:47 -07:00
< SoapboxMount / >
2020-04-28 13:25:10 -07:00
< / P r o v i d e r >
2020-03-27 13:59:38 -07:00
) ;
}
}