feat: made the ongoing screen... for now
This commit is contained in:
parent
099b20f805
commit
e5a8745e0e
5 changed files with 119 additions and 2 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 !"));
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Reference in a new issue