2024-02-21 20:58:41 +03:00
|
|
|
import { useCallback, useMemo } from "react";
|
|
|
|
|
import { ReviewSegment } from "@/types/review";
|
2024-02-21 02:22:59 +03:00
|
|
|
|
|
|
|
|
export const useSegmentUtils = (
|
|
|
|
|
segmentDuration: number,
|
|
|
|
|
events: ReviewSegment[],
|
2024-02-21 20:58:41 +03:00
|
|
|
severityType: string
|
2024-02-21 02:22:59 +03:00
|
|
|
) => {
|
2024-02-21 20:58:41 +03:00
|
|
|
const getSegmentStart = useCallback(
|
|
|
|
|
(time: number): number => {
|
|
|
|
|
return Math.floor(time / segmentDuration) * segmentDuration;
|
|
|
|
|
},
|
|
|
|
|
[segmentDuration]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const getSegmentEnd = useCallback(
|
|
|
|
|
(time: number | undefined): number => {
|
|
|
|
|
if (time) {
|
|
|
|
|
return (
|
|
|
|
|
Math.floor(time / segmentDuration) * segmentDuration + segmentDuration
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
return Date.now() / 1000 + segmentDuration;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
[segmentDuration]
|
|
|
|
|
);
|
2024-02-21 02:22:59 +03:00
|
|
|
|
|
|
|
|
const mapSeverityToNumber = useCallback((severity: string): number => {
|
|
|
|
|
switch (severity) {
|
|
|
|
|
case "significant_motion":
|
|
|
|
|
return 1;
|
|
|
|
|
case "detection":
|
|
|
|
|
return 2;
|
|
|
|
|
case "alert":
|
|
|
|
|
return 3;
|
|
|
|
|
default:
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const displaySeverityType = useMemo(
|
|
|
|
|
() => mapSeverityToNumber(severityType ?? ""),
|
|
|
|
|
[severityType]
|
|
|
|
|
);
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const getSeverity = useCallback(
|
|
|
|
|
(time: number, displaySeverityType: number): number[] => {
|
|
|
|
|
const activeEvents = events?.filter((event) => {
|
|
|
|
|
const segmentStart = getSegmentStart(event.start_time);
|
|
|
|
|
const segmentEnd = getSegmentEnd(event.end_time);
|
|
|
|
|
return time >= segmentStart && time < segmentEnd;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (activeEvents?.length === 0) return [0];
|
|
|
|
|
const severityValues = activeEvents.map((event) =>
|
|
|
|
|
mapSeverityToNumber(event.severity)
|
2024-02-21 02:22:59 +03:00
|
|
|
);
|
2024-02-21 20:58:41 +03:00
|
|
|
const highestSeverityValue = Math.max(...severityValues);
|
2024-02-21 02:22:59 +03:00
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
if (
|
|
|
|
|
severityValues.includes(displaySeverityType) &&
|
|
|
|
|
displaySeverityType !== highestSeverityValue
|
|
|
|
|
) {
|
|
|
|
|
return [displaySeverityType, highestSeverityValue];
|
|
|
|
|
} else {
|
|
|
|
|
return [highestSeverityValue];
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
[events, getSegmentStart, getSegmentEnd, mapSeverityToNumber]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const getReviewed = useCallback(
|
|
|
|
|
(time: number): boolean => {
|
|
|
|
|
return events.some((event) => {
|
|
|
|
|
const segmentStart = getSegmentStart(event.start_time);
|
|
|
|
|
const segmentEnd = getSegmentEnd(event.end_time);
|
|
|
|
|
return (
|
|
|
|
|
time >= segmentStart && time < segmentEnd && event.has_been_reviewed
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
[events, getSegmentStart, getSegmentEnd]
|
|
|
|
|
);
|
2024-02-21 02:22:59 +03:00
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const shouldShowRoundedCorners = useCallback(
|
|
|
|
|
(segmentTime: number): { roundTop: boolean; roundBottom: boolean } => {
|
2024-02-21 02:22:59 +03:00
|
|
|
const prevSegmentTime = segmentTime - segmentDuration;
|
|
|
|
|
const nextSegmentTime = segmentTime + segmentDuration;
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const severityEvents = events.filter((e) => e.severity === severityType);
|
2024-02-21 02:22:59 +03:00
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const otherEvents = events.filter((e) => e.severity !== severityType);
|
2024-02-21 02:22:59 +03:00
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const hasPrevSeverityEvent = severityEvents.some((e) => {
|
2024-02-21 02:22:59 +03:00
|
|
|
return (
|
|
|
|
|
prevSegmentTime >= getSegmentStart(e.start_time) &&
|
|
|
|
|
prevSegmentTime < getSegmentEnd(e.end_time)
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const hasNextSeverityEvent = severityEvents.some((e) => {
|
2024-02-21 02:22:59 +03:00
|
|
|
return (
|
|
|
|
|
nextSegmentTime >= getSegmentStart(e.start_time) &&
|
|
|
|
|
nextSegmentTime < getSegmentEnd(e.end_time)
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const hasPrevOtherEvent = otherEvents.some((e) => {
|
|
|
|
|
return (
|
|
|
|
|
prevSegmentTime >= getSegmentStart(e.start_time) &&
|
|
|
|
|
prevSegmentTime < getSegmentEnd(e.end_time)
|
|
|
|
|
);
|
2024-02-21 02:22:59 +03:00
|
|
|
});
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const hasNextOtherEvent = otherEvents.some((e) => {
|
|
|
|
|
return (
|
|
|
|
|
nextSegmentTime >= getSegmentStart(e.start_time) &&
|
|
|
|
|
nextSegmentTime < getSegmentEnd(e.end_time)
|
|
|
|
|
);
|
2024-02-21 02:22:59 +03:00
|
|
|
});
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const hasOverlappingSeverityEvent = severityEvents.some((e) => {
|
|
|
|
|
return (
|
|
|
|
|
segmentTime >= getSegmentStart(e.start_time) &&
|
|
|
|
|
segmentTime < getSegmentEnd(e.end_time)
|
|
|
|
|
);
|
2024-02-21 02:22:59 +03:00
|
|
|
});
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
const hasOverlappingOtherEvent = otherEvents.some((e) => {
|
|
|
|
|
return (
|
|
|
|
|
segmentTime >= getSegmentStart(e.start_time) &&
|
|
|
|
|
segmentTime < getSegmentEnd(e.end_time)
|
|
|
|
|
);
|
2024-02-21 02:22:59 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let roundTop = false;
|
|
|
|
|
let roundBottom = false;
|
|
|
|
|
|
|
|
|
|
if (hasOverlappingSeverityEvent) {
|
|
|
|
|
roundBottom = !hasPrevSeverityEvent;
|
|
|
|
|
roundTop = !hasNextSeverityEvent;
|
|
|
|
|
} else if (hasOverlappingOtherEvent) {
|
|
|
|
|
roundBottom = !hasPrevOtherEvent;
|
|
|
|
|
roundTop = !hasNextOtherEvent;
|
|
|
|
|
} else {
|
|
|
|
|
roundTop = !hasNextSeverityEvent || !hasNextOtherEvent;
|
|
|
|
|
roundBottom = !hasPrevSeverityEvent || !hasPrevOtherEvent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
roundTop,
|
2024-02-21 20:58:41 +03:00
|
|
|
roundBottom,
|
2024-02-21 02:22:59 +03:00
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
[events, getSegmentStart, getSegmentEnd, segmentDuration, severityType]
|
|
|
|
|
);
|
|
|
|
|
|
2024-02-21 20:58:41 +03:00
|
|
|
return {
|
|
|
|
|
getSegmentStart,
|
|
|
|
|
getSegmentEnd,
|
|
|
|
|
getSeverity,
|
|
|
|
|
displaySeverityType,
|
|
|
|
|
getReviewed,
|
|
|
|
|
shouldShowRoundedCorners,
|
|
|
|
|
};
|
2024-02-21 23:07:32 +03:00
|
|
|
};
|