"use client"; import { useState, useEffect } from "react"; import { motion } from "framer-motion"; import { useMorningBrief } from "@/lib/morning-brief/store"; import { MorningBrief } from "@/lib/morning-brief/types"; const fadeUp = { hidden: { opacity: 0, y: 20 }, visible: { opacity: 1, y: 0 }, }; export default function MorningBriefCalendar() { const { briefs, todayBrief, generateBrief, getBriefByDate } = useMorningBrief(); const [selectedDate, setSelectedDate] = useState(null); const [viewingBrief, setViewingBrief] = useState(null); // Get current month for calendar const today = new Date(); const [currentMonth, setCurrentMonth] = useState(today.getMonth()); const [currentYear, setCurrentYear] = useState(today.getFullYear()); const monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; // Generate calendar days const getDaysInMonth = (month: number, year: number) => { return new Date(year, month + 1, 0).getDate(); }; const getFirstDayOfMonth = (month: number, year: number) => { return new Date(year, month, 1).getDay(); }; const daysInMonth = getDaysInMonth(currentMonth, currentYear); const firstDay = getFirstDayOfMonth(currentMonth, currentYear); // Generate brief dates map const briefDates = new Set(briefs.map((b) => b.date)); const todayStr = today.toISOString().split("T")[0]; const handlePrevMonth = () => { if (currentMonth === 0) { setCurrentMonth(11); setCurrentYear(currentYear - 1); } else { setCurrentMonth(currentMonth - 1); } }; const handleNextMonth = () => { if (currentMonth === 11) { setCurrentMonth(0); setCurrentYear(currentYear + 1); } else { setCurrentMonth(currentMonth + 1); } }; const handleDateClick = (day: number) => { const dateStr = `${currentYear}-${String(currentMonth + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`; const brief = getBriefByDate(dateStr); if (brief) { setSelectedDate(dateStr); setViewingBrief(brief); } }; // Calendar grid const calendarDays = []; for (let i = 0; i < firstDay; i++) { calendarDays.push(
); } for (let day = 1; day <= daysInMonth; day++) { const dateStr = `${currentYear}-${String(currentMonth + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`; const hasBrief = briefDates.has(dateStr); const isToday = dateStr === todayStr; calendarDays.push( ); } return (
{/* Calendar */}

{monthNames[currentMonth]} {currentYear}

{["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((d) => (
{d}
))}
{calendarDays}
{/* Today's Brief Preview */} {todayBrief && (

Today's Brief

{todayBrief.generatedAt}
{/* Weather */}

Weather

🌤️

{todayBrief.weather?.temperature}

{todayBrief.weather?.condition}

{/* Market */}

Market

{todayBrief.market.usIndex}

{todayBrief.market.crypto}

{/* Tasks */}

My Tasks Today

    {todayBrief.myTasks.pending.slice(0, 3).map((task, i) => (
  • • {task}
  • ))}
{/* OpenClaw Use Cases */} {todayBrief.openclowUseCases && todayBrief.openclowUseCases.skillIdeas.length > 0 && (

🦞 OpenClaw Skill Ideas

    {todayBrief.openclowUseCases.skillIdeas.map((idea, i) => (
  • { const updated = { ...todayBrief.openclowUseCases }; updated.skillIdeas[i].selected = !idea.selected; // Save to localStorage localStorage.setItem("sitemente:openclaw-usecases", JSON.stringify(updated)); }} className="w-4 h-4 accent-purple-500" /> {idea.name}
  • ))}
)}
)} {/* Brief Detail Modal */} {viewingBrief && (
setViewingBrief(null)} />

Brief Date

{viewingBrief.date}

{/* Weather */}

🌤️ Weather

{viewingBrief.weather?.temperature} — {viewingBrief.weather?.condition}

{viewingBrief.weather?.location}

{/* AI News */}

🤖 AI News

    {viewingBrief.aiNews.items.map((item, i) => (
  • • {item}
  • ))}
{/* Tasks */}

✓ My Tasks

{viewingBrief.myTasks.pending.length > 0 && (

Pending

{viewingBrief.myTasks.pending.map((t, i) => (

• {t}

))}
)} {viewingBrief.myTasks.inProgress.length > 0 && (

In Progress

{viewingBrief.myTasks.inProgress.map((t, i) => (

• {t}

))}
)}
{/* Market */}

📈 Market

{viewingBrief.market.usIndex}

{viewingBrief.market.crypto}

Sentiment: {viewingBrief.market.sentiment.toUpperCase()}

{/* OpenClaw Use Cases */} {viewingBrief.openclowUseCases && viewingBrief.openclowUseCases.skillIdeas.length > 0 && (

🦞 OpenClaw Skill Ideas

    {viewingBrief.openclowUseCases.skillIdeas.map((idea, i) => (
  • • {idea}
  • ))}
{viewingBrief.openclowUseCases.topUseCases.length > 0 && (

Top Use Cases:

{viewingBrief.openclowUseCases.topUseCases.map((uc, i) => (

• {uc}

))}
)}
)}
)} {/* Generate Button */}
); }