invitation flow finished

This commit is contained in:
echo 2026-03-18 23:58:14 +01:00
parent 0817e8e72b
commit d4fae890bb
5 changed files with 26 additions and 9 deletions

Binary file not shown.

View File

@ -54,13 +54,13 @@ export async function GET(request: NextRequest) {
// Gym filter: SuperAdmin can see all, others only their gym // Gym filter: SuperAdmin can see all, others only their gym
if (role === "superAdmin") { if (role === "superAdmin") {
// If gymId param provided, filter by it // If gymId param provided, filter by it
if (targetGymId && metadata?.gymId !== targetGymId) { if (targetGymId && (metadata?.gymId ?? null) !== targetGymId) {
return false; return false;
} }
return true; return true;
} else { } else {
// Non-superAdmins: must match their gym // Non-superAdmins: must match their gym (normalize null/undefined)
return metadata?.gymId === userGymId; return (metadata?.gymId ?? null) === (userGymId ?? null);
} }
}) })
.map((inv) => ({ .map((inv) => ({
@ -214,9 +214,9 @@ export async function POST(req: Request) {
const invitation = await client.invitations.createInvitation({ const invitation = await client.invitations.createInvitation({
emailAddress: inviteeEmail, emailAddress: inviteeEmail,
publicMetadata: { publicMetadata: {
roleAssigned, role: roleAssigned,
gymId: gymIdForInvite, gymId: gymIdForInvite,
inviterUserId: inviter.id, createdBy: inviter.id,
}, },
}); });

View File

@ -85,14 +85,12 @@ export async function POST(request: NextRequest) {
try { try {
const client = await clerkClient(); const client = await clerkClient();
// Build publicMetadata - only include gymId if it exists // Build publicMetadata with consistent field names
const publicMetadata: Record<string, any> = { const publicMetadata: Record<string, any> = {
role: data.role, role: data.role,
createdBy: userId, createdBy: userId,
gymId: assignedGymId ?? null,
}; };
if (assignedGymId) {
publicMetadata.gymId = assignedGymId;
}
// Determine redirect URL based on role // Determine redirect URL based on role
// Staff (admin, trainer, superAdmin) → Admin web app // Staff (admin, trainer, superAdmin) → Admin web app

View File

@ -174,6 +174,10 @@ export function CreateUserModal({
// Reset form // Reset form
resetModal(); resetModal();
// Add delay to allow Clerk API to propagate invitation
await new Promise((resolve) => setTimeout(resolve, 1000));
onSuccess(); onSuccess();
onOpenChange(false); onOpenChange(false);
} catch (error) { } catch (error) {

View File

@ -365,6 +365,21 @@ export function useInvitations(gymId?: string) {
(res) => res.data?.invitations ?? [], (res) => res.data?.invitations ?? [],
); );
}, },
refetchInterval: (query) => {
const data = query.state.data;
const hasData = data && data.length > 0;
const fetchCount = query.state.dataUpdateCount;
// Poll every 2 seconds if:
// 1. No invitations returned yet
// 2. Haven't exceeded 5 attempts (10 seconds total)
if (!hasData && fetchCount < 5) {
return 2000;
}
// Stop polling after 10 seconds or when data is present
return false;
},
}); });
} }