import { Widget, WidgetBody } from '@/components/widget'; import { cn } from '@/utils/cn'; import { addMonths, eachDayOfInterval, endOfMonth, format, formatISO, isSameMonth, isToday, startOfMonth, subMonths, } from 'date-fns'; import { ActivityIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react'; import { useState } from 'react'; import { WidgetAbsoluteButtons, WidgetHead, WidgetTitle, } from '../overview/overview-widget'; import { Button } from '../ui/button'; import { Tooltiper } from '../ui/tooltip'; type Props = { data: { count: number; date: string }[]; }; function getOpacityLevel(count: number, maxCount: number): number { if (count === 0 || maxCount === 0) return 0; const ratio = count / maxCount; if (ratio <= 0.25) return 0.25; if (ratio <= 0.5) return 0.5; if (ratio <= 0.75) return 0.75; return 1; } const MonthCalendar = ({ month, data, maxCount, }: { month: Date; data: Props['data']; maxCount: number }) => (
{format(month, 'MMMM yyyy')}
{eachDayOfInterval({ start: startOfMonth(month), end: endOfMonth(month), }).map((date) => { const hit = data.find((item) => item.date.includes(formatISO(date, { representation: 'date' })), ); const opacity = hit ? getOpacityLevel(hit.count, maxCount) : 0; return (
{format(date, 'EEEE, MMM d')}
{hit ? (
{hit.count} {hit.count === 1 ? 'event' : 'events'}
) : (
No activity
)}
} >
); })}
); export const ProfileActivity = ({ data }: Props) => { const [startDate, setStartDate] = useState(startOfMonth(new Date())); const maxCount = Math.max(...data.map((item) => item.count), 0); return ( Activity
{[3, 2, 1, 0].map((offset) => ( ))}
); };