import { ResponsiveBar } from '@nivo/bar'; import { queryTradingVolume } from '../api/bbgo'; import { useEffect, useState } from 'react'; function toPeriodDateString(time, period) { switch (period) { case 'day': return ( time.getFullYear() + '-' + (time.getMonth() + 1) + '-' + time.getDate() ); case 'month': return time.getFullYear() + '-' + (time.getMonth() + 1); case 'year': return time.getFullYear(); } return ( time.getFullYear() + '-' + (time.getMonth() + 1) + '-' + time.getDate() ); } function groupData(rows, period, segment) { let dateIndex = {}; let startTime = null; let endTime = null; let keys = {}; rows.forEach((v) => { const time = new Date(v.time); if (!startTime) { startTime = time; } endTime = time; const dateStr = toPeriodDateString(time, period); const key = v[segment]; keys[key] = true; const k = key ? key : 'total'; const quoteVolume = Math.round(v.quoteVolume * 100) / 100; if (dateIndex[dateStr]) { dateIndex[dateStr][k] = quoteVolume; } else { dateIndex[dateStr] = { date: dateStr, year: time.getFullYear(), month: time.getMonth() + 1, day: time.getDate(), [k]: quoteVolume, }; } }); let data = []; while (startTime < endTime) { const dateStr = toPeriodDateString(startTime, period); const groupData = dateIndex[dateStr]; if (groupData) { data.push(groupData); } else { data.push({ date: dateStr, year: startTime.getFullYear(), month: startTime.getMonth() + 1, day: startTime.getDate(), total: 0, }); } switch (period) { case 'day': startTime.setDate(startTime.getDate() + 1); break; case 'month': startTime.setMonth(startTime.getMonth() + 1); break; case 'year': startTime.setFullYear(startTime.getFullYear() + 1); break; } } return [data, Object.keys(keys)]; } export default function TradingVolumeBar(props) { const [tradingVolumes, setTradingVolumes] = useState([]); const [period, setPeriod] = useState(props.period); const [segment, setSegment] = useState(props.segment); useEffect(() => { if (props.period !== period) { setPeriod(props.period); } if (props.segment !== segment) { setSegment(props.segment); } queryTradingVolume( { period: props.period, segment: props.segment }, (tradingVolumes) => { setTradingVolumes(tradingVolumes); } ); }, [props.period, props.segment]); const [data, keys] = groupData(tradingVolumes, period, segment); return ( ); }