Skip to content
Snippets Groups Projects
formalizations-list.tsx 8.26 KiB
Newer Older
brunoravera's avatar
brunoravera committed
import {
  Badge,
brunoravera's avatar
brunoravera committed
  Box,
  Button,
brunoravera's avatar
brunoravera committed
  Center,
  HStack,
  Icon,
  IconButton,
  List,
  ListItem,
  ListProps,
  Text,
  Tooltip,
  useToast,
  VStack,
} from '@chakra-ui/react'
brunoravera's avatar
brunoravera committed
import React from 'react'
brunoravera's avatar
brunoravera committed
import { FaDownload, FaTrash } from 'react-icons/fa'
brunoravera's avatar
brunoravera committed
import { Formalization, Pattern } from 'src/models'
brunoravera's avatar
brunoravera committed
import { DeleteFormalizationMutation } from '../query-builder/delete-formalization-mutation'
import { useQueryClient } from 'react-query'
brunoravera's avatar
brunoravera committed
import { GetFormalizationsQuery } from '../query-builder/get-formalizations-query'
import { useDropzone } from 'react-dropzone'
import {
  MAX_FILE_SIZE,
  SIZE_TOO_LARGE,
} from '../add-pattern/use-add-formalizations'
import { CreateFormalizationMutation } from '../query-builder'
brunoravera's avatar
brunoravera committed
import { DownloadFileMutation } from 'src/utils/query-builder/download-file-mutation'
brunoravera's avatar
brunoravera committed

export type FormalizationListProps = {
brunoravera's avatar
brunoravera committed
  patternId: Pattern['id']
brunoravera's avatar
brunoravera committed
} & ListProps

