diff --git a/packages/web/pages/settings/webhooks.tsx b/packages/web/pages/settings/webhooks.tsx new file mode 100644 index 000000000..0a029f336 --- /dev/null +++ b/packages/web/pages/settings/webhooks.tsx @@ -0,0 +1,65 @@ +import { PrimaryLayout } from '../../components/templates/PrimaryLayout' +import { Toaster } from 'react-hot-toast' +import { Table } from '../../components/elements/Table' +import { applyStoredTheme } from '../../lib/themeUpdater' +import { useGetWebhooksQuery } from '../../lib/networking/queries/useGetWebhooksQuery' +import { useState } from 'react' +import { showErrorToast, showSuccessToast } from '../../lib/toastHelpers' +import { ConfirmationModal } from '../../components/patterns/ConfirmationModal' +import { deleteWebhookMutation } from '../../lib/networking/mutations/deleteWebhookMutation' + +export default function Webhooks(): JSX.Element { + const { webhooks, revalidate } = useGetWebhooksQuery() + const [deleteId, setDeleteId] = useState(null) + + applyStoredTheme(false) + + async function onDelete(id: string): Promise { + const result = await deleteWebhookMutation(id) + if (result) { + showSuccessToast('Deleted', { position: 'bottom-right' }) + } else { + showErrorToast('Failed to delete', { position: 'bottom-right' }) + } + revalidate() + } + + const headers = ['URL', 'Event Types', 'Enabled'] + const rows = new Map() + webhooks.forEach((webhook) => + rows.set(webhook.id, [ + webhook.url, + webhook.eventTypes.join(', '), + webhook.enabled ? 'Yes' : 'No', + ]) + ) + + return ( + + + + {deleteId ? ( + { + await onDelete(deleteId) + setDeleteId(null) + }} + onOpenChange={() => setDeleteId(null)} + /> + ) : null} + + + ) +}