blakeblackshear.frigate/web/src/hooks/use-motion-segment-utils.ts
2024-03-04 14:12:54 -06:00

69 lines
1.8 KiB
TypeScript

import { useCallback } from "react";
import { MockMotionData } from "@/pages/UIPlayground";
export const useMotionSegmentUtils = (
segmentDuration: number,
motion_events: MockMotionData[],
) => {
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],
);
const interpolateMotionAudioData = useCallback(
(value: number, newMax: number): number => {
return Math.ceil((Math.abs(value) / 100.0) * newMax) || 1;
},
[],
);
const getMotionSegmentValue = useCallback(
(time: number): number => {
const matchingEvent = motion_events.find((event) => {
return (
time >= getSegmentStart(event.start_time) &&
time < getSegmentEnd(event.start_time + segmentDuration / 2)
);
});
return matchingEvent?.motionValue ?? 0;
},
[motion_events, getSegmentStart, getSegmentEnd, segmentDuration],
);
const getAudioSegmentValue = useCallback(
(time: number): number => {
const matchingEvent = motion_events.find((event) => {
return (
time >= getSegmentStart(event.start_time) &&
time < getSegmentEnd(event.end_time)
);
});
return matchingEvent?.audioValue ?? 0;
},
[motion_events, getSegmentStart, getSegmentEnd],
);
return {
getMotionSegmentValue,
getAudioSegmentValue,
interpolateMotionAudioData,
};
};