import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/intl.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'app/app.dart'; import 'app/app_bootstrap.dart'; import 'app/router.dart'; import 'database/app_database.dart'; import 'services/admin_pin_service.dart'; import 'services/bar_tab_service.dart'; import 'services/kooltap_api_client.dart'; import 'services/pin_lock_service.dart'; import 'services/product_image_sync.dart'; import 'services/product_service.dart'; import 'services/remote_sync_service.dart'; import 'services/settings_service.dart'; import 'viewmodels/admin_pin_view_model.dart'; import 'viewmodels/bar_screen_view_model.dart'; import 'viewmodels/dev_menu_view_model.dart'; import 'viewmodels/history_view_model.dart'; import 'viewmodels/inventory_view_model.dart'; import 'viewmodels/pin_lock_view_model.dart'; import 'viewmodels/product_list_view_model.dart'; import 'viewmodels/registration_view_model.dart'; import 'viewmodels/remote_sync_view_model.dart'; import 'viewmodels/settings_view_model.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); // Initialized first so errors during startup are reported too. await SentryFlutter.init((options) { options.dsn = 'https://2c31c1baf3ee495288ad08a56d7baf0e@glitchtip.brammie15.dev/1'; options.tracesSampleRate = kReleaseMode ? 0.1 : 1.0; options.enableAutoSessionTracking = false; options.attachViewHierarchy = true; options.enableLogs = true; options.attachThreads = true; // Screens show customer names; replays mask all text and images. options.attachScreenshot = false; options.privacy.maskAllText = true; options.privacy.maskAllImages = true; options.replay.onErrorSampleRate = 1.0; options.replay.sessionSampleRate = 0.05; }, appRunner: _runApp); } Future _runApp() async { await initializeDateFormatting('nl_BE', null); Intl.defaultLocale = 'nl_BE'; await SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); final database = AppDatabase(); final productService = DriftProductService(database: database); final barTabService = DriftBarTabService(database: database); final settingsService = DriftSettingsService(database: database); final pinLockService = PinLockService(maxLockout: const Duration(minutes: 1)); final apiClient = KoolTapApiClient( appVersion: (await PackageInfo.fromPlatform()).version, ); final remoteSyncService = RemoteSyncService( database: database, barTabService: barTabService, apiClient: apiClient, imageSync: ProductImageSync( database: database, apiClient: apiClient, imagesDirectory: () async => Directory( path.join( (await getApplicationSupportDirectory()).path, 'product_images', ), ), ), ); final pinLockViewModel = PinLockViewModel( pinLockService: pinLockService, settingsService: settingsService, ); final adminPinViewModel = AdminPinViewModel( adminPinService: AdminPinService(), ); final remoteSyncViewModel = RemoteSyncViewModel( syncService: remoteSyncService, ); // The router's first redirect depends on these. await Future.wait([ pinLockViewModel.ensureLoaded(), adminPinViewModel.ensureLoaded(), remoteSyncViewModel.init(), ]); final appRouter = createAppRouter( pinLockViewModel: pinLockViewModel, adminPinViewModel: adminPinViewModel, remoteSyncViewModel: remoteSyncViewModel, ); runApp( MultiProvider( providers: [ Provider.value(value: database), Provider.value(value: productService), Provider.value(value: barTabService), Provider.value(value: settingsService), Provider( create: (_) => remoteSyncService, dispose: (_, service) => service.dispose(), ), ChangeNotifierProvider.value( value: remoteSyncViewModel, ), ChangeNotifierProvider( create: (_) => RegistrationViewModel( apiClient: apiClient, syncService: remoteSyncService, ), ), ChangeNotifierProvider( create: (_) => InventoryViewModel(productService: productService), ), ChangeNotifierProvider( create: (context) => ProductListViewModel( productService: productService, inventory: context.read(), ), ), ChangeNotifierProvider( create: (_) => BarScreenViewModel(barTabService: barTabService), ), ChangeNotifierProvider( create: (_) => HistoryViewModel(barTabService: barTabService), ), ChangeNotifierProvider.value(value: pinLockViewModel), ChangeNotifierProvider.value( value: adminPinViewModel, ), ChangeNotifierProvider( create: (_) => SettingsViewModel(settingsService: settingsService), ), ChangeNotifierProvider( create: (_) => DevMenuViewModel( database: database, productService: productService, barTabService: barTabService, settingsService: settingsService, pinLockService: pinLockService, ), ), ], child: AppBootstrap(child: KoolTapApp(router: appRouter)), ), ); }