import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:relationship_saver/core/config/app_config.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; class SentryInit { SentryInit(); Future? _initializeFuture; bool _initialized = false; Future initialize({FutureOr Function()? appRunner}) async { final Future? inFlight = _initializeFuture; if (inFlight != null) { await inFlight; if (appRunner != null && !_initialized) { await Future.sync(appRunner); } return; } _initializeFuture = _initializeInternal(appRunner: appRunner); return _initializeFuture; } Future _initializeInternal({ FutureOr Function()? appRunner, }) async { if (!kReleaseMode || AppConfig.sentryDsn.isEmpty) { if (appRunner != null) { await Future.sync(appRunner); } return; } await SentryFlutter.init((options) { options.dsn = AppConfig.sentryDsn; options.environment = AppConfig.useFakeBackend ? 'development' : 'production'; options.tracesSampleRate = 0.1; }, appRunner: appRunner); _initialized = true; } void captureException(Object error, {StackTrace? stackTrace}) { if (_initialized) { Sentry.captureException(error, stackTrace: stackTrace); } } void captureMessage(String message, {SentryLevel level = SentryLevel.info}) { if (_initialized) { Sentry.captureMessage(message, level: level); } } } final sentryInitProvider = Provider((Ref ref) { return SentryInit(); });