import { useMemo, useState } from 'react'; import { Trans, useLingui } from '@lingui/react/macro'; import { WebhookCallStatus } from '@prisma/client'; import { RotateCwIcon } from 'lucide-react'; import { createCallable } from 'react-call'; 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'; export type WebhookLogsSheetProps = { webhookCall: TFindWebhookCallsResponse['data'][number]; }; export const WebhookLogsSheet = createCallable( ({ call, webhookCall: initialWebhookCall }) => { const { t } = useLingui(); const { toast } = useToast(); const [webhookCall, setWebhookCall] = useState(initialWebhookCall); const [activeTab, setActiveTab] = useState<'request' | 'response'>('request'); const { mutateAsync: resendWebhookCall, isPending: isResending } = trpc.webhook.calls.resend.useMutation({ onSuccess: (result) => { toast({ title: t`Webhook successfully sent` }); setWebhookCall(result); }, 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}
)}
); }, );