Skip to content

Instantly share code, notes, and snippets.

@arafaysaleem
Created December 23, 2024 07:43
Show Gist options
  • Save arafaysaleem/28ae107c22372bd3e6dfe6b4b114e5b7 to your computer and use it in GitHub Desktop.
Save arafaysaleem/28ae107c22372bd3e6dfe6b4b114e5b7 to your computer and use it in GitHub Desktop.
Analytics Service for Flutter
// 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