import { useEventUtils } from "@/hooks/use-event-utils"; import { useSegmentUtils } from "@/hooks/use-segment-utils"; import { Event } from "@/types/event"; import { useMemo } from "react"; type EventSegmentProps = { events: Event[]; segmentTime: number; segmentDuration: number; timestampSpread: number; showMinimap: boolean; minimapStartTime?: number; minimapEndTime?: number; severityType: string; }; type MinimapSegmentProps = { isFirstSegmentInMinimap: boolean; isLastSegmentInMinimap: boolean; alignedMinimapStartTime: number; alignedMinimapEndTime: number; }; type TickSegmentProps = { isFirstSegmentInMinimap: boolean; isLastSegmentInMinimap: boolean; timestamp: Date; timestampSpread: number; }; type TimestampSegmentProps = { isFirstSegmentInMinimap: boolean; isLastSegmentInMinimap: boolean; timestamp: Date; timestampSpread: number; segmentKey: number; }; function MinimapBounds({ isFirstSegmentInMinimap, isLastSegmentInMinimap, alignedMinimapStartTime, alignedMinimapEndTime, }: MinimapSegmentProps) { return ( <> {isFirstSegmentInMinimap && (
{new Date(alignedMinimapStartTime).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", month: "short", day: "2-digit", })}
)} {isLastSegmentInMinimap && (
{new Date(alignedMinimapEndTime).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", month: "short", day: "2-digit", })}
)} ); } function Tick({ isFirstSegmentInMinimap, isLastSegmentInMinimap, timestamp, timestampSpread, }: TickSegmentProps) { return (
{!isFirstSegmentInMinimap && !isLastSegmentInMinimap && (
)}
); } function Timestamp({ isFirstSegmentInMinimap, isLastSegmentInMinimap, timestamp, timestampSpread, segmentKey, }: TimestampSegmentProps) { return (
{!isFirstSegmentInMinimap && !isLastSegmentInMinimap && (
{timestamp.getMinutes() % timestampSpread === 0 && timestamp.getSeconds() === 0 && timestamp.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", })}
)}
); } export function EventSegment({ events, segmentTime, segmentDuration, timestampSpread, showMinimap, minimapStartTime, minimapEndTime, severityType, }: EventSegmentProps) { const { isStartOfEvent, isEndOfEvent } = useEventUtils( events, segmentDuration ); const { getSeverity, getReviewed, displaySeverityType, shouldShowRoundedCorners, } = useSegmentUtils(segmentDuration, events, severityType); const { alignDateToTimeline } = useEventUtils(events, segmentDuration); const severity = useMemo( () => getSeverity(segmentTime), [getSeverity, segmentTime] ); const reviewed = useMemo( () => getReviewed(segmentTime), [getReviewed, segmentTime] ); const showRoundedCorners = useMemo( () => shouldShowRoundedCorners(segmentTime), [shouldShowRoundedCorners, segmentTime] ); const timestamp = useMemo(() => new Date(segmentTime), [segmentTime]); const segmentKey = useMemo( () => Math.floor(segmentTime / 1000), [segmentTime] ); const alignedMinimapStartTime = useMemo( () => alignDateToTimeline(minimapStartTime ?? 0), [minimapStartTime, alignDateToTimeline] ); const alignedMinimapEndTime = useMemo( () => alignDateToTimeline(minimapEndTime ?? 0), [minimapEndTime, alignDateToTimeline] ); const isInMinimapRange = useMemo(() => { return ( showMinimap && minimapStartTime && minimapEndTime && segmentTime > minimapStartTime && segmentTime < minimapEndTime ); }, [showMinimap, minimapStartTime, minimapEndTime, segmentTime]); const isFirstSegmentInMinimap = useMemo(() => { return showMinimap && segmentTime === alignedMinimapStartTime; }, [showMinimap, segmentTime, alignedMinimapStartTime]); const isLastSegmentInMinimap = useMemo(() => { return showMinimap && segmentTime === alignedMinimapEndTime; }, [showMinimap, segmentTime, alignedMinimapEndTime]); const segmentClasses = `flex flex-row ${ showMinimap ? isInMinimapRange ? "bg-muted" : isLastSegmentInMinimap ? "" : "opacity-80" : "" } ${ isFirstSegmentInMinimap || isLastSegmentInMinimap ? "relative h-2 border-b border-gray-500" : "" }`; const severityColors: { [key: number]: string } = { 1: reviewed ? "from-yellow-200/30 to-yellow-400/30" : "from-yellow-200 to-yellow-400", 2: reviewed ? "from-orange-400/30 to-orange-600/30" : "from-orange-400 to-orange-600", 3: reviewed ? "from-red-500/30 to-red-800/30" : "from-red-500 to-red-800", }; return (
{severity == displaySeverityType && (
)} {severity != displaySeverityType && (
)}
); } export default EventSegment;