export const FormalizationList: React.FC<FormalizationListProps> = ({
brunoravera's avatar
brunoravera committed
  patternId,
brunoravera's avatar
brunoravera committed
  ...props
}) => {
brunoravera's avatar
brunoravera committed
  const formalizationsQuery = GetFormalizationsQuery.useQuery({ patternId })
brunoravera's avatar
brunoravera committed
  const [isDeleting, setIsDeleting] = React.useState(false)
brunoravera's avatar
brunoravera committed
  const [isUploadingFormalizations, setIsUploadingFormalizations] =
    React.useState(false)
brunoravera's avatar
brunoravera committed
  const toast = useToast()
  const queryClient = useQueryClient()

  const deleteMutation = DeleteFormalizationMutation.useMutation({
    onSuccess: () => {
      toast({
        status: 'success',
        position: 'top',
        title: `Se ha eliminado la formalizacion satisfactoriamente.`,
      })
      setIsDeleting(false)

brunoravera's avatar
brunoravera committed
      queryClient.invalidateQueries(
        GetFormalizationsQuery.getKey({ patternId })
      )
brunoravera's avatar
brunoravera committed
    },
    onError: () => {
      toast({
        status: 'error',
        position: 'top',
        title: `Ha ocurrido un error al eliminar la formalizacion.`,
      })
    },
  })

  const handleOnRemoveFormalization = (id: string) => {
    setIsDeleting(true)
    deleteMutation.mutate({ id })
  }
brunoravera's avatar
brunoravera committed

  const onDrop = React.useCallback(async (acceptedFiles: File[]) => {
    const createFormalizationPromises = acceptedFiles.map((file) => {
      const name = file.name.split('.')[0]
      return CreateFormalizationMutation.mutationFn({
        patternId,
        name,
        fileName: file.name,
        file: file,
      })
    })

    await Promise.all(createFormalizationPromises)

    queryClient.invalidateQueries(GetFormalizationsQuery.getKey({ patternId }))
  }, [])

  const dropzoneState = useDropzone({
    onDrop,
    noDrag: true,
    validator: (file) => {
      if (file.size > MAX_FILE_SIZE) {
        return {
          code: SIZE_TOO_LARGE,
          message: `Maximo ${MAX_FILE_SIZE} MB.`,
        }
      }
      return null
    },
  })

brunoravera's avatar
brunoravera committed
  const downloadFileMutation = DownloadFileMutation.useMutation({
    onSuccess: (blob) => {
      // Create a URL for the blob and trigger a download
      const url = window.URL.createObjectURL(blob)
      const link = document.createElement('a')
      link.href = url
      link.setAttribute('download', 'formalization.eventb')
      document.body.appendChild(link)
      link.click()
      link.remove()
    },
  })

  const handleOnDownloadFormalization = (formalization: Formalization) => {
    const filePath = formalization.url.split('/remote.php/webdav/')[1]

    downloadFileMutation.mutate({ filePath })
  }

  const formalizations = formalizationsQuery.data ?? []

brunoravera's avatar
brunoravera committed
  return (
brunoravera's avatar
brunoravera committed
    <VStack w="full">
      <Box w="full">
        <List {...props} maxW="300px">
          {formalizations &&
            formalizations.map((formalization, index) => {
              const fileExtension = formalization.fileName.split('.')[1] ?? ''
brunoravera's avatar
brunoravera committed
              console.log({ formalization })
brunoravera's avatar
brunoravera committed
              return (
                <ListItem
                  pt="8"
                  id={`formalization-${index}`}
                  key={`formalization-${index}`}
                  display="flex"
                  minW="350px"
brunoravera's avatar
brunoravera committed
                >
brunoravera's avatar
brunoravera committed
                  <VStack w="full">
                    <Badge>{formalization.name}</Badge>
                    <HStack
                      spacing="0"
brunoravera's avatar
brunoravera committed
                      w="full"
brunoravera's avatar
brunoravera committed
                      border="1px"
                      borderColor="gray.200"
                      borderRadius="sm"
                      bg="white"
                      width="full"
                      height="min-content"
                      mt="0"
                      minW="0"
                      flex="1"
                      alignItems="flex-start"
                      fontSize="xs"
                      h="52px"
brunoravera's avatar
brunoravera committed
                    >
brunoravera's avatar
brunoravera committed
                      <Center
                        bg="blue.600"
                        borderLeftRadius="base"
                        px="4"
                        h="52px"
                      >
                        <Text
                          fontWeight="medium"
                          variant="-1"
                          color="white"
                          textTransform="uppercase"
                        >
                          {fileExtension}
                        </Text>
                      </Center>
                      <HStack
                        h="full"
                        borderColor="gray.200"
                        borderWidth="px"
                        borderStyle="solid"
                        borderRadius="base"
                        borderLeft="none"
                        borderLeftRadius="none"
                        ml="0"
                        w="full"
                        minWidth="0"
                        flex="1"
                      >
                        <VStack
                          justifyContent="flex-start"
                          spacing="1"
                          pl="3"
                          minW="0"
                          flex="1"
                        >
                          <Text
                            variant="-1"
                            isTruncated={true}
                            w="full"
                            textAlign="center"
                          >
                            {formalization.fileName}
                          </Text>
                        </VStack>
                        <HStack>
                          <Tooltip
                            hasArrow
                            label={<Text>Descargar formalizacion</Text>}
                          >
                            <IconButton
                              aria-label="download formalization"
                              variant="unstyled"
                              color="blue.400"
brunoravera's avatar
brunoravera committed
                              onClick={() =>
                                handleOnDownloadFormalization(formalization)
                              }
brunoravera's avatar
brunoravera committed
                              icon={<Icon as={FaDownload} />}
                            />
                          </Tooltip>
                          {formalizations.length > 1 && (
                            <Tooltip
                              hasArrow
                              label={<Text>Eliminar formalizacion</Text>}
                            >
                              <IconButton
                                aria-label="remove formalization"
                                ml="-4"
                                variant="unstyled"
                                color="blue.400"
                                isDisabled={isDeleting}
                                onClick={() =>
                                  handleOnRemoveFormalization(formalization.id)
                                }
                                icon={<Icon as={FaTrash} />}
                              />
                            </Tooltip>
                          )}
                        </HStack>
                      </HStack>
                    </HStack>
brunoravera's avatar
brunoravera committed
                  </VStack>
brunoravera's avatar
brunoravera committed
                </ListItem>
              )
            })}
        </List>
      </Box>
      <Box w="full" display="flex" justifyContent="flex-end">
        <div {...dropzoneState.getRootProps()}>
          <Center>
            <input
              aria-label="file-upload"
              {...dropzoneState.getInputProps()}
            />
            <Button colorScheme="blue" isLoading={isUploadingFormalizations}>
              Crear Formalizacion
            </Button>
          </Center>
        </div>
      </Box>
    </VStack>
brunoravera's avatar
brunoravera committed
  )
}