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; }; 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" : "" }`; 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", })}
)}
{!isFirstSegmentInMinimap && !isLastSegmentInMinimap && (
)}
{!isFirstSegmentInMinimap && !isLastSegmentInMinimap && (
{timestamp.getMinutes() % timestampSpread === 0 && timestamp.getSeconds() === 0 && timestamp.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", })}
)}
{severity == displaySeverityType && (
)} {severity != displaySeverityType && (
)}
); } export default EventSegment;