← back to Trademarks Copyright
src/components/ReferralWidget.tsx
63 lines
"use client";
import { useEffect, useState } from "react";
export default function ReferralWidget({
token, totalRefs, untilNext, rewardedRefs,
}: {
token: string; totalRefs: number; untilNext: number; rewardedRefs: number;
}) {
const [url, setUrl] = useState("");
const [copied, setCopied] = useState(false);
useEffect(() => {
setUrl(`${window.location.origin}/drops?ref=${encodeURIComponent(token)}`);
}, [token]);
function copy() {
navigator.clipboard.writeText(url);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
const shareLines = [
{ label: "Twitter", href: `https://twitter.com/intent/tweet?text=${encodeURIComponent("Daily brief on abandoned trademarks + expiring domains. Worth a look:")}&url=${encodeURIComponent(url)}` },
{ label: "Email", href: `mailto:?subject=${encodeURIComponent("Drops — daily trademark opportunities")}&body=${encodeURIComponent(`I've been reading this. 3 free drops to start:\n\n${url}`)}` },
{ label: "LinkedIn", href: `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}` },
];
return (
<div className="card p-5 mb-4 border-brass/30 bg-brass/5">
<div className="flex items-start gap-4 flex-wrap">
<div className="flex-1 min-w-[280px]">
<div className="text-xs uppercase tracking-widest text-brass">Referrals</div>
<h3 className="mt-1 text-lg font-semibold">Share Drops, get 30 free days.</h3>
<p className="mt-1 text-sm text-ink/70">
For every 3 signups from your link, we add 30 days to your subscription.
</p>
<div className="mt-3 flex flex-wrap items-center gap-2">
<input readOnly value={url} className="flex-1 min-w-[220px] font-mono text-xs" />
<button onClick={copy} className="btn">{copied ? "✓ copied" : "Copy"}</button>
</div>
<div className="mt-2 flex gap-3 text-xs">
{shareLines.map((s) => (
<a key={s.label} href={s.href} target="_blank" rel="noreferrer" className="text-brass hover:underline">{s.label}</a>
))}
</div>
</div>
<div className="text-right">
<div className="text-xs uppercase tracking-wide text-ink/60">Referrals</div>
<div className="text-3xl font-semibold">{totalRefs}</div>
<div className="text-xs text-ink/60">
{untilNext > 0 ? `${untilNext} until next reward` : "reward pending"}
</div>
{rewardedRefs > 0 && (
<div className="mt-2 text-xs text-emerald-700">
✓ {rewardedRefs} reward{rewardedRefs === 1 ? "" : "s"} claimed
</div>
)}
</div>
</div>
</div>
);
}