import { createRoute, useParams, useNavigate } from "@tanstack/react-router"; import { Route as appRoute } from "../../_app"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { Calendar, Clock, FileText, LayoutDashboard, Trash2 } from "lucide-react"; import { format, parseISO } from "date-fns"; import { api, useApiQuery } from "@/lib/api"; import { useRealtime } from "@/hooks/use-realtime"; import { useOptimisticPatch } from "@/hooks/use-optimistic-patch"; import { InlineTextarea } from "@/components/entities/inline-edit"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { LoadingState, ErrorState } from "@/components/state"; import type { Canvas } from "@/lib/types"; import { CanvasEditor } from "../canvas"; function errorMessage(err: unknown): string { return err instanceof Error ? err.message : "Something went wrong"; } function formatCustomFieldValue(value: unknown): string { if (value === null || value === undefined) return "—"; if (typeof value === "object") return JSON.stringify(value); return String(value); } function CanvasDetail() { const { id } = useParams({ from: Route.id }); const navigate = useNavigate(); const queryClient = useQueryClient(); useRealtime({ enabled: true }); const { data: canvas, isLoading, isError, error, refetch } = useApiQuery( ["canvas", id], "/canvas/" + id ); const { patch } = useOptimisticPatch({ entityKey: ["canvas", id], listKeys: [["canvas"]], patchUrl: (cid) => `/canvas/${cid}`, applyPatch: (current, data) => ({ ...current, ...data }), }); const deleteMutation = useMutation({ mutationFn: () => api.delete(`/canvas/${id}`), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["canvas"] }); toast.success("Canvas deleted"); navigate({ to: "/canvas" }); }, onError: (err) => toast.error(errorMessage(err)), }); if (isLoading) return ; if (isError) { return refetch()} />; } if (!canvas) return ; const customFieldEntries = Object.entries(canvas.customFields ?? {}); return (
navigate({ to: "/canvas" })} />
); } export const Route = createRoute({ getParentRoute: () => appRoute, path: "canvas/$id", component: CanvasDetail, });