diff --git a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/DrillDownTable.tsx b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/DrillDownTable.tsx index eaf34448..7adf28e6 100644 --- a/src/app/portfolio/[slug]/(portfolio)/your-projects/live/DrillDownTable.tsx +++ b/src/app/portfolio/[slug]/(portfolio)/your-projects/live/DrillDownTable.tsx @@ -1,6 +1,7 @@ "use client"; import { useMemo, useState } from "react"; +import { useMutation } from "@tanstack/react-query"; import { useReactTable, getCoreRowModel, @@ -39,27 +40,35 @@ function escapeCell(value: unknown): string { : str; } -async function handlePhotoDownload(rawUrl: string) { - try { - const key = rawUrl.split(".amazonaws.com/")[1]; - if (!key) return alert("Invalid S3 key"); +function PhotoDownloadButton({ url }: { url: string }) { + const { mutate: download, isPending } = useMutation({ + mutationFn: async () => { + const key = url.split(".amazonaws.com/")[1]; + if (!key) throw new Error("Invalid S3 key"); + const res = await fetch("/api/sign-s3-url", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ key }), + }); + if (!res.ok) throw new Error("Failed to get signed URL"); + const data = await res.json(); + return data.url as string; + }, + onSuccess: (signedUrl) => { + window.open(signedUrl, "_blank"); + }, + }); - const res = await fetch("/api/sign-s3-url", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ key }), - }); - - const data = await res.json(); - if (data.url) { - window.open(data.url, "_blank"); - } else { - alert("Failed to get signed URL"); - } - } catch (err) { - console.error(err); - alert("Error downloading file"); - } + return ( + + ); } function PhotoDownloadCell({ value }: { value: unknown }) { @@ -81,14 +90,7 @@ function PhotoDownloadCell({ value }: { value: unknown }) { return (