Skip to content
Snippets Groups Projects
CompareChart.js 7.17 KiB
Newer Older
import React, { useState, useRef } from "react";
import ReactECharts from "echarts-for-react";
import { useCryptoList, useCryptoTimeSeriesRangeData } from "../../queries";
import moment from "moment";
Aggarwal Himanshu's avatar
Aggarwal Himanshu committed
import { ToggleButton } from "../button";
import Dropdown from "../dropdown/Dropdown";
import { ChevronDoubleRightIcon } from "@heroicons/react/outline";
import {
  FcScatterPlot,
  FcCandleSticks,
  FcBarChart,
  FcLineChart,
} from "react-icons/fc";

const unixNow = () => {
  return moment().unix();
};

const unixSubtractId = (id) => {
  return moment().subtract(id[0], id.substring(1)).unix();
};

const reorderCandlestickData = (data) => {
  if (!data) {
    return null;
  }
  const newData = [];
  for (let i = 0; i < data.length; i++) {
    newData.push([data[i][0], data[i][1], data[i][4], data[i][3], data[i][2]]);
  }
  return newData;
};

function CompareChart({ singleChart, selectionDisabled, selectedCurrency }) {
  const [timerange, setTimerange] = useState("6month");
  const [chartType, setChartType] = useState("line");
  const chartRef = useRef(null);
  const listOfCoins = useCryptoList("usd", 21, false);
  const [firstCrypto, setFirstCrypto] = useState(
    selectedCurrency ? selectedCurrency : "solana"
  );
Aggarwal Himanshu's avatar
Aggarwal Himanshu committed
  const [secondCrypto, setSecondCrypto] = useState("avalanche-2");
  const cryptoQuery = useCryptoTimeSeriesRangeData(
    unixSubtractId(timerange),
    unixNow(),
    chartType === "candlestick"
  );
  const cryptoQuery2 = useCryptoTimeSeriesRangeData(
    unixSubtractId(timerange),
    unixNow(),
    chartType === "candlestick"
  );

  const option = {
    tooltip: {
      trigger: "axis",
      axisPointer: {
        type: "shadow",
      },
    },
    grid: {
      bottom: 30,
      right: 10,
      top: 10,
      left: 50,
    },
    dataZoom: [
      {
        type: "inside",
      },
    ],
    xAxis: {
      type: "time",
      silent: false,
      splitLine: {
        show: false,
      },
      splitArea: {
        show: false,
      },
    },
    yAxis: {
      type: "value",
      splitArea: {
        show: false,
      },
      splitLine: {
        show: false,
      },
    },
    series: [
      {
        type: chartType,
        data:
          chartType === "candlestick" && cryptoQuery.data
            ? reorderCandlestickData(cryptoQuery.data)
            : cryptoQuery.data?.prices,
        name: firstCrypto,
        smooth: true,
        symbol: chartType === "scatter" ? "circle" : "none",
        symbolSize: 7,
        lineStyle: {
          width: 3,
          shadowOffsetY: 1,
          color: "#3590F3",
          shadowColor: "#1F51FF",
          shadowOffsetX: 1,
          shadowBlur: 10,
        },
        itemStyle:
          chartType === "candlestick"
            ? {
                color0: "#DE5E57",
                color: "#51A49A",
                borderColor0: "#DE5E57",
                borderColor: "#51A49A",
        type: chartType,
        data: singleChart
          ? null
          : chartType === "candlestick" && cryptoQuery2.data
          ? reorderCandlestickData(cryptoQuery2.data)
          : cryptoQuery2.data?.prices,
        name: secondCrypto,
        smooth: true,
        symbol: chartType === "scatter" ? "circle" : "none",
        symbolSize: 7,
        lineStyle: {
          width: 3,
          shadowOffsetY: 0,
          color: "#06D6A0",
          shadowColor: "#39FF14",
          shadowOffsetX: 1,
          shadowBlur: 10,
        },
        itemStyle:
          chartType === "candlestick"
            ? {
                color: "rgba(85, 69, 255, 1)",
                color0: "#EE7147",
                borderColor: "rgba(85, 69, 255, 1)",
                borderColor0: "#EE7147",
    <div className="bg-white shadow-lg dark:bg-dark-600 p-8 rounded-3xl overflow-x-hidden">
      <div className="flex flex-col justify-center xl:justify-between xl:flex-row items-center space-y-3 xl:space-y-0 xl:space-x-12">
        <div className="flex flex-row space-x-3 sm:space-x-6 md:space-x-10 xl:space-x-2">
          <ToggleButton
            id="1hour"
            active={timerange}
            setActive={setTimerange}
            tooltip="1 Hour"
          >
            1H
          </ToggleButton>
          <ToggleButton
            id="1day"
            active={timerange}
            setActive={setTimerange}
            tooltip="1 Day"
          >
            1D
          </ToggleButton>
          <ToggleButton
            id="1week"
            active={timerange}
            setActive={setTimerange}
            tooltip="1 Week"
          >
            1W
          </ToggleButton>
          <ToggleButton
            id="1month"
            active={timerange}
            setActive={setTimerange}
            tooltip="1 Month"
          >
            1M
          </ToggleButton>
          <ToggleButton
            id="6month"
            active={timerange}
            setActive={setTimerange}
            tooltip="6 Months"
          >
            6M
          </ToggleButton>
          <ToggleButton
            id="1year"
            active={timerange}
            setActive={setTimerange}
            tooltip="1 Year"
          >
            1Y
          </ToggleButton>
        </div>
        <div className="flex flex-row space-x-2 sm:space-x-6 md:space-x-10 xl:space-x-2">
          <ToggleButton
            id="line"
            active={chartType}
            setActive={setChartType}
            tooltip="Line"
          >
            <FcLineChart size={"1.6em"} />
          </ToggleButton>
          <ToggleButton
            id="bar"
            active={chartType}
            setActive={setChartType}
            tooltip="Bar"
          >
            <FcBarChart size={"1.6em"} />
          </ToggleButton>
          <ToggleButton
            id="scatter"
            active={chartType}
            setActive={setChartType}
            tooltip="Scatter"
          >
            <FcScatterPlot size={"1.6em"} />
          </ToggleButton>
          <ToggleButton
            id="candlestick"
            active={chartType}
            setActive={setChartType}
            tooltip="Candlestick"
          >
            <FcCandleSticks size={"1.6em"} />
          </ToggleButton>
        </div>
        {!selectionDisabled && (
          <div className="flex flex-row space-x-3 sm:space-x-6 md:space-x-10 xl:space-x-3 items-center">
            <Dropdown
              list={listOfCoins.isLoading ? [] : listOfCoins.data}
              value={firstCrypto}
              setValue={setFirstCrypto}
              disabled={[secondCrypto]}
            />
            <ChevronDoubleRightIcon className="w-5 h-5 dark:text-gray-300" />
            <Dropdown
              list={listOfCoins.isLoading ? [] : listOfCoins.data}
              value={secondCrypto}
              setValue={setSecondCrypto}
              disabled={[firstCrypto]}
            />
          </div>
        )}
      </div>
      <div className="h-[600px] mt-10">
        <ReactECharts
          ref={chartRef}
          option={option}
          style={{
            height: "100%",
          }}
        />
      </div>
    </div>
  );
}

export default CompareChart;