infect-frontend
Version:
infect fronend
106 lines (86 loc) • 4.48 kB
JavaScript
/**
* Bootstrap of the Infect application's frontend
*/
import { useStrict } from 'mobx';
import debug from 'debug';
import InfectApp from './infectApp';
import ReactDOM from 'react-dom';
import React from 'react'; // Not needed here, but error is thrown if we don't import it
import Matrix from './components/matrix/matrix';
import MatrixHeader from './components/matrix/matrixHeader';
import FilterList from './components/filterList/filterList';
import SelectedFiltersList from './components/selectedFilters/selectedFiltersList';
import FilterListMenu from './components/filterListMenu/filterListMenu';
import MatrixLoadingOverlay from './components/matrixLoadingOverlay/matrixLoadingOverlay';
import FilterSearch from './components/filterSearch/filterSearch';
import Disclaimer from './components/disclaimer/disclaimer';
import Notifications from './components/notifications/notifications';
import GuidedTour from './components/guidedTour/guidedTour';
import InfoOverlay from './components/infoOverlay/infoOverlay';
import InfoOverlayButton from './components/infoOverlay/infoOverlayButton';
// Models limited to web app
import GuidedTourModel from './models/guidedTour/guidedTour';
import InfoOverlayModel from './models/infoOverlay/infoOverlay';
const log = debug('infect:Main');
useStrict(true);
/* global window */
const isBeta = window.location.hostname.includes('beta.') ||
window.location.hostname === 'localhost';
// const envPrefix = isBeta ? 'beta.' : '';
const envPrefix = 'rda.';
log('Is beta? %o. envPrefix is %s', isBeta, envPrefix);
// const protocol = window.location.protocol;
const protocol = 'https:';
const config = {
endpoints: {
apiPrefix: `${protocol}//${envPrefix}infect.info/`,
bacteria: 'pathogen.bacterium',
antibiotics: 'substance.compound',
resistances: 'rda.data',
substanceClasses: 'substance.substanceClass',
regions: 'generics.region',
countries: 'generics.country',
ageGroups: 'generics.ageGroup',
},
};
// Setup models that are shared between mobile and web app
const app = new InfectApp(config);
const infoOverlayModel = new InfoOverlayModel();
const guidedTourModel = new GuidedTourModel(infoOverlayModel);
// React
log('views:', app.views);
/* global document */
function renderReact() {
ReactDOM.render(
<Matrix matrix={ app.views.matrix } filters={ app.filterValues }
selectedFilters={ app.selectedFilters } />,
document.querySelector('Matrix'),
);
ReactDOM.render(
<MatrixHeader matrix={ app.views.matrix } filters={ app.filterValues }
selectedFilters={ app.selectedFilters }/>,
document.querySelector('MatrixHeader'),
);
ReactDOM.render(
<FilterList mostUsedFilters={ app.mostUsedFilters } filterValues={ app.filterValues }
selectedFilters={ app.selectedFilters }
offsetFilters={ app.offsetFilters }/>,
document.querySelector('FilterList'),
);
ReactDOM.render(<SelectedFiltersList selectedFilters={ app.selectedFilters }/>, document.querySelector('SelectedFiltersList'));
ReactDOM.render(<FilterListMenu mostUsedFilters={ app.mostUsedFilters }/>, document.querySelector('FilterListMenu'));
ReactDOM.render(<FilterSearch filterValues={ app.filterValues } selectedFilters={ app.selectedFilters }/>, document.querySelector('FilterSearch'));
ReactDOM.render(<MatrixLoadingOverlay stores={ [app.bacteria, app.antibiotics, app.resistances, app.substanceClasses] } />, document.querySelector('MatrixLoadingOverlay'));
ReactDOM.render(<Disclaimer infoOverlay={ infoOverlayModel } guidedTour={ guidedTourModel }/>, document.querySelector('Disclaimer'));
ReactDOM.render(<GuidedTour guidedTour={ guidedTourModel }/>, document.querySelector('GuidedTour'));
ReactDOM.render(<InfoOverlay guidedTour={ guidedTourModel } infoOverlay={ infoOverlayModel }/>, document.querySelector('InfoOverlay'));
ReactDOM.render(<InfoOverlayButton infoOverlay={ infoOverlayModel }/>, document.querySelector('InfoOverlayButton'));
ReactDOM.render(
<Notifications/>,
document.querySelector('Notifications'),
);
}
// Edge fails on reloads, sometimes. *Might* be a caching issue where cached JS is executed before
// it appears in DOM. Wait until dom is loaded – just to be sure.
document.addEventListener('DOMContentLoaded', renderReact);
if (document.readyState !== 'loading') renderReact();