import React from 'react'; import Datamap from 'datamaps' import FadeIn from '../fade-in' import Bar from './bar' import MoreLink from './more-link' import * as api from '../api' export default class Countries extends React.Component { constructor(props) { super(props) this.resizeMap = this.resizeMap.bind(this) this.state = { loading: true } } componentDidMount() { this.fetchCountries() window.addEventListener('resize', this.resizeMap); } componentWillUnmount() { window.removeEventListener('resize', this.resizeMap); } componentDidUpdate(prevProps) { if (this.props.query !== prevProps.query) { this.setState({loading: true, countries: null}) this.fetchCountries() } } fetchCountries() { api.get(`/api/stats/${encodeURIComponent(this.props.site.domain)}/countries`, this.props.query) .then((res) => this.setState({loading: false, countries: res})) .then(() => this.drawMap()) } resizeMap() { this.map && this.map.resize() } drawMap() { var dataset = {}; var onlyValues = this.state.countries.map(function(obj){ return obj.count }); var minValue = Math.min.apply(null, onlyValues), maxValue = Math.max.apply(null, onlyValues); var paletteScale = d3.scale.linear() .domain([minValue,maxValue]) .range(["#f3ebff","#a779e9"]); this.state.countries.forEach(function(item){ dataset[item.name] = {numberOfThings: item.count, fillColor: paletteScale(item.count)}; }); this.map = new Datamap({ element: document.getElementById('map-container'), responsive: true, projection: 'mercator', fills: { defaultFill: '#f8fafc' }, data: dataset, geographyConfig: { borderColor: '#dae1e7', highlightBorderWidth: 2, highlightFillColor: function(geo) { return geo['fillColor'] || '#F5F5F5'; }, highlightBorderColor: '#a779e9', popupTemplate: function(geo, data) { if (!data) { return ; } return ['
', '', geo.properties.name, '', '
', data.numberOfThings, ' Visitors', '
'].join(''); } } }); } renderBody() { if (this.state.countries) { return (

Countries

) } } render() { return (
{ this.state.loading &&
} { this.renderBody() }
) } }