You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.2 KiB
43 lines
1.2 KiB
import {useContext, useEffect, useMemo, useReducer, useState} from "react";
|
|
import RuntimeContext from "../contexts/RuntimeContext";
|
|
import {Milestone} from "../models/Milestone";
|
|
import {ValueKey} from "../models/Shared";
|
|
|
|
export function useCurrentMilestone(showOld: boolean = false): Milestone | null {
|
|
const {lastEvent} = useContext(RuntimeContext);
|
|
|
|
const [milestone, setMilestone] = useState<Milestone | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (lastEvent?.milestone) {
|
|
setMilestone(lastEvent.milestone);
|
|
}
|
|
|
|
if (showOld && lastEvent?.oldMilestones) {
|
|
for (const milestone of lastEvent.oldMilestones) {
|
|
setMilestone(milestone);
|
|
}
|
|
}
|
|
}, [showOld, lastEvent]);
|
|
|
|
useEffect(() => {
|
|
const handle = setTimeout(() => setMilestone(null), 1000);
|
|
|
|
return () => clearTimeout(handle);
|
|
}, [milestone]);
|
|
|
|
return milestone;
|
|
}
|
|
|
|
export function useLastMilestoneValue(valueKey: ValueKey, primaryKey: ValueKey) {
|
|
const [value, setValue] = useState<number>(0);
|
|
const current = useCurrentMilestone(true);
|
|
|
|
useEffect(() => {
|
|
if (current && current.primaryKey === primaryKey) {
|
|
setValue(prev => current.current[valueKey] || prev);
|
|
}
|
|
}, [current, primaryKey, valueKey]);
|
|
|
|
return value;
|
|
}
|