import 'package:hub/modals/forms/forgot_password/widget.dart'; import 'package:hub/shared/components/atoms/atom_image_svg_theme.dart'; import '/commons/widgets/flutter_flow_animations.dart'; import '/commons/widgets/flutter_flow_theme.dart'; import '/commons/widgets/flutter_flow_util.dart'; import '/commons/widgets/flutter_flow_widgets.dart'; import '/commons/actions/actions.dart' as action_blocks; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:google_fonts/google_fonts.dart'; export 'component.dart'; class SignInTemplateComponentModel extends FlutterFlowModel { /// State fields for stateful widgets in this component. final formKey = GlobalKey(); // State field(s) for emailAddress widget. FocusNode? emailAddressFocusNode; TextEditingController? emailAddressTextController; String? Function(BuildContext, String?)? emailAddressTextControllerValidator; String? _emailAddressTextControllerValidator( BuildContext context, String? val) { if (val == null || val.isEmpty) { return FFLocalizations.of(context).getText( 'xhnawzcb' /* Campo é necessário */, ); } if (!RegExp(kTextValidatorEmailRegex).hasMatch(val)) { return 'Has to be a valid email address.'; } return null; } // State field(s) for password widget. FocusNode? passwordFocusNode; TextEditingController? passwordTextController; late bool passwordVisibility; String? Function(BuildContext, String?)? passwordTextControllerValidator; String? _passwordTextControllerValidator(BuildContext context, String? val) { if (val == null || val.isEmpty) { return FFLocalizations.of(context).getText( '9cs5wlmc' /* Campo é necessário */, ); } return null; } @override void initState(BuildContext context) { emailAddressTextControllerValidator = _emailAddressTextControllerValidator; passwordVisibility = false; passwordTextControllerValidator = _passwordTextControllerValidator; } @override void dispose() { emailAddressFocusNode?.dispose(); emailAddressTextController?.dispose(); passwordFocusNode?.dispose(); passwordTextController?.dispose(); } } class SignInTemplateComponentWidget extends StatefulWidget { const SignInTemplateComponentWidget({ super.key, required this.toggleSignUpPage, }); final Future Function()? toggleSignUpPage; @override State createState() => _SignInTemplateComponentWidgetState(); } class _SignInTemplateComponentWidgetState extends State with TickerProviderStateMixin { late SignInTemplateComponentModel _model; final animationsMap = {}; @override void setState(VoidCallback callback) { super.setState(callback); _model.onUpdate(); } @override void initState() { super.initState(); _model = createModel(context, () => SignInTemplateComponentModel()); _model.emailAddressTextController ??= TextEditingController(); _model.emailAddressFocusNode ??= FocusNode(); _model.passwordTextController ??= TextEditingController(); _model.passwordFocusNode ??= FocusNode(); animationsMap.addAll({ 'containerOnPageLoadAnimation': AnimationInfo( trigger: AnimationTrigger.onPageLoad, effectsBuilder: () => [ VisibilityEffect(duration: 1.ms), FadeEffect( curve: Curves.easeInOut, delay: 0.0.ms, duration: 300.0.ms, begin: 0.0, end: 1.0, ), MoveEffect( curve: Curves.easeInOut, delay: 0.0.ms, duration: 300.0.ms, begin: const Offset(0.0, 140.0), end: const Offset(0.0, 0.0), ), ScaleEffect( curve: Curves.easeInOut, delay: 0.0.ms, duration: 300.0.ms, begin: const Offset(0.9, 0.9), end: const Offset(1.0, 1.0), ), TiltEffect( curve: Curves.easeInOut, delay: 0.0.ms, duration: 300.0.ms, begin: const Offset(-0.349, 0), end: const Offset(0, 0), ), ], ), }); } @override void dispose() { _model.maybeDispose(); super.dispose(); } @override Widget build(BuildContext context) { return Row( mainAxisSize: MainAxisSize.max, children: [ Expanded( flex: 6, child: Container( width: 100.0, height: double.infinity, decoration: const BoxDecoration(), 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: [ Padding( padding: const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 35.0), child: Container( width: 548.0, height: 112.0, decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.0), ), alignment: const AlignmentDirectional(0.0, 0.0), child: Padding( padding: const EdgeInsets.all(20.0), child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: Align( alignment: const AlignmentDirectional(0.0, 1.0), child: Padding( padding: const EdgeInsets.all(3.0), child: Text( FFLocalizations.of(context).getText( '9hbdjxrz' /* VAMOS LA! ENTRE COM A SUA CONT... */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) .displaySmall .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of(context) .primaryText, fontSize: 24.0, letterSpacing: 0.0, fontWeight: FontWeight.w500, useGoogleFonts: GoogleFonts.asMap() .containsKey( 'Plus Jakarta Sans'), ), ), ), ), ), ], ), ), ), ), Container( width: 291.0, height: 167.0, decoration: const BoxDecoration(), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: const AtomImageSVGTheme(filename: 'login', width: 600, height: 155), ), ), Column( mainAxisSize: MainAxisSize.max, children: [ Align( alignment: const AlignmentDirectional(0.0, 0.0), child: Padding( padding: const EdgeInsetsDirectional.fromSTEB( 34.0, 0.0, 34.0, 0.0), child: Container( width: double.infinity, constraints: const BoxConstraints( maxWidth: 570.0, ), decoration: BoxDecoration( color: FlutterFlowTheme.of(context) .primaryBackground, borderRadius: BorderRadius.circular(12.0), shape: BoxShape.rectangle, ), child: Align( alignment: const AlignmentDirectional(0.0, 0.0), child: Padding( padding: const EdgeInsets.all(32.0), child: Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [ Form( key: _model.formKey, autovalidateMode: AutovalidateMode.onUserInteraction, child: Column( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 16.0), child: SizedBox( width: double.infinity, child: TextFormField( controller: _model .emailAddressTextController, focusNode: _model .emailAddressFocusNode, autofocus: false, textCapitalization: TextCapitalization.none, textInputAction: TextInputAction.next, obscureText: false, decoration: InputDecoration( isDense: true, labelText: FFLocalizations.of( context) .getText( '1ltg0ylb' /* Email */, ), labelStyle: FlutterFlowTheme .of(context) .labelLarge .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme .of(context) .primaryText, fontSize: 16.0, letterSpacing: 0.0, fontWeight: FontWeight.w500, useGoogleFonts: GoogleFonts .asMap() .containsKey( 'Plus Jakarta Sans'), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .customColor1, width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .success, width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .error, width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .error, width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), suffixIcon: Icon( Icons.email, color: FlutterFlowTheme.of( context) .accent1, size: 22.0, ), ), style: FlutterFlowTheme.of( context) .bodyLarge .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .primaryText, fontSize: 16.0, letterSpacing: 0.0, fontWeight: FontWeight.w500, useGoogleFonts: GoogleFonts .asMap() .containsKey( 'Plus Jakarta Sans'), ), keyboardType: TextInputType .emailAddress, validator: _model .emailAddressTextControllerValidator .asValidator(context), ), ), ), Padding( padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 16.0), child: SizedBox( width: double.infinity, child: TextFormField( controller: _model .passwordTextController, focusNode: _model.passwordFocusNode, autofocus: false, textInputAction: TextInputAction.send, obscureText: !_model .passwordVisibility, decoration: InputDecoration( isDense: true, labelText: FFLocalizations.of( context) .getText( '2x19ce8k' /* Senha */, ), labelStyle: FlutterFlowTheme .of(context) .labelLarge .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme .of(context) .primaryText, fontSize: 16.0, letterSpacing: 0.0, fontWeight: FontWeight.w500, useGoogleFonts: GoogleFonts .asMap() .containsKey( 'Plus Jakarta Sans'), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .customColor1, width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), focusedBorder: OutlineInputBorder( borderSide: const BorderSide( color: Color(0xFF1AAB5F), width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), errorBorder: OutlineInputBorder( borderSide: const BorderSide( color: Color(0xFFFF5963), width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), focusedErrorBorder: OutlineInputBorder( borderSide: const BorderSide( color: Color(0xFFFF5963), width: 0.25, ), borderRadius: BorderRadius.circular( 12.0), ), filled: true, fillColor: FlutterFlowTheme.of( context) .primaryBackground, suffixIcon: InkWell( onTap: () => setState( () => _model .passwordVisibility = !_model .passwordVisibility, ), focusNode: FocusNode( skipTraversal: true), child: Icon( _model.passwordVisibility ? Icons .visibility_outlined : Icons .visibility_off_outlined, color: FlutterFlowTheme.of( context) .accent1, size: 24.0, ), ), ), style: FlutterFlowTheme.of( context) .bodyLarge .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .primaryText, fontSize: 16.0, letterSpacing: 0.0, fontWeight: FontWeight.w500, useGoogleFonts: GoogleFonts .asMap() .containsKey( 'Plus Jakarta Sans'), ), validator: _model .passwordTextControllerValidator .asValidator(context), ), ), ), ], ), ), Builder( builder: (context) { if (MediaQuery.sizeOf(context).width < kBreakpointSmall ? true : false) { return Column( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 16.0), child: FFButtonWidget( onPressed: () async { await action_blocks .singInLoginAction( context, emailAdress: _model .emailAddressTextController .text, password: _model .passwordTextController .text, ); setState(() {}); }, text: FFLocalizations.of( context) .getText( 'k44tm7wo' /* Entrar */, ), options: FFButtonOptions( width: double.infinity, height: 44.0, padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), iconPadding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), color: FlutterFlowTheme.of( context) .primary, textStyle: FlutterFlowTheme.of( context) .titleSmall .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .info, fontSize: 16.0, letterSpacing: 0.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), ), showLoadingIndicator: false, ), ), Padding( padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 16.0), child: FFButtonWidget( onPressed: () async { await widget .toggleSignUpPage ?.call(); }, text: FFLocalizations.of( context) .getText( '14u7ipws' /* Cadastrar */, ), options: FFButtonOptions( width: double.infinity, height: 44.0, padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), iconPadding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), color: FlutterFlowTheme.of( context) .customColor1, textStyle: FlutterFlowTheme.of( context) .titleSmall .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .secondaryText, fontSize: 16.0, letterSpacing: 0.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), ), showLoadingIndicator: false, ), ), ], ); } else { return Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Expanded( child: Padding( padding: const EdgeInsetsDirectional .fromSTEB(0.0, 0.0, 0.0, 16.0), child: FFButtonWidget( onPressed: (((_model.emailAddressTextController .text == '') || ((_model.emailAddressFocusNode ?.hasFocus ?? false) != null)) && ((_model.emailAddressTextController .text == '') || ((_model.passwordTextController.text == '') || ((_model.passwordFocusNode?.hasFocus ?? false) != null)))) ? null : () async { await action_blocks .singInLoginAction( context, emailAdress: _model .emailAddressTextController .text, password: _model .passwordTextController .text, ); setState(() {}); }, text: FFLocalizations.of( context) .getText( '1x926nsn' /* Entrar */, ), options: FFButtonOptions( width: double.infinity, height: 44.0, padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), iconPadding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), color: FlutterFlowTheme.of( context) .accent1, textStyle: FlutterFlowTheme.of( context) .titleSmall .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .info, fontSize: 16.0, letterSpacing: 0.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: const Color(0xE81AAB5F), ), showLoadingIndicator: false, ), ), ), Expanded( child: Padding( padding: const EdgeInsetsDirectional .fromSTEB(0.0, 0.0, 0.0, 16.0), child: FFButtonWidget( onPressed: () async { await widget .toggleSignUpPage ?.call(); }, text: FFLocalizations.of( context) .getText( 'jwvd4ai1' /* Cadastrar */, ), options: FFButtonOptions( width: double.infinity, height: 44.0, padding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), iconPadding: const EdgeInsetsDirectional .fromSTEB( 0.0, 0.0, 0.0, 0.0), color: FlutterFlowTheme.of( context) .customColor1, textStyle: FlutterFlowTheme.of( context) .titleSmall .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .secondaryText, fontSize: 16.0, letterSpacing: 0.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), ), showLoadingIndicator: false, ), ), ), ].divide(const SizedBox(width: 7.0)), ); } }, ), // You will have to add an action on this rich text to go to your login page. Padding( padding: const EdgeInsetsDirectional.fromSTEB( 0.0, 12.0, 0.0, 12.0), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { await showModalBottomSheet( isScrollControlled: true, backgroundColor: Colors.transparent, enableDrag: false, context: context, builder: (context) { return Padding( padding: MediaQuery.viewInsetsOf( context), child: const ForgotPasswordTemplateComponentWidget(), ); }, ).then( (value) => safeSetState(() {})); }, child: RichText( textScaler: MediaQuery.of(context) .textScaler, text: TextSpan( children: [ TextSpan( text: FFLocalizations.of( context) .getText( '05dx91ku' /* Você esqueceu a sua senha? */, ), style: TextStyle( color: FlutterFlowTheme.of( context) .primaryText, ), ), TextSpan( text: FFLocalizations.of( context) .getText( 'p5c6d54y' /* Recupere aqui */, ), style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Plus Jakarta Sans', color: FlutterFlowTheme.of( context) .primary, fontSize: 14.0, letterSpacing: 0.0, fontWeight: FontWeight.normal, useGoogleFonts: GoogleFonts .asMap() .containsKey( 'Plus Jakarta Sans'), ), mouseCursor: SystemMouseCursors.click, recognizer: TapGestureRecognizer() ..onTap = () async { await showModalBottomSheet( isScrollControlled: true, backgroundColor: Colors .transparent, context: context, builder: (context) { return Padding( padding: MediaQuery .viewInsetsOf( context), child: const ForgotPasswordTemplateComponentWidget(), ); }, ).then((value) => safeSetState( () {})); }, ) ], style: FlutterFlowTheme.of(context) .bodyMedium .override( fontFamily: FlutterFlowTheme.of( context) .bodyMediumFamily, letterSpacing: 0.0, useGoogleFonts: GoogleFonts .asMap() .containsKey( FlutterFlowTheme.of( context) .bodyMediumFamily), ), ), ), ), ), GestureDetector( onTap: () async { await action_blocks.openTermsOfUse(context); }, child: Text( FFLocalizations.of(context).getVariableText( ptText: 'Termos de uso', enText: 'Terms of use', ), style: FlutterFlowTheme.of(context) .bodyMedium .override( fontFamily: FlutterFlowTheme.of(context) .bodyMediumFamily, color: FlutterFlowTheme.of(context) .primaryText, fontSize: 14.0, letterSpacing: 0.0, useGoogleFonts: GoogleFonts .asMap() .containsKey( FlutterFlowTheme.of( context) .bodyMediumFamily), ), ), ), ], ), ), ), ).animateOnPageLoad( animationsMap['containerOnPageLoadAnimation']!), ), ), ], ), ], ), ), ), ), ), ], ); } }