diff --git a/src/components/ManageMembersModal.tsx b/src/components/ManageMembersModal.tsx index fecd875..37c563b 100644 --- a/src/components/ManageMembersModal.tsx +++ b/src/components/ManageMembersModal.tsx @@ -711,7 +711,7 @@ export function ManageMembersModal({ setError(null); setSuccess(null); console.log( - '[ManageMembersModal] Copy Join Link clicked' + '[ManageMembersModal] Share/Copy Join Link clicked' ); const res = await fetch( `/api/collections/${collectionId}/invite`, @@ -738,18 +738,22 @@ export function ManageMembersModal({ throw new Error('No link received from server'); } + // Detect if we're on mobile + const isMobile = + typeof navigator !== 'undefined' && + /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + // On mobile, prefer native share over clipboard (more reliable on iOS) if ( + isMobile && typeof navigator !== 'undefined' && - (navigator as any).share && - /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) + (navigator as any).share ) { console.log( '[ManageMembersModal] using navigator.share on mobile' ); + // Only pass url to avoid "text + url" when copying from share sheet await (navigator as any).share({ - title: `Join ${collectionName} on StuffLibrary`, - text: `Here's your invite to ${collectionName}`, url: link, }); // Don't set success message for share, as the action is self-evident @@ -768,7 +772,10 @@ export function ManageMembersModal({ } } } catch (e) { - console.error('[ManageMembersModal] copy link failed', e); + console.error( + '[ManageMembersModal] share/copy link failed', + e + ); // Only show error if it's not user cancellation of share dialog if ( !(e instanceof Error && e.name === 'AbortError') && @@ -785,61 +792,12 @@ export function ManageMembersModal({ } }} > - {shareLoading ? 'Preparing…' : 'Copy Join Link'} - -