import preloader from '@fortawesome/fontawesome-free-solid/faCircleNotch'; import FontAwesomeIcon from '@fortawesome/react-fontawesome'; import { isEmpty, mapObjIndexed, pick } from 'ramda'; import React from 'react'; import { Doughnut, HorizontalBar } from 'react-chartjs-2'; import Moment from 'react-moment'; import { connect } from 'react-redux'; import { Card, CardBody, CardHeader, UncontrolledTooltip } from 'reactstrap'; import PropTypes from 'prop-types'; import DateInput from '../common/DateInput'; import MutedMessage from '../utils/MuttedMessage'; import ExternalLink from '../utils/ExternalLink'; import { serverType } from '../servers/prop-types/index'; import { getShortUrlVisits, shortUrlVisitsType } from './reducers/shortUrlVisits'; import { processOsStats, processBrowserStats, processCountriesStats, processReferrersStats, } from './services/VisitsParser'; import './ShortUrlVisits.scss'; export class ShortUrlsVisitsComponent extends React.Component { static propTypes = { processOsStats: PropTypes.func, processBrowserStats: PropTypes.func, processCountriesStats: PropTypes.func, processReferrersStats: PropTypes.func, match: PropTypes.object, getShortUrlVisits: PropTypes.func, selectedServer: serverType, shortUrlVisits: shortUrlVisitsType, }; static defaultProps = { processOsStats, processBrowserStats, processCountriesStats, processReferrersStats, }; state = { startDate: undefined, endDate: undefined }; loadVisits = () => { const { match: { params }, getShortUrlVisits } = this.props; getShortUrlVisits(params.shortCode, mapObjIndexed( (value) => value && value.format ? value.format('YYYY-MM-DD') : value, this.state )); }; componentDidMount() { this.loadVisits(); } render() { const { match: { params }, selectedServer, processOsStats, processBrowserStats, processCountriesStats, processReferrersStats, shortUrlVisits: { visits, loading, error, shortUrl }, } = this.props; const serverUrl = selectedServer ? selectedServer.url : ''; const shortLink = `${serverUrl}/${params.shortCode}`; const generateGraphData = (stats, label, isBarChart) => ({ labels: Object.keys(stats), datasets: [ { label, data: Object.values(stats), backgroundColor: isBarChart ? 'rgba(70, 150, 229, 0.4)' : [ '#97BBCD', '#DCDCDC', '#F7464A', '#46BFBD', '#FDB45C', '#949FB1', '#4D5360', ], borderColor: isBarChart ? 'rgba(70, 150, 229, 1)' : 'white', borderWidth: 2, }, ], }); const renderGraphCard = (title, stats, isBarChart, label) => (