-
chrisgarrity authored
Added language-selector component and container. Replaced lib/intl.jsx with reducers/intl.js and added updateIntl to handle language changes. Moved languages.json into src
chrisgarrity authoredAdded language-selector component and container. Replaced lib/intl.jsx with reducers/intl.js and added updateIntl to handle language changes. Moved languages.json into src
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
index.jsx 2.44 KiB
import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux';
import {createStore, applyMiddleware, compose} from 'redux';
import throttle from 'redux-throttle';
import {intlInitialState, IntlProvider} from './reducers/intl.js';
import GUI from './containers/gui.jsx';
import log from './lib/log';
import ProjectLoader from './lib/project-loader';
import reducer from './reducers/gui';
import styles from './index.css';
class App extends React.Component {
constructor (props) {
super(props);
this.fetchProjectId = this.fetchProjectId.bind(this);
this.updateProject = this.updateProject.bind(this);
this.state = {
projectId: null,
projectData: this.fetchProjectId().length ? null : JSON.stringify(ProjectLoader.DEFAULT_PROJECT_DATA)
};
}
componentDidMount () {
window.addEventListener('hashchange', this.updateProject);
this.updateProject();
}
componentWillUnmount () {
window.removeEventListener('hashchange', this.updateProject);
}
fetchProjectId () {
return window.location.hash.substring(1);
}
updateProject () {
const projectId = this.fetchProjectId();
if (projectId !== this.state.projectId) {
if (projectId.length < 1) {
return this.setState({
projectId: projectId,
projectData: JSON.stringify(ProjectLoader.DEFAULT_PROJECT_DATA)
});
}
ProjectLoader.load(projectId, (err, body) => {
if (err) return log.error(err);
this.setState({projectData: body});
});
this.setState({projectId: projectId});
}
}
render () {
if (this.state.projectData === null) return null;
return (
<GUI
projectData={this.state.projectData}
/>
);
}
}
const appTarget = document.createElement('div');
appTarget.className = styles.app;
document.body.appendChild(appTarget);
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const enhancer = composeEnhancers(
applyMiddleware(
throttle(300, {leading: true, trailing: true})
)
);
const store = createStore(reducer, intlInitialState, enhancer);
ReactDOM.render((
<Provider store={store}>
<IntlProvider>
<App />
</IntlProvider>
</Provider>
), appTarget);