import React, { useState, useEffect } from 'react';
import { Calendar, Heart, Users, MapPin, Clock } from 'lucide-react';
const WeddingAnniversaryCalendar = () => {
const [anniversaries, setAnniversaries] = useState({});
const [selectedDate, setSelectedDate] = useState(null);
const [currentMonth, setCurrentMonth] = useState(new Date().getMonth());
const [currentYear] = useState(new Date().getFullYear());
useEffect(() => {
const loadData = async () => {
try {
const fileContent = await window.fs.readFile('paste.txt', { encoding: 'utf8' });
const lines = fileContent.trim().split('\n');
const dataLines = lines.slice(1);
const weddings = dataLines.map(line => {
const parts = line.split('\t');
if (parts.length >= 5) {
const dateStr = parts[0];
const marriageId = parts[1];
const groom = parts[2];
const bride = parts[3];
const location = parts[4];
const [day, month, year] = dateStr.split('-');
const date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
return {
date: date,
dateStr: dateStr,
marriageId: marriageId,
groom: groom,
bride: bride,
location: location,
monthDay: `${month.padStart(2, '0')}-${day.padStart(2, '0')}`,
displayDate: `${month}/${day}`,
originalYear: parseInt(year)
};
}
return null;
}).filter(w => w !== null);
// Group by month-day
const anniversariesByDate = {};
weddings.forEach(wedding => {
const key = wedding.monthDay;
if (!anniversariesByDate[key]) {
anniversariesByDate[key] = [];
}
anniversariesByDate[key].push(wedding);
});
setAnniversaries(anniversariesByDate);
} catch (error) {
console.error('Error loading data:', error);
}
};
loadData();
}, []);
const monthNames = [
'January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'
];
const getDaysInMonth = (month, year) => {
return new Date(year, month + 1, 0).getDate();
};
const getFirstDayOfMonth = (month, year) => {
return new Date(year, month, 1).getDay();
};
const getAnniversariesForDate = (day, month) => {
const key = `${(month + 1).toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
return anniversaries[key] || [];
};
const renderCalendar = () => {
const daysInMonth = getDaysInMonth(currentMonth, currentYear);
const firstDay = getFirstDayOfMonth(currentMonth, currentYear);
const days = [];
// Empty cells for days before the first day of month
for (let i = 0; i < firstDay; i++) {
days.push(
);
}
// Days of the month
for (let day = 1; day <= daysInMonth; day++) {
const dayAnniversaries = getAnniversariesForDate(day, currentMonth);
const hasAnniversaries = dayAnniversaries.length > 0;
days.push(
hasAnniversaries ? setSelectedDate({ day, month: currentMonth, anniversaries: dayAnniversaries }) : null}
>
{day}
{hasAnniversaries && (
{dayAnniversaries.length}
{dayAnniversaries[0].groom.split(' ')[0]} & {dayAnniversaries[0].bride.split(' ')[0]}
{dayAnniversaries.length > 1 && ` +${dayAnniversaries.length - 1} more`}
)}
);
}
return days;
};
const totalAnniversaries = Object.values(anniversaries).reduce((sum, arr) => sum + arr.length, 0);
const uniqueDates = Object.keys(anniversaries).length;
return (
Wedding Anniversary Calendar
Track {totalAnniversaries} wedding anniversaries across {uniqueDates} different dates throughout the year
{/* Calendar */}
{/* Calendar Header */}
setCurrentMonth((currentMonth - 1 + 12) % 12)}
className="px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors"
>
←
{monthNames[currentMonth]} {currentYear}
setCurrentMonth((currentMonth + 1) % 12)}
className="px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors"
>
→
{/* Day headers */}
{['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map(day => (
{day}
))}
{/* Calendar grid */}
{renderCalendar()}
{/* Details Panel */}
{/* Anniversary Stats */}
Anniversary Stats
Total Marriages:
{totalAnniversaries}
Unique Dates:
{uniqueDates}
This Month:
{Object.keys(anniversaries).filter(date => {
const [month] = date.split('-');
return parseInt(month) === currentMonth + 1;
}).reduce((sum, date) => sum + anniversaries[date].length, 0)}
{/* Selected Date Details */}
{selectedDate && (
{monthNames[selectedDate.month]} {selectedDate.day} Anniversaries
{selectedDate.anniversaries.map((wedding, index) => {
const yearsMarried = currentYear - wedding.originalYear;
return (
{wedding.groom} & {wedding.bride}
Married {wedding.originalYear} ({yearsMarried} years)
{wedding.location}
ID: {wedding.marriageId}
);
})}
)}
{/* Instructions */}
How to Use
• Click the arrows to navigate months
• Red highlighted dates have anniversaries
• Click on a date to see anniversary details
• Numbers show how many couples celebrate each day
);
};
export default WeddingAnniversaryCalendar;