mnemo_cards/lib/features/analytics/analytics.dart

174 lines
4.6 KiB
Dart
Raw Normal View History

2024-05-28 21:25:51 +00:00
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:mnemo_cards/managers/user_manager.dart';
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
class Analytics {
static final _analytics = FirebaseAnalytics.instance;
static final _crashlytics = FirebaseCrashlytics.instance;
static Future<void> setUser(UserDto user) {
return _analytics.setUserId(id: user.id?.toString());
}
static Future<void> login(ExternalIdType idType) {
return _analytics.logLogin(loginMethod: idType.name);
}
static Future<void> logout(UserDto? dto) async {
await _analytics.logEvent(
name: 'logout',
parameters: {
'id': dto?.id,
}.asFirebaseMap,
);
return _analytics.setUserId(id: dto?.id?.toString());
}
static Future<void> profilePageOpened(UserDto? dto) {
return _analytics.logScreenView(
screenClass: 'profile',
screenName: 'profile',
parameters: {
'id': dto?.id,
}.asFirebaseMap);
}
static Future<void> availablePackOpened(CardPackDto dto) {
return _analytics.logScreenView(
screenClass: 'pack',
screenName: 'available',
parameters: {
'id': dto.id,
'title': dto.title,
'version': dto.version,
}.asFirebaseMap);
}
static Future<void> buyPackOpened(CardPackBuyDto dto) {
return _analytics.logScreenView(
screenClass: 'pack',
screenName: 'buy',
parameters: {
'id': dto.id,
'title': dto.title,
'version': dto.version,
'price': dto.price,
}.asFirebaseMap);
}
static Future<void> buyPackPressed(CardPackBuyDto dto, PaymentSystem system) {
return _analytics.logEvent(
name: 'buy',
parameters: {
'id': dto.id,
'title': dto.title,
'version': dto.version,
'price': dto.price,
'system': system.name,
}.asFirebaseMap);
}
static Future<void> buyError(
CardPackBuyDto? dto,
PaymentSystem system, {
Map<String, String?>? data,
String? message,
}) {
return _analytics.logEvent(
name: 'buy_error',
parameters: {
'id': dto?.id.toString(),
'system': system.name,
'version': dto?.version.toString(),
'price': dto?.price.toString(),
if (message != null) 'message': message,
if (data != null) ...data,
}.asFirebaseMap);
}
static Future<void> buyEvent(
CardPackBuyDto? dto,
PaymentSystem system, {
Map<String, String?>? data,
String? message,
}) {
return _analytics.logEvent(
name: 'buy_event',
parameters: {
'id': dto?.id,
'system': system.name,
'version': dto?.version,
'price': dto?.price,
if (message != null) 'message': message,
if (data != null) ...data,
}.asFirebaseMap);
}
static Future<void> buyComplete(
CardPackBuyDto? dto,
PaymentSystem system, {
Map<String, String?>? data,
String? message,
}) {
return _analytics.logEvent(
name: 'buy_complete',
parameters: {
'id': dto?.id,
'system': system.name,
'version': dto?.version,
'price': dto?.price,
if (message != null) 'message': message,
if (data != null) ...data,
}.asFirebaseMap,
);
}
static Future<void> loadingPackOpened(CardPackDto dto, int timeMillis) {
return _analytics.logScreenView(
screenClass: 'pack',
screenName: 'loading',
parameters: {
'id': dto.id,
'title': dto.title,
'version': dto.version,
'time': timeMillis,
}.asFirebaseMap);
}
static Future<void> testOpened(TestDto dto) {
return _analytics.logScreenView(
screenClass: 'test',
screenName: 'test',
parameters: {
'id': dto.id,
'name': dto.name,
'version': dto.version,
'questions': dto.questions.length,
}.asFirebaseMap);
}
static crashlyticsError(Object? e, StackTrace? s) =>
_crashlytics.recordError(e, s);
static error({Map<String, String?>? data, String? message}) {
try {
_analytics.logEvent(
name: 'error',
parameters: {
'msg': message,
if (data != null) ...data,
}.asFirebaseMap,
);
} catch (e, s) {
_crashlytics.recordError(e, s);
}
}
}
extension on Map {
Map<String, Object?> get asFirebaseMap => (Map.from(this)
..removeWhere((k, v) => v == null))
.map((k, v) => MapEntry(k, (v is String || v is num) ? v : v.toString()));
}