"use client" import { useParams } from "next/navigation" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" import { useState, useRef } from "react" import { Plus, Trash2, FileIcon, ImageIcon, FileTextIcon } from "lucide-react" import { toast } from "sonner" import { useAuthApi } from "@/shared/useApi" import { confirm } from "@/shared/components/confirm-dialog" import { Button } from "@/shared/components/ui/button" import { Card, CardContent } from "@/shared/components/ui/card" import { JOB_CARD_ROUTES } from "@garage/api" type Attachment = { id: number file_name: string url: string mime_type?: string created_at?: string } function getFileIcon(mimeType?: string) { if (mimeType?.startsWith("image/")) return ImageIcon if (mimeType?.includes("pdf")) return FileTextIcon return FileIcon } export default function JobCardAttachmentsPage() { const { id: jobCardId } = useParams<{ id: string }>() const api = useAuthApi() const queryClient = useQueryClient() const fileInputRef = useRef(null) const [isUploading, setIsUploading] = useState(false) const queryKey = [JOB_CARD_ROUTES.INDEX, jobCardId, "attachments"] const { data, isLoading } = useQuery({ queryKey, queryFn: () => api.jobCards.show(jobCardId), }) const jobCard = (data as any)?.data ?? data const attachments: Attachment[] = jobCard?.documents ?? jobCard?.attachments ?? [] const deleteMutation = useMutation({ mutationFn: (attachmentId: number) => api.jobCards.deleteAttachment(jobCardId, attachmentId), onSuccess: () => { toast.success("Attachment deleted successfully.") queryClient.invalidateQueries({ queryKey }) }, onError: () => { toast.error("Failed to delete attachment.") }, }) const handleDelete = async (attachment: Attachment) => { const confirmed = await confirm({ title: "Delete Attachment", description: `Are you sure you want to delete "${attachment.file_name}"?`, confirmLabel: "Delete", variant: "destructive", }) if (confirmed) { deleteMutation.mutate(attachment.id) } } const handleUpload = async (e: React.ChangeEvent) => { const files = e.target.files if (!files || files.length === 0) return setIsUploading(true) const promise = api.jobCards.addAttachment(jobCardId, Array.from(files)) toast.promise(promise, { loading: "Uploading attachment(s)...", success: "Attachment(s) uploaded successfully", error: "Failed to upload attachment(s)", }) try { await promise queryClient.invalidateQueries({ queryKey }) } finally { setIsUploading(false) if (fileInputRef.current) { fileInputRef.current.value = "" } } } return (
{isLoading ? ( Loading attachments... ) : attachments.length === 0 ? ( No attachments yet. Click "Upload Attachment" to add files. ) : (
{attachments.map((attachment) => { const Icon = getFileIcon(attachment.mime_type) return (
{attachment.file_name} {attachment.created_at && ( {new Date(attachment.created_at).toLocaleDateString()} )}
) })}
)}
) }