this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at experiment/session-classification 75 lines 2.4 kB view raw
1import React, { useState, useMemo } from 'react'; 2import { Copy, Check, Sparkles } from 'lucide-react'; 3 4interface Props { 5 summary: string; 6} 7 8interface DailySummary { 9 projects: { name: string; summary: string }[]; 10} 11 12function parseSummary(summary: string): DailySummary | null { 13 try { 14 const parsed = JSON.parse(summary); 15 if (parsed.projects && Array.isArray(parsed.projects)) { 16 return parsed as DailySummary; 17 } 18 } catch { 19 // Not JSON, return null 20 } 21 return null; 22} 23 24export default function BragSummary({ summary }: Props) { 25 const [copied, setCopied] = useState(false); 26 27 const parsed = useMemo(() => parseSummary(summary), [summary]); 28 29 const handleCopy = () => { 30 // Copy as readable text 31 const text = parsed 32 ? parsed.projects.map(p => `${p.name}: ${p.summary}`).join('\n') 33 : summary; 34 navigator.clipboard.writeText(text); 35 setCopied(true); 36 setTimeout(() => setCopied(false), 2000); 37 }; 38 39 if (!summary) return null; 40 41 return ( 42 <div className="relative group rounded-lg p-4 mb-4 bg-gradient-to-br from-indigo-50 to-blue-50 border border-indigo-100 shadow-sm"> 43 <div className="absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity"> 44 <button 45 onClick={handleCopy} 46 className="p-1.5 rounded bg-white/80 hover:bg-white text-indigo-600 shadow-sm transition-all" 47 title="Copy to clipboard" 48 > 49 {copied ? <Check size={14} /> : <Copy size={14} />} 50 </button> 51 </div> 52 53 <div className="flex items-start gap-2"> 54 <div className="p-1 bg-indigo-100 text-indigo-600 rounded shrink-0"> 55 <Sparkles size={16} /> 56 </div> 57 <div className="min-w-0"> 58 <h3 className="text-xs font-semibold text-indigo-900 uppercase tracking-wider mb-2">Daily Summary</h3> 59 {parsed ? ( 60 <ul className="space-y-1.5"> 61 {parsed.projects.map((project, i) => ( 62 <li key={i} className="text-sm"> 63 <span className="font-semibold text-slate-800">{project.name}:</span>{' '} 64 <span className="text-slate-600">{project.summary}</span> 65 </li> 66 ))} 67 </ul> 68 ) : ( 69 <p className="text-slate-700 text-sm leading-relaxed">{summary}</p> 70 )} 71 </div> 72 </div> 73 </div> 74 ); 75}