feat: made the ongoing screen... for now

This commit is contained in:
alzalia1 2025-08-14 11:19:06 +02:00
parent 099b20f805
commit e5a8745e0e
5 changed files with 119 additions and 2 deletions

View file

@ -55,6 +55,12 @@ class BalRepository {
false; false;
} }
Future<Result<Bal>> stopBal(int id) async {
final result = await _apiClient.stopBal(id);
_getBalsNoCache();
return result;
}
Future<Result<Bal>> startBal(int id) async { Future<Result<Bal>> startBal(int id) async {
if (isABalOngoing()) { if (isABalOngoing()) {
return Result.error( return Result.error(

View file

@ -42,6 +42,33 @@ class ApiClient {
* ================= * =================
*/ */
Future<Result<Bal>> stopBal(int id) async {
final client = Client();
try {
final headers = await _getHeaders();
final response = await client.post(
Uri.parse("https://$apiBasePath/bal/${id.toString()}/stop"),
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 "Selected BAL was not on ongoing state";
} else {
throw "Unknown error";
}
} catch (e) {
return Result.error(Exception(e));
} finally {
client.close();
}
}
Future<Result<Bal>> startBal(int id) async { Future<Result<Bal>> startBal(int id) async {
final client = Client(); final client = Client();
try { try {

View file

@ -17,6 +17,18 @@ class BalViewModel extends ChangeNotifier {
Bal? get bal => _bal; Bal? get bal => _bal;
bool isABalOngoing = false; bool isABalOngoing = false;
Future<Result<void>> stopBal(int id) async {
final result = await _balRepository.stopBal(id);
switch (result) {
case Ok():
_bal = result.value;
notifyListeners();
break;
default:
}
return result;
}
Future<Result<void>> startBal(int id) async { Future<Result<void>> startBal(int id) async {
if (isABalOngoing) { if (isABalOngoing) {
return Result.error(Exception("Cannot have multiple BALs ongoing !")); return Result.error(Exception("Cannot have multiple BALs ongoing !"));

View file

@ -12,7 +12,50 @@ class BalOngoingScreen extends StatelessWidget {
return Scaffold( return Scaffold(
bottomNavigationBar: AppNavigationBar(startIndex: 0), bottomNavigationBar: AppNavigationBar(startIndex: 0),
appBar: AppBar(title: Text(viewModel.bal!.name)), appBar: AppBar(title: Text(viewModel.bal!.name)),
body: Center(child: Text("Ongoing BAL")), body: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
children: [
Center(
child: ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(
"Êtes-vous sûr·e de vouloir arrêter cette BAL ?",
),
content: Text(
"Cette action est irréversible. Vous pourrez ensuite consulter des statistiques sur la BAL, mais ne pourrez plus ajouter ou vendre de livre qui en fasse partie.",
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("Annuler"),
),
TextButton(
onPressed: () async {
await viewModel.stopBal(viewModel.bal!.id);
if (context.mounted) {
Navigator.of(context).pop();
}
},
child: Text("Valider"),
),
],
);
},
);
},
child: Text("Arrêter la BAL"),
),
),
],
),
),
); );
} }
} }

View file

@ -38,7 +38,36 @@ class BalPendingScreen extends StatelessWidget {
); );
} }
: () { : () {
viewModel.startBal(viewModel.bal!.id); showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(
"Êtes-vous sûr·e de vouloir débuter cette BAL ?",
),
content: Text(
"Cette action est irréversible. Vous pourrez ensuite intéragir avec la BAL, mais pas la remettre en mode \"À venir\"",
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("Annuler"),
),
TextButton(
onPressed: () async {
await viewModel.startBal(viewModel.bal!.id);
if (context.mounted) {
Navigator.of(context).pop();
}
},
child: Text("Valider"),
),
],
);
},
);
}, },
child: Text("Démarrer cette BAL"), child: Text("Démarrer cette BAL"),
), ),