Current File : /home/tradevaly/www/fresh/lib/view/screens/profile/profile_edit_screen.dart |
import 'package:flutter/material.dart';
import 'package:flutter_grocery/data/model/response/response_model.dart';
import 'package:flutter_grocery/data/model/response/userinfo_model.dart';
import 'package:flutter_grocery/helper/responsive_helper.dart';
import 'package:flutter_grocery/localization/language_constrants.dart';
import 'package:flutter_grocery/provider/auth_provider.dart';
import 'package:flutter_grocery/provider/profile_provider.dart';
import 'package:flutter_grocery/provider/splash_provider.dart';
import 'package:flutter_grocery/utill/color_resources.dart';
import 'package:flutter_grocery/utill/dimensions.dart';
import 'package:flutter_grocery/utill/images.dart';
import 'package:flutter_grocery/utill/styles.dart';
import 'package:flutter_grocery/view/base/custom_snackbar.dart';
import 'package:flutter_grocery/view/base/custom_text_field.dart';
import 'package:flutter_grocery/view/base/web_app_bar/web_app_bar.dart';
import 'package:flutter_grocery/view/screens/profile/web/profile_screen_web.dart';
import 'package:provider/provider.dart';
class ProfileEditScreen extends StatefulWidget {
final UserInfoModel userInfoModel;
ProfileEditScreen({this.userInfoModel});
@override
_ProfileEditScreenState createState() => _ProfileEditScreenState();
}
class _ProfileEditScreenState extends State<ProfileEditScreen> {
TextEditingController _firstNameController;
TextEditingController _lastNameController;
TextEditingController _emailController;
TextEditingController _phoneController;
TextEditingController _passwordController;
TextEditingController _confirmPasswordController;
FocusNode firstNameFocus;
FocusNode lastNameFocus;
FocusNode emailFocus;
FocusNode phoneFocus;
FocusNode passwordFocus;
FocusNode confirmPasswordFocus;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
Provider.of<ProfileProvider>(context, listen: false).getUserInfo(context);
_firstNameController = TextEditingController();
_lastNameController = TextEditingController();
_emailController = TextEditingController();
_phoneController = TextEditingController();
_passwordController = TextEditingController();
_confirmPasswordController = TextEditingController();
firstNameFocus = FocusNode();
lastNameFocus = FocusNode();
emailFocus = FocusNode();
phoneFocus = FocusNode();
passwordFocus = FocusNode();
confirmPasswordFocus = FocusNode();
_firstNameController.text = widget.userInfoModel.fName ?? '';
_lastNameController.text = widget.userInfoModel.lName ?? '';
_emailController.text = widget.userInfoModel.email ?? '';
_phoneController.text = widget.userInfoModel.phone ?? '';
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
// backgroundColor: Theme.of(context).cardColor,
appBar: ResponsiveHelper.isDesktop(context)? PreferredSize(child: WebAppBar(), preferredSize: Size.fromHeight(120)): AppBar(
backgroundColor: Theme.of(context).cardColor,
leading: IconButton(
icon: Icon(Icons.arrow_back_ios, color: Theme.of(context).primaryColor),
onPressed: () {
Provider.of<SplashProvider>(context, listen: false).setPageIndex(0);
Navigator.of(context).pop();
}),
title: Text(getTranslated('update_profile', context) ?? '',
style: poppinsMedium.copyWith(
fontSize: Dimensions.FONT_SIZE_SMALL,
color: Theme.of(context).textTheme.bodyText1.color,
)),
),
body: ResponsiveHelper.isDesktop(context)
? Consumer<ProfileProvider>(
builder: (context, profileProvider, child) {
return ProfileScreenWeb(
file: profileProvider.data,
pickImage: profileProvider.pickImage,
confirmPasswordController: _confirmPasswordController,
confirmPasswordFocus: confirmPasswordFocus,
emailController: _emailController,
firstNameController: _firstNameController,
firstNameFocus: firstNameFocus,
lastNameController: _lastNameController,
lastNameFocus: lastNameFocus,
emailFocus: emailFocus,
passwordController: _passwordController,
passwordFocus: passwordFocus,
phoneNumberController: _phoneController,
phoneNumberFocus: phoneFocus,
image: widget.userInfoModel.image,
);
}
)
: SafeArea(
child: Consumer<ProfileProvider>(
builder: (context, profileProvider, child) => Scrollbar(
child: SingleChildScrollView(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.all(Dimensions.PADDING_SIZE_SMALL),
child: Center(
child: SizedBox(
width: 1170,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// for profile image
Container(
margin: EdgeInsets.only(top: 25, bottom: 24),
alignment: Alignment.center,
decoration: BoxDecoration(
border: Border.all(color: ColorResources.getGreyColor(context), width: 3),
shape: BoxShape.circle,
),
child: InkWell(
onTap: () {
if(ResponsiveHelper.isMobilePhone()) {
profileProvider.choosePhoto();
}else {
profileProvider.pickImage();
}
},
child: Stack(
clipBehavior: Clip.none,
children: [
ClipRRect(
borderRadius: BorderRadius.circular(50),
child: profileProvider.file != null
? Image.file(profileProvider.file, width: 80, height: 80, fit: BoxFit.fill) : profileProvider.data != null
? Image.network(profileProvider.data.path, width: 80, height: 80, fit: BoxFit.fill) : ClipRRect(
borderRadius: BorderRadius.circular(50),
child: FadeInImage.assetNetwork(
placeholder: Images.placeholder(context),
width: 80, height: 80, fit: BoxFit.cover,
image: '${Provider.of<SplashProvider>(context, listen: false).baseUrls.customerImageUrl}'
'/${profileProvider.userInfoModel.image}',
imageErrorBuilder: (c, o, s) => Image.asset(Images.placeholder(context), height: 80, width: 80, fit: BoxFit.cover),
),
),
),
Positioned(
bottom: 5,
right: 0,
child: Image.asset(
Images.camera,
width: 24,
height: 24,
),
),
],
),
),
),
SizedBox(height: 10),
//mobileNumber,email,gender
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// for first name section
Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
getTranslated('first_name', context),
style: poppinsRegular.copyWith(
fontSize: Dimensions.FONT_SIZE_EXTRA_SMALL,
color: ColorResources.getHintColor(context),
),
),
),
CustomTextField(
hintText: getTranslated('enter_first_name', context),
isElevation: false,
isPadding: false,
controller: _firstNameController,
focusNode: firstNameFocus,
nextFocus: lastNameFocus,
),
],
),
Positioned(bottom: 0, left: 20, right: 20, child: Divider()),
],
),
SizedBox(height: 15),
// for Last name section
Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
getTranslated('last_name', context),
style:
poppinsRegular.copyWith(
fontSize: Dimensions.FONT_SIZE_EXTRA_SMALL,
color: ColorResources.getHintColor(context),
),
),
),
CustomTextField(
hintText: getTranslated('enter_last_name', context),
isElevation: false,
isPadding: false,
controller: _lastNameController,
focusNode: lastNameFocus,
nextFocus: emailFocus,
),
],
),
Positioned(bottom: 0, left: 20, right: 20, child: Divider()),
],
),
SizedBox(height: 15),
// for email section
Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
getTranslated('email', context),
style: poppinsRegular.copyWith(
fontSize: Dimensions.FONT_SIZE_EXTRA_SMALL,
color: ColorResources.getHintColor(context),
),
),
),
CustomTextField(
hintText: getTranslated('enter_email_address', context),
isElevation: false,
isPadding: false,
isEnabled: false,
controller: _emailController,
focusNode: emailFocus,
nextFocus: phoneFocus,
inputType: TextInputType.emailAddress,
),
],
),
Positioned(bottom: 0, left: 20, right: 20, child: Divider()),
],
),
SizedBox(height: 15),
// for Phone Number section
Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
getTranslated('phone_number', context) ?? '',
style: poppinsRegular.copyWith(
fontSize: Dimensions.FONT_SIZE_EXTRA_SMALL,
color: ColorResources.getHintColor(context),
),
),
),
CustomTextField(
hintText: getTranslated('enter_phone_number', context),
isElevation: false,
isPadding: false,
controller: _phoneController,
focusNode: phoneFocus,
nextFocus: passwordFocus,
inputType: TextInputType.phone,
),
],
),
Positioned(bottom: 0, left: 20, right: 20, child: Divider()),
],
),
SizedBox(height: 15),
Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
getTranslated('password', context) ?? '',
style: poppinsRegular.copyWith(
fontSize: Dimensions.FONT_SIZE_EXTRA_SMALL,
color: ColorResources.getHintColor(context),
),
),
),
CustomTextField(
hintText: getTranslated('password_hint', context),
isElevation: false,
isPadding: false,
isPassword: true,
isShowSuffixIcon: true,
controller: _passwordController,
focusNode: passwordFocus,
nextFocus: confirmPasswordFocus,
),
],
),
Positioned(bottom: 0, left: 20, right: 20, child: Divider()),
],
),
SizedBox(height: 15),
Stack(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Text(
getTranslated('confirm_password', context) ?? '',
style:
poppinsRegular.copyWith(
fontSize: Dimensions.FONT_SIZE_EXTRA_SMALL,
color: ColorResources.getHintColor(context),
),
),
),
CustomTextField(
hintText: getTranslated('password_hint', context),
isElevation: false,
isPadding: false,
isPassword: true,
isShowSuffixIcon: true,
controller: _confirmPasswordController,
focusNode: confirmPasswordFocus,
inputAction: TextInputAction.done,
),
],
),
Positioned(bottom: 0, left: 20, right: 20, child: Divider()),
],
),
],
),
SizedBox(height: 50),
!profileProvider.isLoading
? TextButton(
onPressed: () async {
String _firstName = _firstNameController.text.trim();
String _lastName = _lastNameController.text.trim();
String _phoneNumber = _phoneController.text.trim();
String _password = _passwordController.text.trim();
String _confirmPassword = _confirmPasswordController.text.trim();
if (profileProvider.userInfoModel.fName == _firstName &&
profileProvider.userInfoModel.lName == _lastName &&
profileProvider.userInfoModel.phone == _phoneNumber &&
profileProvider.userInfoModel.email == _emailController.text
&& profileProvider.file == null && profileProvider.data == null
&& _password.isEmpty && _confirmPassword.isEmpty) {
showCustomSnackBar(getTranslated('change_something_to_update', context), context);
}else if (_firstName.isEmpty) {
showCustomSnackBar(getTranslated('enter_first_name', context), context);
}else if (_lastName.isEmpty) {
showCustomSnackBar(getTranslated('enter_last_name', context), context);
}else if (_phoneNumber.isEmpty) {
showCustomSnackBar(getTranslated('enter_phone_number', context), context);
} else if((_password.isNotEmpty && _password.length < 6)
|| (_confirmPassword.isNotEmpty && _confirmPassword.length < 6)) {
showCustomSnackBar(getTranslated('password_should_be', context), context);
} else if(_password != _confirmPassword) {
showCustomSnackBar(getTranslated('password_did_not_match', context), context);
} else {
UserInfoModel updateUserInfoModel = profileProvider.userInfoModel;
updateUserInfoModel.fName = _firstNameController.text ?? "";
updateUserInfoModel.lName = _lastNameController.text ?? "";
updateUserInfoModel.phone = _phoneController.text ?? '';
ResponseModel _responseModel = await profileProvider.updateUserInfo(
updateUserInfoModel,_password,
profileProvider.file, profileProvider.data,
Provider.of<AuthProvider>(context, listen: false).getUserToken(),
);
if (_responseModel.isSuccess) {
profileProvider.getUserInfo(context);
_passwordController.text = '';
_confirmPasswordController.text = '';
showCustomSnackBar(getTranslated('updated_successfully', context),context,isError: false);
} else {
showCustomSnackBar(_responseModel.message,context,isError: true);
}
setState(() {});
}
},
child: Container(
height: 50,
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(10),
),
child: Center(
child: Text(
getTranslated('save', context),
style: TextStyle(
color: Colors.white,
fontSize: 15,
),
),
),
),
)
: Center(child: CircularProgressIndicator(valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor))),
],
),
),
),
),
),
),
),
);
}
}