// notifications.jsx โ€” Launch announcements (events, seminars, milestones) const { useState: useStateN, useEffect: useEffectN } = React; const { Card, Chip, TopBar, DisplayHeading } = window.LAUNCH_SCREENS_1; // Sample announcements โ€” these would come from a feed in production const NOTIFICATIONS = [ { id: 'n-001', kind: 'event', pinned: true, title: 'A&R Open Mic ยท Live This Friday', body: 'Vintage Music Group A&R will live-evaluate 10 tracks this Friday at 7 PM ET. RSVP to lock your slot.', cta: 'RSVP', when: 'MAY 19 ยท 7:00 PM ET', age: '2H AGO', accent: true, icon: '๐ŸŽ™', }, { id: 'n-002', kind: 'seminar', title: 'Nashville Songwriters Seminar', body: 'Three-day intensive at our Nashville HQ. PG Banker leads songwriting workshops with Jay Brunswick on A&R panels.', cta: 'LEARN MORE', when: 'JUN 4โ€“6 ยท IN PERSON', age: 'YESTERDAY', icon: '๐ŸŽผ', }, { id: 'n-003', kind: 'milestone', title: "You unlocked a new A&R credit", body: '+100 XP since last credit. You now have 3 unlocked credits ready to spend on an evaluation.', cta: 'USE CREDIT', age: '3D AGO', accent: true, icon: '๐Ÿš€', }, { id: 'n-004', kind: 'event', title: 'Mix Engineering Workshop ยท Jay Brunswick', body: 'Live mix breakdown session. Bring a stem, get it mixed in real time on the broadcast.', cta: 'RESERVE', when: 'MAY 28 ยท 6:00 PM ET', age: '5D AGO', icon: '๐ŸŽง', }, { id: 'n-005', kind: 'announcement', title: 'New on Launch ยท Vintage A&R partnership', body: 'Vintage Music Group is now scoring tracks directly through Launch. 100 XP = 1 free evaluation.', age: 'LAST WEEK', icon: 'โ˜…', }, ]; const UNREAD_IDS = ['n-001', 'n-002', 'n-003']; // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ // NotificationsBell โ€” icon button with unread dot, for top bars // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ function NotificationsBell({ theme, onClick }) { const unread = UNREAD_IDS.length; return (
{unread > 0 && (
{unread}
)}
); } // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ // NotificationsScreen โ€” full announcements feed // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ function NotificationsScreen({ theme, onBack }) { const pinned = NOTIFICATIONS.filter(n => n.pinned); const rest = NOTIFICATIONS.filter(n => !n.pinned); const NotificationCard = ({ n }) => { const isUnread = UNREAD_IDS.includes(n.id); return ( {isUnread && (
)}
{n.icon}
{n.pinned ? 'โ˜… PINNED ยท ' : ''}{n.kind.toUpperCase()} {n.age}
{n.title}
{n.body}
{n.when && (
๐Ÿ“… {n.when}
)} {n.cta && (
)}
); }; return (
{/* Top bar */}
โ˜… FROM LAUNCH
NOTIFICATIONS
{UNREAD_IDS.length} UNREAD ยท {NOTIFICATIONS.length} TOTAL
{/* Pinned */} {pinned.length > 0 && (
PINNED ยท DON'T MISS
{pinned.map(n => )}
)} {/* Recent */}
RECENT
{rest.map(n => )}
{/* Settings link */}
); } window.LAUNCH_SCREENS_11 = { NotificationsBell, NotificationsScreen, UNREAD_IDS };