diff --git a/lib/pages/MyItemsPages/my_items_transfer_screen.dart b/lib/pages/MyItemsPages/my_items_transfer_screen.dart index d18e327..866bc9a 100755 --- a/lib/pages/MyItemsPages/my_items_transfer_screen.dart +++ b/lib/pages/MyItemsPages/my_items_transfer_screen.dart @@ -11,11 +11,14 @@ import 'package:cssd/widgets/MyItemsScreens/Detail/cancel_transfer_button.dart'; import 'package:cssd/widgets/MyItemsScreens/Detail/transfer_data_box.dart'; import 'package:cssd/widgets/MyItemsScreens/Detail/transfer_destroy_button.dart'; import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; + class ItemsTransferScreen extends StatefulWidget { final bool? isAdmin; final ItemDetailObject? items; + const ItemsTransferScreen({ super.key, this.isAdmin, @@ -85,7 +88,12 @@ class _ItemsTransferScreenState extends State { child: Scaffold( appBar: AppBar( titleSpacing: -10, - title: Text('Item Details', style: TextStyle(color: Colors.white,),), + title: Text( + 'Item Details', + style: TextStyle( + color: Colors.white, + ), + ), backgroundColor: Colors.black, leading: IconButton( icon: Icon( @@ -192,7 +200,7 @@ class _ItemsTransferScreenState extends State { ), content: SizedBox( width: _deviceBlockSize, - height: 300, + height: 320, child: Column( children: [ Text( @@ -228,27 +236,45 @@ class _ItemsTransferScreenState extends State { SizedBox( height: 20.0, ), - TransferDestroyButton( - deviceBlockSize: _deviceBlockSize, - firstColor: kDarkBlue, - secondColor: kDarkBlueSub, - onTap: () { - Provider.of( - context, - listen: false, - ).transferItems( - itemData!.id, - Provider.of( - context, - listen: false) - .saveUserId!, + Consumer( + builder: + (context, myItemProvider, _) { + return TransferDestroyButton( + deviceBlockSize: + _deviceBlockSize, + firstColor: kDarkBlue, + secondColor: kDarkBlueSub, + onTap: () async { + myItemProvider + .setLoadingButton(); + await Provider.of< + MyItemProvider>( + context, + listen: false, + ).transferItems( + itemData!.id, + await Provider.of< + UsersProvider>( + context, + listen: false) + .saveUserId!, + ); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + myItemProvider + .resetLoadingButton(); + Fluttertoast.showToast( + msg: "The item is transferred.", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + ); + }, + text: 'Transfer', + isLoadingButton: myItemProvider + .isloadingButton, ); - Navigator.of(context).pop(); - Navigator.of(context) - .popAndPushNamed(Routes - .myItemsResultScreen); }, - text: 'Transfer', ), SizedBox( height: 5.0, diff --git a/lib/providers/my_items.dart b/lib/providers/my_items.dart index bd41b31..a5c90eb 100755 --- a/lib/providers/my_items.dart +++ b/lib/providers/my_items.dart @@ -256,6 +256,17 @@ class MyItemProvider extends ChangeNotifier { // } // } + bool isloadingButton = false; + void resetLoadingButton() { + isloadingButton = false; + notifyListeners(); + } + + void setLoadingButton() { + isloadingButton = true; + notifyListeners(); + } + Future transferItems(String itemId, String userId) async { var response = await http.post( Uri.parse(Url.transferItems(itemId)), diff --git a/lib/widgets/MyItemsScreens/Detail/my_items_detail_box_widget.dart b/lib/widgets/MyItemsScreens/Detail/my_items_detail_box_widget.dart index 5d88e3d..0e283fc 100755 --- a/lib/widgets/MyItemsScreens/Detail/my_items_detail_box_widget.dart +++ b/lib/widgets/MyItemsScreens/Detail/my_items_detail_box_widget.dart @@ -8,6 +8,7 @@ import 'package:cssd/providers/my_items.dart'; import 'package:cssd/widgets/MyItemsScreens/Detail/cancel_transfer_button.dart'; import 'package:cssd/widgets/MyItemsScreens/Detail/transfer_destroy_button.dart'; import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:intl/intl.dart'; import 'package:pinch_zoom/pinch_zoom.dart'; import 'package:provider/provider.dart'; @@ -466,25 +467,39 @@ class MyItemsDetailsDataBox extends StatelessWidget { SizedBox( height: 20.0, ), - TransferDestroyButton( - deviceBlockSize: _deviceBlockSize, - firstColor: kPink, - secondColor: kPinkSub, - onTap: () { - Provider.of(context, - listen: false) - .removeItems(datas.id) - .then( - (value) { - Navigator.of(context).pop(); - Navigator.pushReplacementNamed( - context, - Routes.myItemsResultScreen, + Consumer( + builder: (context, itemProvider, child) { + return TransferDestroyButton( + deviceBlockSize: _deviceBlockSize, + firstColor: kPink, + secondColor: kPinkSub, + isLoadingButton: + itemProvider.isloadingButton, + onTap: () async { + itemProvider.setLoadingButton(); + await Provider.of(context, + listen: false) + .removeItems(datas.id) + .then( + (value) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.pushReplacementNamed( + context, + Routes.myItemsResultScreen, + ); + itemProvider.resetLoadingButton(); + Fluttertoast.showToast( + msg: "The item is destroyed.", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + ); + }, ); }, + text: 'Destroy', ); }, - text: 'Destroy', ), SizedBox( height: 5.0, @@ -603,7 +618,7 @@ class MyItemsDetailsDataBox extends StatelessWidget { ), content: SizedBox( width: _deviceBlockSize, - height: 220, + height: 240, child: Column( children: [ Text( @@ -619,25 +634,34 @@ class MyItemsDetailsDataBox extends StatelessWidget { SizedBox( height: 20.0, ), - TransferDestroyButton( - deviceBlockSize: _deviceBlockSize, - firstColor: Colors.black, - secondColor: Colors.black87, - onTap: () { - Provider.of(context, - listen: false) - .repairItems(datas.id, 'approved') - .then( - (value) { - Navigator.of(context).pop(); - Navigator.pushReplacementNamed( - context, - Routes.myItemsResultScreen, + Consumer( + builder: (context, itemProvider, child) { + return TransferDestroyButton( + deviceBlockSize: _deviceBlockSize, + firstColor: Colors.black, + secondColor: Colors.black87, + isLoadingButton: itemProvider.isloadingButton, + onTap: () async { + itemProvider.setLoadingButton(); + await Provider.of(context, + listen: false) + .repairItems(datas.id, 'approved') + .then( + (value) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + itemProvider.resetLoadingButton(); + Fluttertoast.showToast( + msg: "The item is repaired.", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + ); + }, ); }, + text: 'Repair', ); }, - text: 'Repair', ), SizedBox( height: 5.0, @@ -824,7 +848,7 @@ class MyItemsDetailsDataBox extends StatelessWidget { ), ), Container( - width: 30 * _deviceBlockSize, + width: 40 * _deviceBlockSize, child: Row( children: [ Text( diff --git a/lib/widgets/MyItemsScreens/Detail/transfer_destroy_button.dart b/lib/widgets/MyItemsScreens/Detail/transfer_destroy_button.dart index 9ba75a7..0488a23 100755 --- a/lib/widgets/MyItemsScreens/Detail/transfer_destroy_button.dart +++ b/lib/widgets/MyItemsScreens/Detail/transfer_destroy_button.dart @@ -9,6 +9,7 @@ class TransferDestroyButton extends StatelessWidget { required this.onTap, required this.text, this.fontSize = 5.0, + this.isLoadingButton = false, }) : _deviceBlockSize = deviceBlockSize, super(key: key); final double _deviceBlockSize; @@ -17,6 +18,7 @@ class TransferDestroyButton extends StatelessWidget { final String text; final VoidCallback onTap; final double fontSize; + final bool isLoadingButton; @override Widget build(BuildContext context) { @@ -33,16 +35,22 @@ class TransferDestroyButton extends StatelessWidget { ), borderRadius: BorderRadius.circular(7), ), - child: Align( - alignment: Alignment.center, - child: Text( - text, - style: TextStyle( - color: Colors.white, - fontSize: fontSize * _deviceBlockSize, - ), - ), - ), + child: isLoadingButton + ? Center( + child: CircularProgressIndicator( + color: Colors.white, + ), + ) + : Align( + alignment: Alignment.center, + child: Text( + text, + style: TextStyle( + color: Colors.white, + fontSize: fontSize * _deviceBlockSize, + ), + ), + ), ), ); }