2024-03-05 01:18:27 +03:00
|
|
|
import { useCallback, useMemo } from "react";
|
2024-03-05 22:55:44 +03:00
|
|
|
import { MotionData } from "@/types/review";
|
2024-03-04 19:42:51 +03:00
|
|
|
|
|
|
|
|
export const useMotionSegmentUtils = (
|
|
|
|
|
segmentDuration: number,
|
2024-03-05 22:55:44 +03:00
|
|
|
motion_events: MotionData[],
|
2024-03-04 19:42:51 +03:00
|
|
|
) => {
|
2024-03-05 01:18:27 +03:00
|
|
|
const halfSegmentDuration = useMemo(
|
|
|
|
|
() => segmentDuration / 2,
|
|
|
|
|
[segmentDuration],
|
|
|
|
|
);
|
|
|
|
|
|
2024-03-04 19:42:51 +03:00
|
|
|
const getSegmentStart = useCallback(
|
|
|
|
|
(time: number): number => {
|
2024-03-05 01:18:27 +03:00
|
|
|
return Math.floor(time / halfSegmentDuration) * halfSegmentDuration;
|
2024-03-04 19:42:51 +03:00
|
|
|
},
|
2024-03-05 01:18:27 +03:00
|
|
|
[halfSegmentDuration],
|
2024-03-04 19:42:51 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const getSegmentEnd = useCallback(
|
|
|
|
|
(time: number | undefined): number => {
|
|
|
|
|
if (time) {
|
|
|
|
|
return (
|
2024-03-05 01:18:27 +03:00
|
|
|
Math.floor(time / halfSegmentDuration) * halfSegmentDuration +
|
|
|
|
|
halfSegmentDuration
|
2024-03-04 19:42:51 +03:00
|
|
|
);
|
|
|
|
|
} else {
|
2024-03-05 01:18:27 +03:00
|
|
|
return Date.now() / 1000 + halfSegmentDuration;
|
2024-03-04 19:42:51 +03:00
|
|
|
}
|
|
|
|
|
},
|
2024-03-05 01:18:27 +03:00
|
|
|
[halfSegmentDuration],
|
2024-03-04 19:42:51 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const interpolateMotionAudioData = useCallback(
|
2024-03-05 01:18:27 +03:00
|
|
|
(value: number, newMax: number): number => {
|
|
|
|
|
return Math.ceil((Math.abs(value) / 100.0) * newMax) || 1;
|
2024-03-04 19:42:51 +03:00
|
|
|
},
|
|
|
|
|
[],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const getMotionSegmentValue = useCallback(
|
|
|
|
|
(time: number): number => {
|
|
|
|
|
const matchingEvent = motion_events.find((event) => {
|
|
|
|
|
return (
|
|
|
|
|
time >= getSegmentStart(event.start_time) &&
|
2024-03-05 01:18:27 +03:00
|
|
|
time < getSegmentEnd(event.start_time)
|
2024-03-04 19:42:51 +03:00
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
2024-03-05 22:55:44 +03:00
|
|
|
return matchingEvent?.motion ?? 0;
|
2024-03-04 19:42:51 +03:00
|
|
|
},
|
|
|
|
|
[motion_events, getSegmentStart, getSegmentEnd],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const getAudioSegmentValue = useCallback(
|
|
|
|
|
(time: number): number => {
|
|
|
|
|
const matchingEvent = motion_events.find((event) => {
|
|
|
|
|
return (
|
|
|
|
|
time >= getSegmentStart(event.start_time) &&
|
2024-03-05 01:18:27 +03:00
|
|
|
time < getSegmentEnd(event.start_time)
|
2024-03-04 19:42:51 +03:00
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
2024-03-05 22:55:44 +03:00
|
|
|
return matchingEvent?.audio ?? 0;
|
2024-03-04 19:42:51 +03:00
|
|
|
},
|
|
|
|
|
[motion_events, getSegmentStart, getSegmentEnd],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
getMotionSegmentValue,
|
|
|
|
|
getAudioSegmentValue,
|
|
|
|
|
interpolateMotionAudioData,
|
|
|
|
|
};
|
|
|
|
|
};
|