This commit is contained in:
Anik Ghosh 2022-03-16 20:13:18 +05:30
parent a257b77501
commit d709f53c47
3 changed files with 78 additions and 29 deletions

View File

@ -28,7 +28,7 @@ import { FaUserPlus, FaMinusCircle, FaPlus, FaUpload } from 'react-icons/fa';
import { useDropzone } from 'react-dropzone'; import { useDropzone } from 'react-dropzone';
import { escape } from 'lodash'; import { escape } from 'lodash';
import { validateEmail, validateURI } from '../utils'; import { validateEmail, validateURI } from '../utils';
import { UpdateUser } from '../graphql/mutation'; import { InviteMembers } from '../graphql/mutation';
import { ArrayInputOperations, csvDemoData } from '../constants'; import { ArrayInputOperations, csvDemoData } from '../constants';
import parseCSV from '../utils/parseCSV'; import parseCSV from '../utils/parseCSV';
@ -37,22 +37,33 @@ interface stateDataTypes {
isInvalid: boolean; isInvalid: boolean;
} }
const InviteMembersModal = ({ disabled = true }: { disabled: boolean }) => { interface requestParamTypes {
emails: string[];
redirect_uri?: string;
}
const initData: stateDataTypes = {
value: '',
isInvalid: false,
};
const InviteMembersModal = ({
updateUserList,
disabled = true,
}: {
updateUserList: Function;
disabled: boolean;
}) => {
const client = useClient(); const client = useClient();
const toast = useToast(); const toast = useToast();
const { isOpen, onOpen, onClose } = useDisclosure(); const { isOpen, onOpen, onClose } = useDisclosure();
const [tabIndex, setTabIndex] = useState<number>(0); const [tabIndex, setTabIndex] = useState<number>(0);
const [redirectURI, setRedirectURI] = useState<stateDataTypes>({ const [redirectURI, setRedirectURI] = useState<stateDataTypes>({
value: '', ...initData,
isInvalid: false,
}); });
const [emails, setEmails] = useState<stateDataTypes[]>([ const [emails, setEmails] = useState<stateDataTypes[]>([{ ...initData }]);
{
value: '',
isInvalid: false,
},
]);
const [disableSendButton, setDisableSendButton] = useState<boolean>(false); const [disableSendButton, setDisableSendButton] = useState<boolean>(false);
const [loading, setLoading] = React.useState<boolean>(false);
useEffect(() => { useEffect(() => {
if (redirectURI.isInvalid) { if (redirectURI.isInvalid) {
setDisableSendButton(true); setDisableSendButton(true);
@ -64,31 +75,58 @@ const InviteMembersModal = ({ disabled = true }: { disabled: boolean }) => {
}, [redirectURI, emails]); }, [redirectURI, emails]);
useEffect(() => { useEffect(() => {
return () => { return () => {
setRedirectURI({ setRedirectURI({ ...initData });
value: '', setEmails([{ ...initData }]);
isInvalid: false,
});
setEmails([
{
value: '',
isInvalid: false,
},
]);
}; };
}, []); }, []);
const sendInviteHandler = async () => { const sendInviteHandler = async () => {
setLoading(true);
try {
const emailList = emails
.filter((emailData) => !emailData.isInvalid)
.map((emailData) => emailData.value);
const params: requestParamTypes = {
emails: emailList,
};
if (redirectURI.value !== '' && !redirectURI.isInvalid) {
params.redirect_uri = redirectURI.value;
}
if (emailList.length > 1) {
const res = await client
.mutation(InviteMembers, {
params,
})
.toPromise();
if (res.error) {
throw new Error('Internal server error');
return;
}
toast({
title: 'Invites sent successfully!',
isClosable: true,
status: 'success',
position: 'bottom-right',
});
setLoading(false);
updateUserList();
} else {
throw new Error('Please add emails');
}
} catch (error: any) {
toast({
title: error?.message || 'Error occurred, try again!',
isClosable: true,
status: 'error',
position: 'bottom-right',
});
setLoading(false);
}
closeModalHandler(); closeModalHandler();
}; };
const updateEmailListHandler = (operation: string, index: number = 0) => { const updateEmailListHandler = (operation: string, index: number = 0) => {
switch (operation) { switch (operation) {
case ArrayInputOperations.APPEND: case ArrayInputOperations.APPEND:
setEmails([ setEmails([...emails, { ...initData }]);
...emails,
{
value: '',
isInvalid: false,
},
]);
break; break;
case ArrayInputOperations.REMOVE: case ArrayInputOperations.REMOVE:
const updatedEmailList = [...emails]; const updatedEmailList = [...emails];
@ -318,7 +356,7 @@ const InviteMembersModal = ({ disabled = true }: { disabled: boolean }) => {
colorScheme="blue" colorScheme="blue"
variant="solid" variant="solid"
onClick={sendInviteHandler} onClick={sendInviteHandler}
isDisabled={disableSendButton} isDisabled={disableSendButton || loading}
> >
<Center h="100%" pt="5%"> <Center h="100%" pt="5%">
Send Send

View File

@ -45,3 +45,11 @@ export const DeleteUser = `
} }
} }
`; `;
export const InviteMembers = `
mutation inviteMembers($params: InviteMemberInput!) {
_invite_members(params: $params) {
message
}
}
`;

View File

@ -190,7 +190,10 @@ export default function Users() {
<Text fontSize="md" fontWeight="bold"> <Text fontSize="md" fontWeight="bold">
Users Users
</Text> </Text>
<InviteMembersModal disabled={disableInviteMembers} /> <InviteMembersModal
disabled={disableInviteMembers}
updateUserList={updateUserList}
/>
</Flex> </Flex>
{!loading ? ( {!loading ? (
userList.length > 0 ? ( userList.length > 0 ? (