@nocios/crudify-ui 4.1.52 → 4.1.56

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/index.d.mts CHANGED
@@ -5,8 +5,8 @@ import { a as CrudifyLoginConfig } from './LoginComponent-CSTVsfeV.mjs';
5
5
  export { B as BoxScreenType, C as CrudifyLogin, b as CrudifyLoginProps, c as CrudifyLoginTranslations, L as LoginComponent, f as POLICY_ACTIONS, g as PREFERRED_POLICY_ORDER, P as Policies, e as PolicyAction, S as SessionStatus, d as UserLoginData, U as UserProfileDisplay } from './LoginComponent-CSTVsfeV.mjs';
6
6
  import React, { ReactNode } from 'react';
7
7
  export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.mjs';
8
- import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-DudiZgBg.mjs';
9
- export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-DudiZgBg.mjs';
8
+ import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-4MK_rZUi.mjs';
9
+ export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-4MK_rZUi.mjs';
10
10
  import * as react_jsx_runtime from 'react/jsx-runtime';
11
11
  import { ThemeOptions } from '@mui/material';
12
12
  export { E as ERROR_CODES, j as ERROR_SEVERITY_MAP, n as ErrorCode, o as ErrorSeverity, q as ErrorTranslationConfig, P as ParsedError, m as createErrorTranslator, d as decodeJwtSafely, a as getCookie, g as getCurrentUserEmail, f as getErrorMessage, h as handleCrudifyError, i as isTokenExpired, p as parseApiError, e as parseJavaScriptError, c as parseTransactionError, b as secureLocalStorage, s as secureSessionStorage, l as translateError, t as translateErrorCode, k as translateErrorCodes } from './errorTranslation-DEn4aqs6.mjs';
@@ -241,6 +241,239 @@ declare const validateInternalRedirect: (path: string, defaultPath?: string) =>
241
241
  */
242
242
  declare const extractSafeRedirectFromUrl: (searchParams: URLSearchParams | string, defaultPath?: string) => string;
243
243
 
