flutter-freaccess-hub/lib/pages/onboarding/signup/component.dart

943 lines
54 KiB
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:easy_debounce/easy_debounce.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';
export 'component.dart';
class SignUpTemplateComponentModel
extends FlutterFlowModel<SignUpTemplateComponentWidget> {
/// State fields for stateful widgets in this component.
final formKey = GlobalKey<FormState>();
// State field(s) for nameRegisterForm widget.
FocusNode? nameRegisterFormFocusNode;
TextEditingController? nameRegisterFormTextController;
String? Function(BuildContext, String?)?
nameRegisterFormTextControllerValidator;
String? _nameRegisterFormTextControllerValidator(
BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText(
'3bs10dfq' /* Campo é necessário */,
);
}
if (!RegExp(kTextValidatorUsernameRegex).hasMatch(val)) {
return 'Must start with a letter and can only contain letters, digits and - or _.';
}
return null;
}
// State field(s) for emailRegisterForm widget.
FocusNode? emailRegisterFormFocusNode;
TextEditingController? emailRegisterFormTextController;
String? Function(BuildContext, String?)?
emailRegisterFormTextControllerValidator;
String? _emailRegisterFormTextControllerValidator(
BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText(
'mlvw63yj' /* Campo é necessário */,
);
}
if (!RegExp(kTextValidatorEmailRegex).hasMatch(val)) {
return 'Has to be a valid email address.';
}
return null;
}
// State field(s) for passwordRegisterForm widget.
FocusNode? passwordRegisterFormFocusNode;
TextEditingController? passwordRegisterFormTextController;
late bool passwordRegisterFormVisibility;
String? Function(BuildContext, String?)?
passwordRegisterFormTextControllerValidator;
String? _passwordRegisterFormTextControllerValidator(
BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText(
'6nn79lmh' /* Campo é necessário */,
);
}
return null;
}
// Stores action output result for [Action Block - signUpRegisterAction] action in SignUpButtonRegisterForm widget.
bool? signUp;
@override
void initState(BuildContext context) {
nameRegisterFormTextControllerValidator =
_nameRegisterFormTextControllerValidator;
emailRegisterFormTextControllerValidator =
_emailRegisterFormTextControllerValidator;
passwordRegisterFormVisibility = false;
passwordRegisterFormTextControllerValidator =
_passwordRegisterFormTextControllerValidator;
}
@override
void dispose() {
nameRegisterFormFocusNode?.dispose();
nameRegisterFormTextController?.dispose();
emailRegisterFormFocusNode?.dispose();
emailRegisterFormTextController?.dispose();
passwordRegisterFormFocusNode?.dispose();
passwordRegisterFormTextController?.dispose();
}
}
class SignUpTemplateComponentWidget extends StatefulWidget {
const SignUpTemplateComponentWidget({
super.key,
required this.toggleSignInPage,
});
final Future Function()? toggleSignInPage;
@override
State<SignUpTemplateComponentWidget> createState() =>
_SignUpTemplateComponentWidgetState();
}
class _SignUpTemplateComponentWidgetState
extends State<SignUpTemplateComponentWidget> with TickerProviderStateMixin {
late SignUpTemplateComponentModel _model;
final animationsMap = <String, AnimationInfo>{};
@override
void setState(VoidCallback callback) {
super.setState(callback);
_model.onUpdate();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => SignUpTemplateComponentModel());
_model.nameRegisterFormTextController ??= TextEditingController();
_model.nameRegisterFormFocusNode ??= FocusNode();
_model.nameRegisterFormFocusNode!.addListener(() => setState(() {}));
_model.emailRegisterFormTextController ??= TextEditingController();
_model.emailRegisterFormFocusNode ??= FocusNode();
_model.emailRegisterFormFocusNode!.addListener(() => setState(() {}));
_model.passwordRegisterFormTextController ??= TextEditingController();
_model.passwordRegisterFormFocusNode ??= FocusNode();
_model.passwordRegisterFormFocusNode!.addListener(() => setState(() {}));
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) {
context.watch<FFAppState>();
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: [
Padding(
padding: const EdgeInsets.all(4.0),
child: Container(
width: 669.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.max,
children: [
Expanded(
child: Align(
alignment: const AlignmentDirectional(0.0, -1.0),
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Text(
FFLocalizations.of(context).getText(
'49609olv' /* INSIRA SEU EMAIL E SENHA, VAMO... */,
),
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: SvgPicture.network(
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/ug2zlyhca2sh/Frame_5.svg',
width: 603.0,
height: 155.0,
fit: BoxFit.contain,
),
),
),
Column(
mainAxisSize: MainAxisSize.max,
children: [
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Padding(
padding: const EdgeInsets.all(34.0),
child: Container(
width: double.infinity,
constraints: const BoxConstraints(
maxWidth: 570.0,
),
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.primaryBackground,
borderRadius: BorderRadius.circular(12.0),
),
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
.nameRegisterFormTextController,
focusNode: _model
.nameRegisterFormFocusNode,
onChanged: (_) =>
EasyDebounce.debounce(
'_model.nameRegisterFormTextController',
const Duration(
milliseconds: 2000),
() => setState(() {}),
),
autofocus: false,
autofillHints: const [
AutofillHints.name
],
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText:
FFLocalizations.of(
context)
.getText(
'3corpwhd' /* Nome */,
),
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),
),
filled: true,
fillColor:
FlutterFlowTheme.of(
context)
.primaryBackground,
suffixIcon: Icon(
Icons.person,
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.name,
validator: _model
.nameRegisterFormTextControllerValidator
.asValidator(context),
),
),
),
Padding(
padding: const EdgeInsetsDirectional
.fromSTEB(
0.0, 0.0, 0.0, 16.0),
child: SizedBox(
width: double.infinity,
child: TextFormField(
controller: _model
.emailRegisterFormTextController,
focusNode: _model
.emailRegisterFormFocusNode,
onChanged: (_) =>
EasyDebounce.debounce(
'_model.emailRegisterFormTextController',
const Duration(
milliseconds: 2000),
() => setState(() {}),
),
autofocus: false,
autofillHints: const [
AutofillHints.email
],
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText:
FFLocalizations.of(
context)
.getText(
'80wonb69' /* 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)
.primaryText,
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),
),
filled: true,
fillColor:
FlutterFlowTheme.of(
context)
.primaryBackground,
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)
.customColor1,
fontSize: 16.0,
letterSpacing: 0.0,
fontWeight:
FontWeight.w500,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
'Plus Jakarta Sans'),
),
keyboardType: TextInputType
.emailAddress,
validator: _model
.emailRegisterFormTextControllerValidator
.asValidator(context),
),
),
),
Padding(
padding: const EdgeInsetsDirectional
.fromSTEB(
0.0, 0.0, 0.0, 16.0),
child: SizedBox(
width: double.infinity,
child: TextFormField(
controller: _model
.passwordRegisterFormTextController,
focusNode: _model
.passwordRegisterFormFocusNode,
onChanged: (_) =>
EasyDebounce.debounce(
'_model.passwordRegisterFormTextController',
const Duration(
milliseconds: 2000),
() => setState(() {}),
),
autofocus: false,
autofillHints: const [
AutofillHints.password
],
obscureText: !_model
.passwordRegisterFormVisibility,
decoration: InputDecoration(
isDense: true,
labelText:
FFLocalizations.of(
context)
.getText(
'0firji8l' /* 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
.passwordRegisterFormVisibility =
!_model
.passwordRegisterFormVisibility,
),
focusNode: FocusNode(
skipTraversal: true),
child: Icon(
_model.passwordRegisterFormVisibility
? 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
.passwordRegisterFormTextControllerValidator
.asValidator(context),
),
),
),
],
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 16.0),
child: FFButtonWidget(
onPressed: () async {
var shouldSetState = false;
_model.signUp =
await action_blocks
.signUpRegisterAction(
context,
name: _model
.nameRegisterFormTextController
.text,
passwd: _model
.passwordRegisterFormTextController
.text,
email: _model
.emailRegisterFormTextController
.text,
device: FFAppState().device,
);
shouldSetState = true;
if (_model.signUp == true) {
await widget
.toggleSignInPage
?.call();
} else {
if (shouldSetState) {
setState(() {});
}
return;
}
if (shouldSetState) {
setState(() {});
}
},
text: FFLocalizations.of(context)
.getText(
'rnvdwzei' /* Cadastrar-se */,
),
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)
.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,
),
),
// 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 widget.toggleSignInPage
?.call();
},
child: RichText(
textScaler: MediaQuery.of(context)
.textScaler,
text: TextSpan(
children: [
TextSpan(
text: FFLocalizations.of(
context)
.getVariableText(
ptText: 'Você já tem uma conta? ',
enText: 'Already have an account? ',
),
style: TextStyle(
color: FlutterFlowTheme.of(
context)
.primaryText,
),
),
TextSpan(
text: FFLocalizations.of(
context)
.getText(
'09xv5ctc' /* Clique aqui */,
),
style: FlutterFlowTheme.of(
context)
.bodyMedium
.override(
fontFamily:
'Plus Jakarta Sans',
color:
FlutterFlowTheme.of(
context)
.primary,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight:
FontWeight.w600,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
'Plus Jakarta Sans'),
),
)
],
style:
FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(
context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(
context)
.bodyMediumFamily),
),
),
),
),
),
],
),
),
),
).animateOnPageLoad(
animationsMap['containerOnPageLoadAnimation']!),
),
),
],
),
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),
),
),
),
],
),
),
),
),
),
],
);
}
}