import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/input_text.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/material.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; class DeliveryAddressEditor extends StatefulWidget { final DeliveryAddress? deliveryAddress; final User? user; DeliveryAddressEditor({this.deliveryAddress, this.user}); @override _DeliveryAddressEditorState createState() => _DeliveryAddressEditorState(); } class _DeliveryAddressEditorState extends State { TextEditingController _nameController = new TextEditingController(); TextEditingController _address1Controller = new TextEditingController(); TextEditingController _address2Controller = new TextEditingController(); TextEditingController _cityController = new TextEditingController(); TextEditingController _stateController = new TextEditingController(); TextEditingController _phoneController = new TextEditingController(); DeliveryAddress _deliveryAddress = new DeliveryAddress(); bool _isLoading = false; bool _isNew = true; final _deliveryFormKey = GlobalKey(); @override void initState() { super.initState(); if (widget.deliveryAddress != null) { _isNew = false; _deliveryAddress = widget.deliveryAddress!; _nameController.text = _deliveryAddress.fullName ?? ""; _address1Controller.text = _deliveryAddress.addressLine1 ?? ""; _address2Controller.text = _deliveryAddress.addressLine2 ?? ""; _cityController.text = _deliveryAddress.city ?? ""; _stateController.text = _deliveryAddress.state ?? ""; _phoneController.text = _deliveryAddress.phoneNumber ?? ""; } else { _cityController.text = "Yangon"; _stateController.text = "Yangon"; } } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { final fullName = InputText( labelTextKey: 'delivery_address.full_name', iconData: MaterialCommunityIcons.account_arrow_left, controller: _nameController, autovalidateMode: AutovalidateMode.onUserInteraction, validator: (value) { if (value == null || value.isEmpty) { return "Please enter full name"; } return null; }); final addressLine1 = InputText( labelTextKey: 'delivery_address.address_line1', iconData: Icons.location_on, controller: _address1Controller, autovalidateMode: AutovalidateMode.onUserInteraction, validator: (value) { if (value == null || value.isEmpty) { return "Please enter address"; } return null; }); final addressLine2 = InputText( labelTextKey: 'delivery_address.address_line2', iconData: Icons.location_on, controller: _address2Controller); final cityBox = InputText( labelTextKey: 'delivery_address.city', iconData: Icons.location_city, controller: _cityController, autovalidateMode: AutovalidateMode.onUserInteraction, validator: (value) { if (value == null || value.isEmpty) { return "Please enter city"; } return null; }); final regionBox = InputText( labelTextKey: 'delivery_address.state_region', iconData: Entypo.location, controller: _stateController, autovalidateMode: AutovalidateMode.onUserInteraction, validator: (value) { if (value == null || value.isEmpty) { return "Please enter state/region"; } return null; }); final phoneNumberBox = InputText( labelTextKey: 'delivery_address.phonenumber', iconData: Icons.phone, textInputType: TextInputType.phone, controller: _phoneController, autovalidateMode: AutovalidateMode.onUserInteraction, validator: (value) { if (value == null || value.isEmpty) { return "Please enter phone number"; } return null; }); final createBtn = fcsButton( context, getLocalString(context, "delivery_address.create"), callack: _create, ); final updateBtn = fcsButton( context, getLocalString(context, "delivery_address.update"), callack: _update, ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: LocalAppBar( labelKey: 'delivery_address', backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor, onBack: () { if (isDataChanged()) { showConfirmDialog(context, "back.button_confirm", () { Navigator.of(context).pop(); }); } else { Navigator.of(context).pop(); } }, actions: [ _isNew ? Container() : IconButton( icon: Icon( Icons.delete, color: primaryColor, ), onPressed: _delete) ], ), body: Form( key: _deliveryFormKey, child: Padding( padding: const EdgeInsets.only(left: 10.0, right: 10), child: ListView(children: [ fullName, SizedBox(height: 5), phoneNumberBox, SizedBox(height: 10), addressLine1, SizedBox(height: 5), addressLine2, SizedBox(height: 5), cityBox, SizedBox(height: 5), regionBox, SizedBox(height: 5), _isNew ? createBtn : updateBtn, SizedBox(height: 10) ]), ), ), )); } DeliveryAddress _getPayload() { DeliveryAddress deliveryAddress = DeliveryAddress(); deliveryAddress.id = _deliveryAddress.id; try { deliveryAddress.fullName = _nameController.text; deliveryAddress.addressLine1 = _address1Controller.text; deliveryAddress.addressLine2 = _address2Controller.text; deliveryAddress.city = _cityController.text; deliveryAddress.state = _stateController.text; deliveryAddress.phoneNumber = _phoneController.text; } catch (e) { showMsgDialog(context, "Error", e.toString()); // shold never happen } return deliveryAddress; } Future _validate(DeliveryAddress deliveryAddress) async { if (!_deliveryFormKey.currentState!.validate()) { return false; } // if (deliveryAddress.addressLine1 == "") { // await showMsgDialog(context, "Error", "Invalid address line 1!"); // return false; // } // if (deliveryAddress.city == null) { // await showMsgDialog(context, "Error", "Invalid city!"); // return false; // } // if (deliveryAddress.state == null) { // await showMsgDialog(context, "Error", "Invalid state!"); // return false; // } // if (deliveryAddress.phoneNumber == null) { // await showMsgDialog(context, "Error", "Invalid phone number!"); // return false; // } return true; } Future _create() async { DeliveryAddress deliveryAddress = _getPayload(); bool valid = await _validate(deliveryAddress); if (!valid) { return; } if (widget.user != null) { deliveryAddress.userID = widget.user!.id; } setState(() { _isLoading = true; }); var deliveryAddressModel = Provider.of(context, listen: false); try { await deliveryAddressModel.createDeliveryAddress(deliveryAddress); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } Future _update() async { DeliveryAddress deliveryAddress = _getPayload(); bool valid = await _validate(deliveryAddress); if (!valid) { return; } if (widget.user != null) { deliveryAddress.userID = widget.user!.id; } setState(() { _isLoading = true; }); var deliveryAddressModel = Provider.of(context, listen: false); try { await deliveryAddressModel.updateDeliveryAddress(deliveryAddress); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _delete() { showConfirmDialog(context, "delivery_address.delete.confirm", _deleteDA); } _deleteDA() async { setState(() { _isLoading = true; }); try { DeliveryAddressModel deliveryAddressModel = Provider.of(context, listen: false); if (widget.user != null) { _deliveryAddress.userID = widget.user!.id; } await deliveryAddressModel.deleteDeliveryAddress(_deliveryAddress); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } isDataChanged() { if (_isNew) { return _nameController.text != "" || _phoneController.text != "" || _address1Controller.text != "" || _address2Controller.text != "" || _cityController.text != "Yangon" || _stateController.text != "Yangon"; } else { DeliveryAddress deliveryAddress = _getPayload(); return this._deliveryAddress.isChangedForEdit(deliveryAddress); } } }