import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:telnow_mobile_new/src/api/api_auth_provider.dart'; import 'package:telnow_mobile_new/src/api/api_auth_repository.dart'; import 'package:telnow_mobile_new/src/injector/injector.dart'; import 'package:telnow_mobile_new/src/layouts/components/template.dart'; import 'package:telnow_mobile_new/src/model/login/login_body.dart'; import 'package:telnow_mobile_new/src/model/token/token.dart'; import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart'; import 'package:telnow_mobile_new/src/utils/U.dart'; class MobPasswordPage extends StatefulWidget { Map user; MobPasswordPage({required this.user, super.key}); @override State createState() => _MobPasswordPageState(); } class _MobPasswordPageState extends State { final ApiAuthProvider apiAuthProvider = ApiAuthProvider(); final ApiAuthRepository apiAuthRepository = ApiAuthRepository(); final SharedPreferencesManager sharedPreferencesManager = locator(); String controllerOld = ''; String controllerNew = ''; String controllerConfirm = ''; @override Widget build(BuildContext context) { return Scaffold( backgroundColor: backgroundColor, appBar: appBarTemplate(context: context, title: 'settingPassword'.tr()), body: Column( children: [ divider(), Expanded( child: Container( alignment: Alignment.topCenter, width: U.bodyWidth(context), child: SingleChildScrollView( padding: EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( margin: EdgeInsets.only(bottom: 5), child: Text('titlePassOld'.tr(), style: TextStyle(fontSize: 16, color: textColor)), ), passwordFieldTemplate(value: controllerOld, iconColor: textColor.withValues(alpha: 0.5), color: textColor, placeholder: 'oldPassword'.tr(), action: (val)=>controllerOld=val), Container( margin: EdgeInsets.only(top: 20, bottom: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('titlePassNew'.tr(), style: TextStyle(fontSize: 16, color: textColor)), SizedBox(height: 10), Text('newPassword'.tr(), style: TextStyle(fontSize: 16, color: textColor)), ], ) ), passwordFieldTemplate(value: controllerNew, placeholder: 'newPassword'.tr(), action: (val)=>controllerNew=val), Container( margin: EdgeInsets.only(top: 20, bottom: 5), child: Text('confirmPassword'.tr(), style: TextStyle(fontSize: 16, color: textColor)), ), passwordFieldTemplate(value: controllerConfirm, placeholder: 'confirmPassword'.tr(), action: (val)=>controllerConfirm=val) ], ), ), ), ), Container( padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16), decoration: BoxDecoration( color: Colors.white, border: Border(top: BorderSide(color: textColor.withValues(alpha: 0.15))) ), child: buttonTemplate(text: 'buttonSave'.tr(), action: ()async{ if(controllerOld.trim().isNotEmpty && controllerNew.trim().isNotEmpty && controllerConfirm.trim().isNotEmpty){ if(controllerNew == controllerConfirm){ var data = { 'oldPassword':controllerOld.trim(), 'password':controllerNew.trim() }; var res = await apiAuthProvider.patchData('/api/informants/'+widget.user['id'].toString()+'/changePassword', data, context); if(res != null){ String username = widget.user['_isRelated']?widget.user['relatedTo']:widget.user['userId']; String? password = widget.user['_isRelated'] && widget.user['tenantCode']!=null && widget.user['tenantCode']!=''?widget.user['tenantCode']+' '+data['password']:data['password']; LoginBody loginBody = LoginBody(username, password!, 'password'); Token token = await apiAuthRepository.postLoginUser(loginBody); if (token.error != null) { showError(context, token.error); } else{ await sharedPreferencesManager.putString(SharedPreferencesManager.keyAccessToken, token.accessToken!); await sharedPreferencesManager.putString(SharedPreferencesManager.keyRefreshToken, token.refreshToken!); await sharedPreferencesManager.putString(SharedPreferencesManager.keyUsername, widget.user['_isRelated']?widget.user['tenantCode']!=null && widget.user['tenantCode']!=''?widget.user['tenantCode']+' '+data['password']!:data['password']!:widget.user['userId']); Navigator.of(context).pop(true); } } } else{ showError(context, 'checkNewPass'.tr()); } } else{ showError(context, 'cannotEmpty'.tr()); } }), ) ], ), ); } Widget passwordFieldTemplate({required String value, iconColor = primaryColor, Color color = primaryColor, placeholder = '', required action(value)}){ TextEditingController controller = TextEditingController()..text = value; bool hidePass = true; return SizedBox( width: double.infinity, child: StatefulBuilder( builder: (context, fieldState) => TextFormField( controller: controller, style: TextStyle(fontSize: 16, color: color), keyboardType: widget.user['_isRelated']?TextInputType.number:null, inputFormatters: widget.user['_isRelated']?[FilteringTextInputFormatter.digitsOnly]:null, enableInteractiveSelection: widget.user['_isRelated']?false:true, obscureText: hidePass, decoration: InputDecoration( hintText: placeholder, hintStyle: TextStyle(fontSize: 16, color: color.withValues(alpha: 0.5)), filled: true, fillColor: Colors.white, hoverColor: textColor.withValues(alpha: 0.1), contentPadding: EdgeInsets.all(16), border: InputBorder.none, prefixIcon: U.iconsax('bold/key', size: 24, color: iconColor), suffixIconConstraints: BoxConstraints(maxHeight: 40, maxWidth: 40, minHeight: 40, minWidth: 40), suffixIcon: GestureDetector(child: U.iconsax(hidePass?'eye':'eye-slash', size: 24, color: textColor.withValues(alpha: 0.5)), onTap: ()=>fieldState(()=>hidePass=!hidePass)), enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: textColor.withValues(alpha: 0.5))), focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: textColor.withValues(alpha: 0.5))), isDense: true ), onChanged: (val)=>action(val.toString()), ), ), ); } }