feat: better and centralized loading screen
This commit is contained in:
parent
eb83e9fbe3
commit
b751d93be6
11 changed files with 82 additions and 13 deletions
|
|
@ -139,7 +139,13 @@ class AddViewModel extends ChangeNotifier {
|
|||
break;
|
||||
}
|
||||
final result2 = await _loadBal();
|
||||
isLoaded = true;
|
||||
switch (result2) {
|
||||
case Ok():
|
||||
isLoaded = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
notifyListeners();
|
||||
return result2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import 'package:seshat/ui/add_page/widgets/form_popup.dart';
|
|||
import 'package:seshat/ui/add_page/widgets/owner_popup.dart';
|
||||
import 'package:seshat/ui/add_page/widgets/confirmation_popup.dart';
|
||||
import 'package:seshat/ui/core/ui/navigation_bar.dart';
|
||||
import 'package:seshat/ui/core/ui/await_loading.dart';
|
||||
import 'package:seshat/utils/result.dart';
|
||||
|
||||
class AddPage extends StatefulWidget {
|
||||
|
|
@ -37,7 +38,7 @@ class _AddPageState extends State<AddPage> {
|
|||
body: ListenableBuilder(
|
||||
listenable: widget.viewModel,
|
||||
builder: (context, child) => switch (widget.viewModel.isLoaded) {
|
||||
false => Center(child: CircularProgressIndicator()),
|
||||
false => AwaitLoading(),
|
||||
true => switch (widget.viewModel.currentBal) {
|
||||
null => Center(
|
||||
child: SizedBox(
|
||||
|
|
|
|||
|
|
@ -28,12 +28,12 @@ class BalViewModel extends ChangeNotifier {
|
|||
Future<Result<void>> _load() async {
|
||||
final result1 = await _loadBal();
|
||||
switch (result1) {
|
||||
case Error():
|
||||
return result1;
|
||||
case Ok():
|
||||
isLoaded = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
isLoaded = true;
|
||||
notifyListeners();
|
||||
return result1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:seshat/domain/models/bal.dart';
|
||||
import 'package:seshat/ui/bal_page/view_model/bal_view_model.dart';
|
||||
import 'package:seshat/ui/core/ui/navigation_bar.dart';
|
||||
import 'package:seshat/ui/core/ui/await_loading.dart';
|
||||
|
||||
class BalPage extends StatefulWidget {
|
||||
const BalPage({super.key, required this.viewModel});
|
||||
|
|
@ -21,7 +22,7 @@ class _BalPageState extends State<BalPage> {
|
|||
listenable: widget.viewModel,
|
||||
builder: (context, child) {
|
||||
return switch (widget.viewModel.isLoaded) {
|
||||
false => Center(child: CircularProgressIndicator()),
|
||||
false => AwaitLoading(),
|
||||
true => switch (widget.viewModel.bal == null) {
|
||||
true => Center(
|
||||
child: Text("La BAL référencée n'est pas accessible"),
|
||||
|
|
|
|||
47
lib/ui/core/ui/await_loading.dart
Normal file
47
lib/ui/core/ui/await_loading.dart
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AwaitLoading extends StatefulWidget {
|
||||
const AwaitLoading({super.key});
|
||||
|
||||
@override
|
||||
State<AwaitLoading> createState() => _AwaitLoadingState();
|
||||
}
|
||||
|
||||
class _AwaitLoadingState extends State<AwaitLoading> {
|
||||
String text = "";
|
||||
|
||||
Timer? t;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
t?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
t = Timer(Duration(seconds: 8), () {
|
||||
setState(() {
|
||||
text =
|
||||
"Il semblerait qu'il y ait un problème. Vérifiez que vous êtes connecté·e à internet.";
|
||||
});
|
||||
});
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
Expanded(child: SizedBox()),
|
||||
Center(child: CircularProgressIndicator()),
|
||||
Expanded(
|
||||
child: Center(
|
||||
child: SizedBox(
|
||||
width: 300,
|
||||
child: Text(text, textAlign: TextAlign.center),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -56,7 +56,13 @@ class HomeViewModel extends ChangeNotifier {
|
|||
|
||||
Future<Result<void>> _load() async {
|
||||
final result2 = await _loadBal();
|
||||
isLoaded = true;
|
||||
switch (result2) {
|
||||
case Ok():
|
||||
isLoaded = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
notifyListeners();
|
||||
return result2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:seshat/domain/models/bal.dart';
|
|||
import 'package:seshat/ui/core/ui/navigation_bar.dart';
|
||||
import 'package:seshat/ui/home_page/view_model/home_view_model.dart';
|
||||
import 'package:seshat/ui/home_page/widgets/create_confirmation_popup.dart';
|
||||
import 'package:seshat/ui/core/ui/await_loading.dart';
|
||||
|
||||
class HomePage extends StatefulWidget {
|
||||
const HomePage({super.key, required this.viewModel});
|
||||
|
|
@ -23,7 +24,7 @@ class _HomePageState extends State<HomePage> {
|
|||
listenable: widget.viewModel,
|
||||
builder: (context, child) {
|
||||
return switch (widget.viewModel.isLoaded) {
|
||||
false => Center(child: CircularProgressIndicator()),
|
||||
false => AwaitLoading(),
|
||||
true => switch (widget.viewModel.currentBal == null) {
|
||||
true => HomePageOnNoCurrent(widget: widget),
|
||||
false => HomePageOnCurrent(widget: widget),
|
||||
|
|
|
|||
|
|
@ -71,10 +71,16 @@ class SellViewModel extends ChangeNotifier {
|
|||
bool isLoaded = false;
|
||||
|
||||
Future<Result<void>> _load() async {
|
||||
final result2 = await _loadBal();
|
||||
isLoaded = true;
|
||||
final result1 = await _loadBal();
|
||||
switch (result1) {
|
||||
case Ok():
|
||||
isLoaded = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
notifyListeners();
|
||||
return result2;
|
||||
return result1;
|
||||
}
|
||||
|
||||
Future<Result<void>> _loadBal() async {
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import 'package:seshat/routing/routes.dart';
|
|||
import 'package:seshat/ui/core/ui/navigation_bar.dart';
|
||||
import 'package:seshat/ui/sell_page/view_model/sell_view_model.dart';
|
||||
import 'package:seshat/ui/sell_page/widgets/scan_screen.dart';
|
||||
import 'package:seshat/ui/core/ui/await_loading.dart';
|
||||
|
||||
class SellPage extends StatefulWidget {
|
||||
const SellPage({super.key, required this.viewModel});
|
||||
|
|
@ -24,7 +25,7 @@ class _SellPageState extends State<SellPage> {
|
|||
listenable: widget.viewModel,
|
||||
builder: (context, child) {
|
||||
return switch (widget.viewModel.isLoaded) {
|
||||
false => Center(child: CircularProgressIndicator()),
|
||||
false => AwaitLoading(),
|
||||
true => switch (widget.viewModel.currentBal) {
|
||||
null => Center(
|
||||
child: SizedBox(
|
||||
|
|
|
|||
Reference in a new issue