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
|
||||
if (role === "superAdmin") {
|
||||
// If gymId param provided, filter by it
|
||||
if (targetGymId && metadata?.gymId !== targetGymId) {
|
||||
if (targetGymId && (metadata?.gymId ?? null) !== targetGymId) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
// Non-superAdmins: must match their gym
|
||||
return metadata?.gymId === userGymId;
|
||||
// Non-superAdmins: must match their gym (normalize null/undefined)
|
||||
return (metadata?.gymId ?? null) === (userGymId ?? null);
|
||||
}
|
||||
})
|
||||
.map((inv) => ({
|
||||
@ -214,9 +214,9 @@ export async function POST(req: Request) {
|
||||
const invitation = await client.invitations.createInvitation({
|
||||
emailAddress: inviteeEmail,
|
||||
publicMetadata: {
|
||||
roleAssigned,
|
||||
role: roleAssigned,
|
||||
gymId: gymIdForInvite,
|
||||
inviterUserId: inviter.id,
|
||||
createdBy: inviter.id,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@ -85,14 +85,12 @@ export async function POST(request: NextRequest) {
|
||||
try {
|
||||
const client = await clerkClient();
|
||||
|
||||
// Build publicMetadata - only include gymId if it exists
|
||||
// Build publicMetadata with consistent field names
|
||||
const publicMetadata: Record<string, any> = {
|
||||
role: data.role,
|
||||
createdBy: userId,
|
||||
gymId: assignedGymId ?? null,
|
||||
};
|
||||
if (assignedGymId) {
|
||||
publicMetadata.gymId = assignedGymId;
|
||||
}
|
||||
|
||||
// Determine redirect URL based on role
|
||||
// Staff (admin, trainer, superAdmin) → Admin web app
|
||||
|
||||
@ -174,6 +174,10 @@ export function CreateUserModal({
|
||||
|
||||
// Reset form
|
||||
resetModal();
|
||||
|
||||
// Add delay to allow Clerk API to propagate invitation
|
||||
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||
|
||||
onSuccess();
|
||||
onOpenChange(false);
|
||||
} catch (error) {
|
||||
|
||||
@ -365,6 +365,21 @@ export function useInvitations(gymId?: string) {
|
||||
(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