"use client"; export const dynamic = "force-dynamic"; import { useMemo, useState } from "react"; import { useParams, useRouter } from "next/navigation"; import { useAuth } from "@/auth/clerk"; import { ApiError } from "@/api/mutator"; import { type getBoardWebhookApiV1BoardsBoardIdWebhooksWebhookIdGetResponse, type listBoardWebhookPayloadsApiV1BoardsBoardIdWebhooksWebhookIdPayloadsGetResponse, useGetBoardWebhookApiV1BoardsBoardIdWebhooksWebhookIdGet, useListBoardWebhookPayloadsApiV1BoardsBoardIdWebhooksWebhookIdPayloadsGet, } from "@/api/generated/board-webhooks/board-webhooks"; import type { BoardWebhookPayloadRead } from "@/api/generated/model"; import { DashboardPageLayout } from "@/components/templates/DashboardPageLayout"; import { Button } from "@/components/ui/button"; import { useOrganizationMembership } from "@/lib/use-organization-membership"; const PAGE_LIMIT = 20; const stringifyPayload = (value: unknown) => { if (value === null || value === undefined) { return ""; } if (typeof value === "string") { return value; } try { return JSON.stringify(value, null, 2); } catch { return String(value); } }; export default function WebhookPayloadsPage() { const { isSignedIn } = useAuth(); const { isAdmin } = useOrganizationMembership(isSignedIn); const router = useRouter(); const params = useParams(); const boardIdParam = params?.boardId; const webhookIdParam = params?.webhookId; const boardId = Array.isArray(boardIdParam) ? boardIdParam[0] : boardIdParam; const webhookId = Array.isArray(webhookIdParam) ? webhookIdParam[0] : webhookIdParam; const [offset, setOffset] = useState(0); const webhookQuery = useGetBoardWebhookApiV1BoardsBoardIdWebhooksWebhookIdGet< getBoardWebhookApiV1BoardsBoardIdWebhooksWebhookIdGetResponse, ApiError >(boardId ?? "", webhookId ?? "", { query: { enabled: Boolean(isSignedIn && isAdmin && boardId && webhookId), refetchOnMount: "always", retry: false, }, }); const payloadsQuery = useListBoardWebhookPayloadsApiV1BoardsBoardIdWebhooksWebhookIdPayloadsGet< listBoardWebhookPayloadsApiV1BoardsBoardIdWebhooksWebhookIdPayloadsGetResponse, ApiError >( boardId ?? "", webhookId ?? "", { limit: PAGE_LIMIT, offset }, { query: { enabled: Boolean(isSignedIn && isAdmin && boardId && webhookId), refetchOnMount: "always", retry: false, }, }, ); const webhook = webhookQuery.data?.status === 200 ? webhookQuery.data.data : null; const payloadPage = payloadsQuery.data?.status === 200 ? payloadsQuery.data.data : null; const payloads = payloadPage?.items ?? []; const total = payloadPage?.total ?? 0; const currentPage = Math.floor(offset / PAGE_LIMIT) + 1; const pageCount = Math.max(1, Math.ceil(total / PAGE_LIMIT)); const hasPrev = offset > 0; const hasNext = offset + PAGE_LIMIT < total; const errorMessage = payloadsQuery.error?.message ?? webhookQuery.error?.message ?? null; const isLoading = payloadsQuery.isLoading || webhookQuery.isLoading; const payloadTitle = useMemo(() => { if (!webhook) return "Webhook payloads"; return `Webhook ${webhook.id.slice(0, 8)} payloads`; }, [webhook]); return (

{payloadTitle}

{webhook?.description ?? "Loading webhook details..."}

{webhook ? (
{webhook.endpoint_url ?? webhook.endpoint_path}
) : null}

{total} payload{total === 1 ? "" : "s"} total

Page {currentPage} of {pageCount}
{errorMessage ? (

{errorMessage}

) : null} {isLoading ? (

Loading payloads...

) : null} {!isLoading && payloads.length === 0 ? (

No payloads received for this webhook yet.

) : null}
{payloads.map((payload: BoardWebhookPayloadRead) => (
Payload {payload.id.slice(0, 8)} {new Date(payload.received_at).toLocaleString()}

Content type:{" "} {payload.content_type ?? "not provided"}

Source IP: {payload.source_ip ?? "not provided"}

                {stringifyPayload(payload.payload)}
              
))}
); }