This commit is contained in:
@@ -17,8 +17,8 @@ import {
|
||||
} from "lucide-react";
|
||||
import Image from "next/image";
|
||||
import { useEffect, useState } from "react";
|
||||
import { TrackedLink } from "./util-tracked-link";
|
||||
import { TrackedButton } from "./util-tracked-button";
|
||||
import { TrackedLink } from "./util-tracked-link";
|
||||
|
||||
interface Props {
|
||||
bibtexKey: string;
|
||||
@@ -49,24 +49,9 @@ export function PublicationCard({
|
||||
"idle"
|
||||
);
|
||||
const [imageError, setImageError] = useState(false);
|
||||
const [downloadUrl, setDownloadUrl] = useState<string | null>(null);
|
||||
const [isClient, setIsClient] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
setIsClient(true);
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
if (downloadUrl) {
|
||||
URL.revokeObjectURL(downloadUrl);
|
||||
}
|
||||
};
|
||||
}, [downloadUrl]);
|
||||
|
||||
const handleCopy = (e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
if (isClient && navigator.clipboard?.writeText) {
|
||||
const handleCopy = () => {
|
||||
if (navigator.clipboard?.writeText) {
|
||||
navigator.clipboard
|
||||
.writeText(bibtex)
|
||||
.then(() => {
|
||||
@@ -84,17 +69,16 @@ export function PublicationCard({
|
||||
}
|
||||
};
|
||||
|
||||
const handleDownload = (e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
const handleDownload = () => {
|
||||
const blob = new Blob([bibtex], { type: "text/plain" });
|
||||
const url = URL.createObjectURL(blob);
|
||||
setDownloadUrl(url);
|
||||
const a = document.createElement("a");
|
||||
a.href = url;
|
||||
a.download = `${bibtexKey}.bib`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
URL.revokeObjectURL(url); // Clean up immediately
|
||||
};
|
||||
|
||||
const handleCardClick = () => {
|
||||
@@ -203,7 +187,6 @@ export function PublicationCard({
|
||||
size="sm"
|
||||
className="h-7 w-7 px-2"
|
||||
asChild
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
<TrackedLink
|
||||
href={pdfUrl}
|
||||
@@ -222,5 +205,5 @@ export function PublicationCard({
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
);
|
||||
};
|
||||
@@ -18,6 +18,9 @@ export const TrackedButton = ({
|
||||
const handleTrackedClick = (
|
||||
e: React.MouseEvent<HTMLButtonElement, MouseEvent>
|
||||
) => {
|
||||
|
||||
e.stopPropagation();
|
||||
|
||||
if (window.umami) {
|
||||
window.umami.track(eventName);
|
||||
}
|
||||
|
||||
11
types/umami.d.ts
vendored
Normal file
11
types/umami.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
// types/umami.d.ts
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
umami?: {
|
||||
track: (event_name: string, data?: object) => void;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export {};
|
||||
Reference in New Issue
Block a user