Files
Homarr/src/modules/Docker/DockerModule.tsx

101 lines
2.9 KiB
TypeScript
Raw Normal View History

import { ActionIcon, Drawer, Text, Tooltip } from '@mantine/core';
import { useHotkeys } from '@mantine/hooks';
2022-12-23 17:17:57 +01:00
import { showNotification } from '@mantine/notifications';
import { IconBrandDocker, IconX } from '@tabler/icons-react';
import axios from 'axios';
import Docker from 'dockerode';
2022-08-22 09:50:54 +02:00
import { useTranslation } from 'next-i18next';
2022-12-23 17:17:57 +01:00
import { useEffect, useState } from 'react';
import { useCardStyles } from '../../components/layout/useCardStyles';
2023-01-06 12:11:47 +09:00
import { useConfigContext } from '../../config/provider';
2022-08-18 21:46:46 +02:00
import ContainerActionBar from './ContainerActionBar';
import DockerTable from './DockerTable';
export default function DockerMenuButton(props: any) {
const [opened, setOpened] = useState(false);
const [containers, setContainers] = useState<Docker.ContainerInfo[]>([]);
const [selection, setSelection] = useState<Docker.ContainerInfo[]>([]);
2022-12-23 17:17:57 +01:00
const { config } = useConfigContext();
2023-01-22 23:10:05 +09:00
const { classes } = useCardStyles(true);
useHotkeys([['mod+B', () => setOpened(!opened)]]);
2022-12-23 17:17:57 +01:00
const dockerEnabled = config?.settings.customization.layout.enabledDocker || false;
const { t } = useTranslation('modules/docker');
useEffect(() => {
reload();
2022-12-23 17:17:57 +01:00
}, [config?.settings]);
function reload() {
2022-12-23 17:17:57 +01:00
if (!dockerEnabled) {
return;
}
setTimeout(() => {
axios
.get('/api/docker/containers')
.then((res) => {
setContainers(res.data);
setSelection([]);
})
.catch(() => {
// Remove containers from the list
setContainers([]);
// Send an Error notification
showNotification({
autoClose: 1500,
2022-08-22 09:50:54 +02:00
title: <Text>{t('errors.integrationFailed.title')}</Text>,
color: 'red',
icon: <IconX />,
2022-08-22 09:50:54 +02:00
message: t('errors.integrationFailed.message'),
});
2022-09-02 13:01:56 +02:00
});
}, 300);
}
2022-12-23 17:17:57 +01:00
2023-03-02 16:40:50 +09:00
if (!dockerEnabled || process.env.DISABLE_EDIT_MODE === 'true') {
return null;
}
2022-12-23 17:44:51 +01:00
return (
<>
<Drawer
opened={opened}
trapFocus={false}
onClose={() => setOpened(false)}
padding="xl"
2023-01-04 22:45:51 +09:00
position="right"
2023-03-03 00:37:22 +09:00
size="100%"
title={<ContainerActionBar selected={selection} reload={reload} />}
2023-03-03 00:37:22 +09:00
transitionProps={{
transition: 'pop',
}}
styles={{
2023-03-03 00:37:22 +09:00
content: {
display: 'flex',
flexDirection: 'column',
},
body: {
minHeight: 0,
},
}}
>
<DockerTable containers={containers} selection={selection} setSelection={setSelection} />
</Drawer>
2022-08-22 09:50:54 +02:00
<Tooltip label={t('actionIcon.tooltip')}>
<ActionIcon
variant="default"
className={classes.card}
radius="md"
size="xl"
color="blue"
onClick={() => setOpened(true)}
>
<IconBrandDocker />
</ActionIcon>
</Tooltip>
</>
);
}