import React, { useMemo } from 'react'; import { GripVertical, X, Calendar, UserPlus, XCircle, CheckCircle, DollarSign } from 'lucide-react'; import { formatDistanceToNow } from 'date-fns'; import { Appointment, Customer } from '../../types'; interface ActivityItem { id: string; type: 'booking' | 'cancellation' | 'completion' | 'new_customer' | 'payment'; title: string; description: string; timestamp: Date; icon: React.ReactNode; iconBg: string; } interface RecentActivityWidgetProps { appointments: Appointment[]; customers: Customer[]; isEditing?: boolean; onRemove?: () => void; } const RecentActivityWidget: React.FC = ({ appointments, customers, isEditing, onRemove, }) => { const activities = useMemo(() => { const items: ActivityItem[] = []; // Add appointments as activity appointments.forEach((appt) => { const timestamp = new Date(appt.startTime); if (appt.status === 'CONFIRMED' || appt.status === 'PENDING') { items.push({ id: `booking-${appt.id}`, type: 'booking', title: 'New Booking', description: `${appt.customerName} booked an appointment`, timestamp, icon: , iconBg: 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400', }); } else if (appt.status === 'CANCELLED') { items.push({ id: `cancel-${appt.id}`, type: 'cancellation', title: 'Cancellation', description: `${appt.customerName} cancelled their appointment`, timestamp, icon: , iconBg: 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400', }); } else if (appt.status === 'COMPLETED') { items.push({ id: `complete-${appt.id}`, type: 'completion', title: 'Completed', description: `${appt.customerName}'s appointment completed`, timestamp, icon: , iconBg: 'bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400', }); } }); // Add recent customers (those with no lastVisit are new) customers .filter(c => !c.lastVisit) .slice(0, 5) .forEach((customer) => { items.push({ id: `customer-${customer.id}`, type: 'new_customer', title: 'New Customer', description: `${customer.name} signed up`, timestamp: new Date(), // Approximate - would need createdAt field icon: , iconBg: 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400', }); }); // Sort by timestamp descending items.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); return items.slice(0, 10); }, [appointments, customers]); return (
{isEditing && ( <>
)}

Recent Activity

{activities.length === 0 ? (

No recent activity

) : (
{activities.map((activity) => (
{activity.icon}

{activity.title}

{activity.description}

{formatDistanceToNow(activity.timestamp, { addSuffix: true })}

))}
)}
); }; export default RecentActivityWidget;