mirror of
				https://github.com/Mercantec-GHC/h4-projekt-gruppe-0-sm.git
				synced 2025-10-31 15:47:00 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			149 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| 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';
 | |
| import 'package:provider/provider.dart';
 | |
| 
 | |
| class FinishShoppingPage extends StatelessWidget {
 | |
|   const FinishShoppingPage({super.key});
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     final CartControllerCache cartController =
 | |
|         context.read<CartControllerCache>();
 | |
|     final PayingStateController payingStateRepo =
 | |
|         context.watch<PayingStateController>();
 | |
|     final cart = cartController.allCartItems();
 | |
| 
 | |
|     return Scaffold(
 | |
|       body: Stack(
 | |
|         children: [
 | |
|           SafeArea(
 | |
|             child: Column(
 | |
|               crossAxisAlignment: CrossAxisAlignment.start,
 | |
|               children: [
 | |
|                 const BackButton(),
 | |
|                 Container(
 | |
|                   margin: const EdgeInsets.all(20),
 | |
|                   child: ListView.builder(
 | |
|                       shrinkWrap: true,
 | |
|                       itemBuilder: (_, idx) => ReceiptItemView(
 | |
|                           pricePerAmount: cart[idx].product.priceDkkCent,
 | |
|                           name: cart[idx].product.name,
 | |
|                           amount: cart[idx].amount),
 | |
|                       itemCount: cart.length),
 | |
|                 ),
 | |
|                 Container(
 | |
|                   margin: const EdgeInsets.all(20),
 | |
|                   child: Row(
 | |
|                     mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | |
|                     children: [
 | |
|                       const Text(
 | |
|                         "Total:",
 | |
|                         style: TextStyle(fontWeight: FontWeight.bold),
 | |
|                       ),
 | |
|                       Text(formatDkkCents(cartController.totalPrice())),
 | |
|                     ],
 | |
|                   ),
 | |
|                 ),
 | |
|                 Expanded(
 | |
|                   child: Center(
 | |
|                       child: PrimaryButton(
 | |
|                           onPressed: () async {
 | |
|                             payingStateRepo.next();
 | |
|                             await Future.delayed(const Duration(seconds: 1));
 | |
|                             if (await cartController.purchase()
 | |
|                                 case Err<Null, String>(value: final message)) {
 | |
|                               if (context.mounted) {
 | |
|                                 showDialog<String>(
 | |
|                                   context: context,
 | |
|                                   builder: (BuildContext context) =>
 | |
|                                       AlertDialog(
 | |
|                                     content: Text(ErrorMessages.fancy(message)),
 | |
|                                     actions: <Widget>[
 | |
|                                       TextButton(
 | |
|                                         onPressed: () =>
 | |
|                                             Navigator.pop(context, 'Ok'),
 | |
|                                         child: const Text('Ok'),
 | |
|                                       ),
 | |
|                                     ],
 | |
|                                   ),
 | |
|                                 );
 | |
|                               }
 | |
|                               payingStateRepo.reset();
 | |
|                               return;
 | |
|                             }
 | |
|                             payingStateRepo.next();
 | |
|                             await Future.delayed(const Duration(seconds: 1));
 | |
|                             cartController.clearCart();
 | |
|                             payingStateRepo.reset();
 | |
|                             if (context.mounted) {
 | |
|                               Navigator.pop(context);
 | |
|                               final RoutingController routing =
 | |
|                                   context.read<RoutingController>();
 | |
|                               routing.routeTo(PageSelector.homePage);
 | |
|                             }
 | |
|                           },
 | |
|                           child: const Text("Betal"))),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|           ),
 | |
|           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<Color>(
 | |
|                                 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,
 | |
|                         ),
 | |
|                       )
 | |
|                     ]
 | |
|                 },
 | |
|               ],
 | |
|             ),
 | |
|           )
 | |
|         ],
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |