invitation flow finished
This commit is contained in:
parent
0817e8e72b
commit
d4fae890bb
Binary file not shown.
@ -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,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user