Created
December 23, 2024 07:43
-
-
Save arafaysaleem/28ae107c22372bd3e6dfe6b4b114e5b7 to your computer and use it in GitHub Desktop.
Analytics Service for Flutter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Local | |
import '../../config/config.dart'; | |
import '../local/local.dart'; | |
// Analytics | |
import 'analytics_client_base.dart'; | |
import 'logger_analytics_client.dart'; | |
import 'posthog_analytics_client.dart'; | |
class AnalyticsService implements AnalyticsClientBase { | |
static const _clients = [ | |
if (AppConfig.isDebug) LoggerAnalyticsClient(), | |
if (AppConfig.isStaging) ServerAnalyticsClient(...) // insert your api service or dio/http etc. | |
if (AppConfig.isProd) PosthogAnalyticsClient(), | |
]; | |
static const instance = AnalyticsService._(); | |
const AnalyticsService._(); | |
static const _collectUsageStatisticsKey = 'collectUsageStatisticsKey'; | |
static const _keyValueStorage = KeyValueStorageBase.instance; | |
void _setCollectUsageStatistics(bool value) { | |
_keyValueStorage.setCommon(_collectUsageStatisticsKey, value); | |
} | |
bool get collectUsageStatistics { | |
return _keyValueStorage.getCommon(_collectUsageStatisticsKey) ?? true; | |
} | |
@override | |
Future<void> toggleAnalyticsCollection(bool enabled) { | |
_setCollectUsageStatistics(enabled); | |
return _dispatch( | |
(c) => c.toggleAnalyticsCollection(enabled), | |
); | |
} | |
@override | |
Future<void> identifyUser({ | |
required String userId, | |
required String email, | |
required String role, | |
}) => | |
_dispatch( | |
(c) => c.identifyUser( | |
userId: userId, | |
email: email, | |
role: role, | |
), | |
); | |
@override | |
Future<void> resetUser() => _dispatch( | |
(c) => c.resetUser(), | |
); | |
@override | |
Future<void> trackEvent(String eventName, [Map<String, Object>? eventData]) => | |
_dispatch( | |
(c) => c.trackEvent(eventName, eventData), | |
); | |
@override | |
Future<void> trackScreenView(String routeName, String action) => _dispatch( | |
(c) => c.trackScreenView(routeName, action), | |
); | |
@override | |
Future<void> trackBottomSheetView(String routeName, [Map<String, Object>? data]) => | |
_dispatch( | |
(c) => c.trackBottomSheetView(routeName, data), | |
); | |
@override | |
Future<void> trackDialogView(String dialogName, [Map<String, Object>? data]) => _dispatch( | |
(c) => c.trackDialogView(dialogName, data), | |
); | |
@override | |
Future<void> trackAppForegrounded() => _dispatch( | |
(c) => c.trackAppForegrounded(), | |
); | |
@override | |
Future<void> trackAppBackgrounded() => _dispatch( | |
(c) => c.trackAppBackgrounded(), | |
); | |
@override | |
Future<void> trackButtonPressed(String buttonName, | |
[Map<String, Object>? data]) => | |
_dispatch( | |
(c) => c.trackButtonPressed(buttonName, data), | |
); | |
@override | |
Future<void> trackPermissionRequest(String permission, String status) => | |
_dispatch( | |
(c) => c.trackPermissionRequest(permission, status), | |
); | |
@override | |
Future<void> trackNewAppOnboarding() => _dispatch( | |
(c) => c.trackNewAppOnboarding(), | |
); | |
@override | |
Future<void> trackAppCreated() => _dispatch( | |
(c) => c.trackAppCreated(), | |
); | |
@override | |
Future<void> trackAppUpdated() => _dispatch( | |
(c) => c.trackAppUpdated(), | |
); | |
@override | |
Future<void> trackAppDeleted() => _dispatch( | |
(c) => c.trackAppDeleted(), | |
); | |
@override | |
Future<void> trackTaskCompleted(int completedCount) => _dispatch( | |
(c) => c.trackTaskCompleted(completedCount), | |
); | |
/// Dispatches the given [work] to all analytics clients. | |
/// | |
/// All analytics clients will run the given [work] concurrently. | |
Future<void> _dispatch( | |
Future<void> Function(AnalyticsClientBase client) work, | |
) async { | |
final worksList = _clients.map(work).toList(); | |
await Future.wait(worksList); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment