Skip to content
Snippets Groups Projects
add-pattern-button.tsx 5.34 KiB
Newer Older
brunoravera's avatar
brunoravera committed
import React from 'react'

import {
  Button,
  Modal,
  ModalHeader,
  ButtonProps,
  useDisclosure,
  ModalCloseButton,
  ModalBody,
  ModalOverlay,
  ModalContent,
  Text,
  HStack,
  VStack,
  FormControl,
  FormLabel,
  Input,
  ModalFooter,
  FormErrorMessage,
  Textarea,
brunoravera's avatar
brunoravera committed
  Center,
  Icon,
brunoravera's avatar
brunoravera committed
  Stack,
brunoravera's avatar
brunoravera committed
} from '@chakra-ui/react'
import { useFormik } from 'formik'
brunoravera's avatar
brunoravera committed
import { FaPaperclip } from 'react-icons/fa'
brunoravera's avatar
brunoravera committed
import { useQueryClient } from 'react-query'

brunoravera's avatar
brunoravera committed
import { CreatePatternMutation, GetPatternsQuery } from '../query-builder'
brunoravera's avatar
brunoravera committed

import { CreatePatternSchema, createPatternSchema } from './schema'
brunoravera's avatar
brunoravera committed
import { useAddFormalizations } from './use-add-formalizations'
brunoravera's avatar
brunoravera committed
import { FormalizationsList } from './formalizations-list'
brunoravera's avatar
brunoravera committed

const FORM_ID = 'add-pattern-form'

export const AddPatternButton: React.FC<ButtonProps> = () => {
  const { isOpen, onClose, onOpen } = useDisclosure()
brunoravera's avatar
brunoravera committed
  const queryClient = useQueryClient()

brunoravera's avatar
brunoravera committed
  const { formalizations, dropzoneState, handleRemoveFormalization } =
    useAddFormalizations({})
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
  const createMutation = CreatePatternMutation.useMutation({
    onSuccess: () => {
      queryClient.invalidateQueries(GetPatternsQuery.getKey({}))
    },
  })
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
  const handleOnSubmit = async (values: CreatePatternSchema) => {
    await createMutation.mutateAsync({
      title: values.title,
      description: values.description,
    })
    onClose()
brunoravera's avatar
brunoravera committed
  }

  const {
    handleSubmit,
    handleReset,
    handleChange,
    setTouched,
    values,
    isSubmitting,
    errors,
    touched,
    isValid,
  } = useFormik({
    enableReinitialize: true,
    initialValues: {
      title: '',
      description: '',
    },
    validateOnBlur: true,
    validateOnChange: true,
    validateOnMount: true,
    validationSchema: createPatternSchema,
    onSubmit: handleOnSubmit,
  })
  return (
    <>
      <Button variant="solid" colorScheme="blue" onClick={onOpen}>
        Crear
      </Button>
      <Modal isOpen={isOpen} onClose={onClose}>
        <ModalOverlay />
        <ModalContent>
          <ModalHeader>
            <Text fontSize="md">Crear un nuevo patron</Text>
          </ModalHeader>
          <ModalCloseButton />
          <form id={FORM_ID} onSubmit={handleSubmit} onReset={handleReset}>
            <ModalBody>
              <VStack>
                <FormControl isInvalid={Boolean(errors.title) && touched.title}>
                  <FormLabel>
brunoravera's avatar
brunoravera committed
                    <HStack>
                      <Text fontSize="sm">Titulo</Text>
                      <Text color="red">*</Text>
                    </HStack>
brunoravera's avatar
brunoravera committed
                  </FormLabel>
                  <Input
                    name="title"
                    autoFocus
                    value={values.title}
                    onChange={(e) => {
                      setTouched({ ...touched, title: true })
                      handleChange(e)
                    }}
                  />
                  <FormErrorMessage>{errors.title}</FormErrorMessage>
                </FormControl>
                <FormControl
                  isInvalid={Boolean(errors.description) && touched.description}
                >
                  <FormLabel>
brunoravera's avatar
brunoravera committed
                    <HStack>
                      <Text fontSize="sm">Descripcion</Text>
                      <Text color="red">*</Text>
                    </HStack>
brunoravera's avatar
brunoravera committed
                  </FormLabel>
                  <Textarea
                    name="description"
                    value={values.description}
                    onChange={(e) => {
                      setTouched({ ...touched, description: true })
                      handleChange(e)
                    }}
                  />
                  <FormErrorMessage>{errors.description}</FormErrorMessage>
                </FormControl>
brunoravera's avatar
brunoravera committed
                <Stack w="full">
                  <FormalizationsList
                    formalizations={formalizations}
                    onRemoveFormalization={handleRemoveFormalization}
                  />
                  <div {...dropzoneState.getRootProps()}>
                    <Center w="100%">
                      <input
                        aria-label="file-upload"
                        {...dropzoneState.getInputProps()}
                      />
                      <Button
                        aria-label="add formalization"
                        variant="unstyled"
                        justifyContent="flex-start"
                        iconSpacing="2"
                        display="flex"
                        color="gray.500"
                        fontWeight="500"
                        fontSize="md"
                        leftIcon={<Icon as={FaPaperclip} />}
                      >
                        Agregar formalizacion
                      </Button>
                    </Center>
                  </div>
                </Stack>
brunoravera's avatar
brunoravera committed
              </VStack>
            </ModalBody>
          </form>

          <ModalFooter>
            <HStack>
              <Button variant="outline" onClick={onClose}>
                Cancelar
              </Button>
              <Button
                form={FORM_ID}
                variant="solid"
                colorScheme="blue"
                type="submit"
                isLoading={isSubmitting}
                isDisabled={!isValid}
              >
                Guardar
              </Button>
            </HStack>
          </ModalFooter>
        </ModalContent>
      </Modal>
    </>
  )
}