import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:tangheem/api/user_api_client.dart'; import 'package:tangheem/classes/colors.dart'; import 'package:tangheem/classes/utils.dart'; import 'package:tangheem/extensions/int_extensions.dart'; import 'package:tangheem/extensions/string_extensions.dart'; import 'package:tangheem/extensions/widget_extensions.dart'; import 'package:tangheem/models/country_model.dart'; import 'package:tangheem/models/general_response_model.dart'; import 'package:tangheem/ui/bottom_sheets/country_selection_bottom_sheet.dart'; import 'package:tangheem/ui/dialogs/general_dialog.dart'; import 'package:tangheem/ui/screens/contact_us_screen.dart'; import 'package:tangheem/widgets/common_textfield_widget.dart'; class RegistrationScreen extends StatefulWidget { static const String routeName = "/registration"; RegistrationScreen({Key key}) : super(key: key); @override _RegistrationScreenState createState() { return _RegistrationScreenState(); } } class _RegistrationScreenState extends State { TextEditingController _firstNameController = TextEditingController(); TextEditingController _lastNameController = TextEditingController(); TextEditingController _emailController = TextEditingController(); TextEditingController _mobileNumberController = TextEditingController(); TextEditingController _passwordController = TextEditingController(); TextEditingController _confirmPasswordController = TextEditingController(); bool _isAccept = false; CountryModelData _selectedCountry; CountryModel _countryModel; @override void initState() { super.initState(); fetchCountryList(); } void fetchCountryList() async { Utils.showLoading(context); try { _countryModel = await UserApiClient().getCountry(); if ((_countryModel?.data?.length ?? 0) > 0) { _selectedCountry = _countryModel.data.first; } setState(() {}); } catch (ex) { if (mounted) Utils.handleException(ex, null); } finally { Utils.hideLoading(context); } } void registerUser(String _firstName, String _lastName, String _email, String _password, String _countryCode, String _phone) async { Utils.showLoading(context); try { GeneralResponseModel model = await UserApiClient().registerUser(_firstName, _lastName, _email, _password, _countryCode, _phone); if (model.message == "UserRegistration Already Exists") { Utils.showToast("البريد الإلكتروني مستخدم سابقا"); Utils.hideLoading(context); return; } Utils.hideLoading(context); await showDialog( context: context, barrierColor: ColorConsts.secondaryWhite.withOpacity(0.8), builder: (BuildContext context) => GeneralDialog(message: "تم إنشاء الحساب بنجاح , الرجاء توثيق الحساب من خلال الرابط المرسل إلى بريدك الإلكتروني"), ); Navigator.pop(context); } catch (ex) { if (mounted) Utils.handleException(ex, null); Utils.hideLoading(context); } } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { bool isPortrait = MediaQuery.of(context).orientation == Orientation.portrait; Widget _header = Column( mainAxisSize: MainAxisSize.min, children: [ Padding( padding: EdgeInsets.only(top: 35, bottom: 24), child: SvgPicture.asset("assets/icons/regsiter_user.svg", width: 72, height: 72), ), "انشاء حساب جديد".toText(18, color: ColorConsts.darkText), ], ); Widget _dataInput = Column( mainAxisSize: MainAxisSize.min, children: [ CommonTextFieldWidget(hint: "البريد الإلكتروني", controller: _emailController, isEmail: true), SizedBox(height: 8), CommonTextFieldWidget(hint: "الاسم الأول", controller: _firstNameController), SizedBox(height: 8), CommonTextFieldWidget(hint: "الاسم الأخير", controller: _lastNameController), SizedBox(height: 8), CommonTextFieldWidget( hint: _selectedCountry?.countryNameAr ?? "الدولة", controller: null, suffixWidget: Icon(Icons.keyboard_arrow_down, size: 18, color: ColorConsts.secondaryOrange), onTap: () { _selectCountry(context); }, ), SizedBox(height: 8), CommonTextFieldWidget( hint: " رقم الجوال (اختياري)${" (" + (_selectedCountry?.countryCode ?? "+9xx") + " xxxxxxxxx)"}", controller: _mobileNumberController, suffixWidget: Text(_selectedCountry?.countryCode ?? "", textDirection: TextDirection.ltr), ), SizedBox(height: 8), CommonTextFieldWidget(hint: "تعيين كلمة المرور", controller: _passwordController), SizedBox(height: 8), CommonTextFieldWidget(hint: "تأكيد كلمة المرور", controller: _confirmPasswordController), Row( mainAxisSize: MainAxisSize.min, children: [ Icon(_isAccept ? Icons.check_box_rounded : Icons.check_box_outline_blank_rounded, color: ColorConsts.borderDark2Text, size: 17), SizedBox(width: 8), "جميع البيانات صحيحة ضمن اتفاقية الاستخدام".toText(14, color: ColorConsts.darkText).expanded, ], ).onPress(() { setState(() { _isAccept = !_isAccept; }); }).paddingOnly(top: 24, bottom: 24, left: 16, right: 16), ], ); List _dataList = [ _header, "قم بتعبئة بيانات طلب انشاء الحساب و ستصلك رسالة تأكيد, ومن ثم يمكنك الدخول لحسابك الجديد" .toText(13, color: ColorConsts.grey9FColor, textAlign: TextAlign.center) .paddingOnly(left: 24, right: 24, top: 18, bottom: 18), _dataInput.paddingOnly(left: 12, right: 12), ]; Widget _registrationButton = SizedBox( width: double.infinity, height: 50, child: TextButton( onPressed: () { if (_emailController.text.length < 1) { Utils.showToast("يرجى إدخال البريد الإلكتروني"); return; } if (_firstNameController.text.length < 1) { Utils.showToast("يرجى إدخال الاسم الأول"); return; } if (_lastNameController.text.length < 1) { Utils.showToast("يرجى إدخال الاسم الأخير"); return; } if (_selectedCountry?.countryCode == null) { Utils.showToast("يرجى اختيار الدولة"); return; } // if (_mobileNumberController.text.length < 1) { // Utils.showToast("يرجى إدخال رقم الجوال"); // return; // } else if (_mobileNumberController.text.isNotEmpty && (_mobileNumberController.text.length < 8 || _mobileNumberController.text.length > 12)) { Utils.showToast("رقم الهاتف غير صحيح"); return; } if (_passwordController.text.length < 1) { Utils.showToast("يرجى إدخال كلمة المرور"); return; } if (_confirmPasswordController.text.length < 1) { Utils.showToast("يرجى تأكيد كلمة المرور"); return; } if (!_emailController.text.isValidEmail()) { Utils.showToast("صيغة البريد الإلكتروني خاطئة"); return; } if (_passwordController.text != _confirmPasswordController.text) { Utils.showToast("كلمة المرور غير متطابقة"); return; } if (!_isAccept) { Utils.showToast("الرجاء الموافقة على سياسة الخصوصية"); return; } registerUser(_firstNameController.text, _lastNameController.text, _emailController.text, _passwordController.text, _selectedCountry?.countryCode, _mobileNumberController.text); }, style: TextButton.styleFrom( backgroundColor: ColorConsts.darkText, foregroundColor: Colors.white, textStyle: TextStyle(fontSize: 18), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(25.0), ), ), child: Text("انشئ حسابك"), ), ); Widget _contactUsButton = Column( mainAxisSize: MainAxisSize.min, children: [ SvgPicture.asset("assets/icons/new/contact_us.svg", width: 26, height: 24, color: ColorConsts.greyC4Color), 8.height, "اتصل بنا".toText(14, color: ColorConsts.greyC4Color), ], ).onPress(() { Navigator.pushNamed(context, ContactUsScreen.routeName); }); return isPortrait ? Scaffold( backgroundColor: ColorConsts.greyF8Color, body: SingleChildScrollView( padding: EdgeInsets.only(top: 100, bottom: 24), physics: BouncingScrollPhysics(), child: Column( mainAxisSize: MainAxisSize.min, children: [ Image.asset("assets/icons/new/Tangeem-logo.png", width: 116, height: 62), 30.height, Container( width: MediaQuery.of(context).size.width, decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.0), color: Colors.white), margin: EdgeInsets.only(left: 24, right: 24, top: 24, bottom: 20), child: Column(crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: _dataList), ), _registrationButton.paddingOnly(left: 35, right: 35, bottom: 35), _contactUsButton, ], ), ), ) : Row( children: [ Expanded(child: Image.asset("assets/icons/new/Tangeem-logo.png", width: 116, height: 62).paddingOnly(right: 70), flex: 3), Expanded( child: Container( width: MediaQuery.of(context).size.width, decoration: BoxDecoration(borderRadius: BorderRadius.circular(20.0), color: Colors.white), margin: EdgeInsets.all(24), child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Expanded(child: _header, flex: 2), Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(24), physics: const BouncingScrollPhysics(), child: Column( mainAxisSize: MainAxisSize.min, children: [ "قم بتعبئة بيانات طلب انشاء الحساب و ستصلك رسالة تأكيد, ومن ثم يمكنك الدخول لحسابك الجديد".toText(14, color: ColorConsts.grey9FColor, textAlign: TextAlign.center), 24.height, _dataInput, _registrationButton, 24.height, _contactUsButton, ], ), ), flex: 4), ], ), ), flex: 7), ], ); } void _selectCountry(context) { showModalBottomSheet( context: context, shape: RoundedRectangleBorder( borderRadius: BorderRadius.only( topLeft: Radius.circular(16), topRight: Radius.circular(16), ), ), backgroundColor: Colors.transparent, builder: (BuildContext bc) => CountrySelectionBottomSheet( countryList: _countryModel?.data ?? [], onSelectCountry: (country) { WidgetsBinding.instance.addPostFrameCallback((_) { setState(() { _selectedCountry = country; }); }); }), ); } }