Files
app-hyggecraftery/lib/services/analytics_service.dart
2026-01-03 15:24:36 +01:00

133 lines
3.3 KiB
Dart

import 'dart:convert';
import 'package:http/http.dart' as http;
/// Analytics Service für Umami Integration
///
/// Umami ist eine datenschutzfreundliche Analytics-Lösung.
/// Konfiguriere deine Umami-URL und Website-ID in den statischen Variablen.
class AnalyticsService {
// Ersetze mit deiner Umami-Instanz URL
static const String umamiUrl = 'https://analytics.hyggecraftery.com';
// Ersetze mit deiner Website-ID von Umami
static const String websiteId = 'c43cd023-ff64-43c8-a42a-ac23d32366f6';
// Optionale API-Key für Authentifizierung
static const String? apiKey = null;
/// Sendet ein Event an Umami
static Future<void> trackEvent({
required String eventName,
Map<String, dynamic>? eventData,
String? url,
String? referrer,
}) async {
try {
final uri = Uri.parse('$umamiUrl/api/send');
final payload = {
'website': websiteId,
'hostname': 'hyggecraftery.com',
'url': url ?? '/',
'referrer': referrer,
'name': eventName,
'data': eventData ?? {},
};
final headers = <String, String>{
'Content-Type': 'application/json',
};
if (apiKey != null) {
headers['Authorization'] = 'Bearer $apiKey';
}
final response = await http.post(
uri,
headers: headers,
body: json.encode(payload),
);
if (response.statusCode != 200) {
print('Umami Tracking Fehler: ${response.statusCode}');
}
} catch (e) {
// Fail silently - Analytics sollten die App nicht blockieren
print('Analytics Fehler: $e');
}
}
/// Trackt einen Page View
static Future<void> trackPageView(String page) async {
await trackEvent(
eventName: 'pageview',
url: page,
);
}
/// Trackt eine Produktansicht
static Future<void> trackProductView(int productId, String productName) async {
await trackEvent(
eventName: 'product_view',
eventData: {
'product_id': productId,
'product_name': productName,
},
);
}
/// Trackt einen "Zum Warenkorb hinzufügen" Event
static Future<void> trackAddToCart(int productId, String productName, double price) async {
await trackEvent(
eventName: 'add_to_cart',
eventData: {
'product_id': productId,
'product_name': productName,
'price': price,
},
);
}
/// Trackt einen Checkout-Start
static Future<void> trackCheckoutStart(double total) async {
await trackEvent(
eventName: 'checkout_start',
eventData: {
'total': total,
},
);
}
/// Trackt eine erfolgreiche Bestellung
static Future<void> trackPurchase(int orderId, double total) async {
await trackEvent(
eventName: 'purchase',
eventData: {
'order_id': orderId,
'total': total,
},
);
}
/// Trackt eine Suche
static Future<void> trackSearch(String searchQuery) async {
await trackEvent(
eventName: 'search',
eventData: {
'query': searchQuery,
},
);
}
/// Trackt eine Kategorie-Ansicht
static Future<void> trackCategoryView(String categoryName) async {
await trackEvent(
eventName: 'category_view',
eventData: {
'category': categoryName,
},
);
}
}