/**
 * app entry
 */

import React, { Suspense } from 'react';
import ReactDOM from 'react-dom';
import moment from 'moment';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
import { PageLoading, ErrorBoundary } from '@stofe/sui-patcher';

// layout
import FrameworkLayout from '$src/layouts/FrameworkLayout';

// stores
import { Provider } from 'react-redux';
import store from '$src/stores';

// router
import routes from '$src/configs/routes';
import {
  isInIcestark,
  getBasename,
  getMountNode,
  registerAppEnter,
  registerAppLeave,
} from '@alicd/micro-stark';

// local dependencies
import './global.scss';
import './utils/time';

// set moment language
moment.locale('zh-cn');

// app
class App extends React.PureComponent {
  render() {
    return (
      <Provider store={store}>
        <BrowserRouter basename={getBasename()}>
          <FrameworkLayout>
            <ErrorBoundary>
              <Suspense fallback={<PageLoading />}>
                <Switch>
                  {routes.map((el, i) => {
                    return <Route {...el} key={i} />;
                  })}
                </Switch>
              </Suspense>
            </ErrorBoundary>
          </FrameworkLayout>
        </BrowserRouter>
      </Provider>
    );
  }
}
// mount to page
if (isInIcestark()) {
  const mountNode = getMountNode();
  registerAppEnter(() => {
    ReactDOM.render(<App />, mountNode);
  });
  // 注意务必保留 unmountComponentAtNode, 否则切换子应用时无法触发子应用的卸载（unmount）事件
  registerAppLeave(() => {
    ReactDOM.unmountComponentAtNode(mountNode);
  });
} else {
  ReactDOM.render(<App />, document.getElementById('root'));
}
