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                                  76x   12796x 12796x 12796x 12796x 12796x 12796x 12796x 12796x   12796x   74x     11x   38388x       12796x 74x 38388x   12796x   81x           12796x     25592x     22x           12774x     12855x       226x       13000x 12774x   76644x 226x 226x       12855x     12774x   13226x 12774x 13000x 38322x      
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>
  );
}