All files / src/pages/flowsheet-page/flowsheet SolveButton.tsx

89.13% Statements 41/46
57.69% Branches 15/26
33.33% Functions 1/3
94.59% Lines 35/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95                                  103x   13098x 13098x 13098x 13098x 13098x 13098x 13098x 13098x   13098x   80x     13x   39294x       13098x 80x 39294x   13098x   136x           13098x     26196x     184x           12914x     13039x       278x       13192x 12914x   77484x 278x 278x       13039x     12914x   13470x 12914x 13192x 38742x      
import { defineCommand, useRegisterCommand } from "just-search-it";
import { ChevronDown, Play } from "lucide-react";
import { useCallback } from "react";
import { useLocalStorage } from "usehooks-ts";
import { Button } from "@/ahuora-design-system/ui/button";
import { Spinner } from "@/ahuora-design-system/ui/spinner";
import { ToolTipCover } from "@/ahuora-design-system/ui/tooltip";
import { useFlowsheetAccess } from "@/hooks/flowsheetAccess";
import {
  DropdownMenu,
  DropdownMenuTrigger,
} from "../../../ahuora-design-system/ui/dropdown-menu";
import { cn } from "../../../lib/utils";
import { ScenarioDropdown } from "./LeftSideBar/Scenarios/ScenarioDropdown";
import { useCurrentScenario } from "./LeftSideBar/Scenarios/useCurrentScenario";
import { useSolve } from "./Solving/useSolve";
 
const solveCommand = defineCommand<[], void>("solve");
 
export default function SolveButton({ className }: { className?: string }) {
  const [solve, solveRunning] = useSolve();
  const access = useFlowsheetAccess();
  const canMutate = access?.can_edit ?? true;
  const scenario = useCurrentScenario();
  const scenarioNumber = scenario?.id;
  const [, setScenarioOpen] = useLocalStorage("scenario-result-open", false);
  const solveDisabled = solveRunning;
 
  const executeSolve = useCallback(
    (targetScenario?: number) => {
      solve(targetScenario);
 
      if (targetScenario) {
        setScenarioOpen(true);
      }
    },
    [setScenarioOpen, solve],
  );
 
  const handleClick = () => {
    executeSolve(scenarioNumber);
  };
 
  useRegisterCommand(
    solveCommand,
    {
      name: "Solve",
      description:
        "Solve the flowsheet in steady-state with the current parameters.",
      group: "Solving",
      icon: <Play className="icon-ls" />,
    },
    () => {
      executeSolve(undefined);
    },
  );
 
  if (!canMutate) {
    return null;
  }
 
  return (
    <div className="h-full">
      <ToolTipCover content={"Click to solve flowsheet."} asChild side="bottom">
        <Button
          size="sm"
          className={cn(className, "rounded-r-none")}
          onClick={handleClick}
          disabled={solveDisabled}
        >
          {solveRunning ? (
            <Spinner size="small" color="white" />
          ) : (
            <Play size={20} />
          )}
          Run {scenario && ` ${scenario.displayName}`}
        </Button>
      </ToolTipCover>
      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <Button
            size="sm"
            aria-label="Select Scenario"
            className={cn(className, "rounded-l-none")}
            disabled={solveDisabled}
          >
            <ChevronDown />
          </Button>
        </DropdownMenuTrigger>
        <ScenarioDropdown />
      </DropdownMenu>
    </div>
  );
}