import { toFriendlyWebhookEventName } from '@documenso/lib/universal/webhook/to-friendly-webhook-event-name'; import { trpc } from '@documenso/trpc/react'; import type { TFindWebhookCallsResponse } from '@documenso/trpc/server/webhook-router/find-webhook-calls.types'; import { CopyTextButton } from '@documenso/ui/components/common/copy-text-button'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Sheet, SheetContent, SheetTitle } from '@documenso/ui/primitives/sheet'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { Trans, useLingui } from '@lingui/react/macro'; import { WebhookCallStatus } from '@prisma/client'; import { RotateCwIcon } from 'lucide-react'; import { useMemo, useState } from 'react'; import { createCallable } from 'react-call'; export type WebhookLogsSheetProps = { webhookCall: TFindWebhookCallsResponse['data'][number]; }; export const WebhookLogsSheet = createCallable(({ call, webhookCall }) => { const { t } = useLingui(); const { toast } = useToast(); const [activeTab, setActiveTab] = useState<'request' | 'response'>('request'); const { mutateAsync: resendWebhookCall, isPending: isResending } = trpc.webhook.calls.resend.useMutation({ onSuccess: () => { toast({ title: t`Webhook queued for resend` }); }, onError: () => { toast({ title: t`Something went wrong` }); }, }); const generalWebhookDetails = useMemo(() => { return [ { header: t`Status`, value: webhookCall.status === WebhookCallStatus.SUCCESS ? t`Success` : t`Failed`, }, { header: t`Event`, value: toFriendlyWebhookEventName(webhookCall.event), }, { header: t`Sent`, value: new Date(webhookCall.createdAt).toLocaleString(), }, { header: t`Response Code`, value: webhookCall.responseCode, }, { header: t`Destination`, value: webhookCall.url, }, ]; }, [webhookCall]); return ( (!value ? call.end(null) : null)}>

Webhook Details

{webhookCall.id}

{/* Content */}

Details

{generalWebhookDetails.map(({ header, value }, index) => ( ))}
{header} {value}
{/* Payload Tabs */}
toast({ title: t`Copied to clipboard` })} />
                {JSON.stringify(activeTab === 'request' ? webhookCall.requestBody : webhookCall.responseBody, null, 2)}
              
{activeTab === 'response' && (

Response Headers

{Object.entries(webhookCall.responseHeaders as Record).map(([key, value]) => ( ))}
{key} {value as string}
)}
); });