Better Tracking
All checks were successful
Next.js App CI / docker (push) Successful in 7m21s

This commit is contained in:
2025-09-16 11:45:04 +02:00
parent 669e915e1d
commit 4255c61fab
3 changed files with 96 additions and 99 deletions

View File

@@ -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>
);
);
};

View File

@@ -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
View File

@@ -0,0 +1,11 @@
// types/umami.d.ts
declare global {
interface Window {
umami?: {
track: (event_name: string, data?: object) => void;
};
}
}
export {};