import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/vo/privilege.dart'; import 'package:fcs/localization/transalation.dart'; import 'package:fcs/pages/delivery_address/delivery_address_list.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/model/language_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/profile/profile_currency_edit.dart'; import 'package:fcs/pages/profile/profile_edit.dart'; import 'package:fcs/pages/staff/model/staff_model.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import '../../helpers/theme.dart'; import 'package:collection/collection.dart'; import 'account_delection_page.dart'; import 'add_recovery_email.dart'; import 'change_phone_number.dart'; typedef void ProfileCallback(); class Profile extends StatefulWidget { @override _ProfileState createState() => _ProfileState(); } class _ProfileState extends State { GlobalKey key = GlobalKey(); bool _isLoading = false; String? selectedLanguage; TextEditingController bizNameController = new TextEditingController(); static final List languagesList = Translation().supportedLanguages; static final List languageCodesList = Translation().supportedLanguagesCodes; final Map languagesMap = { languagesList[0]: languageCodesList[0], languagesList[1]: languageCodesList[1], }; buildLanguage(LanguageModel languageModel) async { var lan = await languageModel.load(); if (this.selectedLanguage != lan) { setState(() { this.selectedLanguage = lan; }); } } @override void initState() { super.initState(); } @override Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); LanguageModel languageModel = Provider.of(context); if (mainModel.user == null) { return Container(); } User user = mainModel.user!; buildLanguage(languageModel); var deliveryAddressModel = Provider.of(context); final namebox = DisplayText( text: "${user.name ?? ''}" + " (${user.status ?? ''})", labelTextKey: "profile.name", iconData: Icons.person, ); final currencyBox = Row( children: [ Expanded( child: DisplayText( text: user.preferCurrency ?? "", labelTextKey: "profile.currency", iconData: FontAwesome5Regular.money_bill_alt, )), Padding( padding: const EdgeInsets.only(right: 0), child: IconButton( icon: Icon(Icons.edit, color: Colors.grey), onPressed: _editCurrency), ) ], ); final deleteAccountBox = DisplayText( labelTextKey: "profile.delete.title", iconData: MaterialCommunityIcons.account_remove, ); final phonenumberBox = Row( children: [ Expanded( child: DisplayText( text: user.phone, labelTextKey: "profile.phone", iconData: Icons.phone), ), // IconButton( // icon: Icon(Icons.edit, color: Colors.grey), // onPressed: () { // Navigator.of(context, rootNavigator: true).push( // CupertinoPageRoute( // builder: (context) => ChangePhoneNumber(user: user))); // }) ], ); final fcsIDBox = Row( children: [ Expanded( child: DisplayText( text: user.fcsID ?? "", labelTextKey: "customer.fcs.id", icon: FcsIDIcon(), ), ), IconButton( icon: Icon(Icons.content_copy, color: Colors.grey), onPressed: () => _copy( getLocalString(context, "customer.fcs.id"), user.fcsID ?? ""), ) ], ); final usaShippingAddressBox = Row( children: [ Expanded( child: DisplayText( text: mainModel.setting!.usaAddress ?? "", labelTextKey: "profile.usa.shipping.address", iconData: Icons.location_on, ), ), IconButton( icon: Icon(Icons.content_copy, color: Colors.grey), onPressed: () => _copy( getLocalString(context, "profile.usa.shipping.address"), mainModel.setting!.usaAddress ?? ""), ) ], ); final logoutbutton = fcsButton(context, getLocalString(context, "profile.logout"), callack: mainModel.isPinLogin ? null : () { showConfirmDialog(context, "profile.logout.confirm", () async { await _logout(); }); }, iconData: Icons.exit_to_app); final emailBox = Row( children: [ Expanded( child: DisplayText( text: user.recoveryEmail, labelTextKey: "profile.recovery.email", iconData: Icons.email_outlined, ), ), IconButton(icon: Icon(Icons.edit, color: Colors.grey), onPressed: () { Navigator.of(context, rootNavigator: true).push( CupertinoPageRoute( builder: (context) => AddRecoveryEmail(user: user))); }) ], ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( key: key, appBar: LocalAppBar( labelKey: "profile.title", backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor), body: Padding( padding: const EdgeInsets.all(8.0), child: ListView( children: [ Row( children: [ Expanded(child: namebox), Padding( padding: const EdgeInsets.only(right: 0), child: IconButton( icon: Icon(Icons.edit, color: Colors.grey), onPressed: _editName), ) ], ), phonenumberBox, fcsIDBox, usaShippingAddressBox, currencyBox, // emailBox, DefaultDeliveryAddress( labelKey: "profile.default.delivery.address", deliveryAddress: deliveryAddressModel.defalutAddress, onTap: () { Navigator.push( context, CupertinoPageRoute( builder: (context) => DeliveryAddressList())); }, ), buildLanguageWidget( context: context, text: "profile.language", iconData: Icons.language, isEng: languageModel.isEng, ), Row( children: [ Expanded( child: deleteAccountBox, ), Padding( padding: const EdgeInsets.only(right: 0), child: IconButton( icon: Icon(Icons.edit, color: Colors.grey), onPressed: _editDelete), ) ], ), getPrivilegeBox(context), SizedBox(height: 15), logoutbutton, SizedBox(height: 25) ], ), ), ), ); } Widget buildLanguageWidget( {required String text, required BuildContext context, IconData? iconData, required bool isEng}) { return Row( children: [ Icon(iconData, color: primaryColor), const SizedBox(width: 15), Expanded( child: LocalText( context, text, fontSize: 15.0, color: Colors.black54, ), ), Row( children: [ isEng ? Image.asset( 'icons/flags/png/us.png', package: 'country_icons', fit: BoxFit.fitWidth, width: 25, ) : Image.asset( 'icons/flags/png/mm.png', package: 'country_icons', fit: BoxFit.fitWidth, width: 25, ), Container( width: 100, padding: const EdgeInsets.only(left: 15), child: DropdownButton( value: selectedLanguage, underline: const SizedBox(), isExpanded: true, items: languagesList .map>((String value) { return DropdownMenuItem( value: value, child: Text( value, style: const TextStyle(fontSize: 14), )); }).toList(), onChanged: _selectedDropdown)), ], ) ], ); } _selectedDropdown(selected) { var languageModel = Provider.of(context, listen: false); languageModel.saveLanguage(selected); setState(() { selectedLanguage = selected; }); } Widget getPrivilegeBox(BuildContext context) { User? user = Provider.of(context, listen: false).user; List _privileges = Provider.of(context, listen: false).privileges; if (user == null || user.isCustomer()) return Container(); List privileges = []; user.privileges.forEach((e) { Privilege? p = _privileges.firstWhereOrNull((p) => p.id == e); if (p != null) { privileges.add(p); } }); return privileges.isEmpty ? const SizedBox() : Column( children: [ DisplayText( labelTextKey: "profile.privileges", iconData: MaterialCommunityIcons.clipboard_check_outline, ), Padding( padding: const EdgeInsets.only(left: 30.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: getRowPrivilegeWidget(privileges)), ) ], ); } List getRowPrivilegeWidget(List privileges) { return privileges.map((p) { return Container( padding: EdgeInsets.all(3.0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Icon( p.iconData, color: Colors.black38, ), SizedBox( width: 10, ), Flexible( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("${p.name}", style: TextStyle( fontSize: 16.0, fontStyle: FontStyle.normal, color: primaryColor, )), Text( "${p.desc}", style: TextStyle( fontSize: 14.0, fontStyle: FontStyle.normal, color: Colors.black38), ), ], ), ) ], ), ); }).toList(); } _copy(String title, String data) { Clipboard.setData(ClipboardData(text: data)); _showToast(title); } _showToast(String title) { ScaffoldMessengerState? scaffold = key.currentState; if (scaffold == null) { scaffold = ScaffoldMessenger.of(context); } scaffold.showSnackBar( SnackBar( content: Text('copied "$title" data to clipboard'), backgroundColor: secondaryColor, duration: Duration(seconds: 1), ), ); } _editDelete() { Navigator.of(context).push(CupertinoPageRoute( builder: (context) => AccountDelectionPage( onlogout: () { _logout(); }, ))); } _editName() { Navigator.of(context) .push(CupertinoPageRoute(builder: (context) => ProfileEdit())); } _editCurrency() { Navigator.of(context).push( CupertinoPageRoute(builder: (context) => ProfileCurrencyEdit())); } _logout() async { setState(() { _isLoading = true; }); try { await context.read().signout(); } catch (e) { } finally { Future.delayed(Duration(seconds: 1), () { if (mounted) { setState(() { _isLoading = false; }); } }); Navigator.of(context) .pushNamedAndRemoveUntil("/welcome", ModalRoute.withName('/welcome')); } } }