import React, { useEffect, useState } from 'react'; import { useClient } from 'urql'; import { Box, Button, Center, Flex, IconButton, Menu, MenuButton, MenuList, NumberDecrementStepper, NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, Select, Spinner, Table, TableCaption, Tag, Tbody, Td, Text, Th, Thead, Tooltip, Tr, } from '@chakra-ui/react'; import { FaAngleDoubleLeft, FaAngleDoubleRight, FaAngleDown, FaAngleLeft, FaAngleRight, FaExclamationCircle, } from 'react-icons/fa'; import UpdateWebhookModal from '../components/UpdateWebhookModal'; import { pageLimits, WebhookInputDataFields, UpdateModalViews, } from '../constants'; import { WebhooksDataQuery } from '../graphql/queries'; import DeleteWebhookModal from '../components/DeleteWebhookModal'; import ViewWebhookLogsModal from '../components/ViewWebhookLogsModal'; interface paginationPropTypes { limit: number; page: number; offset: number; total: number; maxPages: number; } interface webhookDataTypes { [WebhookInputDataFields.ID]: string; [WebhookInputDataFields.EVENT_NAME]: string; [WebhookInputDataFields.ENDPOINT]: string; [WebhookInputDataFields.ENABLED]: boolean; [WebhookInputDataFields.HEADERS]?: Record; } const Webhooks = () => { const client = useClient(); const [loading, setLoading] = useState(false); const [webhookData, setWebhookData] = useState([]); const [paginationProps, setPaginationProps] = useState({ limit: 5, page: 1, offset: 0, total: 0, maxPages: 1, }); 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 fetchWebookData = async () => { setLoading(true); const res = await client .query(WebhooksDataQuery, { params: { pagination: { limit: paginationProps.limit, page: paginationProps.page, }, }, }) .toPromise(); if (res.data?._webhooks) { const { pagination, webhooks } = res.data?._webhooks; const maxPages = getMaxPages(pagination); if (webhooks?.length) { setWebhookData(webhooks); setPaginationProps({ ...paginationProps, ...pagination, maxPages }); } else { if (paginationProps.page !== 1) { setPaginationProps({ ...paginationProps, ...pagination, maxPages, page: 1, }); } } } setLoading(false); }; const paginationHandler = (value: Record) => { setPaginationProps({ ...paginationProps, ...value }); }; useEffect(() => { fetchWebookData(); }, [paginationProps.page, paginationProps.limit]); return ( Webhooks {!loading ? ( webhookData.length ? ( {webhookData.map((webhook: webhookDataTypes) => ( ))} {(paginationProps.maxPages > 1 || paginationProps.total >= 5) && ( 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={} /> )}
Event Name Endpoint Enabled Headers Actions
{webhook[WebhookInputDataFields.EVENT_NAME]} {webhook[WebhookInputDataFields.ENDPOINT]} {webhook[WebhookInputDataFields.ENABLED].toString()} {Object.keys( webhook[WebhookInputDataFields.HEADERS] || {} )?.length.toString()} Menu
) : (
No Data
) ) : (
)}
); }; export default Webhooks;