import { useEffect, useState } from "react"; import { useIntl } from "react-intl"; import { message, Select, Tooltip, Typography } from "antd"; import { get } from "../../request"; import type { IUserOperationDailyResponse } from "../../api/Exp"; interface IOptions { value: string; label: string; } interface IDailyData { date: string; commits: number; year: number; month: number; day: number; week: number; } interface IWidget { studioName?: string; } const HeatmapWidget = ({ studioName }: IWidget) => { const [dailyData, setDailyData] = useState([]); const [year, setYear] = useState([]); const thisYear = new Date().getFullYear(); const [currYear, setCurrYear] = useState(thisYear.toString()); const intl = useIntl(); useEffect(() => { get( `/v2/user-operation-daily?view=user-year&studio_name=${studioName}&year=2021` ).then((json) => { if (json.ok) { //找到起止年份 if (json.data.rows.length > 0) { const yearStart = new Date(json.data.rows[0].date_int).getFullYear(); const yearEnd = new Date( json.data.rows[json.data.rows.length - 1].date_int ).getFullYear(); const yearOption: IOptions[] = []; for (let index = yearStart; index <= yearEnd; index++) { yearOption.push({ value: index.toString(), label: index.toString(), }); } setYear(yearOption); } const data = json.data.rows.map((item) => { const date = new Date(item.date_int); const oneJan = new Date(date.getFullYear(), 0, 1); const week = Math.ceil( ((date.getTime() - oneJan.getTime()) / 86400000 + oneJan.getDay() + 1) / 7 ); return { date: date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(), year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDay(), week: week, commits: Math.floor(item.duration / 1000 / 60), }; }); console.log("data", data); setDailyData(data); } else { message.error(json.message); } }); }, [studioName]); const yAxisLabel = new Array(7).fill(1).map((_item, id) => { return (
{intl.formatMessage({ id: `labels.week.${id}` })}
); }); const dayColor = ["#9be9a8", "#40c463", "#30a14e", "#216e39"]; const weeks = new Array(54).fill(1); const heatmap = weeks.map((_item, week) => { const days = new Array(7).fill(1); return (
{days.map((_itemDay, day) => { const currDate = dailyData.find( (value) => value.year === parseInt(currYear) && value.week === week && value.day === day ); const time = currDate?.commits; const color = time ? time > 100 ? dayColor[3] : time > 50 ? dayColor[2] : time > 20 ? dayColor[1] : time > 0 ? dayColor[0] : "rgba(0,0,0,0)" : "rgba(0,0,0,0)"; return (
); })}
); }); return (