import React, { useState, useEffect, useMemo } from 'react'; import { useSpring, animated } from 'react-spring'; import classNames from 'classnames'; import { get } from 'lib/web'; import styles from './RankingsChart.module.css'; export default function RankingsChart({ title, websiteId, startDate, endDate, type, className, filterData, }) { const [data, setData] = useState(); const rankings = useMemo(() => (data && filterData ? filterData(data) : data), [data]); const total = useMemo(() => rankings?.reduce((n, { y }) => n + y, 0) || 0, [rankings]); async function loadData() { setData( await get(`/api/website/${websiteId}/rankings`, { start_at: +startDate, end_at: +endDate, type, }), ); } useEffect(() => { if (websiteId) { loadData(); } }, [websiteId, startDate, endDate, type]); if (!data) { return

loading...

; } return (
{title}
{rankings.map(({ x, y }, i) => (i <= 10 ? : null))}
); } const Row = ({ label, value, total }) => { const props = useSpring({ width: `${(value / total) * 100}%`, from: { width: '0%' } }); const valueProps = useSpring({ y: value, from: { y: 0 } }); return (
{label}
{valueProps.y.interpolate(y => y.toFixed(0))}
); };