/** * DashboardRecentActivity — the avatar + text + timestamp list panel * from the operator's redesign-v2 mockup. * * Implementation note: a user-wide activity feed API does not exist * yet (collection_activity is scoped per-collection). Per the * operator's pattern for "real metrics where available, placeholders * for what we don't have" (umbrella § 7.1), this component ships * with hardcoded demo rows and a TODO comment pointing at the * follow-up convoy that will land /api/user/activity. * * Once the API ships, the parent page will fetch and pass rows in * via the `activities` prop; the component's render code already * handles both real and demo shapes (same { id, actor, action, * subject, time } shape). * * Props: * activities: array | undefined — if undefined or empty, demo rows * render. If a non-empty array is passed, those rows * render instead (forward-compat). */ const DEMO_ACTIVITIES = [ { id: 'demo-1', actor: { name: 'StarGazer73', initial: 'S' }, action: 'completed a trade', subject: '2x Astral Sage for Tideborn Explorer', time: '2m ago', }, { id: 'demo-2', actor: { name: 'You', initial: 'Y' }, action: 'listed a card for sale', subject: 'Voidforge Titan • $89.99', time: '18m ago', }, { id: 'demo-3', actor: { name: 'Market', initial: 'M' }, action: 'price drop alert', subject: 'Lumen Warden is down 12%', time: '1h ago', }, ]; const ACTOR_GRADIENTS = { S: 'linear-gradient(135deg, rgb(120, 144, 255) 0%, rgb(80, 96, 207) 100%)', Y: 'linear-gradient(135deg, rgb(255, 140, 30) 0%, rgb(216, 67, 21) 100%)', M: 'linear-gradient(135deg, rgb(178, 102, 255) 0%, rgb(124, 58, 237) 100%)', }; function gradientFor(initial) { return ( ACTOR_GRADIENTS[initial] ?? 'linear-gradient(135deg, rgb(150, 150, 150) 0%, rgb(100, 100, 100) 100%)' ); } export default function DashboardRecentActivity({ activities }) { const rows = activities && activities.length > 0 ? activities : DEMO_ACTIVITIES; const usingDemo = !activities || activities.length === 0; return (

Recent Activity

{usingDemo && (

{/* TODO(user-activity-feed convoy): replace these demo rows with rows from GET /api/user/activity once that endpoint ships. Operator-approved placeholder per umbrella § 7.1. */} Demo activity — connect to live feed in a follow-up release.

)}
); }