diff --git a/frontend/src/stores/useTenantInitializer.ts b/frontend/src/stores/useTenantInitializer.ts index 02be35c2..24aab966 100644 --- a/frontend/src/stores/useTenantInitializer.ts +++ b/frontend/src/stores/useTenantInitializer.ts @@ -131,26 +131,68 @@ export const useTenantInitializer = () => { console.log('✅ [TenantInitializer] Set API client tenant ID:', virtualTenantId); }); - // For enterprise demos, load the actual tenant list to show child tenants + // For enterprise demos, wait for session to be ready, then load tenants if (demoAccountType === 'enterprise') { - console.log('🔄 [TenantInitializer] Loading available tenants for enterprise demo...'); - // Use a mock user ID for demo mode - const mockUserId = 'demo-user'; - - // Import tenant service and load user tenants - import('../api/services/tenant').then(({ TenantService }) => { - const tenantService = new TenantService(); - tenantService.getUserTenants(mockUserId) - .then(tenants => { - console.log('📋 [TenantInitializer] Loaded available tenants:', tenants.length); - // Update the tenant store with available tenants - import('../stores/tenant.store').then(({ useTenantStore }) => { - useTenantStore.getState().setAvailableTenants(tenants); - }); - }) - .catch(error => { - console.error('❌ [TenantInitializer] Failed to load available tenants:', error); + console.log('🔄 [TenantInitializer] Waiting for enterprise demo session to be ready...'); + + // Poll session status until ready + const pollSessionStatus = async (sessionId: string, maxAttempts = 30) => { + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + const response = await fetch(`/api/v1/demo-sessions/${sessionId}/status`); + if (response.ok) { + const status = await response.json(); + console.log(`⏳ [TenantInitializer] Session status poll ${attempt}/${maxAttempts}:`, status.status); + + if (status.status === 'ready') { + console.log('✅ [TenantInitializer] Demo session is ready!'); + return true; + } else if (status.status === 'failed') { + console.error('❌ [TenantInitializer] Demo session failed:', status); + return false; + } + // Status is 'initializing' or 'cloning_data' - continue polling + } + } catch (error) { + console.warn(`⚠️ [TenantInitializer] Status poll ${attempt} failed:`, error); + } + + // Wait 1 second before next poll (except on last attempt) + if (attempt < maxAttempts) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + + console.error('❌ [TenantInitializer] Session readiness timeout after 30 seconds'); + return false; + }; + + // Wait for session to be ready, then load tenants + pollSessionStatus(demoSessionId).then(isReady => { + if (isReady) { + console.log('🔄 [TenantInitializer] Loading available tenants for enterprise demo...'); + const mockUserId = 'demo-user'; + + import('../api/services/tenant').then(({ TenantService }) => { + const tenantService = new TenantService(); + tenantService.getUserTenants(mockUserId) + .then(tenants => { + console.log('📋 [TenantInitializer] Loaded available tenants:', tenants.length); + if (tenants.length === 0) { + console.warn('⚠️ [TenantInitializer] Session ready but no tenants found - possible sync issue'); + } + // Update the tenant store with available tenants + import('../stores/tenant.store').then(({ useTenantStore }) => { + useTenantStore.getState().setAvailableTenants(tenants); + }); + }) + .catch(error => { + console.error('❌ [TenantInitializer] Failed to load available tenants:', error); + }); }); + } else { + console.error('❌ [TenantInitializer] Cannot load tenants - session not ready'); + } }); } }