hackdex-website/src/components/Hack/DownloadsBadge.tsx
2025-10-24 14:13:28 -10:00

38 lines
1.2 KiB
TypeScript

"use client";
import React from "react";
import { ImDownload } from "react-icons/im";
import { formatCompactNumber } from "@/utils/format";
import type { DownloadEvent } from "@/types/util";
export default function DownloadsBadge({ slug, initialCount }: { slug: string; initialCount: number }) {
const [count, setCount] = React.useState<number>(initialCount);
const [anim, setAnim] = React.useState<boolean>(false);
React.useEffect(() => {
function onApplied(e: Event) {
const detail = (e as DownloadEvent).detail;
if (detail.slug !== slug) return;
setCount((c) => c + 1);
setAnim(true);
const t = setTimeout(() => setAnim(false), 600);
return () => clearTimeout(t);
}
window.addEventListener("hack:patch-applied", onApplied);
return () => window.removeEventListener("hack:patch-applied", onApplied);
}, [slug]);
return (
<div
className={`inline-flex items-center gap-2 rounded-full ring-1 ring-[var(--border)] bg-[var(--surface-2)] px-3 py-1 text-sm text-foreground/85 transition-transform ${
anim ? "scale-110 shadow-md font-bold" : ""
}`}
>
<ImDownload size={16} className="text-foreground/85" />
<span>{formatCompactNumber(count)}</span>
</div>
);
}