From d4fae890bbeac634a26050fc5c51d844ee43aa75 Mon Sep 17 00:00:00 2001 From: echo Date: Wed, 18 Mar 2026 23:58:14 +0100 Subject: [PATCH] invitation flow finished --- apps/admin/data/fitai.db | Bin 172032 -> 172032 bytes apps/admin/src/app/api/invitations/route.ts | 10 +++++----- apps/admin/src/app/api/users/create/route.ts | 6 ++---- .../src/components/users/CreateUserModal.tsx | 4 ++++ apps/admin/src/hooks/use-api.ts | 15 +++++++++++++++ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/apps/admin/data/fitai.db b/apps/admin/data/fitai.db index 0b7bdbbbb55f2b6909993f2c0d123fcccca3be90..031e880ca6b7d8da11c415423b924cca7de9525b 100644 GIT binary patch delta 569 zcmZoTz}0YoYl1Z6@`*CejLSDBEa4Yp=eftmSIghV_k`Dy=N_Lb?**P>9-YmK0zy3Q zuH3w?ih_a+43aD?3=9k;*ubx z3@j`Ve<1tW)G|IhJEtlyJ*hGSpNo?ci!+lGlS?woQenXW4vI^@MofGx{N4=w_xQc} zSMcZY=WP}U_{=w1BVIrp60FEpuqiQnGERQrE4SGzevg4z4g>!_{u+KOz8`$s_)7SU zct7y2X9V>TVP1tWZ?h9|DFF6 v{|o-dK)Y}9zvaKOS+HOizbp$g10y$x-~hWrGkQxXPln(cn;2tlcFA-WqaXB? zX3T|o>KeDpepMtcBI??zp4OM6Szap+Sbp2v ({ @@ -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, }, }); diff --git a/apps/admin/src/app/api/users/create/route.ts b/apps/admin/src/app/api/users/create/route.ts index 4319126..029b8d6 100644 --- a/apps/admin/src/app/api/users/create/route.ts +++ b/apps/admin/src/app/api/users/create/route.ts @@ -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 = { 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 diff --git a/apps/admin/src/components/users/CreateUserModal.tsx b/apps/admin/src/components/users/CreateUserModal.tsx index 53f961c..25e0851 100644 --- a/apps/admin/src/components/users/CreateUserModal.tsx +++ b/apps/admin/src/components/users/CreateUserModal.tsx @@ -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) { diff --git a/apps/admin/src/hooks/use-api.ts b/apps/admin/src/hooks/use-api.ts index 39d1397..7073f91 100644 --- a/apps/admin/src/hooks/use-api.ts +++ b/apps/admin/src/hooks/use-api.ts @@ -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; + }, }); }