UNPKG

avlmap

Version:
109 lines (96 loc) 2.47 kB
import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { scaleTime } from 'd3-scale'; import { select } from 'd3-selection'; import { axisBottom } from 'd3-axis'; import { createSelector } from 'reselect'; import styled from 'styled-components'; const TimeSliderContainer = styled.svg` pointer-events: none; position: absolute; top: 0; .axis text { font-size: 9px; fill: ${props => props.theme.textColor}; } .axis line, .axis path { fill: none; stroke: ${props => props.theme.sliderBarBgd}; shape-rendering: crispEdges; stroke-width: 2; } .axis .domain { display: none; } .value { fill: ${props => props.theme.textColor}; font-size: 10px; &.start { text-anchor: start; } &.end { text-anchor: end; } } `; const height = 30; export default class TimeSliderMarker extends Component { componentDidMount() { this._updateAxis(this.scaleSelector(this.props)); } componentWillReceiveProps(nextProps) { if (this.scaleSelector(this.props) !== this.scaleSelector(nextProps)) { this._updateAxis(this.scaleSelector(nextProps)); } } domainSelector = props => props.domain; widthSelector = props => props.width; scaleSelector = createSelector( this.domainSelector, this.widthSelector, (domain, width) => Array.isArray(domain) // ? scaleUtc() ? scaleTime() .domain(domain) .range([0, width]) .clamp(true) : null ); _updateAxis(scale) { if (!scale) { return; } // console.log("<time-slider-marker> DOMAIN:",scale.domain()) // console.log("<time-slider-marker> RANGE:",scale.range()) // console.log("?????", scale.invert(0), scale.invert(this.props.width)) const xAxis = axisBottom(scale) .ticks(4) .tickSize(8) .tickPadding(6); const svg = select(this.svgContainer); svg .select('.x.axis') .call(xAxis) .selectAll('text'); } render() { return ( <TimeSliderContainer className="time-slider-marker" width={this.props.width} height={height} ref={comp => { this.svgContainer = comp; }} > <g className="x axis" transform="translate(0, 0)" /> </TimeSliderContainer> ); } }; TimeSliderMarker.propTypes = { domain: PropTypes.arrayOf(PropTypes.any).isRequired, width: PropTypes.number.isRequired };