import { useState, useRef, useEffect } from 'react'; import { Card, Title, Text, Stack, Badge, Divider } from '@repo/ui/components'; // ── Showcase Components ────────────────────────────────────────── import { CashierUI } from './printer/cashier.ui'; import { PrinterListener } from './printer/printer.listener'; import { LiveStockGrid } from './stock-grid/live-stock-grid.ui'; import { ProfileSettingsUI } from './auth-sync/profile-settings.ui'; import { StorageSyncListener } from './auth-sync/storage-sync.listener'; import { DEVICE_EVENTS, AUTH_EVENTS } from '../../../../core/constants/events'; // ─── Events Demo Page ─────────────────────────────────────────── /** * Orchestrator page for all three Event Bus showcase demos. * * This component is completely self-contained within the * `events-demo/` folder and does not leak state or side-effects * into the rest of the application. */ export default function EventsDemoPage() { // ── Showcase 1: Printer status feedback ────────────────────── const [printerLog, setPrinterLog] = useState([]); // ── Showcase 3: Storage sync status feedback ───────────────── const [syncLog, setSyncLog] = useState([]); // ── Render counter to prove this parent is stable ──────────── const renderCount = useRef(0); renderCount.current += 1; // Keep log sizes bounded useEffect(() => { if (printerLog.length > 20) setPrinterLog((prev) => prev.slice(-20)); }, [printerLog.length]); useEffect(() => { if (syncLog.length > 20) setSyncLog((prev) => prev.slice(-20)); }, [syncLog.length]); return (
🔌 Event Bus Showcase Three real-world demos of @repo/core-events — zero coupling, strict typing, high performance. Parent render count: {renderCount.current}
{/* ═══════════════════════════════════════════════════════════ SHOWCASE 1: Cross-Platform Printer Abstraction ═══════════════════════════════════════════════════════════ */} 🖨️ Showcase 1: Cross-Platform Printer Abstraction The CashierUI publishes a {DEVICE_EVENTS.PRINT_RECEIPT} event. The PrinterListener listens for it and simulates interacting with a physical printer. {/* Headless listener — renders nothing visible */} setPrinterLog((prev) => [...prev, `[${new Date().toLocaleTimeString()}] ${msg}`])} /> {printerLog.length > 0 && ( <> 📋 Printer Log:
{printerLog.map((line, i) => (
{line}
))}
)}
{/* ═══════════════════════════════════════════════════════════ SHOWCASE 2: Extreme Performance — Live Stock Grid ═══════════════════════════════════════════════════════════ */} 📈 Showcase 2: High-Frequency Real-Time Data (50 updates/sec) A mock WebSocket fires WS:STOCK_UPDATE every 20ms. Each StockRow subscribes to the global event but only updates when payload.id === row.id. The parent grid never re-renders. {/* ═══════════════════════════════════════════════════════════ SHOWCASE 3: Auth/Profile → IndexedDB Sync ═══════════════════════════════════════════════════════════ */} 💾 Showcase 3: Auth/Profile Sync with <code>@repo/core-storage</code> ProfileSettingsUI publishes {AUTH_EVENTS.PROFILE_UPDATED}. StorageSyncListener silently catches it in the background and saves to IndexedDB via secureIndexedDB. {/* Headless listener — renders nothing visible */} setSyncLog((prev) => [...prev, `[${new Date().toLocaleTimeString()}] ${msg}`])} /> {syncLog.length > 0 && ( <> 📋 Storage Sync Log:
{syncLog.map((line, i) => (
{line}
))}
)}
); }