Openstatus www.openstatus.dev
at e04c855d4ded3de361d0d758827dbfc50ff511d0 54 lines 1.8 kB view raw
1import { Tracker as OSTracker, classNames } from "@openstatus/tracker"; 2 3import type { ResponseStatusTracker } from "@/lib/tb"; 4import { cn, formatDate } from "@/lib/utils"; 5 6interface TrackerProps { 7 data: ResponseStatusTracker[]; 8} 9 10export function Tracker({ data }: TrackerProps) { 11 const tracker = new OSTracker({ data }); 12 13 return ( 14 <div tw="flex flex-col w-full my-12"> 15 <div tw="flex flex-col mx-auto"> 16 <div tw="flex flex-row items-center justify-between -mb-1 text-black font-light"> 17 <p tw="font-medium">{tracker.totalUptime}%</p> 18 </div> 19 {/* Empty State */} 20 <div tw="flex flex-row relative"> 21 {new Array(data.length).fill(null).map((_, i) => { 22 return <div key={i} tw="h-16 w-3 rounded-full mr-1 bg-black/20" />; 23 })} 24 <div tw="flex flex-row-reverse absolute left-0"> 25 {tracker.days.map((item, i) => { 26 const isBlackListed = Boolean(item.blacklist); 27 if (isBlackListed) { 28 return ( 29 <div 30 key={i} 31 tw="h-16 w-3 rounded-full mr-1 bg-status-operational/90" 32 /> 33 ); 34 } 35 return ( 36 <div 37 key={i} 38 tw={cn( 39 "h-16 w-3 rounded-full mr-1", 40 classNames[item.variant], 41 )} 42 /> 43 ); 44 })} 45 </div> 46 </div> 47 <div tw="flex flex-row items-center justify-between -mt-3 text-slate-500 text-sm"> 48 <p tw="">{data.length} days ago</p> 49 <p tw="mr-1">{formatDate(new Date())}</p> 50 </div> 51 </div> 52 </div> 53 ); 54}