From 55f2d067e0e33184d160ad15489e1bcfc9b04bb0 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Wed, 9 Oct 2024 17:02:34 -0300 Subject: [PATCH] WIP --- lib/main.dart | 24 +- .../forgot_password_screen.dart | 303 +++++++++++------- .../authentication_service.dart | 8 +- 3 files changed, 200 insertions(+), 135 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index db89d915..0ac2f3ae 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -199,17 +199,23 @@ class _AppState extends State { final String token = uri.queryParameters['token'] ?? ''; final BuildContext context = StorageUtil().context!; final bool isNotEmpty = email.isNotEmpty && token.isNotEmpty; - log('openAppLink: $uri'); - - if (isNotEmpty) + final MediaQueryData mediaQuery = MediaQuery.of(context); + final double height = mediaQuery.size.height * 0.8; + final FlutterFlowTheme theme = FlutterFlowTheme.of(context); + final Widget screen = ForgotPasswordScreen(email: email, token: token); + final Widget Function(BuildContext) builder = (context) => screen; + if (isNotEmpty) { showModalBottomSheet( - context: context, - builder: (context) => ForgotPasswordScreen(email: email, token: token), - showDragHandle: true, - backgroundColor: FlutterFlowTheme.of(context).primaryBackground, - ) - .then((_) => StorageUtil().isRecovered = false); + context: context, + builder: (context) => SizedBox(height: height, child: builder(context)), + isScrollControlled: true, + showDragHandle: true, + barrierColor: theme.primaryText.withOpacity(0.7), + backgroundColor: theme.primaryBackground, + + ).then((_) => StorageUtil().isRecovered = false); + } // Use the extracted email and token as needed // navigatorKey.currentState?.pushNamed('/forgotPassword', arguments: {'email': email, 'token': token}); diff --git a/lib/pages/forgot_password_page/forgot_password_screen.dart b/lib/pages/forgot_password_page/forgot_password_screen.dart index 2686ca47..00c9509b 100644 --- a/lib/pages/forgot_password_page/forgot_password_screen.dart +++ b/lib/pages/forgot_password_page/forgot_password_screen.dart @@ -88,146 +88,200 @@ class _ForgotPasswordScreenState extends State with Ticker super.dispose(); } - @override Widget build(BuildContext context) { - final MediaQueryData mediaQuery = MediaQuery.of(context); - return buildBody(context); + @override Widget build(BuildContext context) => buildBody(context); + + AppBar buildAppBar(BuildContext context) { + return AppBar( + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + automaticallyImplyLeading: false, + forceMaterialTransparency: true, + leading: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 60.0, + icon: Icon( + Icons.keyboard_arrow_left, + color: FlutterFlowTheme.of(context).primaryText, + size: 30.0, + ), + onPressed: () async { + context.pop(); + StorageUtil().isRecovered = true; + }, + ), + title: Text( + FFLocalizations.of(context).getVariableText( + ptText: 'Recuperar Senha', + enText: 'Recover Password', + + ), + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 15.0, + fontWeight: FontWeight.bold, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + actions: const [], + centerTitle: true, + elevation: 0.0, + ); } - Row buildBody(BuildContext context) { + SafeArea buildBody(BuildContext context) { late final String message = FFLocalizations.of(context).getVariableText( ptText: 'Qual serĂ¡ a sua nova senha? Insira abaixo e confirme.', enText: 'What will be your new password? Enter it below and confirm.', ); - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - flex: 6, - child: Container( - width: 100.0, - height: double.infinity, - decoration: BoxDecoration(color: FlutterFlowTheme.of(context).primaryBackground), - alignment: const AlignmentDirectional(0.0, -1.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - width: 291.0, - height: 167.0, - decoration: const BoxDecoration(), - child: ClipRRect( - borderRadius: BorderRadius.circular(8.0), - child: const AtomImageSvgTheme(filename: 'register', width: 600, height: 155), + return SafeArea( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration(color: FlutterFlowTheme.of(context).primaryBackground), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: const AtomImageSvgTheme(filename: 'register', width: 600, height: 155), + ), ), - ), - Padding( - padding: const EdgeInsets.all(34.0), - child: Material( - child: Container( - width: double.infinity, - constraints: const BoxConstraints(maxWidth: 570.0), - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(12.0), - ), - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Column( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB(20.0, 24.0, 0.0, 30.0), - child: Text( - message, - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context).bodyMedium.override( - fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts.asMap().containsKey( - FlutterFlowTheme.of(context).bodyMediumFamily), - ), - ), - ), - ), - Form( - key: _model.formKey, - autovalidateMode: AutovalidateMode.onUserInteraction, - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - _buildPasswordField( - context, - controller: _model.passwordRegisterFormTextController, - focusNode: _model.passwordRegisterFormFocusNode, - visibility: _model.passwordRegisterFormVisibility, - onVisibilityToggle: () => setState(() => _model.passwordRegisterFormVisibility = !_model.passwordRegisterFormVisibility), - ), - _buildPasswordField( - context, - controller: _model.passwordConfirmFormTextController, - focusNode: _model.passwordConfirmFormFocusNode, - visibility: _model.passwordConfirmFormVisibility, - onVisibilityToggle: () => setState(() => _model.passwordConfirmFormVisibility = !_model.passwordConfirmFormVisibility), - ), - ], - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0), - child: FFButtonWidget( - key: const ValueKey('SubmitButtonWidget'), - onPressed: _model.isFormInvalid() ? null : () async { - await AuthenticationService.changePassword(context, widget.email, _model.passwordRegisterFormTextController!.text, widget.token); - setState(() {}); - }, - text: FFLocalizations.of(context).getVariableText( - ptText: 'Enviar', - enText: 'Submit', - ), - options: FFButtonOptions( - width: double.infinity, - height: 44.0, - color: FlutterFlowTheme.of(context).accent1, - textStyle: FlutterFlowTheme.of(context).titleSmall.override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).secondaryText, - fontSize: 16.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans')), - elevation: 3.0, - borderSide: const BorderSide(color: Colors.transparent, width: 1.0), - borderRadius: BorderRadius.circular(12.0), - disabledColor: FlutterFlowTheme.of(context).customColor5, - disabledTextColor: Colors.white, - ), - showLoadingIndicator: true, - ), - ), - ], + Padding( + padding: const EdgeInsets.all(34.0), + child: Material( + child: Container( + width: double.infinity, + constraints: const BoxConstraints(maxWidth: 570.0), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(12.0), ), - ), - ).animateOnPageLoad(animationsMap['containerOnPageLoadAnimation']!), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB(20.0, 24.0, 0.0, 30.0), + child: Text( + message, + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily, + fontWeight: FontWeight.bold, + useGoogleFonts: GoogleFonts.asMap().containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ), + ), + Form( + key: _model.formKey, + autovalidateMode: AutovalidateMode.onUserInteraction, + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + _buildPasswordField( + context, + controller: _model.passwordRegisterFormTextController, + focusNode: _model.passwordRegisterFormFocusNode, + visibility: _model.passwordRegisterFormVisibility, + onVisibilityToggle: () => setState(() => _model.passwordRegisterFormVisibility = !_model.passwordRegisterFormVisibility), + ), + _buildPasswordField( + context, + controller: _model.passwordConfirmFormTextController, + focusNode: _model.passwordConfirmFormFocusNode, + visibility: _model.passwordConfirmFormVisibility, + onVisibilityToggle: () => setState(() => _model.passwordConfirmFormVisibility = !_model.passwordConfirmFormVisibility), + ), + ], + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + key: const ValueKey('SubmitButtonWidget'), + onPressed: _model.isFormInvalid() ? null : () async { + await AuthenticationService.changePassword(context, widget.email, _model.passwordRegisterFormTextController!.text, widget.token); + setState(() {}); + }, + text: FFLocalizations.of(context).getVariableText( + ptText: 'Enviar', + enText: 'Submit', + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + color: FlutterFlowTheme.of(context).accent1, + textStyle: FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).secondaryText, + fontSize: 16.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans')), + elevation: 3.0, + borderSide: const BorderSide(color: Colors.transparent, width: 1.0), + borderRadius: BorderRadius.circular(12.0), + disabledColor: FlutterFlowTheme.of(context).customColor5, + disabledTextColor: Colors.white, + ), + showLoadingIndicator: true, + ), + ), + ], + ), + ), + ).animateOnPageLoad(animationsMap['containerOnPageLoadAnimation']!), + ), ), - ), - ], + ], + ), ), ), ), ), - ), - ], + ], + ), ); } - Widget _buildPasswordField(BuildContext context, {required TextEditingController? controller, required FocusNode? focusNode, required bool visibility, required VoidCallback onVisibilityToggle}){ + Widget _buildPasswordField( + BuildContext context, { + required TextEditingController? controller, + required FocusNode? focusNode, + required bool visibility, + required VoidCallback onVisibilityToggle}){ + final label = FFLocalizations.of(context).getVariableText( + ptText: 'Senha', + enText: 'Password', + ); + final hint = FFLocalizations.of(context).getVariableText( + ptText: 'Insira sua senha', + enText: 'Enter your password', + ); + return Padding( padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0), child: SizedBox( @@ -246,7 +300,8 @@ class _ForgotPasswordScreenState extends State with Ticker obscureText: !visibility, decoration: InputDecoration( isDense: true, - labelText: FFLocalizations.of(context).getText('0firji8'), + hintText: hint, + labelText: label, labelStyle: FlutterFlowTheme.of(context).labelLarge.override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of(context).primaryText, diff --git a/lib/shared/services/authentication/authentication_service.dart b/lib/shared/services/authentication/authentication_service.dart index ceb8ab31..df69ead1 100644 --- a/lib/shared/services/authentication/authentication_service.dart +++ b/lib/shared/services/authentication/authentication_service.dart @@ -164,6 +164,7 @@ class AuthenticationService { } static Future changePassword(BuildContext context, String email, String password, String token) async { + try { final ApiCallResponse response = await PhpGroup.changePasswordCall.call(email: email, psswd: password, token: token); if (response.jsonBody['error'] == false) { @@ -171,11 +172,14 @@ class AuthenticationService { enText: "Password changed successfully!", ptText: "Senha alterada com sucesso!", ); - DialogUtil.success(context, message); - context.go('/homePage'); + DialogUtil.success(context, message).then((_) => context.pop); } else { final String message = response.jsonBody['error_msg']; DialogUtil.error(context, message); + } } catch (e, s) { + DialogUtil.errorDefault(context); + LogUtil.requestAPIFailed( + 'changePassword.php', email, "Change Password", e, s); }