fix dimmed safearea and translate error messages

This commit is contained in:
Mikkel Troels Kongsted 2025-03-20 13:24:28 +01:00
parent 0b2b6f5a18
commit 57133e7a13
3 changed files with 117 additions and 54 deletions

View File

@ -19,6 +19,9 @@ import 'package:mobile/controllers/routing.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
ErrorMessages.init("danish");
final server = BackendServer(); final server = BackendServer();
final usersController = UsersController(server: server); final usersController = UsersController(server: server);
final sessionController = SessionController(server: server); final sessionController = SessionController(server: server);

View File

@ -3,6 +3,7 @@ import 'package:mobile/controllers/routing.dart';
import 'package:mobile/controllers/cart.dart'; import 'package:mobile/controllers/cart.dart';
import 'package:mobile/controllers/paying_state.dart'; import 'package:mobile/controllers/paying_state.dart';
import 'package:mobile/results.dart'; import 'package:mobile/results.dart';
import 'package:mobile/server/server.dart';
import 'package:mobile/utils/price.dart'; import 'package:mobile/utils/price.dart';
import 'package:mobile/widgets/primary_button.dart'; import 'package:mobile/widgets/primary_button.dart';
import 'package:mobile/widgets/receipt_item.dart'; import 'package:mobile/widgets/receipt_item.dart';
@ -20,10 +21,10 @@ class FinishShoppingPage extends StatelessWidget {
final cart = cartController.allCartItems(); final cart = cartController.allCartItems();
return Scaffold( return Scaffold(
body: SafeArea( body: Stack(
child: Stack( children: [
children: [ SafeArea(
Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const BackButton(), const BackButton(),
@ -57,14 +58,13 @@ class FinishShoppingPage extends StatelessWidget {
payingStateRepo.next(); payingStateRepo.next();
await Future.delayed(const Duration(seconds: 1)); await Future.delayed(const Duration(seconds: 1));
if (await cartController.purchase() if (await cartController.purchase()
is Err<Null, String>) { case Err<Null, String>(value: final message)) {
if (context.mounted) { if (context.mounted) {
showDialog<String>( showDialog<String>(
context: context, context: context,
builder: (BuildContext context) => builder: (BuildContext context) =>
AlertDialog( AlertDialog(
content: const Text( content: Text(ErrorMessages.fancy(message)),
'Du har desværre ikke råd til at købe dette'),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
onPressed: () => onPressed: () =>
@ -93,55 +93,55 @@ class FinishShoppingPage extends StatelessWidget {
), ),
], ],
), ),
if (payingStateRepo.state != PayingState.unset) ...[ ),
Container( if (payingStateRepo.state != PayingState.unset) ...[
color: Colors.black.withValues(alpha: 0.5), Container(
), color: Colors.black.withValues(alpha: 0.5),
], ),
Center( ],
child: Column( Center(
mainAxisAlignment: MainAxisAlignment.center, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.center,
...switch (payingStateRepo.state) { children: [
PayingState.unset => [], ...switch (payingStateRepo.state) {
PayingState.loading => [ PayingState.unset => [],
Container( PayingState.loading => [
decoration: const BoxDecoration( Container(
borderRadius: BorderRadius.all(Radius.circular(10)), decoration: const BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(10)),
), color: Colors.white,
padding: const EdgeInsets.all(20), ),
child: SizedBox( padding: const EdgeInsets.all(20),
width: 50, child: SizedBox(
height: 50, width: 50,
child: CircularProgressIndicator( height: 50,
valueColor: AlwaysStoppedAnimation<Color>( child: CircularProgressIndicator(
Theme.of(context).primaryColor), valueColor: AlwaysStoppedAnimation<Color>(
strokeWidth: 6.0, Theme.of(context).primaryColor),
), strokeWidth: 6.0,
), ),
), ),
], ),
PayingState.done => [ ],
Container( PayingState.done => [
padding: const EdgeInsets.all(10), Container(
decoration: const BoxDecoration( padding: const EdgeInsets.all(10),
borderRadius: BorderRadius.all(Radius.circular(10)), decoration: const BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(10)),
), color: Colors.white,
child: Icon( ),
Icons.check_rounded, child: Icon(
color: Theme.of(context).primaryColor, Icons.check_rounded,
size: 70, color: Theme.of(context).primaryColor,
), size: 70,
) ),
] )
}, ]
], },
), ],
) ),
], )
), ],
), ),
); );
} }

View File

@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mobile/models/cart_item.dart'; import 'package:mobile/models/cart_item.dart';
import 'package:mobile/models/product.dart'; import 'package:mobile/models/product.dart';
@ -32,3 +33,62 @@ abstract class Server {
Image productImage(int productId); 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";
}
}