import React, { useState, useCallback, useEffect } from 'react'; import { Button, Center, Flex, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, useDisclosure, useToast, Tabs, TabList, Tab, TabPanels, TabPanel, InputGroup, Input, InputRightElement, Text, Link, } from '@chakra-ui/react'; import { useClient } from 'urql'; import { FaUserPlus, FaMinusCircle, FaPlus, FaUpload } from 'react-icons/fa'; import { useDropzone } from 'react-dropzone'; import { escape } from 'lodash'; import { validateEmail, validateURI } from '../utils'; import { UpdateUser } from '../graphql/mutation'; import { ArrayInputOperations, csvDemoData } from '../constants'; import parseCSV from '../utils/parseCSV'; interface stateDataTypes { value: string; isInvalid: boolean; } const InviteMembersModal = ({ disabled = true }: { disabled: boolean }) => { const client = useClient(); const toast = useToast(); const { isOpen, onOpen, onClose } = useDisclosure(); const [tabIndex, setTabIndex] = useState(0); const [redirectURI, setRedirectURI] = useState({ value: '', isInvalid: false, }); const [emails, setEmails] = useState([ { value: '', isInvalid: false, }, ]); const [disableSendButton, setDisableSendButton] = useState(false); useEffect(() => { if (redirectURI.isInvalid) { setDisableSendButton(true); } else if (emails.some((emailData) => emailData.isInvalid)) { setDisableSendButton(true); } else { setDisableSendButton(false); } }, [redirectURI, emails]); useEffect(() => { return () => { setRedirectURI({ value: '', isInvalid: false, }); setEmails([ { value: '', isInvalid: false, }, ]); }; }, []); const sendInviteHandler = async () => { closeModalHandler(); }; const updateEmailListHandler = (operation: string, index: number = 0) => { switch (operation) { case ArrayInputOperations.APPEND: setEmails([ ...emails, { value: '', isInvalid: false, }, ]); break; case ArrayInputOperations.REMOVE: const updatedEmailList = [...emails]; updatedEmailList.splice(index, 1); setEmails(updatedEmailList); break; default: break; } }; const inputChangeHandler = (value: string, index: number) => { const updatedEmailList = [...emails]; updatedEmailList[index].value = value; updatedEmailList[index].isInvalid = !validateEmail(value); setEmails(updatedEmailList); }; const changeTabsHandler = (index: number) => { setTabIndex(index); }; const onDrop = useCallback(async (acceptedFiles) => { const result = await parseCSV(acceptedFiles[0], ','); setEmails(result); changeTabsHandler(0); }, []); const setRedirectURIHandler = (value: string) => { const updatedRedirectURI: stateDataTypes = { value: '', isInvalid: false, }; updatedRedirectURI.value = value; updatedRedirectURI.isInvalid = !validateURI(value); setRedirectURI(updatedRedirectURI); }; const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: 'text/csv', }); const closeModalHandler = () => { setRedirectURI({ value: '', isInvalid: false, }); setEmails([ { value: '', isInvalid: false, }, ]); onClose(); }; return ( <> Invite Members Enter emails Upload CSV Redirect URI setRedirectURIHandler(e.currentTarget.value) } /> Emails {emails.map((emailData, index) => ( inputChangeHandler(e.currentTarget.value, index) } /> ))} {isDragActive ? ( Drop the files here... ) : (
Drag 'n' drop the csv file here, or click to select. Download{' '} e.stopPropagation()} > {' '} sample.csv {' '} and modify it.{' '}
)}
); }; export default InviteMembersModal;