import React from 'react'; import { useClient } from 'urql'; import dayjs from 'dayjs'; import { Box, Flex, IconButton, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Select, Table, Tag, Tbody, Td, Text, TableCaption, Th, Thead, Tooltip, Tr, Button, Center, Menu, MenuButton, MenuList, MenuItem, useToast, } from '@chakra-ui/react'; import { FaAngleLeft, FaAngleRight, FaAngleDoubleLeft, FaAngleDoubleRight, FaExclamationCircle, FaAngleDown, } from 'react-icons/fa'; import { UserDetailsQuery } from '../graphql/queries'; import { UpdateUser } from '../graphql/mutation'; import EditUserModal from '../components/EditUserModal'; interface paginationPropTypes { limit: number; page: number; offset: number; total: number; maxPages: number; } interface userDataTypes { id: string; email: string; email_verified: boolean; given_name: string; family_name: string; middle_name: string; nickname: string; gender: string; birthdate: string; phone_number: string; picture: string; roles: [string]; created_at: number; } const getMaxPages = (pagination: paginationPropTypes) => { const { limit, total } = pagination; if (total > 1) { return total % limit === 0 ? total / limit : parseInt(`${total / limit}`) + 1; } else return 1; }; const getLimits = (pagination: paginationPropTypes) => { const { total } = pagination; const limits = [5]; if (total > 10) { for (let i = 10; i <= total && limits.length <= 10; i += 5) { limits.push(i); } } return limits; }; export default function Users() { const client = useClient(); const toast = useToast(); const [paginationProps, setPaginationProps] = React.useState({ limit: 5, page: 1, offset: 0, total: 0, maxPages: 1, }); const [userList, setUserList] = React.useState([]); const updateUserList = async () => { const { data } = await client .query(UserDetailsQuery, { params: { pagination: { limit: paginationProps.limit, page: paginationProps.page, }, }, }) .toPromise(); if (data?._users) { const { pagination, users } = data._users; const maxPages = getMaxPages(pagination); setPaginationProps({ ...paginationProps, ...pagination, maxPages }); setUserList(users); } }; React.useEffect(() => { updateUserList(); }, []); React.useEffect(() => { updateUserList(); }, [paginationProps.page, paginationProps.limit]); const paginationHandler = (value: Record) => { setPaginationProps({ ...paginationProps, ...value }); }; const userVerificationHandler = async (user: userDataTypes) => { const { id, email } = user; const res = await client .mutation(UpdateUser, { params: { id, email, email_verified: true, }, }) .toPromise(); if (res.error) { toast({ title: 'User verification failed', isClosable: true, status: 'error', position: 'bottom-right', }); } else if (res.data?._update_user?.id) { toast({ title: 'User verification successful', isClosable: true, status: 'success', position: 'bottom-right', }); } updateUserList(); }; return ( Users {userList.length > 0 ? ( {userList.map((user: userDataTypes) => { const { email_verified, created_at, ...rest }: any = user; return ( ); })} {paginationProps.maxPages > 1 && ( paginationHandler({ page: 1, }) } isDisabled={paginationProps.page <= 1} mr={4} icon={} /> paginationHandler({ page: paginationProps.page - 1, }) } isDisabled={paginationProps.page <= 1} icon={} /> Page{' '} {paginationProps.page} {' '} of{' '} {paginationProps.maxPages} Go to page:{' '} paginationHandler({ page: parseInt(value), }) } value={paginationProps.page} > paginationHandler({ page: paginationProps.page + 1, }) } isDisabled={ paginationProps.page >= paginationProps.maxPages } icon={} /> paginationHandler({ page: paginationProps.maxPages, }) } isDisabled={ paginationProps.page >= paginationProps.maxPages } ml={4} icon={} /> )}
Email Created At Verified Actions
{user.email} {dayjs(user.created_at).format('MMM DD, YYYY')} {user.email_verified.toString()} Menu {!user.email_verified && ( userVerificationHandler(user)} > Verify User )}
) : (
No Data
)}
); }