Files
kooltab/lib/main.dart
T
2026-10-19 21:41:34 +02:00

155 lines
5.4 KiB
Dart

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: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_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<void> 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<void> _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();
final remoteSyncService = RemoteSyncService(
database: database,
barTabService: barTabService,
apiClient: apiClient,
);
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<AppDatabase>.value(value: database),
Provider<ProductService>.value(value: productService),
Provider<BarTabService>.value(value: barTabService),
Provider<SettingsService>.value(value: settingsService),
Provider<RemoteSyncService>(
create: (_) => remoteSyncService,
dispose: (_, service) => service.dispose(),
),
ChangeNotifierProvider<RemoteSyncViewModel>.value(
value: remoteSyncViewModel,
),
ChangeNotifierProvider<RegistrationViewModel>(
create: (_) => RegistrationViewModel(
apiClient: apiClient,
syncService: remoteSyncService,
),
),
ChangeNotifierProvider<InventoryViewModel>(
create: (_) => InventoryViewModel(productService: productService),
),
ChangeNotifierProvider<ProductListViewModel>(
create: (context) => ProductListViewModel(
productService: productService,
inventory: context.read<InventoryViewModel>(),
),
),
ChangeNotifierProvider<BarScreenViewModel>(
create: (_) => BarScreenViewModel(barTabService: barTabService),
),
ChangeNotifierProvider<HistoryViewModel>(
create: (_) => HistoryViewModel(barTabService: barTabService),
),
ChangeNotifierProvider<PinLockViewModel>.value(value: pinLockViewModel),
ChangeNotifierProvider<AdminPinViewModel>.value(
value: adminPinViewModel,
),
ChangeNotifierProvider<SettingsViewModel>(
create: (_) => SettingsViewModel(settingsService: settingsService),
),
ChangeNotifierProvider<DevMenuViewModel>(
create: (_) => DevMenuViewModel(
database: database,
productService: productService,
barTabService: barTabService,
settingsService: settingsService,
pinLockService: pinLockService,
),
),
],
child: AppBootstrap(child: KoolTapApp(router: appRouter)),
),
);
}