computer-scienceangular-roadmapbackend-roadmapblockchain-roadmapdba-roadmapdeveloper-roadmapdevops-roadmapfrontend-roadmapgo-roadmaphactoberfestjava-roadmapjavascript-roadmapnodejs-roadmappython-roadmapqa-roadmapreact-roadmaproadmapstudy-planvue-roadmapweb3-roadmap
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
4.8 KiB
189 lines
4.8 KiB
import CalendarHeatmap from 'react-calendar-heatmap'; |
|
import dayjs from 'dayjs'; |
|
import { formatActivityDate } from '../../lib/date'; |
|
import { Tooltip as ReactTooltip } from 'react-tooltip'; |
|
import 'react-calendar-heatmap/dist/styles.css'; |
|
import './AccountStreakHeatmap.css'; |
|
|
|
const legends = [ |
|
{ count: 1, color: 'bg-slate-600' }, |
|
{ count: 3, color: 'bg-slate-500' }, |
|
{ count: 5, color: 'bg-slate-400' }, |
|
{ count: 10, color: 'bg-slate-300' }, |
|
{ count: 20, color: 'bg-slate-200' }, |
|
]; |
|
|
|
type AccountStreakHeatmapProps = {}; |
|
|
|
export function AccountStreakHeatmap(props: AccountStreakHeatmapProps) { |
|
const startDate = dayjs().subtract(6, 'months').toDate(); |
|
const endDate = dayjs().toDate(); |
|
|
|
return ( |
|
<div className="mt-4"> |
|
<CalendarHeatmap |
|
startDate={startDate} |
|
endDate={endDate} |
|
values={[ |
|
{ |
|
date: '2024-08-01', |
|
count: 4, |
|
}, |
|
{ |
|
date: '2024-08-02', |
|
count: 10, |
|
}, |
|
{ |
|
date: '2024-08-03', |
|
count: 5, |
|
}, |
|
{ |
|
date: '2024-08-04', |
|
count: 3, |
|
}, |
|
{ |
|
date: '2024-08-05', |
|
count: 7, |
|
}, |
|
{ |
|
date: '2024-08-06', |
|
count: 2, |
|
}, |
|
{ |
|
date: '2024-08-07', |
|
count: 6, |
|
}, |
|
{ |
|
date: '2024-08-08', |
|
count: 8, |
|
}, |
|
{ |
|
date: '2024-08-09', |
|
count: 9, |
|
}, |
|
{ |
|
date: '2024-08-10', |
|
count: 1, |
|
}, |
|
{ |
|
date: '2024-08-11', |
|
count: 3, |
|
}, |
|
{ |
|
date: '2024-08-12', |
|
count: 5, |
|
}, |
|
{ |
|
date: '2024-08-13', |
|
count: 7, |
|
}, |
|
{ |
|
date: '2024-08-14', |
|
count: 8, |
|
}, |
|
{ |
|
date: '2024-08-15', |
|
count: 2, |
|
}, |
|
{ |
|
date: '2024-08-16', |
|
count: 4, |
|
}, |
|
{ |
|
date: '2024-08-17', |
|
count: 6, |
|
}, |
|
{ |
|
date: '2024-08-18', |
|
count: 8, |
|
}, |
|
{ |
|
date: '2024-08-19', |
|
count: 10, |
|
}, |
|
{ |
|
date: '2024-08-20', |
|
count: 2, |
|
}, |
|
{ |
|
date: '2024-08-21', |
|
count: 4, |
|
}, |
|
{ |
|
date: '2024-08-22', |
|
count: 6, |
|
}, |
|
{ |
|
date: '2024-08-23', |
|
count: 8, |
|
}, |
|
{ |
|
date: '2024-08-24', |
|
count: 10, |
|
}, |
|
{ |
|
date: '2024-08-25', |
|
count: 30, |
|
}, |
|
]} |
|
classForValue={(value) => { |
|
if (!value) { |
|
return 'fill-slate-700 rounded-md [rx:2px] focus:outline-none'; |
|
} |
|
|
|
const { count } = value; |
|
if (count >= 20) { |
|
return 'fill-slate-200 rounded-md [rx:2px] focus:outline-none'; |
|
} else if (count >= 10) { |
|
return 'fill-slate-300 rounded-md [rx:2px] focus:outline-none'; |
|
} else if (count >= 5) { |
|
return 'fill-slate-400 rounded-md [rx:2px] focus:outline-none'; |
|
} else if (count >= 3) { |
|
return 'fill-slate-500 rounded-md [rx:2px] focus:outline-none'; |
|
} else { |
|
return 'fill-slate-600 rounded-md [rx:2px] focus:outline-none'; |
|
} |
|
}} |
|
tooltipDataAttrs={(value: any) => { |
|
if (!value || !value.date) { |
|
return null; |
|
} |
|
|
|
const formattedDate = formatActivityDate(value.date); |
|
return { |
|
'data-tooltip-id': 'user-activity-tip', |
|
'data-tooltip-content': `${value.count} Updates - ${formattedDate}`, |
|
}; |
|
}} |
|
/> |
|
|
|
<ReactTooltip |
|
id="user-activity-tip" |
|
className="!rounded-lg !bg-slate-900 !p-1 !px-2 !text-xs" |
|
/> |
|
|
|
<div className="mt-2 flex items-center justify-end"> |
|
<div className="flex items-center"> |
|
<span className="mr-2 text-xs text-slate-500">Less</span> |
|
{legends.map((legend) => ( |
|
<div |
|
key={legend.count} |
|
className="flex items-center" |
|
data-tooltip-id="user-activity-tip" |
|
data-tooltip-content={`${legend.count} Updates`} |
|
> |
|
<div |
|
className={`h-2.5 w-2.5 ${legend.color} mr-1 rounded-sm`} |
|
></div> |
|
</div> |
|
))} |
|
<span className="ml-2 text-xs text-slate-500">More</span> |
|
<ReactTooltip |
|
id="user-activity-tip" |
|
className="!rounded-lg !bg-slate-900 !p-1 !px-2 !text-sm" |
|
/> |
|
</div> |
|
</div> |
|
</div> |
|
); |
|
}
|
|
|