getInstance static method

Future<ComprehensiveNotificationManager> getInstance({
  1. FirebaseNotificationRepository? firebaseRepository,
  2. LocalNotificationRepository? localRepository,
  3. NotificationTemplateBuilder? templateBuilder,
  4. NotificationScheduler? scheduler,
  5. NotificationPermissionManager? permissionManager,
  6. ForegroundNotificationConfig? foregroundConfig,
})

Gets the singleton instance with proper initialization.

This method ensures only one instance exists, preventing duplicate notification processing even if called multiple times.

Parameters:

  • firebaseRepository: Firebase repository for remote notifications (optional)
  • localRepository: Local repository for device notifications (optional)
  • templateBuilder: Template builder for creating notifications (optional)
  • scheduler: Scheduler for notification timing (optional)
  • permissionManager: Permission manager (optional)
  • foregroundConfig: Configuration for foreground dialog display

Implementation

static Future<ComprehensiveNotificationManager> getInstance({
  FirebaseNotificationRepository? firebaseRepository,
  LocalNotificationRepository? localRepository,
  NotificationTemplateBuilder? templateBuilder,
  NotificationScheduler? scheduler,
  NotificationPermissionManager? permissionManager,
  ForegroundNotificationConfig? foregroundConfig,
}) async {
  // Return existing instance if already initialized
  final ComprehensiveNotificationManager? instance = _instance;
  if (instance != null && instance._isInitialized) {
    safeDebugLog(
      'Returning existing ComprehensiveNotificationManager instance',
    );
    return instance;
  }

  // Wait for ongoing initialization if in progress
  final Completer<ComprehensiveNotificationManager>? completer =
      _initCompleter;
  if (completer != null) {
    safeDebugLog(
      'Waiting for ongoing ComprehensiveNotificationManager initialization',
    );
    return completer.future;
  }

  // Start new initialization
  _initCompleter = Completer<ComprehensiveNotificationManager>();
  safeDebugLog('Creating new ComprehensiveNotificationManager instance');

  try {
    final FirebaseNotificationRepository finalFirebaseRepository =
        firebaseRepository ??
        await FirebaseNotificationRepository.getInstance();

    final LocalNotificationRepository finalLocalRepository =
        localRepository ?? await LocalNotificationRepository.getInstance();

    final NotificationPermissionManager finalPermissionManager =
        permissionManager ??
        NotificationPermissionManager(repository: finalLocalRepository);

    final ForegroundNotificationManager foregroundManager =
        ForegroundNotificationManager(config: foregroundConfig);

    _instance = ComprehensiveNotificationManager._(
      firebaseRepository: finalFirebaseRepository,
      localRepository: finalLocalRepository,
      templateBuilder: templateBuilder ?? const NotificationTemplateBuilder(),
      scheduler: scheduler ?? const NotificationScheduler(),
      permissionManager: finalPermissionManager,
      foregroundManager: foregroundManager,
    );

    final ComprehensiveNotificationManager? instance = _instance;
    if (instance != null) {
      _initCompleter?.complete(instance);
      safeDebugLog(
        'ComprehensiveNotificationManager singleton created successfully',
      );
      return instance;
    } else {
      throw Exception(
        'Failed to create ComprehensiveNotificationManager instance',
      );
    }
  } catch (e) {
    _initCompleter?.completeError(e);
    _initCompleter = null;
    safeDebugLog('Failed to create ComprehensiveNotificationManager: $e');
    rethrow;
  }
}