Area.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import subMonths from "date-fns/subMonths";
  2. import subHours from "date-fns/subHours";
  3. import formatDate from "date-fns/format";
  4. import subDays from "date-fns/subDays";
  5. import React, { FC } from "react";
  6. import {
  7. AreaChart,
  8. Area,
  9. XAxis,
  10. YAxis,
  11. CartesianGrid,
  12. ResponsiveContainer,
  13. Tooltip
  14. } from "recharts";
  15. interface Props {
  16. data: number[];
  17. period: string;
  18. }
  19. const ChartArea: FC<Props> = ({ data: rawData, period }) => {
  20. const now = new Date();
  21. const getDate = index => {
  22. switch (period) {
  23. case "allTime":
  24. return formatDate(
  25. subMonths(now, rawData.length - index - 1),
  26. "MMM yyy"
  27. );
  28. case "lastDay":
  29. return formatDate(subHours(now, rawData.length - index - 1), "HH:00");
  30. case "lastMonth":
  31. case "lastWeek":
  32. default:
  33. return formatDate(subDays(now, rawData.length - index - 1), "MMM dd");
  34. }
  35. };
  36. const data = rawData.map((view, index) => ({
  37. name: getDate(index),
  38. views: view
  39. }));
  40. return (
  41. <ResponsiveContainer
  42. width="100%"
  43. height={window.innerWidth < 468 ? 240 : 320}
  44. >
  45. <AreaChart
  46. data={data}
  47. margin={{
  48. top: 16,
  49. right: 0,
  50. left: 0,
  51. bottom: 16
  52. }}
  53. >
  54. <defs>
  55. <linearGradient id="colorUv" x1="0" y1="0" x2="0" y2="1">
  56. <stop offset="5%" stopColor="#B39DDB" stopOpacity={0.8} />
  57. <stop offset="95%" stopColor="#B39DDB" stopOpacity={0} />
  58. </linearGradient>
  59. </defs>
  60. <XAxis dataKey="name" />
  61. <YAxis />
  62. <CartesianGrid strokeDasharray="1 1" />
  63. <Tooltip />
  64. <Area
  65. type="monotone"
  66. dataKey="views"
  67. isAnimationActive={false}
  68. stroke="#B39DDB"
  69. fillOpacity={1}
  70. fill="url(#colorUv)"
  71. />
  72. </AreaChart>
  73. </ResponsiveContainer>
  74. );
  75. };
  76. export default ChartArea;