2022-11-28 15:00:28 +13:00
|
|
|
import { Heart, Power } from 'lucide-react';
|
2022-08-05 10:17:31 +08:00
|
|
|
|
|
|
|
import { Icon } from '@/react/components/Icon';
|
|
|
|
|
2024-01-17 22:30:12 +07:00
|
|
|
import {
|
2024-10-08 17:13:14 +02:00
|
|
|
ContainerListViewModel,
|
2024-01-17 22:30:12 +07:00
|
|
|
ContainerStatus as Status,
|
|
|
|
} from '../containers/types';
|
2022-07-06 11:23:53 +03:00
|
|
|
|
|
|
|
interface Props {
|
2024-10-08 17:13:14 +02:00
|
|
|
containers: ContainerListViewModel[];
|
2022-07-06 11:23:53 +03:00
|
|
|
}
|
|
|
|
|
2024-10-08 17:13:14 +02:00
|
|
|
export function useContainerStatusComponent(
|
|
|
|
containers: ContainerListViewModel[]
|
|
|
|
) {
|
2022-07-06 11:23:53 +03:00
|
|
|
return <ContainerStatus containers={containers} />;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function ContainerStatus({ containers }: Props) {
|
|
|
|
return (
|
2022-08-05 10:17:31 +08:00
|
|
|
<div className="pull-right">
|
|
|
|
<div>
|
|
|
|
<div className="vertical-center space-right pr-5">
|
2022-11-28 15:00:28 +13:00
|
|
|
<Icon icon={Power} mode="success" size="sm" />
|
2022-07-06 11:23:53 +03:00
|
|
|
{runningContainersFilter(containers)} running
|
|
|
|
</div>
|
2022-08-05 10:17:31 +08:00
|
|
|
<div className="vertical-center space-right">
|
2022-11-28 15:00:28 +13:00
|
|
|
<Icon icon={Power} mode="danger" size="sm" />
|
2022-07-06 11:23:53 +03:00
|
|
|
{stoppedContainersFilter(containers)} stopped
|
|
|
|
</div>
|
|
|
|
</div>
|
2022-08-05 10:17:31 +08:00
|
|
|
<div>
|
|
|
|
<div className="vertical-center space-right pr-5">
|
2022-11-28 15:00:28 +13:00
|
|
|
<Icon icon={Heart} mode="success" size="sm" />
|
2022-07-06 11:23:53 +03:00
|
|
|
{healthyContainersFilter(containers)} healthy
|
|
|
|
</div>
|
2022-08-05 10:17:31 +08:00
|
|
|
<div className="vertical-center space-right">
|
2022-11-28 15:00:28 +13:00
|
|
|
<Icon icon={Heart} mode="danger" size="sm" />
|
2022-07-06 11:23:53 +03:00
|
|
|
{unhealthyContainersFilter(containers)} unhealthy
|
|
|
|
</div>
|
|
|
|
</div>
|
2022-08-05 10:17:31 +08:00
|
|
|
</div>
|
2022-07-06 11:23:53 +03:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2024-10-08 17:13:14 +02:00
|
|
|
function runningContainersFilter(containers: ContainerListViewModel[]) {
|
2024-01-17 22:30:12 +07:00
|
|
|
return containers.filter(
|
|
|
|
(container) =>
|
|
|
|
container.Status === Status.Running || container.Status === Status.Healthy
|
|
|
|
).length;
|
2022-07-06 11:23:53 +03:00
|
|
|
}
|
2024-10-08 17:13:14 +02:00
|
|
|
function stoppedContainersFilter(containers: ContainerListViewModel[]) {
|
2022-10-20 15:10:39 +08:00
|
|
|
return containers.filter(
|
|
|
|
(container) =>
|
2024-01-17 22:30:12 +07:00
|
|
|
container.Status === Status.Exited || container.Status === Status.Stopped
|
2022-10-20 15:10:39 +08:00
|
|
|
).length;
|
2022-07-06 11:23:53 +03:00
|
|
|
}
|
2024-10-08 17:13:14 +02:00
|
|
|
function healthyContainersFilter(containers: ContainerListViewModel[]) {
|
2024-01-17 22:30:12 +07:00
|
|
|
return containers.filter((container) => container.Status === Status.Healthy)
|
2022-07-06 11:23:53 +03:00
|
|
|
.length;
|
|
|
|
}
|
2024-10-08 17:13:14 +02:00
|
|
|
function unhealthyContainersFilter(containers: ContainerListViewModel[]) {
|
2024-01-17 22:30:12 +07:00
|
|
|
return containers.filter((container) => container.Status === Status.Unhealthy)
|
2022-07-06 11:23:53 +03:00
|
|
|
.length;
|
|
|
|
}
|