import React, { useState, useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { getActivityLog, ActivityEntry, formatActivityTime, getShapeDisplayName, groupActivitiesByDate, } from '../lib/activityLogger'; import '../css/activity-panel.css'; interface ActivityPanelProps { isOpen: boolean; onClose: () => void; } export function ActivityPanel({ isOpen, onClose }: ActivityPanelProps) { const { slug } = useParams<{ slug: string }>(); const [activities, setActivities] = useState([]); const [isLoading, setIsLoading] = useState(true); // Load activities and refresh periodically useEffect(() => { if (!slug || !isOpen) return; const loadActivities = () => { const log = getActivityLog(slug, 50); setActivities(log); setIsLoading(false); }; loadActivities(); // Refresh every 5 seconds when panel is open const interval = setInterval(loadActivities, 5000); return () => clearInterval(interval); }, [slug, isOpen]); if (!isOpen) return null; const groupedActivities = groupActivitiesByDate(activities); const getActionIcon = (action: string) => { switch (action) { case 'created': return '+'; case 'deleted': return '-'; case 'updated': return '~'; default: return '?'; } }; const getActionClass = (action: string) => { switch (action) { case 'created': return 'activity-action-created'; case 'deleted': return 'activity-action-deleted'; case 'updated': return 'activity-action-updated'; default: return ''; } }; return (

Activity

{isLoading ? (
Loading...
) : activities.length === 0 ? (
~

No activity yet

Actions will appear here as you work

) : (
{Array.from(groupedActivities.entries()).map(([dateGroup, entries]) => (
{dateGroup}
{entries.map((entry) => (
{getActionIcon(entry.action)}
{entry.user} {' '} {entry.action === 'created' ? 'added' : entry.action === 'deleted' ? 'deleted' : 'updated'} {' '} {getShapeDisplayName(entry.shapeType)} {formatActivityTime(entry.timestamp)}
))}
))}
)}
); } // Toggle button component for the toolbar export function ActivityToggleButton({ onClick, isActive }: { onClick: () => void; isActive: boolean }) { return ( ); }