/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Button, Group } from '@mantine/core'; import { showNotification, updateNotification } from '@mantine/notifications'; import { IconCheck, IconPlayerPlay, IconPlayerStop, IconPlus, IconRefresh, IconRotateClockwise, IconTrash, } from '@tabler/icons'; import axios from 'axios'; import Dockerode from 'dockerode'; import { useTranslation } from 'next-i18next'; import { useState } from 'react'; import { TFunction } from 'react-i18next'; import { v4 as uuidv4 } from 'uuid'; import { useConfigContext } from '../../config/provider'; import { openContextModalGeneric } from '../../tools/mantineModalManagerExtensions'; import { MatchingImages, ServiceType, tryMatchPort } from '../../tools/types'; import { AppType } from '../../types/app'; let t: TFunction<'modules/docker', undefined>; function sendDockerCommand( action: string, containerId: string, containerName: string, reload: () => void ) { showNotification({ id: containerId, loading: true, title: `${t(`actions.${action}.start`)} ${containerName}`, message: undefined, autoClose: false, withCloseButton: false, }); axios .get(`/api/docker/container/${containerId}?action=${action}`) .then((res) => { updateNotification({ id: containerId, title: containerName, message: `${t(`actions.${action}.end`)} ${containerName}`, icon: , autoClose: 2000, }); }) .catch((err) => { updateNotification({ id: containerId, color: 'red', title: t('errors.unknownError.title'), message: err.response.data.reason, autoClose: 2000, }); }) .finally(() => { reload(); }); } export interface ContainerActionBarProps { selected: Dockerode.ContainerInfo[]; reload: () => void; } export default function ContainerActionBar({ selected, reload }: ContainerActionBarProps) { t = useTranslation('modules/docker').t; const [isLoading, setisLoading] = useState(false); const { name: configName, config } = useConfigContext(); const getLowestWrapper = () => config?.wrappers.sort((a, b) => a.position - b.position)[0]; return ( ); } /** * @deprecated legacy code */ function tryMatchType(imageName: string): ServiceType { const match = MatchingImages.find(({ image }) => imageName.includes(image)); if (match) { return match.type; } // TODO: Remove this legacy code return 'Other'; } /** * @deprecated * @param container the container to match * @returns a new service */ const tryMatchService = (container: Dockerode.ContainerInfo | undefined) => { if (container === undefined) return {}; const name = container.Names[0].substring(1); const type = tryMatchType(container.Image); const port = tryMatchPort(type.toLowerCase())?.value ?? container.Ports[0]?.PublicPort; return { name, id: container.Id, type: tryMatchType(container.Image), url: `localhost${port ? `:${port}` : ''}`, icon: `https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${name .replace(/\s+/g, '-') .toLowerCase()}.png`, }; };