From eb83e9fbe33a535b40fe901c98201c0f6a4a4b97 Mon Sep 17 00:00:00 2001 From: alzalia1 Date: Tue, 12 Aug 2025 23:20:06 +0200 Subject: [PATCH 1/2] feat: prepare state pages --- .../bal_page/widget/pending/bal_pending_screen.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 lib/ui/bal_page/widget/pending/bal_pending_screen.dart diff --git a/lib/ui/bal_page/widget/pending/bal_pending_screen.dart b/lib/ui/bal_page/widget/pending/bal_pending_screen.dart new file mode 100644 index 0000000..b65257a --- /dev/null +++ b/lib/ui/bal_page/widget/pending/bal_pending_screen.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class BalPendingScreen extends StatelessWidget { + const BalPendingScreen({super.key}); + + @override + Widget build(BuildContext context) { + // TODO: implement build + throw UnimplementedError(); + } +} From b751d93be6728c8b04d6a3ec5228199fda246cc9 Mon Sep 17 00:00:00 2001 From: alzalia1 Date: Tue, 12 Aug 2025 23:59:13 +0200 Subject: [PATCH 2/2] feat: better and centralized loading screen --- .../reports/problems/problems-report.html | 2 +- .../add_page/view_model/add_view_model.dart | 8 +++- lib/ui/add_page/widgets/add_page.dart | 3 +- .../bal_page/view_model/bal_view_model.dart | 6 +-- lib/ui/bal_page/widget/bal_page.dart | 3 +- lib/ui/core/ui/await_loading.dart | 47 +++++++++++++++++++ .../core/ui}/overlay_boundary.dart | 0 .../home_page/view_model/home_view_model.dart | 8 +++- lib/ui/home_page/widgets/home_page.dart | 3 +- .../sell_page/view_model/sell_view_model.dart | 12 +++-- lib/ui/sell_page/widgets/sell_page.dart | 3 +- 11 files changed, 82 insertions(+), 13 deletions(-) create mode 100644 lib/ui/core/ui/await_loading.dart rename lib/{utils => ui/core/ui}/overlay_boundary.dart (100%) diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html index 214b73f..620ac10 100644 --- a/android/build/reports/problems/problems-report.html +++ b/android/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ code + .copy-button { diff --git a/lib/ui/add_page/view_model/add_view_model.dart b/lib/ui/add_page/view_model/add_view_model.dart index 61c5b3d..9f63196 100644 --- a/lib/ui/add_page/view_model/add_view_model.dart +++ b/lib/ui/add_page/view_model/add_view_model.dart @@ -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; } diff --git a/lib/ui/add_page/widgets/add_page.dart b/lib/ui/add_page/widgets/add_page.dart index f5ececa..9c7cf0c 100644 --- a/lib/ui/add_page/widgets/add_page.dart +++ b/lib/ui/add_page/widgets/add_page.dart @@ -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 { 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( 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 e52fc02..9339a4b 100644 --- a/lib/ui/bal_page/view_model/bal_view_model.dart +++ b/lib/ui/bal_page/view_model/bal_view_model.dart @@ -28,12 +28,12 @@ class BalViewModel extends ChangeNotifier { Future> _load() async { final result1 = await _loadBal(); switch (result1) { - case Error(): - return result1; + case Ok(): + isLoaded = true; + break; default: break; } - isLoaded = true; notifyListeners(); return result1; } diff --git a/lib/ui/bal_page/widget/bal_page.dart b/lib/ui/bal_page/widget/bal_page.dart index 10a1138..8c7fd9d 100644 --- a/lib/ui/bal_page/widget/bal_page.dart +++ b/lib/ui/bal_page/widget/bal_page.dart @@ -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 { 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"), diff --git a/lib/ui/core/ui/await_loading.dart b/lib/ui/core/ui/await_loading.dart new file mode 100644 index 0000000..7342527 --- /dev/null +++ b/lib/ui/core/ui/await_loading.dart @@ -0,0 +1,47 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +class AwaitLoading extends StatefulWidget { + const AwaitLoading({super.key}); + + @override + State createState() => _AwaitLoadingState(); +} + +class _AwaitLoadingState extends State { + 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), + ), + ), + ), + ], + ); + } +} diff --git a/lib/utils/overlay_boundary.dart b/lib/ui/core/ui/overlay_boundary.dart similarity index 100% rename from lib/utils/overlay_boundary.dart rename to lib/ui/core/ui/overlay_boundary.dart diff --git a/lib/ui/home_page/view_model/home_view_model.dart b/lib/ui/home_page/view_model/home_view_model.dart index 22eae91..a35c33c 100644 --- a/lib/ui/home_page/view_model/home_view_model.dart +++ b/lib/ui/home_page/view_model/home_view_model.dart @@ -56,7 +56,13 @@ class HomeViewModel extends ChangeNotifier { Future> _load() async { final result2 = await _loadBal(); - isLoaded = true; + switch (result2) { + case Ok(): + isLoaded = true; + break; + default: + break; + } notifyListeners(); return result2; } diff --git a/lib/ui/home_page/widgets/home_page.dart b/lib/ui/home_page/widgets/home_page.dart index 586db9d..588347b 100644 --- a/lib/ui/home_page/widgets/home_page.dart +++ b/lib/ui/home_page/widgets/home_page.dart @@ -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 { 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), diff --git a/lib/ui/sell_page/view_model/sell_view_model.dart b/lib/ui/sell_page/view_model/sell_view_model.dart index 85b1670..0532b8b 100644 --- a/lib/ui/sell_page/view_model/sell_view_model.dart +++ b/lib/ui/sell_page/view_model/sell_view_model.dart @@ -71,10 +71,16 @@ class SellViewModel extends ChangeNotifier { bool isLoaded = false; Future> _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> _loadBal() async { diff --git a/lib/ui/sell_page/widgets/sell_page.dart b/lib/ui/sell_page/widgets/sell_page.dart index 47da1e6..1c463f6 100644 --- a/lib/ui/sell_page/widgets/sell_page.dart +++ b/lib/ui/sell_page/widgets/sell_page.dart @@ -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 { 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(