"use client"; export const dynamic = "force-dynamic"; import { useEffect, useMemo, useRef, useState } from "react"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useAuth } from "@/auth/clerk"; import { X } from "lucide-react"; import { useQueryClient } from "@tanstack/react-query"; import { ApiError } from "@/api/mutator"; import { type getBoardApiV1BoardsBoardIdGetResponse, useGetBoardApiV1BoardsBoardIdGet, useUpdateBoardApiV1BoardsBoardIdPatch, } from "@/api/generated/boards/boards"; import { getListBoardWebhooksApiV1BoardsBoardIdWebhooksGetQueryKey, type listBoardWebhooksApiV1BoardsBoardIdWebhooksGetResponse, useCreateBoardWebhookApiV1BoardsBoardIdWebhooksPost, useDeleteBoardWebhookApiV1BoardsBoardIdWebhooksWebhookIdDelete, useListBoardWebhooksApiV1BoardsBoardIdWebhooksGet, useUpdateBoardWebhookApiV1BoardsBoardIdWebhooksWebhookIdPatch, } from "@/api/generated/board-webhooks/board-webhooks"; import { type listBoardGroupsApiV1BoardGroupsGetResponse, useListBoardGroupsApiV1BoardGroupsGet, } from "@/api/generated/board-groups/board-groups"; import { type listGatewaysApiV1GatewaysGetResponse, useListGatewaysApiV1GatewaysGet, } from "@/api/generated/gateways/gateways"; import { useOrganizationMembership } from "@/lib/use-organization-membership"; import type { BoardGroupRead, BoardWebhookRead, BoardRead, BoardUpdate, } from "@/api/generated/model"; import { BoardOnboardingChat } from "@/components/BoardOnboardingChat"; import { DashboardPageLayout } from "@/components/templates/DashboardPageLayout"; import { Button } from "@/components/ui/button"; import { Dialog, DialogClose, DialogContent } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import SearchableSelect from "@/components/ui/searchable-select"; import { Textarea } from "@/components/ui/textarea"; import { localDateInputToUtcIso, toLocalDateInput } from "@/lib/datetime"; const slugify = (value: string) => value .toLowerCase() .trim() .replace(/[^a-z0-9]+/g, "-") .replace(/(^-|-$)/g, "") || "board"; type WebhookCardProps = { webhook: BoardWebhookRead; isLoading: boolean; isWebhookCreating: boolean; isDeletingWebhook: boolean; isUpdatingWebhook: boolean; copiedWebhookId: string | null; onCopy: (webhook: BoardWebhookRead) => void; onDelete: (webhookId: string) => void; onViewPayloads: (webhookId: string) => void; onUpdate: (webhookId: string, description: string) => Promise; }; function WebhookCard({ webhook, isLoading, isWebhookCreating, isDeletingWebhook, isUpdatingWebhook, copiedWebhookId, onCopy, onDelete, onViewPayloads, onUpdate, }: WebhookCardProps) { const [isEditing, setIsEditing] = useState(false); const [draftDescription, setDraftDescription] = useState(webhook.description); const isBusy = isLoading || isWebhookCreating || isDeletingWebhook || isUpdatingWebhook; const trimmedDescription = draftDescription.trim(); const isDescriptionChanged = trimmedDescription !== webhook.description.trim(); const handleSave = async () => { if (!trimmedDescription) return; if (!isDescriptionChanged) { setIsEditing(false); return; } const saved = await onUpdate(webhook.id, trimmedDescription); if (saved) { setIsEditing(false); } }; return (
Webhook {webhook.id.slice(0, 8)}
{isEditing ? ( <> ) : ( <> )}
{isEditing ? (