diff --git a/lib/core/analytics/umami_analytics.dart b/lib/core/analytics/umami_analytics.dart new file mode 100644 index 0000000..e6c78ea --- /dev/null +++ b/lib/core/analytics/umami_analytics.dart @@ -0,0 +1,25 @@ +import 'package:flutter_estatisticas/umami_service.dart'; +import 'package:flutter_estatisticas/umami_navigation_observer.dart'; + +/// Umami analytics singleton. Configured once at app startup. +/// +/// Reuses the same `website` ID as the web app (re-quest.com) so all traffic +/// (web + mobile) aggregates under one dashboard. `hostname` differentiates +/// mobile vs. web inside Umami. +class UmamiAnalytics { + UmamiAnalytics._(); + + static const _endpoint = 'https://analytics.superlabs.co'; + static const _websiteId = '00e1ce31-e174-4519-8b59-63e8d4556b01'; + static const _hostname = 're-quest-mobile.app'; + + static final UmamiService service = UmamiService( + endpoint: _endpoint, + website: _websiteId, + hostname: _hostname, + ); + + /// Navigator observer that auto-tracks screen transitions in GoRouter. + static final UmamiNavigationObserver navigationObserver = + UmamiNavigationObserver(service); +} diff --git a/lib/routing/app_router.dart b/lib/routing/app_router.dart index 45a9d6f..f867d5a 100644 --- a/lib/routing/app_router.dart +++ b/lib/routing/app_router.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:real_estate_mobile/core/analytics/umami_analytics.dart'; import 'package:real_estate_mobile/core/constants/app_colors.dart'; import 'package:real_estate_mobile/core/widgets/app_shell.dart'; import 'package:real_estate_mobile/features/auth/presentation/providers/auth_provider.dart'; @@ -44,6 +45,7 @@ final routerProvider = Provider((ref) { return GoRouter( initialLocation: '/splash', refreshListenable: authRefreshNotifier, + observers: [UmamiAnalytics.navigationObserver], redirect: (context, state) { final authState = ref.read(authProvider); final isAuthenticated = authState.status == AuthStatus.authenticated; diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index d660086..c995d24 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,7 @@ import FlutterMacOS import Foundation +import device_info_plus import emoji_picker_flutter import facebook_auth_desktop import file_selector_macos @@ -22,6 +23,7 @@ import url_launcher_macos import webview_flutter_wkwebview func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) FacebookAuthDesktopPlugin.register(with: registry.registrar(forPlugin: "FacebookAuthDesktopPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 93bec46..8b81094 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -265,6 +265,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.12" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://pub.dev" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" dio: dependency: "direct main" description: @@ -430,6 +446,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.2.1" + flutter_estatisticas: + dependency: "direct main" + description: + name: flutter_estatisticas + sha256: "6381caf2e39179c7339cafbd1117c79737567147da9597596fe68c6fe5fa9656" + url: "https://pub.dev" + source: hosted + version: "0.2.2" flutter_facebook_auth: dependency: "direct main" description: @@ -1573,6 +1597,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 82785bd..89b3822 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,6 +65,9 @@ dependencies: package_info_plus: ^9.0.0 speech_to_text: ^7.3.0 + # Analytics (Umami) + flutter_estatisticas: ^0.2.2 + dev_dependencies: flutter_test: sdk: flutter