import { useState, useMemo } from 'react' import { startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, format, isSameMonth, isToday, addMonths, subMonths, isBefore, isAfter, isSameDay } from 'date-fns' import { ChevronLeft, ChevronRight } from 'lucide-react' import { getBrandColor } from '../utils/api' const CAMPAIGN_COLORS = [ 'bg-indigo-400', 'bg-pink-400', 'bg-emerald-400', 'bg-amber-400', 'bg-purple-400', 'bg-cyan-400', 'bg-rose-400', 'bg-teal-400', ] export default function CampaignCalendar({ campaigns = [] }) { const [currentMonth, setCurrentMonth] = useState(new Date()) const days = useMemo(() => { const monthStart = startOfMonth(currentMonth) const monthEnd = endOfMonth(currentMonth) const calStart = startOfWeek(monthStart, { weekStartsOn: 0 }) const calEnd = endOfWeek(monthEnd, { weekStartsOn: 0 }) return eachDayOfInterval({ start: calStart, end: calEnd }) }, [currentMonth]) const getCampaignsForDay = (day) => { return campaigns.filter((c) => { const start = new Date(c.startDate) const end = new Date(c.endDate) return (isSameDay(day, start) || isAfter(day, start)) && (isSameDay(day, end) || isBefore(day, end)) }) } const isStartOfCampaign = (day, campaign) => { return isSameDay(day, new Date(campaign.startDate)) } const isEndOfCampaign = (day, campaign) => { return isSameDay(day, new Date(campaign.endDate)) } return (
{/* Header */}

{format(currentMonth, 'MMMM yyyy')}

{/* Day names */}
{['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map((d) => (
{d}
))}
{/* Calendar grid */}
{days.map((day, i) => { const dayCampaigns = getCampaignsForDay(day) const inMonth = isSameMonth(day, currentMonth) const today = isToday(day) return (
{format(day, 'd')}
{dayCampaigns.slice(0, 3).map((campaign, ci) => { const colorIndex = campaigns.indexOf(campaign) % CAMPAIGN_COLORS.length const isStart = isStartOfCampaign(day, campaign) const isEnd = isEndOfCampaign(day, campaign) return (
{isStart ? campaign.name : ''}
) })} {dayCampaigns.length > 3 && (
+{dayCampaigns.length - 3} more
)}
) })}
) }