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.

37 lines
1.0 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(): 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. }, [lastEvent]);
  13. useEffect(() => {
  14. const handle = setTimeout(() => setMilestone(null), 1000);
  15. return () => clearTimeout(handle);
  16. }, [milestone]);
  17. return milestone;
  18. }
  19. export function useLastMilestoneValue(valueKey: ValueKey, primaryKey: ValueKey) {
  20. const [value, setValue] = useState<number>(0);
  21. const current = useCurrentMilestone();
  22. useEffect(() => {
  23. if (current && current.primaryKey === primaryKey) {
  24. setValue(prev => current.current[valueKey] || prev);
  25. }
  26. }, [current, primaryKey, valueKey]);
  27. return value;
  28. }