53 lines
1.4 KiB
Dart
53 lines
1.4 KiB
Dart
import 'dart:convert';
|
|
import 'dart:math';
|
|
|
|
import 'package:manager_api_new/api.dart';
|
|
import 'package:mymuseum_visitapp/client.dart';
|
|
|
|
class StatisticsService {
|
|
final Client clientAPI;
|
|
final String? instanceId;
|
|
final String? configurationId;
|
|
final String? appType; // "Mobile" or "Tablet"
|
|
final String? language;
|
|
final String sessionId;
|
|
|
|
StatisticsService({
|
|
required this.clientAPI,
|
|
required this.instanceId,
|
|
required this.configurationId,
|
|
this.appType = 'Mobile',
|
|
this.language,
|
|
}) : sessionId = _generateSessionId();
|
|
|
|
static String _generateSessionId() {
|
|
final rand = Random();
|
|
final bytes = List<int>.generate(16, (_) => rand.nextInt(256));
|
|
return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
|
|
}
|
|
|
|
Future<void> track(
|
|
String eventType, {
|
|
String? sectionId,
|
|
int? durationSeconds,
|
|
Map<String, dynamic>? metadata,
|
|
}) async {
|
|
try {
|
|
await clientAPI.statsApi!.statsTrackEvent(VisitEventDTO(
|
|
instanceId: instanceId ?? '',
|
|
configurationId: configurationId,
|
|
sectionId: sectionId,
|
|
sessionId: sessionId,
|
|
eventType: eventType,
|
|
appType: appType,
|
|
language: language,
|
|
durationSeconds: durationSeconds,
|
|
metadata: metadata != null ? jsonEncode(metadata) : null,
|
|
timestamp: DateTime.now(),
|
|
));
|
|
} catch (_) {
|
|
// fire-and-forget — never block the UI on stats errors
|
|
}
|
|
}
|
|
}
|