This commit is contained in:
J. A. Messias 2025-01-29 15:57:03 -03:00
parent 98c925ba34
commit 896a906936
19 changed files with 993 additions and 476 deletions

View File

@ -29,6 +29,7 @@ import 'package:integration_test/integration_test.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:patrol/patrol.dart';
import 'package:flutter_web_plugins/url_strategy.dart';
import 'package:patrol_finders/patrol_finders.dart';
import 'app_test.dart';
import 'fuzzer/fuzzer.dart';
@ -50,7 +51,7 @@ part 'storage_test.dart';
part 'utils_test.dart';
part 'welcome_test.dart';
late PatrolIntegrationTester $;
late PatrolTester $;
void main() {
//init integration test

View File

@ -2,11 +2,12 @@ part of 'app_test.dart';
class AuthenticationTest {
static Future<void> signIn() async {
patrol(
patrolWidgetTest(
'Sign-In with fuzzed emails',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Authentication Test - Sign-In with fuzzed emails');
$.tester
.printToConsole('Authentication Test - Sign-In with fuzzed emails');
final PatrolFinder throwsException = $(Dialog).$(ThrowExceptionWidget);
final Fuzzer fuzzer = Fuzzer(
@ -32,7 +33,8 @@ class AuthenticationTest {
],
iterations: 2,
);
Map<String, String> concat(String username, String domain, String password) {
Map<String, String> concat(
String username, String domain, String password) {
return {
'emailTextFormField': '${username}@${domain}.test',
'passwordTextFormField': password,
@ -57,11 +59,12 @@ class AuthenticationTest {
},
);
patrol(
patrolWidgetTest(
'Sign-In with email_app@exemplo.com',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Authentication Test - Sign-In with email_app@exemplo.com');
$.tester.printToConsole(
'Authentication Test - Sign-In with email_app@exemplo.com');
final PatrolFinder throwsException = $(Dialog).$(ThrowExceptionWidget);
final Map<String, String> credentials = {
@ -78,11 +81,12 @@ class AuthenticationTest {
}
static Future<void> signUp() async {
patrol(
patrolWidgetTest(
'Sign Up - credenciais já registradas',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Authentication Test - Sign-Up: credenciais já registradas');
$.tester.printToConsole(
'Authentication Test - Sign-Up: credenciais já registradas');
final PatrolFinder throwsException = $(Dialog).$(ThrowExceptionWidget);
final Map<String, String> credentials = {
@ -98,11 +102,12 @@ class AuthenticationTest {
},
);
patrol(
patrolWidgetTest(
'Sign Up - credenciais novas',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Authentication Test - Sign-Up: credenciais novas');
$.tester
.printToConsole('Authentication Test - Sign-Up: credenciais novas');
final PatrolFinder throwsException = $(Dialog).$(ThrowExceptionWidget);
@ -135,7 +140,8 @@ class AuthenticationTest {
],
iterations: 2,
);
Map<String, String> concat(String name, String username, String domain, String password) {
Map<String, String> concat(
String name, String username, String domain, String password) {
return {
'nameTextFormField': name,
'emailTextFormField': '${username}@${domain}.test',
@ -164,11 +170,12 @@ class AuthenticationTest {
}
static Future<void> signOut() async {
patrol(
patrolWidgetTest(
'Deslogar da Conta',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Authentication Test - Sign-Out: Deslogar da Conta');
$.tester.printToConsole(
'Authentication Test - Sign-Out: Deslogar da Conta');
await _loggedWithMultiLocalsAccount($);
await $.pumpWidget(const App());
@ -179,39 +186,21 @@ class AuthenticationTest {
await $.waitUntilVisible($(MenuListView));
await $(Icons.exit_to_app).waitUntilVisible().tap(settlePolicy: SettlePolicy.trySettle);
await $(Icons.exit_to_app)
.waitUntilVisible()
.tap(settlePolicy: SettlePolicy.trySettle);
await Future.delayed(const Duration(milliseconds: 500));
},
);
}
static void recovery() async {
patrol('Open url in the app', ($) async {
await _loggedWithMultiLocalsAccount($);
await $.pumpWidget(const App());
await $.waitUntilVisible($(MenuStaggeredView));
// await $.native.pressHome();
// final String browserId = 'com.android.chrome';
// await $.native.openApp(appId: browserId);
await $.native.openUrl(//
'https://freaccess.com.br/freaccess/alterarSenha.php?email=freaccesshub@gmail.com&token=67939240e12c31.10412525');
await $.pumpAndSettle();
Future.delayed(Duration(seconds: 3));
await $.pump(Duration(seconds: 3));
await $.pumpAndSettle();
final PatrolFinder forgotPassword = await $(#ForgotPasswordScreen).waitUntilVisible();
expect(forgotPassword, findsOneWidget);
});
}
static void recovery() async {}
}
Future<void> _auth(
Map<String, String> credentials,
PatrolIntegrationTester $,
PatrolTester $,
PatrolFinder throwsException,
) async {
await _enterCredentials(credentials, $);
@ -220,7 +209,7 @@ Future<void> _auth(
Future<void> _enterCredentials(
Map<String, String> credentials,
PatrolIntegrationTester $,
PatrolTester $,
) async {
for (var entry in credentials.entries) {
await $(ValueKey(entry.key)) //
@ -230,7 +219,8 @@ Future<void> _enterCredentials(
}
}
Future<void> _submit(String key, PatrolIntegrationTester $, PatrolFinder throwsException) async {
Future<void> _submit(
String key, PatrolTester $, PatrolFinder throwsException) async {
await $(ValueKey(key)) //
.waitUntilVisible()
.tap();
@ -248,5 +238,6 @@ Future<void> _submit(String key, PatrolIntegrationTester $, PatrolFinder throwsE
String _generateRandomString(int length) {
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
final rand = Random();
return List.generate(length, (index) => chars[rand.nextInt(chars.length)]).join();
return List.generate(length, (index) => chars[rand.nextInt(chars.length)])
.join();
}

View File

@ -5,14 +5,14 @@ final _nativeAutomatorConfig = NativeAutomatorConfig(
findTimeout: Duration(seconds: 20), // 10 seconds is too short for some CIs
);
// Future<void> createApp(PatrolIntegrationTester $) async {
// Future<void> createApp(PatrolTester $) async {
// await app_main.main();
// await $.pumpAndSettle();
// }
void patrol(
String description,
Future<void> Function(PatrolIntegrationTester) callback, {
Future<void> Function(PatrolTester) callback, {
bool? skip,
List<String> tags = const [],
NativeAutomatorConfig? nativeAutomatorConfig,

View File

@ -0,0 +1 @@

View File

@ -46,9 +46,9 @@ class LocalsTest {
// }
// },
// );
patrol(
patrolWidgetTest(
'Selecionar um local disponível com somente um local disponivel', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Locals Test - Selecionar um local disponível');
@ -57,7 +57,8 @@ class LocalsTest {
await $.waitUntilVisible($(MenuStaggeredView));
await $.waitUntilVisible($(LocalProfileComponentWidget));
final PatrolFinder profileFinder = $(#AsyncLocalProfileComponentWidget_InkWell);
final PatrolFinder profileFinder =
$(#AsyncLocalProfileComponentWidget_InkWell);
expect(profileFinder, findsOneWidget);
await $(profileFinder) //
@ -183,10 +184,12 @@ class LocalsTest {
// // }
// },
// );
patrol('Desvincular do local selecionado com somente um local disponivel', //
(PatrolIntegrationTester tester) async {
patrolWidgetTest(
'Desvincular do local selecionado com somente um local disponivel', //
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Locals Test - Desvincular do local selecionado com multiplos locais disponiveis');
$.tester.printToConsole(
'Locals Test - Desvincular do local selecionado com multiplos locais disponiveis');
await _loggedWithSomeoneLocalAccount($);
await $.pumpWidgetAndSettle(const App());
@ -225,8 +228,9 @@ class LocalsTest {
await $.pump(const Duration(seconds: 1));
await $.pump();
final PatrolFinder bottomSheetFinder = await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
final PatrolFinder bottomSheetFinder =
await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
expect(bottomSheetFinder, findsOneWidget);
@ -236,22 +240,25 @@ class LocalsTest {
expect(listViewFinder, findsOneWidget);
final PatrolFinder entriesFinder = await $(listViewFinder).$(CardItemTemplateComponentWidget).waitUntilVisible();
final PatrolFinder entriesFinder = await $(listViewFinder)
.$(CardItemTemplateComponentWidget)
.waitUntilVisible();
expect(entriesFinder, findsWidgets);
});
patrol(
patrolWidgetTest(
'Vincular um local desvinculado com somente um local disponivel', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Locals Test - Vincular um local desvinculado');
await _loggedWithSomeoneLocalAccount($, false);
await $.pumpWidget(const App());
final PatrolFinder bottomSheetFinder = await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
final PatrolFinder bottomSheetFinder =
await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
expect(bottomSheetFinder, findsOneWidget);
await $.pump(const Duration(milliseconds: 500));
@ -295,17 +302,18 @@ class LocalsTest {
}
static Future attachLocal() async {
patrol(
patrolWidgetTest(
'Auto-Validação de Locais com Multiplos Locais', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Locals Test - Vincular um local desvinculado');
await _loggedWithMultiLocalsAccount($, false);
await $.pumpWidget(const App());
final PatrolFinder bottomSheetFinder = await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
final PatrolFinder bottomSheetFinder =
await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
expect(bottomSheetFinder, findsOneWidget);
await $.pump(const Duration(milliseconds: 500));
@ -323,17 +331,18 @@ class LocalsTest {
await Future.delayed(const Duration(milliseconds: 500));
},
);
patrol(
patrolWidgetTest(
'Auto-Validação de Locais com local unico', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Locals Test - Vincular um local desvinculado');
await _loggedWithSomeoneLocalAccount($, false);
await $.pumpWidget(const App());
final PatrolFinder bottomSheetFinder = await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
final PatrolFinder bottomSheetFinder =
await $(BottomArrowLinkedLocalsComponentWidget) //
.waitUntilVisible();
expect(bottomSheetFinder, findsOneWidget);
await $.pump(const Duration(milliseconds: 500));

View File

@ -2,10 +2,10 @@ part of 'app_test.dart';
class MenuTest {
static Future labels2AppbarConsistency() async {
patrol(
patrolWidgetTest(
'As labels dos menuItems correspondem aos títulos das AppBars? (MultiLocais)',
//
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole(
'Menu Test - As labels dos menuItems correspondem aos títulos das AppBars?');
@ -96,9 +96,9 @@ class MenuTest {
}
static Future containEntries() async {
patrol(
patrolWidgetTest(
'HomeMenu contém seus itens? (MultiLocais)', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Menu Test - HomeMenu contém seus itens?');
@ -135,9 +135,9 @@ class MenuTest {
expect(entriesKey, containsAll(menuKeys));
},
);
patrol(
patrolWidgetTest(
'HomeMenu contém seus itens? (MonoLocal)', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Menu Test - HomeMenu contém seus itens?');
@ -175,9 +175,9 @@ class MenuTest {
},
);
patrol(
patrolWidgetTest(
'DrawerMenu contém seus itens? (MultiLocais)', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Menu Test - DrawerMenu contém seus itens?');
@ -222,9 +222,9 @@ class MenuTest {
await Future.delayed(const Duration(milliseconds: 500));
},
);
patrol(
patrolWidgetTest(
'DrawerMenu contém seus itens? (MonoLocal)', //
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Menu Test - DrawerMenu contém seus itens?');
@ -272,9 +272,9 @@ class MenuTest {
}
static Future navToEntries() async {
patrol(
patrolWidgetTest(
'Navegação entre items do Menu (MultiLocais)',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Menu Test - Navegação entre items do Menu');

View File

@ -2,8 +2,9 @@ part of 'app_test.dart';
class ModularizationTest {
static Future containLicense() async {
patrol('Os modulos de licença está sendo processados? (MultiLocais)',
(PatrolIntegrationTester tester) async {
patrolWidgetTest(
'Os modulos de licença está sendo processados? (MultiLocais)',
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole(
'Modularization Test - Os modulos de licença está sendo processados?');
@ -27,8 +28,9 @@ class ModularizationTest {
return;
});
patrol('Os modulos de licença está sendo processados? (MonoLocal)',
(PatrolIntegrationTester tester) async {
patrolWidgetTest(
'Os modulos de licença está sendo processados? (MonoLocal)',
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole(
'Modularization Test - Os modulos de licença está sendo processados?');
@ -55,9 +57,9 @@ class ModularizationTest {
}
static Future switchLicense() async {
patrol(
patrolWidgetTest(
'Licença está sendo atualizada?',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Licença está sendo atualizada?');

View File

@ -59,7 +59,8 @@ Future<void> main() async {
// Maybe somewhat counterintuitively, this callback runs *after* the calls
// to group() below.
final topLevelGroup = Invoker.current!.liveTest.groups.first;
final dartTestGroup = createDartTestGroup(topLevelGroup,
final dartTestGroup = createDartTestGroup(
topLevelGroup,
tags: null,
excludeTags: null,
);

View File

@ -1,7 +1,7 @@
part of 'app_test.dart';
Future<void> _loggedWithMultiLocalsAccount(
PatrolIntegrationTester $, [
PatrolTester $, [
bool forceLinkedLocal = true,
]) async {
await _init($);
@ -31,7 +31,8 @@ Future<void> _loggedWithMultiLocalsAccount(
}
}
Future<void> _loggedWithSomeoneLocalAccount(PatrolIntegrationTester $, [bool forceLinkedLocal = true]) async {
Future<void> _loggedWithSomeoneLocalAccount(PatrolTester $,
[bool forceLinkedLocal = true]) async {
await _init($);
await StorageHelper() //
.set(SecureStorageKey.isLogged.value, 'true');
@ -59,7 +60,7 @@ Future<void> _loggedWithSomeoneLocalAccount(PatrolIntegrationTester $, [bool for
}
}
Future<void> _unlogged(PatrolIntegrationTester $) async {
Future<void> _unlogged(PatrolTester $) async {
await _init($);
await StorageHelper() //
.set(SecureStorageKey.isLogged.value, 'false');
@ -79,7 +80,7 @@ Future<void> _unlogged(PatrolIntegrationTester $) async {
.set(LocalsStorageKey.isNewVersion.key, true);
}
Future<void> _init(PatrolIntegrationTester $) async {
Future<void> _init(PatrolTester $) async {
WidgetsFlutterBinding.ensureInitialized();
await _initializeTracking();
await _initializeStorage();
@ -91,18 +92,19 @@ Future<void> _init(PatrolIntegrationTester $) async {
await _initializeNav();
}
Future<void> _navigateToSignIn(PatrolIntegrationTester $) async {
Future<void> _navigateToSignIn(PatrolTester $) async {
final signInButton = $(#toggleSignInPage).waitUntilVisible();
await signInButton.tap();
}
Future<void> _navigateToSignUp(PatrolIntegrationTester $) async {
Future<void> _navigateToSignUp(PatrolTester $) async {
final signUpButton = $(#toggleSignUpPage).waitUntilVisible();
await signUpButton.tap();
}
Future<void> _navigateBackUsingSystemGesture() async =>
IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
IntegrationTestWidgetsFlutterBinding.instance.keyboard
.isLogicalKeyPressed(LogicalKeyboardKey.escape);
Future<void> _initializeTracking() async {
print('Requesting tracking authorization...');

View File

@ -2,9 +2,9 @@ part of 'app_test.dart';
class WelcomeTest {
static Future signInToSignUp() async {
patrol(
patrolWidgetTest(
'Sign-In to Sign-Up',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Welcome Test - Sign-In to Sign-Up');
await _unlogged($);
@ -17,9 +17,9 @@ class WelcomeTest {
}
static Future signUpToSignIn() async {
patrol(
patrolWidgetTest(
'Sign-Up to Sign-In',
(PatrolIntegrationTester tester) async {
(PatrolTester tester) async {
$ = tester;
$.tester.printToConsole('Welcome Test - Sign-Up to Sign-In');
await _unlogged($);

View File

@ -19,10 +19,12 @@ class ForgotPasswordTemplateComponentWidget extends StatefulWidget {
const ForgotPasswordTemplateComponentWidget({super.key});
@override
State<ForgotPasswordTemplateComponentWidget> createState() => _ForgotPasswordTemplateComponentWidgetState();
State<ForgotPasswordTemplateComponentWidget> createState() =>
_ForgotPasswordTemplateComponentWidgetState();
}
class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTemplateComponentWidget> {
class _ForgotPasswordTemplateComponentWidgetState
extends State<ForgotPasswordTemplateComponentWidget> {
late ForgotPasswordTemplateComponentModel _model;
@override
@ -49,9 +51,11 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
@override
Widget build(BuildContext context) {
double limitedSubHeaderFontSize = LimitedFontSizeUtil.getSubHeaderFontSize(context);
double limitedSubHeaderFontSize =
LimitedFontSizeUtil.getSubHeaderFontSize(context);
double limitedInputFontSize = LimitedFontSizeUtil.getInputFontSize(context);
double limitedHeaderFontSize = LimitedFontSizeUtil.getHeaderFontSize(context);
double limitedHeaderFontSize =
LimitedFontSizeUtil.getHeaderFontSize(context);
return Align(
key: ValueKey('ForgotPasswordTemplateComponentWidget'),
@ -84,7 +88,8 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
tablet: false,
))
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 8.0),
padding: const EdgeInsetsDirectional.fromSTEB(
16.0, 0.0, 16.0, 8.0),
child: InkWell(
key: const ValueKey<String>('BackButton'),
splashColor: Colors.transparent,
@ -98,7 +103,8 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
mainAxisSize: MainAxisSize.max,
children: [
const Padding(
padding: EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 12.0),
padding: EdgeInsetsDirectional.fromSTEB(
0.0, 12.0, 0.0, 12.0),
child: Icon(
Icons.arrow_back_rounded,
color: Color(0xFF15161E),
@ -106,16 +112,20 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0),
padding: const EdgeInsetsDirectional.fromSTEB(
12.0, 0.0, 0.0, 0.0),
child: Text(
'',
style: FlutterFlowTheme.of(context).bodyMedium.override(
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: 'Plus Jakarta Sans',
color: const Color(0xFF15161E),
fontSize: limitedHeaderFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
),
),
@ -124,30 +134,36 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0),
padding:
const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0),
child: Text(
FFLocalizations.of(context).getText('xxm3ajsy' /* ESQUECEU SUA SENHA? */),
FFLocalizations.of(context)
.getText('xxm3ajsy' /* ESQUECEU SUA SENHA? */),
style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: 'Outfit',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: limitedHeaderFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Outfit'),
useGoogleFonts:
GoogleFonts.asMap().containsKey('Outfit'),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0),
padding: const EdgeInsetsDirectional.fromSTEB(
16.0, 4.0, 16.0, 4.0),
child: Text(
FFLocalizations.of(context).getText('wu2f7yzo' /* Não se preucupe nós vamos te a... */),
FFLocalizations.of(context).getText(
'wu2f7yzo' /* Não se preucupe nós vamos te a... */),
style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: limitedSubHeaderFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
),
),
@ -155,7 +171,8 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
key: _model.formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0),
padding: const EdgeInsetsDirectional.fromSTEB(
16.0, 12.0, 16.0, 0.0),
child: SizedBox(
width: double.infinity,
child: TextFormField(
@ -172,15 +189,18 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText('mtz8l7ft' /* E-mail */),
labelStyle: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primary,
fontSize: limitedInputFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
),
labelText: FFLocalizations.of(context)
.getText('mtz8l7ft' /* E-mail */),
labelStyle:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primary,
fontSize: limitedInputFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: Colors.black,
@ -209,7 +229,8 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
),
borderRadius: BorderRadius.circular(12.0),
),
contentPadding: const EdgeInsetsDirectional.fromSTEB(24.0, 24.0, 20.0, 24.0),
contentPadding: const EdgeInsetsDirectional.fromSTEB(
24.0, 24.0, 20.0, 24.0),
suffixIcon: Icon(
Icons.email,
color: FlutterFlowTheme.of(context).primary,
@ -222,12 +243,14 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
fontSize: limitedInputFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
maxLines: null,
keyboardType: TextInputType.emailAddress,
cursorColor: FlutterFlowTheme.of(context).primary,
validator: _model.emailAddressTextControllerValidator.asValidator(context),
validator: _model.emailAddressTextControllerValidator
.asValidator(context),
),
),
),
@ -235,13 +258,17 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0),
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 24.0, 0.0, 0.0),
child: FFButtonWidget(
key: const ValueKey<String>('SendButtonWidget'),
onPressed: (_model.emailAddressTextController.text == '' ||
!ValidatorUtil.isValidEmail(_model.emailAddressTextController.text))
onPressed: (_model.emailAddressTextController.text ==
'' ||
!ValidatorUtil.isValidEmail(
_model.emailAddressTextController.text))
? null
: () async => await AuthenticationService.forgotPassword(
: () async =>
await AuthenticationService.forgotPassword(
context,
_model.emailAddressTextController.text,
).then((v) => v == true ? context.pop() : null),
@ -251,23 +278,28 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
options: FFButtonOptions(
width: 270.0,
height: 50.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),
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: Colors.white,
fontSize: limitedInputFontSize,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
),
textStyle:
FlutterFlowTheme.of(context).titleSmall.override(
fontFamily: 'Plus Jakarta Sans',
color: Colors.white,
fontSize: limitedInputFontSize,
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,
),
disabledColor: FlutterFlowTheme.of(context).customColor5,
disabledColor:
FlutterFlowTheme.of(context).customColor5,
disabledTextColor: Colors.white,
),
showLoadingIndicator: true,

View File

@ -24,7 +24,8 @@ abstract class LocalsRemoteDataSource {
}
class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
static final LocalsRemoteDataSourceImpl _instance = LocalsRemoteDataSourceImpl._internal();
static final LocalsRemoteDataSourceImpl _instance =
LocalsRemoteDataSourceImpl._internal();
factory LocalsRemoteDataSourceImpl() => _instance;
LocalsRemoteDataSourceImpl._internal();
@ -50,7 +51,8 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
final List<dynamic> locals = response.jsonBody['locais'] ?? [];
final bool isEmpty = locals.isEmpty;
final bool isActive = locals.where((local) => local['CLU_STATUS'] != 'B').isNotEmpty;
final bool isActive =
locals.where((local) => local['CLU_STATUS'] != 'B').isNotEmpty;
final bool isEnable = !isEmpty && isActive;
if (isEnable) {
@ -95,7 +97,8 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
final bool isInactived = await LocalUtil.isInactived(locals);
final bool isPending = LocalUtil.isPending(locals);
final bool isUnique = locals.length == 1;
final bool isBlocked = locals.where((local) => local['CLU_STATUS'] == 'B').isNotEmpty;
final bool isBlocked =
locals.where((local) => local['CLU_STATUS'] == 'B').isNotEmpty;
final bool isEnabled = isUnique && isActive;
final bool isDisabled = isUnique && isBlocked;
final bool isUnselected = await LocalUtil.isUnselected();
@ -148,8 +151,10 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
@override
Future<bool> checkLocals(BuildContext context) async {
final String? cliUUID = await StorageHelper().get(ProfileStorageKey.clientUUID.key);
final String? cliName = await StorageHelper().get(ProfileStorageKey.clientName.key);
final String? cliUUID =
await StorageHelper().get(ProfileStorageKey.clientUUID.key);
final String? cliName =
await StorageHelper().get(ProfileStorageKey.clientName.key);
final haveCli = cliUUID != null && cliUUID.isNotEmpty;
final haveName = cliName != null && cliName.isNotEmpty;
return haveCli && haveName;
@ -175,7 +180,8 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
if (isError == true) {
final GetLocalsCall callback = PhpGroup.getLocalsCall;
response = await callback.call();
final String errorMsg = response.jsonBody['error_msg'] ?? 'Local indisponível';
final String errorMsg =
response.jsonBody['error_msg'] ?? 'Local indisponível';
// await DialogUtil.error(context, errorMsg).whenComplete(() async => await selectLocal(context, response));
return false;
} else {
@ -194,7 +200,8 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
}
@override
Future<bool> selectLocal(BuildContext context, ApiCallResponse? response) async {
Future<bool> selectLocal(
BuildContext context, ApiCallResponse? response) async {
return await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
@ -224,13 +231,15 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource {
enText: 'Device unlinked successfully',
ptText: 'Dispositivo desvinculado com sucesso',
);
final bool status = await PhpGroup.resopndeVinculo.call(tarefa: 'I').then((value) async {
final bool status =
await PhpGroup.resopndeVinculo.call(tarefa: 'I').then((value) async {
if (value.jsonBody['error'] == false) {
await StorageHelper().set(ProfileStorageKey.clientName.key, '');
await StorageHelper().set(ProfileStorageKey.ownerName.key, '');
await StorageHelper().set(ProfileStorageKey.clientUUID.key, '');
context.pop();
context.go('/homePage', extra: {'update': LocalsRepositoryImpl().update});
context.go('/homePage',
extra: {'update': LocalsRepositoryImpl().update});
SnackBarUtil.showSnackBar(context, content);
return true;
}

View File

@ -49,8 +49,10 @@ class LocalsRepositoryImpl implements LocalsRepository {
}
Future<void> check(BuildContext context) async {
final String? cliUUID = await StorageHelper().get(ProfileStorageKey.clientUUID.key);
final String? ownerUUID = await StorageHelper().get(ProfileStorageKey.ownerUUID.key);
final String? cliUUID =
await StorageHelper().get(ProfileStorageKey.clientUUID.key);
final String? ownerUUID =
await StorageHelper().get(ProfileStorageKey.ownerUUID.key);
final bool haveCli = cliUUID != null && cliUUID.isNotEmpty;
final bool haveOwner = ownerUUID != null && ownerUUID.isNotEmpty;
if (!haveCli && !haveOwner) {

View File

@ -66,7 +66,8 @@ class DeepLinkService {
),
),
isScrollControlled: true,
backgroundColor: FlutterFlowTheme.of(navigatorKey.currentContext!).primaryBackground,
backgroundColor: FlutterFlowTheme.of(navigatorKey.currentContext!)
.primaryBackground,
showDragHandle: true,
useSafeArea: true,
enableDrag: true,

View File

@ -86,11 +86,20 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
builder: (context, _) {
return FutureBuilder<Widget>(
future: () async {
final bool isLogged = await StorageHelper().get(SecureStorageKey.isLogged.value) == 'true';
final bool haveLocal = await StorageHelper().get(SecureStorageKey.haveLocal.value) == 'true';
final bool isLogged =
await StorageHelper().get(SecureStorageKey.isLogged.value) ==
'true';
final bool haveLocal =
await StorageHelper().get(SecureStorageKey.haveLocal.value) ==
'true';
final bool haveUserUUID =
(await StorageHelper().get(ProfileStorageKey.userUUID.key))?.isNotEmpty ?? false;
final bool haveDevUUID = (await StorageHelper().get(ProfileStorageKey.devUUID.key))?.isNotEmpty ?? false;
(await StorageHelper().get(ProfileStorageKey.userUUID.key))
?.isNotEmpty ??
false;
final bool haveDevUUID =
(await StorageHelper().get(ProfileStorageKey.devUUID.key))
?.isNotEmpty ??
false;
if (isLogged && haveDevUUID && haveUserUUID) {
return haveLocal
@ -100,17 +109,20 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
create: (context) => MenuBloc(
style: MenuView.list_grid,
item: EnumMenuItem.button,
entries: MenuEntry.getEntriesByType(MenuEntryType.Home),
entries: MenuEntry.getEntriesByType(
MenuEntryType.Home),
)..add(MenuEvent()),
),
BlocProvider<HomeBloc>(
create: (context) => HomeBloc()..add(HomeEvent()),
),
BlocProvider(
create: (context) => LocalProfileBloc()..add(LocalProfileEvent()),
create: (context) =>
LocalProfileBloc()..add(LocalProfileEvent()),
),
],
child: HomePageWidget(key: UniqueKey(), LocalsRepositoryImpl().update),
child: HomePageWidget(
key: UniqueKey(), LocalsRepositoryImpl().update),
)
: const ReceptionPageWidget();
} else {
@ -134,8 +146,10 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
name: 'forgotPassword',
path: '/forgotPassword',
builder: (context, params) {
late final String email = params.getParam('email', ParamType.String);
late final String token = params.getParam('token', ParamType.String);
late final String email =
params.getParam('email', ParamType.String);
late final String token =
params.getParam('token', ParamType.String);
return ForgotPasswordScreen(
key: ValueKey('ForgotPasswordScreen'),
@ -152,7 +166,8 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
name: 'homePage',
path: '/homePage',
builder: (context, params) {
final Future<bool> Function(BuildContext context)? update = params.getParam('update', ParamType.Function);
final Future<bool> Function(BuildContext context)? update =
params.getParam('update', ParamType.Function);
return MultiBlocProvider(
providers: [
BlocProvider(
@ -166,7 +181,8 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
create: (context) => HomeBloc()..add(HomeEvent()),
),
BlocProvider(
create: (context) => LocalProfileBloc()..add(LocalProfileEvent()),
create: (context) =>
LocalProfileBloc()..add(LocalProfileEvent()),
),
],
child: HomePageWidget(key: UniqueKey(), update),
@ -175,12 +191,16 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
FFRoute(
name: 'petsOnThePropertyPage',
path: '/petsOnThePropertyPage',
builder: (context, params) => Scaffold(body: const PetsHistoryScreen(isApp: true))),
builder: (context, params) =>
Scaffold(body: const PetsHistoryScreen(isApp: true))),
FFRoute(
name: 'vehiclesOnThePropertyPage',
path: '/vehiclesOnThePropertyPage',
builder: (context, params) => const VehicleOnTheProperty()),
FFRoute(name: 'receptionPage', path: '/receptionPage', builder: (context, params) => const ReceptionPageWidget()),
FFRoute(
name: 'receptionPage',
path: '/receptionPage',
builder: (context, params) => const ReceptionPageWidget()),
FFRoute(
name: 'messageHistoryPage',
path: '/messageHistoryPage',
@ -192,19 +212,28 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
FFRoute(
name: 'scheduleCompleteVisitPage',
path: '/scheduleCompleteVisitPage',
builder: (context, params) => const ScheduleCompleteVisitPageWidget()),
builder: (context, params) =>
const ScheduleCompleteVisitPageWidget()),
FFRoute(
name: 'deliverySchedule', path: '/deliverySchedule', builder: (context, params) => const DeliverySchedule()),
name: 'deliverySchedule',
path: '/deliverySchedule',
builder: (context, params) => const DeliverySchedule()),
FFRoute(
name: 'provisionalSchedule',
path: '/provisionalSchedule',
builder: (context, params) => const ProvisionalSchedule()),
FFRoute(name: 'fastPassPage', path: '/fastPassPage', builder: (context, params) => FastPassPageWidget()),
FFRoute(
name: 'fastPassPage',
path: '/fastPassPage',
builder: (context, params) => FastPassPageWidget()),
FFRoute(
name: 'preferencesSettings',
path: '/preferencesSettings',
builder: (context, params) => PreferencesPageWidget()),
FFRoute(name: 'aboutProperty', path: '/aboutProperty', builder: (context, params) => AboutPropertyPage()),
FFRoute(
name: 'aboutProperty',
path: '/aboutProperty',
builder: (context, params) => AboutPropertyPage()),
FFRoute(
name: 'residentsOnThePropertyPage',
path: '/residentsOnThePropertyPage',
@ -220,8 +249,11 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
FFRoute(
name: 'acessHistoryPage',
path: '/acessHistoryPage',
builder: (context, params) =>
AccessHistoryScreen(opt: const {'personType': '.*', 'accessType': '.*', 'search': '.*'})),
builder: (context, params) => AccessHistoryScreen(opt: const {
'personType': '.*',
'accessType': '.*',
'search': '.*'
})),
FFRoute(
name: 'provisionalHistoryPage',
path: '/provisionalHistoryPage',
@ -230,13 +262,34 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
name: 'liberationHistory',
path: '/liberationHistory',
builder: (context, params) => const LiberationHistoryWidget()),
FFRoute(name: 'signInPage', path: '/signInPage', builder: (context, params) => const SignInPageWidget()),
FFRoute(name: 'signUpPage', path: '/signUpPage', builder: (context, params) => const SignUpPageWidget()),
FFRoute(name: 'welcomePage', path: '/welcomePage', builder: (context, params) => const WelcomePage()),
FFRoute(name: 'qrCodePage', path: '/qrCodePage', builder: (context, params) => const QrCodePageWidget()),
FFRoute(name: 'preferencesPage', path: '/preferencesPage', builder: (context, params) => PreferencesPageWidget()),
FFRoute(name: 'packageOrder', path: '/packageOrder', builder: (context, params) => const PackageOrderPage()),
FFRoute(name: 'reservation', path: '/reservation', builder: (context, params) => ReservationPageWidget()),
FFRoute(
name: 'signInPage',
path: '/signInPage',
builder: (context, params) => const SignInPageWidget()),
FFRoute(
name: 'signUpPage',
path: '/signUpPage',
builder: (context, params) => const SignUpPageWidget()),
FFRoute(
name: 'welcomePage',
path: '/welcomePage',
builder: (context, params) => const WelcomePage()),
FFRoute(
name: 'qrCodePage',
path: '/qrCodePage',
builder: (context, params) => const QrCodePageWidget()),
FFRoute(
name: 'preferencesPage',
path: '/preferencesPage',
builder: (context, params) => PreferencesPageWidget()),
FFRoute(
name: 'packageOrder',
path: '/packageOrder',
builder: (context, params) => const PackageOrderPage()),
FFRoute(
name: 'reservation',
path: '/reservation',
builder: (context, params) => ReservationPageWidget()),
FFRoute(
name: 'petsPage',
path: '/petsPage',
@ -252,7 +305,9 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
extension NavParamExtensions on Map<String, String?> {
Map<String, String> get withoutNulls => Map.fromEntries(
entries.where((e) => e.value != null).map((e) => MapEntry(e.key, e.value!)),
entries
.where((e) => e.value != null)
.map((e) => MapEntry(e.key, e.value!)),
);
}
@ -266,7 +321,8 @@ extension NavigationExtensions on BuildContext {
}
extension _GoRouterStateExtensions on GoRouterState {
Map<String, dynamic> get extraMap => extra != null ? extra as Map<String, dynamic> : {};
Map<String, dynamic> get extraMap =>
extra != null ? extra as Map<String, dynamic> : {};
Map<String, dynamic> get allParams => <String, dynamic>{}
..addAll(pathParameters)
..addAll(uri.queryParameters)
@ -279,8 +335,9 @@ extension _GoRouterStateExtensions on GoRouterState {
extension GoRouterLocationExtension on GoRouter {
String getCurrentLocation() {
final RouteMatch lastMatch = routerDelegate.currentConfiguration.last;
final RouteMatchList matchList =
lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration;
final RouteMatchList matchList = lastMatch is ImperativeRouteMatch
? lastMatch.matches
: routerDelegate.currentConfiguration;
return matchList.uri.toString();
}
}
@ -293,13 +350,17 @@ class FFParameters {
Map<String, dynamic> futureParamValues = {};
bool get isEmpty =>
state.allParams.isEmpty || (state.allParams.length == 1 && state.extraMap.containsKey(kTransitionInfoKey));
bool isAsyncParam(MapEntry<String, dynamic> param) => asyncParams.containsKey(param.key) && param.value is String;
state.allParams.isEmpty ||
(state.allParams.length == 1 &&
state.extraMap.containsKey(kTransitionInfoKey));
bool isAsyncParam(MapEntry<String, dynamic> param) =>
asyncParams.containsKey(param.key) && param.value is String;
bool get hasFutures => state.allParams.entries.any(isAsyncParam);
Future<bool> completeFutures() => Future.wait(
state.allParams.entries.where(isAsyncParam).map(
(param) async {
final doc = await asyncParams[param.key]!(param.value).onError((_, __) => null);
final doc = await asyncParams[param.key]!(param.value)
.onError((_, __) => null);
if (doc != null) {
futureParamValues[param.key] = doc;
return true;
@ -309,12 +370,15 @@ class FFParameters {
),
).onError((_, __) => [false]).then((v) => v.every((e) => e));
dynamic getParam<T>(String paramName, ParamType type, {bool isList = false, StructBuilder<T>? structBuilder}) {
if (futureParamValues.containsKey(paramName)) return futureParamValues[paramName];
dynamic getParam<T>(String paramName, ParamType type,
{bool isList = false, StructBuilder<T>? structBuilder}) {
if (futureParamValues.containsKey(paramName))
return futureParamValues[paramName];
if (!state.allParams.containsKey(paramName)) return null;
final param = state.allParams[paramName];
if (param is! String) return param;
return deserializeParam<T>(param, type, isList, structBuilder: structBuilder);
return deserializeParam<T>(param, type, isList,
structBuilder: structBuilder);
}
}
@ -354,13 +418,16 @@ class FFRoute {
key: state.pageKey,
child: child,
transitionDuration: transitionInfo.duration,
transitionsBuilder: (context, animation, secondaryAnimation, child) => PageTransition(
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
PageTransition(
type: transitionInfo.transitionType,
duration: transitionInfo.duration,
reverseDuration: transitionInfo.duration,
alignment: transitionInfo.alignment,
child: child,
).buildTransitions(context, animation, secondaryAnimation, child),
).buildTransitions(
context, animation, secondaryAnimation, child),
)
: MaterialPage(key: state.pageKey, child: child);
},
@ -381,7 +448,8 @@ class TransitionInfo {
final Duration duration;
final Alignment? alignment;
static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false);
static TransitionInfo appDefault() =>
const TransitionInfo(hasTransition: false);
}
class RootPageContext {
@ -393,7 +461,9 @@ class RootPageContext {
final rootPageContext = context.read<RootPageContext?>();
final isRootPage = rootPageContext?.isRootPage ?? false;
final location = GoRouterState.of(context).uri.toString();
return isRootPage && location != '/' && location != rootPageContext?.errorRoute;
return isRootPage &&
location != '/' &&
location != rootPageContext?.errorRoute;
}
static Widget wrap(Widget child, {String? errorRoute}) =>

View File

@ -54,7 +54,8 @@ class App extends StatefulWidget {
@override
State<App> createState() => _AppState();
static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!;
static _AppState of(BuildContext context) =>
context.findAncestorStateOfType<_AppState>()!;
}
class _AppState extends State<App> {
@ -96,7 +97,8 @@ class _AppState extends State<App> {
}),
),
);
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = const [
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates =
const [
FFLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
@ -138,7 +140,8 @@ class _AppState extends State<App> {
await StorageHelper().set(SecureStorageKey.haveLocal.value, true);
log('onMessageOpenedApp');
} else {
onMessageReceived(message.data, message.notification!.body, message.data['click_action']);
onMessageReceived(message.data, message.notification!.body,
message.data['click_action']);
}
});
FirebaseMessaging.instance.getInitialMessage().then((message) async {
@ -172,7 +175,9 @@ class _AppState extends State<App> {
_router = createRouter(_appStateNotifier);
Future.delayed(
const Duration(milliseconds: 1000),
() => mounted ? setState(() => _appStateNotifier.stopShowingSplashImage()) : null,
() => mounted
? setState(() => _appStateNotifier.stopShowingSplashImage())
: null,
);
_setupFirebaseMessaging();

View File

@ -15,7 +15,8 @@ import '../../flutter_flow/internationalization.dart';
import 'forgot_password_model.dart';
class ForgotPasswordScreen extends StatefulWidget {
const ForgotPasswordScreen({super.key, required this.email, required this.token});
const ForgotPasswordScreen(
{super.key, required this.email, required this.token});
final String email;
final String token;
@ -23,7 +24,8 @@ class ForgotPasswordScreen extends StatefulWidget {
State<ForgotPasswordScreen> createState() => _ForgotPasswordScreenState();
}
class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with TickerProviderStateMixin {
class _ForgotPasswordScreenState extends State<ForgotPasswordScreen>
with TickerProviderStateMixin {
late ForgotPasswordScreenModel _model;
final animationsMap = <String, AnimationInfo>{};
@ -148,7 +150,8 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
width: MediaQuery.of(context).size.width,
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(left: 15.0, right: 15.0, top: 10.0, bottom: 0.0),
padding: const EdgeInsets.only(
left: 15.0, right: 15.0, top: 10.0, bottom: 0.0),
child: Container(
width: double.infinity,
constraints: const BoxConstraints(maxWidth: 570.0),
@ -157,7 +160,8 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
borderRadius: BorderRadius.circular(12.0),
),
child: Padding(
padding: const EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 0.0),
padding: const EdgeInsets.only(
left: 20.0, right: 20.0, top: 10.0, bottom: 0.0),
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
@ -171,21 +175,25 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
fontSize: 24.0,
fontWeight: FontWeight.bold,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'),
useGoogleFonts:
GoogleFonts.asMap().containsKey('Nunito'),
),
)),
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(20.0, 24.0, 0.0, 30.0),
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,
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
fontWeight: FontWeight.bold,
useGoogleFonts:
GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily),
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
@ -201,32 +209,42 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
controller: _model.passwordRegisterFormTextController,
focusNode: _model.passwordRegisterFormFocusNode,
visibility: _model.passwordRegisterFormVisibility,
onVisibilityToggle: () => setState(
() => _model.passwordRegisterFormVisibility = !_model.passwordRegisterFormVisibility),
label:
FFLocalizations.of(context).getVariableText(ptText: 'Nova Senha', enText: 'New Password'),
hint: FFLocalizations.of(context)
.getVariableText(ptText: 'Insira sua senha', enText: 'Enter your password'),
asValidator: _model.passwordRegisterFormTextControllerValidator.asValidator(context),
onVisibilityToggle: () => setState(() =>
_model.passwordRegisterFormVisibility =
!_model.passwordRegisterFormVisibility),
label: FFLocalizations.of(context).getVariableText(
ptText: 'Nova Senha', enText: 'New Password'),
hint: FFLocalizations.of(context).getVariableText(
ptText: 'Insira sua senha',
enText: 'Enter your password'),
asValidator: _model
.passwordRegisterFormTextControllerValidator
.asValidator(context),
),
_buildPasswordField(
context,
controller: _model.passwordConfirmFormTextController,
focusNode: _model.passwordConfirmFormFocusNode,
visibility: _model.passwordConfirmFormVisibility,
onVisibilityToggle: () => setState(
() => _model.passwordConfirmFormVisibility = !_model.passwordConfirmFormVisibility),
label: FFLocalizations.of(context)
.getVariableText(ptText: 'Confirme a Senha', enText: 'Confirm Password'),
hint: FFLocalizations.of(context)
.getVariableText(ptText: 'Confirme sua senha', enText: 'Confirm your password'),
asValidator: _model.passwordConfirmFormTextControllerValidator.asValidator(context),
onVisibilityToggle: () => setState(() =>
_model.passwordConfirmFormVisibility =
!_model.passwordConfirmFormVisibility),
label: FFLocalizations.of(context).getVariableText(
ptText: 'Confirme a Senha',
enText: 'Confirm Password'),
hint: FFLocalizations.of(context).getVariableText(
ptText: 'Confirme sua senha',
enText: 'Confirm your password'),
asValidator: _model
.passwordConfirmFormTextControllerValidator
.asValidator(context),
),
],
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0),
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 16.0),
child: FFButtonWidget(
key: const ValueKey<String>('SubmitButtonWidget'),
onPressed: _model.isFormInvalid()
@ -248,16 +266,22 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
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')),
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),
borderSide: const BorderSide(
color: Colors.transparent, width: 1.0),
borderRadius: BorderRadius.circular(12.0),
disabledColor: FlutterFlowTheme.of(context).customColor5,
disabledColor:
FlutterFlowTheme.of(context).customColor5,
disabledTextColor: Colors.white,
),
showLoadingIndicator: true,
@ -305,22 +329,28 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 16.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
useGoogleFonts:
GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: FlutterFlowTheme.of(context).customColor1, width: 0.25),
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),
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),
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),
borderSide:
const BorderSide(color: Color(0xFFFF5963), width: 0.25),
borderRadius: BorderRadius.circular(12.0),
),
filled: true,
@ -330,7 +360,9 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
onTap: onVisibilityToggle,
focusNode: FocusNode(skipTraversal: true),
child: Icon(
visibility ? Icons.visibility_outlined : Icons.visibility_off_outlined,
visibility
? Icons.visibility_outlined
: Icons.visibility_off_outlined,
color: FlutterFlowTheme.of(context).accent1,
size: 24.0,
),
@ -341,7 +373,8 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 16.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
useGoogleFonts:
GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
),
validator: asValidator,
),

View File

@ -0,0 +1 @@