"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, JobCardResponseData } from "@garage/api" import DashboardPage from "@/base/components/layout/dashboard/dashboard-page" import { useJobCard } from "@/modules/job-cards/job-card-context" import { CONSTANTS } from "@/config/constants" 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 jobcard = useJobCard() const attachments = jobcard?.attachment_files 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: JobCardResponseData['attachment_files'][number]) => { const confirmed = await confirm({ title: "Delete Attachment", description: `Are you sure you want to delete "${attachment.original_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 ( } title="Attachments" > {attachments?.length === 0 ? ( No attachments yet. Click "Upload Attachment" to add files. ) : (
{attachments?.map((attachment) => { const Icon = getFileIcon(attachment.attachment_path) return (
{attachment.original_name} {attachment.created_at && ( {new Date(attachment.created_at).toLocaleDateString()} )}
) })}
)}
) }