From 374eaae395c10737556cff26be4b4f9a300ce558 Mon Sep 17 00:00:00 2001 From: Ryan Lau <47727459+ryanlau@users.noreply.github.com> Date: Thu, 16 Jan 2025 21:53:10 -0500 Subject: [PATCH] copy button added --- src/components/PreviewCard.tsx | 123 ++++++++++++++++++++++----------- src/routes/root.tsx | 10 +++ 2 files changed, 92 insertions(+), 41 deletions(-) diff --git a/src/components/PreviewCard.tsx b/src/components/PreviewCard.tsx index a7ab90b..418695a 100644 --- a/src/components/PreviewCard.tsx +++ b/src/components/PreviewCard.tsx @@ -9,6 +9,7 @@ import { ScrollArea, TextInput, Notification, + CopyButton, } from "@mantine/core"; import { IconDownload, @@ -23,40 +24,47 @@ interface PreviewCardProps { selectedData: MCAPFileInformation | undefined; } +const origin = window.location.origin; + function PreviewCard({ selectedData }: PreviewCardProps) { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const handleDelete = async () => { - setLoading(true) + setLoading(true); setError(null); - setSuccess(null) + setSuccess(null); try { - const response = await fetch(`${import.meta.env.VITE_API_URL}/mcaps/${selectedData?.id}`, { - method: 'DELETE', - }); + const response = await fetch( + `${import.meta.env.VITE_API_URL}/mcaps/${selectedData?.id}`, + { + method: "DELETE", + }, + ); - if (!response.ok) { - if (response.status === 503) { - const errorMsg = await response.text(); - setError(`Failed to delete: ${errorMsg} \nTry again in a few minutes!`); - console.log(errorMsg); - } else { - const errorMsg = await response.text(); - setError(`Failed to delete: ${errorMsg}`); - console.log(errorMsg); - } + if (!response.ok) { + if (response.status === 503) { + const errorMsg = await response.text(); + setError( + `Failed to delete: ${errorMsg} \nTry again in a few minutes!`, + ); + console.log(errorMsg); } else { - setSuccess('File deleted successfully!'); + const errorMsg = await response.text(); + setError(`Failed to delete: ${errorMsg}`); + console.log(errorMsg); } + } else { + setSuccess("File deleted successfully!"); + } } catch (error) { - console.error('Error sending Delete request:', error); - setError('An error occurred during file deletion.'); + console.error("Error sending Delete request:", error); + setError("An error occurred during file deletion."); } - setLoading(false) - } - + setLoading(false); + }; + const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString("en-US", { @@ -69,30 +77,30 @@ function PreviewCard({ selectedData }: PreviewCardProps) { // Take out when API server team implements filename id in their get route const getFileNameWithoutExtension = (fileNameWithExtension: string) => { - const lastDotIndex = fileNameWithExtension.lastIndexOf('.'); - return lastDotIndex !== -1 ? fileNameWithExtension.slice(0, lastDotIndex) : fileNameWithExtension; + const lastDotIndex = fileNameWithExtension.lastIndexOf("."); + return lastDotIndex !== -1 + ? fileNameWithExtension.slice(0, lastDotIndex) + : fileNameWithExtension; }; - const imageUrl = selectedData?.content_files?.vn_lat_lon_plot?.[0]?.signed_url ?? "https://camo.githubusercontent.com/25de56138803873d9ea83567c55b9a022ad86d0acb53bb7c733bb038583e2279/68747470733a2f2f6d69726f2e6d656469756d2e636f6d2f76322f726573697a653a6669743a3430302f312a7241676c6b664c4c316676384a6363697a4a33572d512e706e67"; // Fallback to a default image if none exists. - + const imageUrl = + selectedData?.content_files?.vn_lat_lon_plot?.[0]?.signed_url ?? + "https://camo.githubusercontent.com/25de56138803873d9ea83567c55b9a022ad86d0acb53bb7c733bb038583e2279/68747470733a2f2f6d69726f2e6d656469756d2e636f6d2f76322f726573697a653a6669743a3430302f312a7241676c6b664c4c316676384a6363697a4a33572d512e706e67"; // Fallback to a default image if none exists. + const formatTime = (dateString: string) => { const date = new Date(dateString); return date.toLocaleTimeString("en-US", { - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - hour12: true, + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + hour12: true, }); }; return (
- Preview + Preview {selectedData ? ( <> - +
+ + {({ copied, copy }) => ( + + )} + {selectedData.mcap_files.map((item) => ( ))} - + {success && ( - setSuccess(null)} style={{ marginTop: 10 }}> + setSuccess(null)} + style={{ marginTop: 10 }} + > {success} )} {error && ( - setError(null)} style={{ marginTop: 10 }}> + setError(null)} + style={{ marginTop: 10 }} + > {error} )}
-
) : ( @@ -234,7 +275,7 @@ export function DownloadButton({ { handleSearch(e.target.value); }} /> - + {" "} {/* Scrollable area with height limit */} (); const [searchTerm] = useQueryState("notes", parseAsString.withDefault("")); + const [selectedId] = useQueryState("id", parseAsString.withDefault("")); const [selectedLocation] = useQueryState( "location", parseAsString.withDefault(""), @@ -49,6 +50,15 @@ export default function Root() { }; const fetchData = async (filters: SearchFilter) => { + if (selectedId != "") { + const res = await fetch( + `${import.meta.env.VITE_API_URL}/api/v2/mcaps/${selectedId}`, + ); + + const data = await res.json(); + return data.data; + } + const { location, date, eventType, searchText } = filters; let { afterDate, beforeDate } = filters;