mirror of
https://github.com/bellingcat/ukraine-timemap.git
synced 2026-06-11 21:08:36 +03:00
76 lines
2.1 KiB
JavaScript
76 lines
2.1 KiB
JavaScript
import React from 'react';
|
|
import { connect } from 'react-redux';
|
|
import * as selectors from '../selectors';
|
|
import hash from 'object-hash';
|
|
|
|
import copy from '../js/data/copy.json';
|
|
import { formatterWithYear, isNotNullNorUndefined } from '../js/utilities';
|
|
import TimelineHeader from './presentational/TimelineHeader';
|
|
import TimelineLogic from '../js/timeline/timeline.js';
|
|
|
|
class Timeline extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
isFolded: false
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.timeline = new TimelineLogic(this.props.app, this.props.ui, this.props.methods);
|
|
this.timeline.update(this.props.domain, this.props.app);
|
|
}
|
|
|
|
componentWillReceiveProps(nextProps) {
|
|
if (hash(nextProps) !== hash(this.props)) {
|
|
this.timeline.update(nextProps.domain, nextProps.app);
|
|
}
|
|
}
|
|
|
|
onClickArrow() {
|
|
this.setState((prevState, props) => {
|
|
return {isFolded: !prevState.isFolded};
|
|
});
|
|
}
|
|
|
|
render() {
|
|
let classes = `timeline-wrapper ${(this.state.isFolded) ? ' folded' : ''}`;
|
|
classes += (this.props.app.narrative !== null) ? ' narrative-mode' : '';
|
|
return (
|
|
<div className={classes}>
|
|
<TimelineHeader
|
|
title={copy[this.props.app.language].timeline.info}
|
|
date0={formatterWithYear(this.props.app.timerange[0])}
|
|
date1={formatterWithYear(this.props.app.timerange[1])}
|
|
onClick={() => { this.onClickArrow(); }}
|
|
/>
|
|
<div className="timeline-content">
|
|
<div id={this.props.ui.dom.timeline} className="timeline" />
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
function mapStateToProps(state) {
|
|
return {
|
|
domain: {
|
|
events: state.domain.events,
|
|
categories: selectors.selectCategories(state),
|
|
narratives: state.domain.narratives
|
|
},
|
|
app: {
|
|
timerange: selectors.getTimeRange(state),
|
|
selected: state.app.selected,
|
|
language: state.app.language,
|
|
zoomLevels: state.app.zoomLevels,
|
|
narrative: state.app.narrative
|
|
},
|
|
ui: {
|
|
dom: state.ui.dom,
|
|
}
|
|
}
|
|
}
|
|
|
|
export default connect(mapStateToProps)(Timeline);
|