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

  1. import {useContext, useEffect, useMemo, useReducer, useState} from "react";
  2. import RuntimeContext from "../contexts/RuntimeContext";
  3. import {Milestone} from "../models/Milestone";
  4. import {ValueKey} from "../models/Shared";
  5. export function useCurrentMilestone(showOld: boolean = false): Milestone | null {
  6. const {lastEvent} = useContext(RuntimeContext);
  7. const [milestone, setMilestone] = useState<Milestone | null>(null);
  8. useEffect(() => {
  9. if (lastEvent?.milestone) {
  10. setMilestone(lastEvent.milestone);
  11. }
  12. if (showOld && lastEvent?.oldMilestones) {
  13. for (const milestone of lastEvent.oldMilestones) {
  14. setMilestone(milestone);
  15. }
  16. }
  17. }, [showOld, lastEvent]);
  18. useEffect(() => {
  19. const handle = setTimeout(() => setMilestone(null), 1000);
  20. return () => clearTimeout(handle);
  21. }, [milestone]);
  22. return milestone;
  23. }
  24. export function useLastMilestoneValue(valueKey: ValueKey, primaryKey: ValueKey) {
  25. const [value, setValue] = useState<number>(0);
  26. const current = useCurrentMilestone(true);
  27. useEffect(() => {
  28. if (current && current.primaryKey === primaryKey) {
  29. setValue(prev => current.current[valueKey] || prev);
  30. }
  31. }, [current, primaryKey, valueKey]);
  32. return value;
  33. }