From 618764f513107d6d5f613e97e45b66f0525be76d Mon Sep 17 00:00:00 2001 From: alzalia1 Date: Thu, 14 Aug 2025 01:02:39 +0200 Subject: [PATCH] feat: compelete bal pending screen --- lib/data/repositories/bal_repository.dart | 20 ++++++++++++-- lib/data/services/api_client.dart | 27 +++++++++++++++++++ .../bal_page/view_model/bal_view_model.dart | 17 ++++++++++++ .../widget/pending/bal_pending_screen.dart | 11 +++++++- 4 files changed, 72 insertions(+), 3 deletions(-) diff --git a/lib/data/repositories/bal_repository.dart b/lib/data/repositories/bal_repository.dart index 4d04374..14f4046 100644 --- a/lib/data/repositories/bal_repository.dart +++ b/lib/data/repositories/bal_repository.dart @@ -50,6 +50,22 @@ class BalRepository { } } + bool isABalOngoing() { + return _bals?.where((bal) => bal.state == BalState.ongoing).isNotEmpty ?? + false; + } + + Future> startBal(int id) async { + if (isABalOngoing()) { + return Result.error( + Exception("Cannot have multiple BAL ongoing at the same time !"), + ); + } + final result = await _apiClient.startBal(id); + _getBalsNoCache(); + return result; + } + Future> editBal( int id, String name, @@ -57,13 +73,13 @@ class BalRepository { DateTime end, ) async { final result = await _apiClient.editBal(id, name, start, end); - _getBalsNoCache(); + await _getBalsNoCache(); return result; } Future> addBal(String name, DateTime start, DateTime end) async { final result = await _apiClient.addBal(name, start, end); - _getBalsNoCache(); + await _getBalsNoCache(); return result; } } diff --git a/lib/data/services/api_client.dart b/lib/data/services/api_client.dart index b2c1230..c093323 100644 --- a/lib/data/services/api_client.dart +++ b/lib/data/services/api_client.dart @@ -42,6 +42,33 @@ class ApiClient { * ================= */ + Future> startBal(int id) async { + final client = Client(); + try { + final headers = await _getHeaders(); + final response = await client.post( + Uri.parse("https://$apiBasePath/bal/${id.toString()}/start"), + headers: headers, + ); + if (response.statusCode == 200) { + final json = jsonDecode(response.body); + return Result.ok(Bal.fromJSON(json)); + } else if (response.statusCode == 403) { + throw "You don't own the specified BAL"; + } else if (response.statusCode == 404) { + throw "No BAL with specified ID found"; + } else if (response.statusCode == 409) { + throw "Cannot have multiple BAl ongoing at the same time!"; + } else { + throw "Unknown error"; + } + } catch (e) { + return Result.error(Exception(e)); + } finally { + client.close(); + } + } + Future> editBal( int id, String name, diff --git a/lib/ui/bal_page/view_model/bal_view_model.dart b/lib/ui/bal_page/view_model/bal_view_model.dart index 1e0f675..5dad1ac 100644 --- a/lib/ui/bal_page/view_model/bal_view_model.dart +++ b/lib/ui/bal_page/view_model/bal_view_model.dart @@ -15,6 +15,22 @@ class BalViewModel extends ChangeNotifier { Bal? _bal; int? id; Bal? get bal => _bal; + bool isABalOngoing = false; + + Future> startBal(int id) async { + if (isABalOngoing) { + return Result.error(Exception("Cannot have multiple BALs ongoing !")); + } + final result = await _balRepository.startBal(id); + switch (result) { + case Ok(): + _bal = result.value; + notifyListeners(); + break; + default: + } + return result; + } Future> editBal( int id, @@ -46,6 +62,7 @@ class BalViewModel extends ChangeNotifier { bool isLoaded = false; Future> _load() async { + isABalOngoing = _balRepository.isABalOngoing(); final result1 = await _loadBal(); switch (result1) { case Ok(): diff --git a/lib/ui/bal_page/widget/pending/bal_pending_screen.dart b/lib/ui/bal_page/widget/pending/bal_pending_screen.dart index 09683e9..99221e1 100644 --- a/lib/ui/bal_page/widget/pending/bal_pending_screen.dart +++ b/lib/ui/bal_page/widget/pending/bal_pending_screen.dart @@ -12,6 +12,7 @@ class BalPendingScreen extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = Theme.of(context); return Scaffold( bottomNavigationBar: AppNavigationBar(startIndex: 0), appBar: AppBar( @@ -31,7 +32,15 @@ class BalPendingScreen extends StatelessWidget { ), body: Center( child: ElevatedButton( - onPressed: () {}, + onPressed: viewModel.isABalOngoing + ? () { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Une BAL est déjà en cours.")), + ); + } + : () { + viewModel.startBal(viewModel.bal!.id); + }, child: Text("Démarrer cette BAL"), ), ),