blob: 78877fbae4026c79d34c20b9cc0d56fb049f817a [file] [log] [blame]
import React, {useState} from 'react';
import {Button, Flex, FlexItem, Label, Spinner, Switch, Tooltip, TooltipPosition} from '@patternfly/react-core';
import '../designer/karavan.css';
import RocketIcon from "@patternfly/react-icons/dist/esm/icons/rocket-icon";
import ReloadIcon from "@patternfly/react-icons/dist/esm/icons/bolt-icon";
import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon";
import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore";
import {ProjectService} from "../api/ProjectService";
import {shallow} from "zustand/shallow";
import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon";
import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon";
import StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon";
interface Props {
reloadOnly?: boolean
}
export function DevModeToolbar (props: Props) {
const [config] = useAppConfigStore((state) => [state.config], shallow)
const [status] = useDevModeStore((state) => [state.status], shallow)
const [project] = useProjectStore((state) => [state.project], shallow)
const [containers] = useStatusesStore((state) => [state.containers], shallow);
const [verbose, setVerbose] = useState(false);
const containerStatus = containers.filter(c => c.containerName === project.projectId).at(0);
const commands = containerStatus?.commands || ['run'];
const isRunning = containerStatus?.state === 'running';
const inTransit = containerStatus?.inTransit;
const isLoading = status === 'wip';
const color = containerStatus?.state === 'running' ? "green" : "grey";
const icon = isRunning ? <UpIcon/> : <DownIcon/>;
return (<Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}>
<FlexItem>
{(inTransit || isLoading) && <Spinner size="lg" aria-label="spinner"/>}
</FlexItem>
{containerStatus?.containerId && <FlexItem>
<Label icon={icon} color={color}>
<Tooltip content={"Show log"} position={TooltipPosition.bottom}>
<Button className='labeled-button' variant="link" isDisabled={!isRunning}
onClick={e =>
useLogStore.setState({showLog: true, type: 'container', podName: containerStatus.containerName})}>
{containerStatus.containerName}
</Button>
</Tooltip>
</Label>
</FlexItem>}
<FlexItem>
<Tooltip content="Verbose" position={TooltipPosition.bottom}>
<Switch aria-label="verbose"
id="verbose"
isChecked={verbose}
onChange={(_, checked) => setVerbose(checked)}
/>
</Tooltip>
</FlexItem>
{!isRunning && <FlexItem>
<Tooltip content="Run in developer mode" position={TooltipPosition.bottom}>
<Button size="sm"
isDisabled={(!(commands.length === 0) && !commands.includes('run')) || inTransit}
variant={"primary"}
icon={<RocketIcon/>}
onClick={() => ProjectService.startDevModeContainer(project, verbose)}>
{"Run"}
</Button>
</Tooltip>
</FlexItem>}
{isRunning && <FlexItem>
<Tooltip content="Reload" position={TooltipPosition.bottom}>
<Button size="sm"
isDisabled={inTransit}
variant={"primary"}
className="project-button"
icon={<ReloadIcon/>}
onClick={() => ProjectService.reloadDevModeCode(project)}>Reload
</Button>
</Tooltip>
</FlexItem>}
{config.infrastructure !== 'kubernetes' &&
<FlexItem>
<Tooltip content="Stop container" position={TooltipPosition.bottom}>
<Button size="sm"
isDisabled={!commands.includes('stop') || inTransit}
variant={"control"}
icon={<StopIcon/>}
onClick={() => ProjectService.stopDevModeContainer(project)}>
</Button>
</Tooltip>
</FlexItem>
}
<FlexItem>
<Tooltip content="Delete container" position={TooltipPosition.bottom}>
<Button size="sm"
isDisabled={!commands.includes('delete') || inTransit}
variant={"control"}
icon={<DeleteIcon/>}
onClick={() => ProjectService.deleteDevModeContainer(project)}>
</Button>
</Tooltip>
</FlexItem>
</Flex>);
}