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 (
<>
}
+
+
+ or
+
+
+
+
+