import { Modal, ModalContent, ModalHeader, ModalOverlay, ModalProps, useDisclosure, Text, ModalCloseButton, ModalBody, VStack, FormControl, FormLabel, HStack, FormErrorMessage, Input, Tooltip, Icon, Textarea, ModalFooter, Button, } from '@chakra-ui/react' import { useFormik } from 'formik' import React from 'react' import { Implementation } from 'src/models' import { EditImplementationSchema, editImplementationSchema } from './schema' import { FaInfo } from 'react-icons/fa' import { UpdateImplementationMutation } from '../query-builder/update-implementation-mutation' import { useQueryClient } from 'react-query' import { GetImplementationQuery } from '../query-builder/get-implementation-query' import { GetImplementationsByPatternIdQuery } from '../query-builder/get-implementations-by-pattern-id-query' const FORM_ID = 'edit-implementation-form' export type EditImplementationModalProps = { disclosure: ReturnType<typeof useDisclosure> implementation: Implementation patternId: string } & Partial<ModalProps> export const EditImplementationModal: React.FC< EditImplementationModalProps > = ({ disclosure, implementation, patternId, ...props }) => { const queryClient = useQueryClient() const updateImplementationMutation = UpdateImplementationMutation.useMutation() const handleOnSubmit = async (values: EditImplementationSchema) => { await updateImplementationMutation.mutateAsync({ id: implementation.id, name: values.name, dockerhubImageName: values.dockerhubImageName, description: values.description, }) queryClient.invalidateQueries( GetImplementationQuery.getKey({ id: implementation.id }) ) queryClient.invalidateQueries( GetImplementationsByPatternIdQuery.getKey({ patternId: patternId, }) ) disclosure.onClose() } const { handleSubmit, handleReset, handleChange, setTouched, values, isSubmitting, errors, touched, isValid, } = useFormik({ enableReinitialize: true, initialValues: { name: implementation.name, description: implementation.description, dockerhubImageName: implementation.dockerhubImageName, }, validateOnBlur: true, validateOnChange: true, validateOnMount: true, validationSchema: editImplementationSchema, onSubmit: handleOnSubmit, }) return ( <> {disclosure.isOpen && ( <Modal size="xl" {...disclosure} {...props}> <ModalOverlay /> <ModalContent> <ModalHeader> <Text fontSize="md"> Editar implementacion {implementation.name} </Text> </ModalHeader> <ModalCloseButton mt="-2" mr="-2" /> <form id={FORM_ID} onSubmit={handleSubmit} onReset={handleReset}> <ModalBody> <VStack> <FormControl isInvalid={Boolean(errors.name) && touched.name}> <FormLabel> <HStack> <Text fontSize="sm">Nombre</Text> <Text color="red">*</Text> </HStack> </FormLabel> <Input name="name" autoFocus value={values.name} onChange={(e) => { setTouched({ ...touched, name: true }) handleChange(e) }} /> <FormErrorMessage>{errors.name}</FormErrorMessage> </FormControl> <FormControl isInvalid={ Boolean(errors.dockerhubImageName) && touched.dockerhubImageName } > <FormLabel> <HStack> <Text fontSize="sm"> Nombre de la imagen en Dockerhub </Text> <Text color="red">*</Text> <Tooltip label="Nombre de la imagen en Dockerhub con la implementacion" shouldWrapChildren hasArrow > <Icon as={FaInfo} color="blue.500" /> </Tooltip> </HStack> </FormLabel> <Input name="dockerhubImageName" autoFocus value={values.dockerhubImageName} onChange={(e) => { setTouched({ ...touched, dockerhubImageName: true }) handleChange(e) }} /> <FormErrorMessage> {errors.dockerhubImageName} </FormErrorMessage> </FormControl> <FormControl isInvalid={ Boolean(errors.description) && touched.description } > <FormLabel> <HStack> <Text fontSize="sm">Descripcion</Text> <Text color="red">*</Text> </HStack> </FormLabel> <Textarea name="description" value={values.description} onChange={(e) => { setTouched({ ...touched, description: true }) handleChange(e) }} /> <FormErrorMessage>{errors.description}</FormErrorMessage> </FormControl> </VStack> </ModalBody> </form> <ModalFooter> <HStack> <Button variant="outline" onClick={disclosure.onClose}> Cancelar </Button> <Button form={FORM_ID} variant="solid" colorScheme="blue" type="submit" isLoading={isSubmitting} isDisabled={!isValid} > Guardar </Button> </HStack> </ModalFooter> </ModalContent> </Modal> )} </> ) }