244
+ type InitializationPriority = "HIGH" | "LOW";
245
+ type InitializationStatus = "UNINITIALIZED" | "INITIALIZING" | "INITIALIZED" | "ERROR";
246
+ interface InitializationState {
247
+ status: InitializationStatus;
248
+ priority: InitializationPriority | null;
249
+ publicApiKey: string | null;
250
+ env: string | null;
251
+ error: Error | null;
252
+ initializedBy: string | null;
253
+ }
254
+ interface InitializationRequest {
255
+ priority: InitializationPriority;
256
+ publicApiKey: string;
257
+ env: "dev" | "stg" | "api" | "prod";
258
+ enableLogging?: boolean;
259
+ requestedBy: string;
260
+ }
261
+ /**
262
+ * CrudifyInitializationManager
263
+ *
264
+ * Singleton manager for controlling Crudify SDK initialization with priority system.
265
+ *
266
+ * **Priority System:**
267
+ * - HIGH: Explicit initialization via `<CrudifyInitializer>` component
268
+ * - LOW: Automatic fallback initialization in providers
269
+ *
270
+ * **Thread-Safe:**
271
+ * - Prevents duplicate initializations
272
+ * - Handles concurrent initialization requests
273
+ * - Shared promise ensures single initialization
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * // HIGH priority (CrudifyInitializer)
278
+ * await crudifyInitManager.initialize({
279
+ * priority: "HIGH",
280
+ * publicApiKey: "key",
281
+ * env: "stg",
282
+ * requestedBy: "CrudifyInitializer"
283
+ * });
284
+ *
285
+ * // LOW priority (provider auto-init)
286
+ * await crudifyInitManager.initialize({
287
+ * priority: "LOW",
288
+ * publicApiKey: "key",
289
+ * env: "stg",
290
+ * requestedBy: "SessionProvider"
291
+ * });
292
+ * ```
293
+ */
294
+ declare class CrudifyInitializationManager {
295
+ private static instance;
296
+ private state;
297
+ private initializationPromise;
298
+ private highPriorityInitializerPresent;
299
+ private waitingForHighPriority;
300
+ private readonly HIGH_PRIORITY_WAIT_TIMEOUT;
301
+ private constructor();
302
+ /**
303
+ * Get singleton instance
304
+ */
305
+ static getInstance(): CrudifyInitializationManager;
306
+ /**
307
+ * Register that a HIGH priority initializer is present
308
+ * This must be called SYNCHRONOUSLY during component mount
309
+ */
310
+ registerHighPriorityInitializer(): void;
311
+ /**
312
+ * Check if a HIGH priority initializer is present
313
+ */
314
+ isHighPriorityInitializerPresent(): boolean;
315
+ /**
316
+ * Get current initialization state (read-only)
317
+ */
318
+ getState(): Readonly<InitializationState>;
319
+ /**
320
+ * Main initialization method - handles priority and concurrency
321
+ *
322
+ * @param request Initialization request with priority and config
323
+ * @returns Promise that resolves when initialization completes
324
+ * @throws Error if initialization fails
325
+ */
326
+ initialize(request: InitializationRequest): Promise<void>;
327
+ /**
328
+ * Wait for HIGH priority initializer with timeout
329
+ */
330
+ private waitForHighPriorityOrTimeout;
331
+ /**
332
+ * Actual SDK initialization
333
+ */
334
+ private performInitialization;
335
+ /**
336
+ * Reset initialization state (for testing)
337
+ */
338
+ reset(): void;
339
+ /**
340
+ * Check if initialized (without triggering initialization)
341
+ */
342
+ isInitialized(): boolean;
343
+ /**
344
+ * Get diagnostic info (for debugging)
345
+ */
346
+ getDiagnostics(): {
347
+ waitingCount: number;
348
+ waitingComponents: string[];
349
+ hasActivePromise: boolean;
350
+ status: InitializationStatus;
351
+ priority: InitializationPriority | null;
352
+ publicApiKey: string | null;
353
+ env: string | null;
354
+ error: Error | null;
355
+ initializedBy: string | null;
356
+ };
357
+ }
358
+ /**
359
+ * Export singleton instance
360
+ *
361
+ * @example
362
+ * ```typescript
363
+ * import { crudifyInitManager } from "@nocios/crudify-ui";
364
+ *
365
+ * // Initialize with HIGH priority
366
+ * await crudifyInitManager.initialize({
367
+ * priority: "HIGH",
368
+ * publicApiKey: "your-key",
369
+ * env: "stg",
370
+ * requestedBy: "CrudifyInitializer"
371
+ * });
372
+ *
373
+ * // Check if initialized
374
+ * if (crudifyInitManager.isInitialized()) {
375
+ * // Ready to use crudify SDK
376
+ * }
377
+ *
378
+ * // Get diagnostics
379
+ * console.log(crudifyInitManager.getDiagnostics());
380
+ * ```
381
+ */
382
+ declare const crudifyInitManager: CrudifyInitializationManager;
383
+
384
+ interface CrudifyInitializerConfig {
385
+ publicApiKey: string;
386
+ env?: "dev" | "stg" | "api" | "prod";
387
+ enableLogging?: boolean;
388
+ }
389
+ interface CrudifyInitializerContextValue {
390
+ isInitialized: boolean;
391
+ isInitializing: boolean;
392
+ error: Error | null;
393
+ }
394
+ interface CrudifyInitializerProps {
395
+ config: CrudifyInitializerConfig;
396
+ children: React.ReactNode;
397
+ fallback?: React.ReactNode;
398
+ onInitialized?: () => void;
399
+ onError?: (error: Error) => void;
400
+ }
401
+ /**
402
+ * CrudifyInitializer Component
403
+ *
404
+ * HIGH priority Crudify SDK initializer component.
405
+ * Use this at the root of your app to explicitly control initialization.
406
+ *
407
+ * **Features:**
408
+ * - HIGH priority initialization (takes precedence over auto-init)
409
+ * - Provides initialization status via context
410
+ * - Optional loading fallback while initializing
411
+ * - Callbacks for initialization complete/error
412
+ * - React 18 StrictMode compatible
413
+ *
414
+ * **Usage:**
415
+ * ```tsx
416
+ * // App.tsx
417
+ * import { CrudifyInitializer } from "@nocios/crudify-ui";
418
+ *
419
+ * function App() {
420
+ * return (
421
+ * <CrudifyInitializer
422
+ * config={{
423
+ * publicApiKey: import.meta.env.VITE_CRUDIFY_PUBLIC_API_KEY,
424
+ * env: "stg",
425
+ * enableLogging: true,
426
+ * }}
427
+ * fallback={<div>Loading Crudify...</div>}
428
+ * onInitialized={() => console.log("Crudify ready!")}
429
+ * onError={(err) => console.error("Init failed:", err)}
430
+ * >
431
+ * <SessionProvider>
432
+ * <TranslationsProvider>
433
+ * <App />
434
+ * </TranslationsProvider>
435
+ * </SessionProvider>
436
+ * </CrudifyInitializer>
437
+ * );
438
+ * }
439
+ * ```
440
+ *
441
+ * **Context Access:**
442
+ * ```tsx
443
+ * import { useCrudifyInitializer } from "@nocios/crudify-ui";
444
+ *
445
+ * function MyComponent() {
446
+ * const { isInitialized, isInitializing, error } = useCrudifyInitializer();
447
+ *
448
+ * if (isInitializing) return <div>Loading...</div>;
449
+ * if (error) return <div>Error: {error.message}</div>;
450
+ * if (!isInitialized) return null;
451
+ *
452
+ * return <div>Crudify is ready!</div>;
453
+ * }
454
+ * ```
455
+ */
456
+ declare const CrudifyInitializer: React.FC<CrudifyInitializerProps>;
457
+ /**
458
+ * Hook to access CrudifyInitializer context
459
+ *
460
+ * @returns Initialization status (isInitialized, isInitializing, error)
461
+ * @throws Error if used outside CrudifyInitializer
462
+ *
463
+ * @example
464
+ * ```tsx
465
+ * function MyComponent() {
466
+ * const { isInitialized, isInitializing, error } = useCrudifyInitializer();
467
+ *
468
+ * if (isInitializing) return <Spinner />;
469
+ * if (error) return <ErrorDisplay error={error} />;
470
+ *
471
+ * return <div>Ready!</div>;
472
+ * }
473
+ * ```
474
+ */
475
+ declare const useCrudifyInitializer: () => CrudifyInitializerContextValue;
476
+
244
477
  interface TranslationsProviderProps {
245
478
  children: React.ReactNode;
246
479
  subscriberKey: string;
@@ -327,20 +560,26 @@ interface TranslationResponse {
327
560
  declare class TranslationService {
328
561
  private static instance;
329
562
  private enableDebug;
563
+ private initializationPromise;
564
+ private isInitialized;
330
565
  private constructor();
331
566
  static getInstance(): TranslationService;
332
567
  /**
333
568
  * Set debug mode
334
569
  */
335
570
  setDebug(enable: boolean): void;
571
+ /**
572
+ * Ensure crudify is initialized before making API calls
573
+ * Thread-safe: multiple calls will wait for the same initialization
574
+ */
575
+ private ensureCrudifyInitialized;
336
576
  /**
337
577
  * Fetch translations with cache strategy
338
578
  * 1. Try cache (if valid and not changed)
339
- * 2. Try API fetch via crudify SDK
340
- * 3. Try expired cache
341
- * 4. Fall back to critical bundle
342
- *
343
- * Note: Assumes crudify SDK is already initialized by the app
579
+ * 2. Ensure crudify is initialized
580
+ * 3. Try API fetch via crudify SDK
581
+ * 4. Try expired cache
582
+ * 5. Fall back to critical bundle
344
583
  */
345
584
  fetchTranslations(options: FetchTranslationsOptions): Promise<Record<string, Record<string, string>>>;
346
585
  /**
@@ -664,4 +903,4 @@ declare const crudifyAdmin: {
664
903
  getModuleVersions: (moduleKey: string) => Promise<ApiResponse<any[]>>;
665
904
  };
666
905
 
667
- export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useSessionContext, useTranslations, validateInternalRedirect };
906
+ export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyInitializationManager, CrudifyInitializer, type CrudifyInitializerConfig, type CrudifyInitializerProps, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, type InitializationPriority, type InitializationRequest, type InitializationStatus, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, crudifyInitManager, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useCrudifyInitializer, useSessionContext, useTranslations, validateInternalRedirect };
package/dist/index.d.ts CHANGED
@@ -5,8 +5,8 @@ import { a as CrudifyLoginConfig } from './LoginComponent-CSTVsfeV.js';
5
5
  export { B as BoxScreenType, C as CrudifyLogin, b as CrudifyLoginProps, c as CrudifyLoginTranslations, L as LoginComponent, f as POLICY_ACTIONS, g as PREFERRED_POLICY_ORDER, P as Policies, e as PolicyAction, S as SessionStatus, d as UserLoginData, U as UserProfileDisplay } from './LoginComponent-CSTVsfeV.js';
6
6
  import React, { ReactNode } from 'react';
7
7
  export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.js';
8
- import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-FQzSa_vl.js';
9
- export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-FQzSa_vl.js';
8
+ import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-Dpy6dlER.js';
9
+ export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-Dpy6dlER.js';
10
10
  import * as react_jsx_runtime from 'react/jsx-runtime';
11
11
  import { ThemeOptions } from '@mui/material';
12
12
  export { E as ERROR_CODES, j as ERROR_SEVERITY_MAP, n as ErrorCode, o as ErrorSeverity, q as ErrorTranslationConfig, P as ParsedError, m as createErrorTranslator, d as decodeJwtSafely, a as getCookie, g as getCurrentUserEmail, f as getErrorMessage, h as handleCrudifyError, i as isTokenExpired, p as parseApiError, e as parseJavaScriptError, c as parseTransactionError, b as secureLocalStorage, s as secureSessionStorage, l as translateError, t as translateErrorCode, k as translateErrorCodes } from './errorTranslation-DdqZg8JD.js';
@@ -241,6 +241,239 @@ declare const validateInternalRedirect: (path: string, defaultPath?: string) =>
241
241
  */
242
242
  declare const extractSafeRedirectFromUrl: (searchParams: URLSearchParams | string, defaultPath?: string) => string;
243
243
 
244
+ type InitializationPriority = "HIGH" | "LOW";
245
+ type InitializationStatus = "UNINITIALIZED" | "INITIALIZING" | "INITIALIZED" | "ERROR";
246
+ interface InitializationState {
247
+ status: InitializationStatus;
248
+ priority: InitializationPriority | null;
249
+ publicApiKey: string | null;
250
+ env: string | null;
251
+ error: Error | null;
252
+ initializedBy: string | null;
253
+ }
254
+ interface InitializationRequest {
255
+ priority: InitializationPriority;
256
+ publicApiKey: string;
257
+ env: "dev" | "stg" | "api" | "prod";
258
+ enableLogging?: boolean;
259
+ requestedBy: string;
260
+ }
261
+ /**
262
+ * CrudifyInitializationManager
263
+ *
264
+ * Singleton manager for controlling Crudify SDK initialization with priority system.
265
+ *
266
+ * **Priority System:**
267
+ * - HIGH: Explicit initialization via `<CrudifyInitializer>` component
268
+ * - LOW: Automatic fallback initialization in providers
269
+ *
270
+ * **Thread-Safe:**
271
+ * - Prevents duplicate initializations
272
+ * - Handles concurrent initialization requests
273
+ * - Shared promise ensures single initialization
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * // HIGH priority (CrudifyInitializer)
278
+ * await crudifyInitManager.initialize({
279
+ * priority: "HIGH",
280
+ * publicApiKey: "key",
281
+ * env: "stg",
282
+ * requestedBy: "CrudifyInitializer"
283
+ * });
284
+ *
285
+ * // LOW priority (provider auto-init)
286
+ * await crudifyInitManager.initialize({
287
+ * priority: "LOW",
288
+ * publicApiKey: "key",
289
+ * env: "stg",
290
+ * requestedBy: "SessionProvider"
291
+ * });
292
+ * ```
293
+ */
294
+ declare class CrudifyInitializationManager {
295
+ private static instance;
296
+ private state;
297
+ private initializationPromise;
298
+ private highPriorityInitializerPresent;
299
+ private waitingForHighPriority;
300
+ private readonly HIGH_PRIORITY_WAIT_TIMEOUT;
301
+ private constructor();
302
+ /**
303
+ * Get singleton instance
304
+ */
305
+ static getInstance(): CrudifyInitializationManager;
306
+ /**
307
+ * Register that a HIGH priority initializer is present
308
+ * This must be called SYNCHRONOUSLY during component mount
309
+ */
310
+ registerHighPriorityInitializer(): void;
311
+ /**
312
+ * Check if a HIGH priority initializer is present
313
+ */
314
+ isHighPriorityInitializerPresent(): boolean;
315
+ /**
316
+ * Get current initialization state (read-only)
317
+ */
318
+ getState(): Readonly<InitializationState>;
319
+ /**
320
+ * Main initialization method - handles priority and concurrency
321
+ *
322
+ * @param request Initialization request with priority and config
323
+ * @returns Promise that resolves when initialization completes
324
+ * @throws Error if initialization fails
325
+ */
326
+ initialize(request: InitializationRequest): Promise<void>;
327
+ /**
328
+ * Wait for HIGH priority initializer with timeout
329
+ */
330
+ private waitForHighPriorityOrTimeout;
331
+ /**
332
+ * Actual SDK initialization
333
+ */
334
+ private performInitialization;
335
+ /**
336
+ * Reset initialization state (for testing)
337
+ */
338
+ reset(): void;
339
+ /**
340
+ * Check if initialized (without triggering initialization)
341
+ */
342
+ isInitialized(): boolean;
343
+ /**
344
+ * Get diagnostic info (for debugging)
345
+ */
346
+ getDiagnostics(): {
347
+ waitingCount: number;
348
+ waitingComponents: string[];
349
+ hasActivePromise: boolean;
350
+ status: InitializationStatus;
351
+ priority: InitializationPriority | null;
352
+ publicApiKey: string | null;
353
+ env: string | null;
354
+ error: Error | null;
355
+ initializedBy: string | null;
356
+ };
357
+ }
358
+ /**
359
+ * Export singleton instance
360
+ *
361
+ * @example
362
+ * ```typescript
363
+ * import { crudifyInitManager } from "@nocios/crudify-ui";
364
+ *
365
+ * // Initialize with HIGH priority
366
+ * await crudifyInitManager.initialize({
367
+ * priority: "HIGH",
368
+ * publicApiKey: "your-key",
369
+ * env: "stg",
370
+ * requestedBy: "CrudifyInitializer"
371
+ * });
372
+ *
373
+ * // Check if initialized
374
+ * if (crudifyInitManager.isInitialized()) {
375
+ * // Ready to use crudify SDK
376
+ * }
377
+ *
378
+ * // Get diagnostics
379
+ * console.log(crudifyInitManager.getDiagnostics());
380
+ * ```
381
+ */
382
+ declare const crudifyInitManager: CrudifyInitializationManager;
383
+
384
+ interface CrudifyInitializerConfig {
385
+ publicApiKey: string;
386
+ env?: "dev" | "stg" | "api" | "prod";
387
+ enableLogging?: boolean;
388
+ }
389
+ interface CrudifyInitializerContextValue {
390
+ isInitialized: boolean;
391
+ isInitializing: boolean;
392
+ error: Error | null;
393
+ }
394
+ interface CrudifyInitializerProps {
395
+ config: CrudifyInitializerConfig;
396
+ children: React.ReactNode;
397
+ fallback?: React.ReactNode;
398
+ onInitialized?: () => void;
399
+ onError?: (error: Error) => void;
400
+ }
401
+ /**
402
+ * CrudifyInitializer Component
403
+ *
404
+ * HIGH priority Crudify SDK initializer component.
405
+ * Use this at the root of your app to explicitly control initialization.
406
+ *
407
+ * **Features:**
408
+ * - HIGH priority initialization (takes precedence over auto-init)
409
+ * - Provides initialization status via context
410
+ * - Optional loading fallback while initializing
411
+ * - Callbacks for initialization complete/error
412
+ * - React 18 StrictMode compatible
413
+ *
414
+ * **Usage:**
415
+ * ```tsx
416
+ * // App.tsx
417
+ * import { CrudifyInitializer } from "@nocios/crudify-ui";
418
+ *
419
+ * function App() {
420
+ * return (
421
+ * <CrudifyInitializer
422
+ * config={{
423
+ * publicApiKey: import.meta.env.VITE_CRUDIFY_PUBLIC_API_KEY,
424
+ * env: "stg",
425
+ * enableLogging: true,
426
+ * }}
427
+ * fallback={<div>Loading Crudify...</div>}
428
+ * onInitialized={() => console.log("Crudify ready!")}
429
+ * onError={(err) => console.error("Init failed:", err)}
430
+ * >
431
+ * <SessionProvider>
432
+ * <TranslationsProvider>
433
+ * <App />
434
+ * </TranslationsProvider>
435
+ * </SessionProvider>
436
+ * </CrudifyInitializer>
437
+ * );
438
+ * }
439
+ * ```
440
+ *
441
+ * **Context Access:**
442
+ * ```tsx
443
+ * import { useCrudifyInitializer } from "@nocios/crudify-ui";
444
+ *
445
+ * function MyComponent() {
446
+ * const { isInitialized, isInitializing, error } = useCrudifyInitializer();
447
+ *
448
+ * if (isInitializing) return <div>Loading...</div>;
449
+ * if (error) return <div>Error: {error.message}</div>;
450
+ * if (!isInitialized) return null;
451
+ *
452
+ * return <div>Crudify is ready!</div>;
453
+ * }
454
+ * ```
455
+ */
456
+ declare const CrudifyInitializer: React.FC<CrudifyInitializerProps>;
457
+ /**
458
+ * Hook to access CrudifyInitializer context
459
+ *
460
+ * @returns Initialization status (isInitialized, isInitializing, error)
461
+ * @throws Error if used outside CrudifyInitializer
462
+ *
463
+ * @example
464
+ * ```tsx
465
+ * function MyComponent() {
466
+ * const { isInitialized, isInitializing, error } = useCrudifyInitializer();
467
+ *
468
+ * if (isInitializing) return <Spinner />;
469
+ * if (error) return <ErrorDisplay error={error} />;
470
+ *
471
+ * return <div>Ready!</div>;
472
+ * }
473
+ * ```
474
+ */
475
+ declare const useCrudifyInitializer: () => CrudifyInitializerContextValue;
476
+
244
477
  interface TranslationsProviderProps {
245
478
  children: React.ReactNode;
246
479
  subscriberKey: string;
@@ -327,20 +560,26 @@ interface TranslationResponse {
327
560
  declare class TranslationService {
328
561
  private static instance;
329
562
  private enableDebug;
563
+ private initializationPromise;
564
+ private isInitialized;
330
565
  private constructor();
331
566
  static getInstance(): TranslationService;
332
567
  /**
333
568
  * Set debug mode
334
569
  */
335
570
  setDebug(enable: boolean): void;
571
+ /**
572
+ * Ensure crudify is initialized before making API calls
573
+ * Thread-safe: multiple calls will wait for the same initialization
574
+ */
575
+ private ensureCrudifyInitialized;
336
576
  /**
337
577
  * Fetch translations with cache strategy
338
578
  * 1. Try cache (if valid and not changed)
339
- * 2. Try API fetch via crudify SDK
340
- * 3. Try expired cache
341
- * 4. Fall back to critical bundle
342
- *
343
- * Note: Assumes crudify SDK is already initialized by the app
579
+ * 2. Ensure crudify is initialized
580
+ * 3. Try API fetch via crudify SDK
581
+ * 4. Try expired cache
582
+ * 5. Fall back to critical bundle
344
583
  */
345
584
  fetchTranslations(options: FetchTranslationsOptions): Promise<Record<string, Record<string, string>>>;
346
585
  /**
@@ -664,4 +903,4 @@ declare const crudifyAdmin: {
664
903
  getModuleVersions: (moduleKey: string) => Promise<ApiResponse<any[]>>;
665
904
  };
666
905
 
667
- export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useSessionContext, useTranslations, validateInternalRedirect };
906
+ export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyInitializationManager, CrudifyInitializer, type CrudifyInitializerConfig, type CrudifyInitializerProps, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, type InitializationPriority, type InitializationRequest, type InitializationStatus, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, crudifyInitManager, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useCrudifyInitializer, useSessionContext, useTranslations, validateInternalRedirect };