import { Button, Group, Select, Stack, Text, TextInput, Title } from '@mantine/core'; import { useForm } from '@mantine/form'; import { ContextModalProps, modals } from '@mantine/modals'; import { showNotification } from '@mantine/notifications'; import { IconCheck, IconX } from '@tabler/icons-react'; import { ContainerInfo } from 'dockerode'; import { Trans, useTranslation } from 'next-i18next'; import { z } from 'zod'; import { api } from '~/utils/api'; import { useI18nZodResolver } from '~/utils/i18n-zod-resolver'; const dockerSelectBoardSchema = z.object({ board: z.string().nonempty(), }); type InnerProps = { containers: ContainerInfo[]; }; type FormType = z.infer; export const DockerSelectBoardModal = ({ id, innerProps }: ContextModalProps) => { const { t } = useTranslation('tools/docker'); const { mutateAsync, isLoading } = api.boards.addAppsForContainers.useMutation(); const { i18nZodResolver } = useI18nZodResolver(); const handleSubmit = async (values: FormType) => { await mutateAsync( { apps: innerProps.containers.map((container) => ({ name: (container.Names.at(0) ?? 'App').replace('/', ''), port: container.Ports.at(0)?.PublicPort, })), boardName: values.board, }, { onSuccess: () => { showNotification({ title: t('notifications.selectBoard.success.title'), message: t('notifications.selectBoard.success.message'), icon: , color: 'green', }); modals.close(id); }, onError: () => { showNotification({ title: t('notifications.selectBoard.error.title'), message: t('notifications.selectBoard.error.message'), icon: , color: 'red', }); }, } ); }; const form = useForm({ initialValues: { board: '', }, validate: i18nZodResolver(dockerSelectBoardSchema), }); const { data: boards } = api.boards.all.useQuery(); return (
{t('modals.selectBoard.text')}