From 57133e7a13b3066bf3098096dd0876fdc9b980e5 Mon Sep 17 00:00:00 2001 From: Mikkel Troels Kongsted Date: Thu, 20 Mar 2025 13:24:28 +0100 Subject: [PATCH] fix dimmed safearea and translate error messages --- mobile/lib/main.dart | 3 + mobile/lib/pages/finish_shopping_page.dart | 108 ++++++++++----------- mobile/lib/server/server.dart | 60 ++++++++++++ 3 files changed, 117 insertions(+), 54 deletions(-) diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 00c107d..ff82fad 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -19,6 +19,9 @@ import 'package:mobile/controllers/routing.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); + + ErrorMessages.init("danish"); + final server = BackendServer(); final usersController = UsersController(server: server); final sessionController = SessionController(server: server); diff --git a/mobile/lib/pages/finish_shopping_page.dart b/mobile/lib/pages/finish_shopping_page.dart index d375497..60ab43a 100644 --- a/mobile/lib/pages/finish_shopping_page.dart +++ b/mobile/lib/pages/finish_shopping_page.dart @@ -3,6 +3,7 @@ import 'package:mobile/controllers/routing.dart'; import 'package:mobile/controllers/cart.dart'; import 'package:mobile/controllers/paying_state.dart'; import 'package:mobile/results.dart'; +import 'package:mobile/server/server.dart'; import 'package:mobile/utils/price.dart'; import 'package:mobile/widgets/primary_button.dart'; import 'package:mobile/widgets/receipt_item.dart'; @@ -20,10 +21,10 @@ class FinishShoppingPage extends StatelessWidget { final cart = cartController.allCartItems(); return Scaffold( - body: SafeArea( - child: Stack( - children: [ - Column( + body: Stack( + children: [ + SafeArea( + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const BackButton(), @@ -57,14 +58,13 @@ class FinishShoppingPage extends StatelessWidget { payingStateRepo.next(); await Future.delayed(const Duration(seconds: 1)); if (await cartController.purchase() - is Err) { + case Err(value: final message)) { if (context.mounted) { showDialog( context: context, builder: (BuildContext context) => AlertDialog( - content: const Text( - 'Du har desværre ikke råd til at købe dette'), + content: Text(ErrorMessages.fancy(message)), actions: [ TextButton( onPressed: () => @@ -93,55 +93,55 @@ class FinishShoppingPage extends StatelessWidget { ), ], ), - if (payingStateRepo.state != PayingState.unset) ...[ - Container( - color: Colors.black.withValues(alpha: 0.5), - ), - ], - Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ...switch (payingStateRepo.state) { - PayingState.unset => [], - PayingState.loading => [ - Container( - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(10)), - color: Colors.white, - ), - padding: const EdgeInsets.all(20), - child: SizedBox( - width: 50, - height: 50, - child: CircularProgressIndicator( - valueColor: AlwaysStoppedAnimation( - Theme.of(context).primaryColor), - strokeWidth: 6.0, - ), + ), + if (payingStateRepo.state != PayingState.unset) ...[ + Container( + color: Colors.black.withValues(alpha: 0.5), + ), + ], + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ...switch (payingStateRepo.state) { + PayingState.unset => [], + PayingState.loading => [ + Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(10)), + color: Colors.white, + ), + padding: const EdgeInsets.all(20), + child: SizedBox( + width: 50, + height: 50, + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + Theme.of(context).primaryColor), + strokeWidth: 6.0, ), ), - ], - PayingState.done => [ - Container( - padding: const EdgeInsets.all(10), - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(10)), - color: Colors.white, - ), - child: Icon( - Icons.check_rounded, - color: Theme.of(context).primaryColor, - size: 70, - ), - ) - ] - }, - ], - ), - ) - ], - ), + ), + ], + PayingState.done => [ + Container( + padding: const EdgeInsets.all(10), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(10)), + color: Colors.white, + ), + child: Icon( + Icons.check_rounded, + color: Theme.of(context).primaryColor, + size: 70, + ), + ) + ] + }, + ], + ), + ) + ], ), ); } diff --git a/mobile/lib/server/server.dart b/mobile/lib/server/server.dart index 324427f..5f9bcff 100644 --- a/mobile/lib/server/server.dart +++ b/mobile/lib/server/server.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mobile/models/cart_item.dart'; import 'package:mobile/models/product.dart'; @@ -32,3 +33,62 @@ abstract class Server { Image productImage(int productId); } + +class ErrorMessages { + final String language; + + static ErrorMessages? _instance; + + static init(String language) { + _instance = ErrorMessages(language: language); + } + + static ErrorMessages get instance { + final instance = _instance; + if (instance == null) { + throw NotInitialized(); + } + return instance; + } + + ErrorMessages({required this.language}); + + static String fancy(String message) { + return instance._fancy(message); + } + + String _fancy(String message) { + switch (language) { + case "danish": + return _fancyDanish(message); + default: + return "error: $message"; + } + } + + String _fancyDanish(String message) { + switch (message) { + case "insufficient funds": + return "Du har desværre ikke nok penge på kontoen."; + + default: + if (kDebugMode) { + throw NotTranslated(message: message); + } + return "error: $message"; + } + } +} + +class NotInitialized implements Exception {} + +class NotTranslated implements Exception { + final String message; + + NotTranslated({required this.message}); + + @override + String toString() { + return "${super.toString()}: message \"$message\" is not translated"; + } +}