43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
|
|
/**
|
|
* Copies the user's referral link to the clipboard. Mirrors AtomCMS's
|
|
* copyCode() helper on the /me page, but resolves the link to an absolute URL
|
|
* (the server only knows a relative path, so we prepend the current origin).
|
|
*/
|
|
export default function CopyReferralButton({ value }: { value: string }) {
|
|
const [copied, setCopied] = useState(false);
|
|
|
|
async function copy() {
|
|
const absolute =
|
|
typeof window !== "undefined" && value.startsWith("/") ? `${window.location.origin}${value}` : value;
|
|
try {
|
|
await navigator.clipboard.writeText(absolute);
|
|
} catch {
|
|
// Older browsers / insecure contexts: fall back to a hidden textarea.
|
|
const ta = document.createElement("textarea");
|
|
ta.value = absolute;
|
|
ta.style.position = "fixed";
|
|
ta.style.opacity = "0";
|
|
document.body.appendChild(ta);
|
|
ta.select();
|
|
try {
|
|
document.execCommand("copy");
|
|
} catch {
|
|
/* give up silently */
|
|
}
|
|
document.body.removeChild(ta);
|
|
}
|
|
setCopied(true);
|
|
setTimeout(() => setCopied(false), 2000);
|
|
}
|
|
|
|
return (
|
|
<button type="button" className="btn btn-secondary" onClick={copy}>
|
|
{copied ? "Copied!" : "Copy link"}
|
|
</button>
|
|
);
|
|
}
|