import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/services/receipt_service.dart'; import '../core/services/sound_service.dart'; import '../data/datasources/local_store.dart'; import '../data/repositories/customer_repository_impl.dart'; import '../data/repositories/product_repository_impl.dart'; import '../data/datasources/remote_catalogue_source.dart'; import '../data/repositories/sync_repository_impl.dart'; import '../data/repositories/transaction_repository_impl.dart'; import '../domain/repositories/customer_repository.dart'; import '../domain/repositories/product_repository.dart'; import '../domain/repositories/sync_repository.dart'; import '../domain/repositories/transaction_repository.dart'; import '../domain/usecases/checkout_sale.dart'; /// Root data source. Overridden in tests with an in-memory double. final localStoreProvider = Provider((ref) => LocalStore.instance); // ---------------------------------------------------------- Repositories final productRepositoryProvider = Provider( (ref) => ProductRepositoryImpl(ref.watch(localStoreProvider)), ); final customerRepositoryProvider = Provider( (ref) => CustomerRepositoryImpl(ref.watch(localStoreProvider)), ); final transactionRepositoryProvider = Provider( (ref) => TransactionRepositoryImpl(ref.watch(localStoreProvider)), ); /// Simulated back-office endpoints. Held as singletons so the offline toggle /// in Settings affects every call. final remoteCatalogueProvider = Provider((ref) => RemoteCatalogueSource()); final remoteOrderSinkProvider = Provider((ref) => RemoteOrderSink()); final syncRepositoryProvider = Provider( (ref) => SyncRepositoryImpl( ref.watch(localStoreProvider), ref.watch(remoteCatalogueProvider), ref.watch(remoteOrderSinkProvider), ), ); // ------------------------------------------------------------- Use cases final checkoutSaleProvider = Provider( (ref) => CheckoutSale( productRepository: ref.watch(productRepositoryProvider), customerRepository: ref.watch(customerRepositoryProvider), transactionRepository: ref.watch(transactionRepositoryProvider), ), ); // -------------------------------------------------------------- Services final soundServiceProvider = Provider((ref) => SoundService.instance); final receiptServiceProvider = Provider((ref) => ReceiptService.instance); // --------------------------------------------------------------- Session class CashierSession { const CashierSession({ required this.name, required this.role, required this.terminalId, }); final String name; final String role; final String terminalId; } final cashierSessionProvider = StateProvider( (ref) => const CashierSession( name: 'Suriya', role: 'ADMIN', terminalId: 'TERM-01', ), ); /// Ticks once a minute to drive the header clock without rebuilding on every /// frame. final clockProvider = StreamProvider((ref) async* { yield DateTime.now(); yield* Stream.periodic(const Duration(seconds: 20), (_) => DateTime.now()); });