diff --git a/src/app/(app)/maintainer/invite-contributor-button.tsx b/src/app/(app)/maintainer/invite-contributor-button.tsx index d2d14358..dca377e2 100644 --- a/src/app/(app)/maintainer/invite-contributor-button.tsx +++ b/src/app/(app)/maintainer/invite-contributor-button.tsx @@ -2,7 +2,8 @@ import { useState, useTransition } from 'react'; import { useRouter } from 'next/navigation'; -import { sendInvite } from '@/app/actions/maintainer'; +import { sendInvite, getMyGithubHandle } from '@/app/actions/maintainer'; +import { Link, Check } from 'lucide-react'; export default function InviteContributorButton({ installationId, @@ -15,6 +16,8 @@ export default function InviteContributorButton({ const [email, setEmail] = useState(''); const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); + const [linkCopied, setLinkCopied] = useState(false); + const [generatingLink, setGeneratingLink] = useState(false); const router = useRouter(); async function handleSubmit(e: React.FormEvent) { @@ -37,6 +40,30 @@ export default function InviteContributorButton({ }); } + async function handleCopyLink() { + setGeneratingLink(true); + const res = await getMyGithubHandle(); + if (!res.ok) { + setError(res.error.message || 'Failed to generate invite link'); + setGeneratingLink(false); + return; + } + const link = `${process.env.NEXT_PUBLIC_APP_URL || 'https://mergeship.dev'}/invite?ref=${res.data}`; + + try { + await navigator.clipboard.writeText(link); + setLinkCopied(true); + } catch { + setError('Failed to copy to clipboard. Please try again.'); + } finally { + setGeneratingLink(false); + setTimeout(() => { + setLinkCopied(false); + setError(null); + }, 2000); + } + } + return ( <> +