@jmruthers/pace-core 0.5.9 → 0.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DataTable-4TQ6VBHW.js → DataTable-7LYDPZXT.js} +5 -5
- package/dist/{chunk-PCFG6WRC.js → chunk-7KDZXMES.js} +5 -5
- package/dist/{chunk-HXX35Q2M.js → chunk-7UEIZCST.js} +2 -2
- package/dist/{chunk-OCM3I4GY.js → chunk-AMOT5ZSZ.js} +3 -3
- package/dist/{chunk-PVMYVQSM.js → chunk-CMXBNDPM.js} +3 -3
- package/dist/{chunk-K6B7BLSE.js → chunk-DKDTXS5Q.js} +2 -2
- package/dist/{chunk-GNTALZV3.js → chunk-DV2Z3RBQ.js} +3 -3
- package/dist/{chunk-SM6KCLW5.js → chunk-JV73V2W5.js} +10 -6
- package/dist/chunk-JV73V2W5.js.map +1 -0
- package/dist/{chunk-CTV3NKPM.js → chunk-ROHDZOP7.js} +3 -3
- package/dist/{chunk-QKHFMQ5R.js → chunk-RQ7Y2CN6.js} +30 -5
- package/dist/chunk-RQ7Y2CN6.js.map +1 -0
- package/dist/{chunk-HD7PYDUV.js → chunk-XYRRPUYV.js} +2 -2
- package/dist/components.js +7 -7
- package/dist/hooks.js +4 -4
- package/dist/index.js +10 -10
- package/dist/providers.js +3 -3
- package/dist/rbac/index.js +5 -5
- package/dist/utils.js +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContextType.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACProviderProps.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +2 -2
- package/package.json +1 -1
- package/src/providers/AuthProvider.tsx +34 -5
- package/src/rbac/components/PagePermissionGuard.tsx +11 -2
- package/dist/chunk-QKHFMQ5R.js.map +0 -1
- package/dist/chunk-SM6KCLW5.js.map +0 -1
- /package/dist/{DataTable-4TQ6VBHW.js.map → DataTable-7LYDPZXT.js.map} +0 -0
- /package/dist/{chunk-PCFG6WRC.js.map → chunk-7KDZXMES.js.map} +0 -0
- /package/dist/{chunk-HXX35Q2M.js.map → chunk-7UEIZCST.js.map} +0 -0
- /package/dist/{chunk-OCM3I4GY.js.map → chunk-AMOT5ZSZ.js.map} +0 -0
- /package/dist/{chunk-PVMYVQSM.js.map → chunk-CMXBNDPM.js.map} +0 -0
- /package/dist/{chunk-K6B7BLSE.js.map → chunk-DKDTXS5Q.js.map} +0 -0
- /package/dist/{chunk-GNTALZV3.js.map → chunk-DV2Z3RBQ.js.map} +0 -0
- /package/dist/{chunk-CTV3NKPM.js.map → chunk-ROHDZOP7.js.map} +0 -0
- /package/dist/{chunk-HD7PYDUV.js.map → chunk-XYRRPUYV.js.map} +0 -0
package/docs/api/modules.md
CHANGED
package/package.json
CHANGED
|
@@ -87,22 +87,39 @@ export function AuthProvider({ children, supabaseClient }: AuthProviderProps) {
|
|
|
87
87
|
useEffect(() => {
|
|
88
88
|
if (!supabaseClient) return;
|
|
89
89
|
|
|
90
|
-
const loadInitialUser = async () => {
|
|
90
|
+
const loadInitialUser = async (retryCount = 0) => {
|
|
91
91
|
try {
|
|
92
|
+
DebugLogger.log('AuthProvider', `Loading initial user (attempt ${retryCount + 1})...`);
|
|
92
93
|
const response = await supabaseClient.auth.getUser();
|
|
93
94
|
const { data: { user: initialUser }, error } = response || { data: { user: null }, error: null };
|
|
95
|
+
|
|
94
96
|
if (error) {
|
|
95
97
|
console.warn('Failed to get initial user:', error);
|
|
98
|
+
// Retry once if it's a network error
|
|
99
|
+
if (retryCount === 0 && (error.message?.includes('network') || error.message?.includes('timeout'))) {
|
|
100
|
+
console.log('AuthProvider: Retrying initial user load due to network error...');
|
|
101
|
+
setTimeout(() => loadInitialUser(1), 1000);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
96
104
|
setAuthLoading(false);
|
|
97
105
|
return;
|
|
98
106
|
}
|
|
99
107
|
|
|
100
108
|
if (initialUser) {
|
|
109
|
+
DebugLogger.log('AuthProvider', 'Initial user loaded successfully:', initialUser.email);
|
|
101
110
|
setUser(initialUser);
|
|
111
|
+
} else {
|
|
112
|
+
DebugLogger.log('AuthProvider', 'No initial user found');
|
|
102
113
|
}
|
|
103
114
|
setAuthLoading(false);
|
|
104
115
|
} catch (error) {
|
|
105
116
|
console.error('Error loading initial user:', error);
|
|
117
|
+
// Retry once if it's a network error
|
|
118
|
+
if (retryCount === 0 && (error instanceof Error && (error.message.includes('network') || error.message.includes('timeout')))) {
|
|
119
|
+
console.log('AuthProvider: Retrying initial user load due to network error...');
|
|
120
|
+
setTimeout(() => loadInitialUser(1), 1000);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
106
123
|
setAuthLoading(false);
|
|
107
124
|
}
|
|
108
125
|
};
|
|
@@ -125,13 +142,14 @@ export function AuthProvider({ children, supabaseClient }: AuthProviderProps) {
|
|
|
125
142
|
return;
|
|
126
143
|
}
|
|
127
144
|
|
|
128
|
-
//
|
|
145
|
+
// Reasonable timeout to allow for auth state changes while preventing infinite hanging
|
|
129
146
|
const timeoutId = setTimeout(() => {
|
|
130
147
|
if (authLoading) {
|
|
131
|
-
console.warn('AuthProvider: Auth loading timeout reached');
|
|
148
|
+
console.warn('AuthProvider: Auth loading timeout reached - this may indicate a network issue or slow auth response');
|
|
132
149
|
setAuthLoading(false);
|
|
150
|
+
setAuthError(new AuthError('Authentication timeout - please try refreshing the page'));
|
|
133
151
|
}
|
|
134
|
-
},
|
|
152
|
+
}, 10000); // Increased to 10 seconds to allow for proper auth flow
|
|
135
153
|
|
|
136
154
|
try {
|
|
137
155
|
DebugLogger.log('AuthProvider', 'Setting up auth state change listener...');
|
|
@@ -151,7 +169,8 @@ export function AuthProvider({ children, supabaseClient }: AuthProviderProps) {
|
|
|
151
169
|
setUser(null);
|
|
152
170
|
setAuthLoading(false);
|
|
153
171
|
setAuthError(null);
|
|
154
|
-
} else {
|
|
172
|
+
} else if (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED') {
|
|
173
|
+
DebugLogger.log('AuthProvider', 'User signed in or token refreshed');
|
|
155
174
|
setSession(session);
|
|
156
175
|
setUser(session?.user ?? null);
|
|
157
176
|
setAuthLoading(false);
|
|
@@ -160,6 +179,16 @@ export function AuthProvider({ children, supabaseClient }: AuthProviderProps) {
|
|
|
160
179
|
if (session) {
|
|
161
180
|
setAuthError(null);
|
|
162
181
|
}
|
|
182
|
+
} else {
|
|
183
|
+
// Handle other events (INITIAL_SESSION, etc.)
|
|
184
|
+
if (session) {
|
|
185
|
+
setSession(session);
|
|
186
|
+
setUser(session.user ?? null);
|
|
187
|
+
setAuthLoading(false);
|
|
188
|
+
if (session) {
|
|
189
|
+
setAuthError(null);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
163
192
|
}
|
|
164
193
|
} catch (error) {
|
|
165
194
|
console.warn('[AuthProvider] Error in auth state change handler:', error);
|
|
@@ -306,9 +306,18 @@ export function PagePermissionGuard({
|
|
|
306
306
|
useCache: true
|
|
307
307
|
});
|
|
308
308
|
|
|
309
|
+
// Only call useCan when we have a valid resolved scope
|
|
310
|
+
// This prevents the race condition by not calling useCan with invalid scope
|
|
311
|
+
const shouldCheckPermissions = resolvedScope && resolvedScope.organisationId;
|
|
312
|
+
|
|
313
|
+
// Use a stable scope object to prevent unnecessary re-renders
|
|
314
|
+
const scopeForUseCan = useMemo(() => {
|
|
315
|
+
return shouldCheckPermissions ? resolvedScope : { organisationId: 'loading', appId: 'loading', eventId: undefined };
|
|
316
|
+
}, [shouldCheckPermissions, resolvedScope]);
|
|
317
|
+
|
|
309
318
|
const { can, isLoading: canIsLoading, error: canError } = useCan(
|
|
310
319
|
user?.id || '',
|
|
311
|
-
|
|
320
|
+
scopeForUseCan,
|
|
312
321
|
permission,
|
|
313
322
|
effectivePageId,
|
|
314
323
|
true // Use cache
|
|
@@ -317,7 +326,7 @@ export function PagePermissionGuard({
|
|
|
317
326
|
console.log('[PagePermissionGuard] useCan returned:', { can, canIsLoading, canError });
|
|
318
327
|
|
|
319
328
|
// Combine loading states - we're loading if either scope is resolving OR permission check is loading
|
|
320
|
-
const isLoading = !resolvedScope || canIsLoading;
|
|
329
|
+
const isLoading = !resolvedScope || !shouldCheckPermissions || canIsLoading;
|
|
321
330
|
const error = checkError || canError;
|
|
322
331
|
|
|
323
332
|
console.log('[PagePermissionGuard] Combined state:', {
|