From cddc5be5500fa707cbaeda70fff820179a6b8b4c Mon Sep 17 00:00:00 2001 From: Kirtan-pc Date: Sat, 11 Jul 2026 12:34:14 +0530 Subject: [PATCH 1/2] Fix: Completion screen: personalized invite link for 'Invite a team member' --- .../maintainer/invite-contributor-button.tsx | 41 ++++++++++++++++++- src/app/actions/maintainer/index.ts | 8 +++- src/app/actions/maintainer/invites.ts | 17 ++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/app/(app)/maintainer/invite-contributor-button.tsx b/src/app/(app)/maintainer/invite-contributor-button.tsx index d2d14358..42ef6faa 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,21 @@ 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}`; + await navigator.clipboard.writeText(link); + setLinkCopied(true); + setGeneratingLink(false); + setTimeout(() => setLinkCopied(false), 2000); + } + return ( <> +