add forgot password screen
This commit is contained in:
parent
909ac01852
commit
d980d36544
|
@ -52,6 +52,7 @@ android {
|
|||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
multiDexEnabled true
|
||||
consumerProguardFiles 'proguard.txt'
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
# SPDX-FileCopyrightText: 2016, microG Project Team
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
# Keep AutoSafeParcelables
|
||||
-keep public class * extends org.microg.safeparcel.AutoSafeParcelable {
|
||||
@org.microg.safeparcel.SafeParcelable.Field *;
|
||||
@org.microg.safeparcel.SafeParceled *;
|
||||
}
|
||||
|
||||
# Keep asInterface method cause it's accessed from SafeParcel
|
||||
-keepattributes InnerClasses
|
||||
-keepclassmembers interface * extends android.os.IInterface {
|
||||
public static class *;
|
||||
}
|
||||
-keep public class * extends android.os.Binder { public static *; }
|
|
@ -49,15 +49,29 @@
|
|||
/>
|
||||
|
||||
|
||||
<!-- <meta-data android:name="flutter_deeplinking_enabled" android:value="true" /> -->
|
||||
<meta-data android:name="flutter_deeplinking_enabled" android:value="false" />
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="https" android:host="freaccess.com.br" android:pathPrefix="/freaccess/alterarSenha.php" />
|
||||
</intent-filter>
|
||||
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="freaccess" />
|
||||
</intent-filter>
|
||||
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="mensagem" />
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="frehub" android:host="frehub.com" />
|
||||
|
@ -86,7 +100,7 @@
|
|||
<meta-data
|
||||
android:name="com.google.firebase.messaging.default_notification_icon"
|
||||
android:resource="@drawable/notification_icon" />
|
||||
|
||||
|
||||
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
|
|
|
@ -2,5 +2,4 @@ package com.freaccess.hub
|
|||
|
||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||
|
||||
class MainActivity: FlutterFragmentActivity() {
|
||||
}
|
||||
class MainActivity: FlutterFragmentActivity() {}
|
|
@ -1,3 +1,5 @@
|
|||
org.gradle.jvmargs=-Xmx4608m
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.enableR8=true
|
||||
enableProguardInReleaseBuilds = true
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
# SPDX-FileCopyrightText: 2016, microG Project Team
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
# Keep AutoSafeParcelables
|
||||
-keep public class * extends org.microg.safeparcel.AutoSafeParcelable {
|
||||
@org.microg.safeparcel.SafeParcelable.Field *;
|
||||
@org.microg.safeparcel.SafeParceled *;
|
||||
}
|
||||
|
||||
# Keep asInterface method cause it's accessed from SafeParcel
|
||||
-keepattributes InnerClasses
|
||||
-keepclassmembers interface * extends android.os.IInterface {
|
||||
public static class *;
|
||||
}
|
||||
-keep public class * extends android.os.Binder { public static *; }
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,48 +1,248 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hub/flutter_flow/random_data_util.dart';
|
||||
import 'package:hub/main.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
|
||||
|
||||
late WidgetTester widget;
|
||||
|
||||
void main() {
|
||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('Authentication Tests', () {
|
||||
setUp(() async {
|
||||
await initializeApp();
|
||||
group('Initialization', () {
|
||||
setUpAll(() async => await initializeApp().then((_) => StorageUtil().isLogged = false));
|
||||
|
||||
testWidgets('Test Welcome', (WidgetTester tester) async {
|
||||
widget = tester;
|
||||
|
||||
await widget.pumpWidget(const App());
|
||||
await widget.pumpAndSettle();
|
||||
await _navigateToSignIn();
|
||||
await _navigateToSignUp();
|
||||
await widget.pumpAndSettle();
|
||||
await widget.pumpWidget(const App());
|
||||
await widget.pumpAndSettle();
|
||||
await _navigateToSignUp();
|
||||
await _navigateToSignIn();
|
||||
await widget.pumpAndSettle();
|
||||
|
||||
|
||||
});
|
||||
|
||||
testWidgets('Test MyApp', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(const App());
|
||||
await _navToSignIn(tester);
|
||||
await _enterCredentialsAndSignIn(tester);
|
||||
await _login(tester);
|
||||
});
|
||||
group('Terms of Use', (){});
|
||||
|
||||
});
|
||||
group('Authentication', () {
|
||||
group('Sign in', () {
|
||||
setUpAll(() async =>
|
||||
await initializeApp().then((_) => StorageUtil().isLogged = false));
|
||||
|
||||
testWidgets('Test Sign In', (WidgetTester tester) async {
|
||||
widget = tester;
|
||||
|
||||
await widget.pumpWidget(const App());
|
||||
await _navigateToSignIn();
|
||||
|
||||
await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||
await _auth({'emailTextFormField': 'email_app@exemplo.com','passwordTextFormField': '12345678'});
|
||||
});
|
||||
});
|
||||
group('Sign up', () {
|
||||
setUpAll(() async =>
|
||||
await initializeApp().then((_) => StorageUtil().isLogged = false));
|
||||
|
||||
|
||||
testWidgets('Test Sign Up', (WidgetTester tester) async {
|
||||
widget = tester;
|
||||
await tester.pumpWidget(const App());
|
||||
late String name;
|
||||
late String email;
|
||||
late String password;
|
||||
late Map<String, dynamic> credentials;
|
||||
|
||||
await _navigateToSignUp();
|
||||
|
||||
name = 'app';
|
||||
email = 'email_app@exemplo.com';
|
||||
password = '12345678';
|
||||
credentials = {
|
||||
'nameTextFormField': name,
|
||||
'emailTextFormField': email,
|
||||
'passwordTextFormField': password
|
||||
};
|
||||
await _auth(credentials);
|
||||
|
||||
|
||||
name = randomString(7, 7, true, true, true);
|
||||
email = '$name@example.com';
|
||||
password = '12345678';
|
||||
credentials = {
|
||||
'nameTextFormField': name,
|
||||
'emailTextFormField': email,
|
||||
'passwordTextFormField': password
|
||||
};
|
||||
await _navigateToSignUp();
|
||||
await _auth(credentials);
|
||||
credentials = {
|
||||
'emailTextFormField': email,
|
||||
'passwordTextFormField': password
|
||||
};
|
||||
await _auth(credentials);
|
||||
|
||||
});
|
||||
});
|
||||
group('Sign Out', () {
|
||||
// setUpAll(() async =>
|
||||
// await initializeApp().then((_) => StorageUtil().isLogged = false));
|
||||
});
|
||||
group('Forgot Password', () {
|
||||
setUpAll(() async => await initializeApp().then((_) => StorageUtil().isLogged = false));
|
||||
|
||||
testWidgets('Test Forgot Password', (WidgetTester tester) async {
|
||||
widget = tester;
|
||||
late final String addr = randomString(5, 5, true, true, true);
|
||||
late Map<String, dynamic> credentials;
|
||||
|
||||
await tester.pumpWidget(const App());
|
||||
|
||||
await _navigateToSignIn();
|
||||
|
||||
await _recoveryPassword();
|
||||
credentials = {'recoveryTextFormField': '$addr@exemple.com'};
|
||||
await _send(credentials);
|
||||
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
|
||||
await _recoveryPassword();
|
||||
credentials = {'recoveryTextFormField': 'email_app@exemple.com'};
|
||||
await _send(credentials);
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
group('Localization', (){
|
||||
|
||||
});
|
||||
group('Networking', (){
|
||||
|
||||
});
|
||||
group('Functionality', (){
|
||||
|
||||
});
|
||||
group('Usability', (){
|
||||
|
||||
});
|
||||
group('Performance', (){
|
||||
|
||||
});
|
||||
group('Security', (){
|
||||
|
||||
});
|
||||
group('Accessibility', (){
|
||||
|
||||
});
|
||||
group('Compatibility', (){
|
||||
|
||||
});
|
||||
group('Internationalization', (){
|
||||
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
Future<void> _navToSignIn(WidgetTester tester) async {
|
||||
final navToSignIn = find.byKey(const Key('toggleSignInPage'));
|
||||
if (navToSignIn.evaluate().isNotEmpty) {
|
||||
await tester.tap(navToSignIn);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
|
||||
Future<void> _navigateBackUsingSystemGesture() async =>
|
||||
IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
|
||||
|
||||
|
||||
Future<void> _navigateToSignUp() async {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage'));
|
||||
if (navToSignUp.evaluate().isNotEmpty) {
|
||||
await widget.tap(navToSignUp);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _enterCredentialsAndSignIn(WidgetTester tester) async {
|
||||
final emailField = find.byKey(const ValueKey('emailField'));
|
||||
await tester.enterText(emailField, 'test@example.com');
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final passwordField = find.byKey(const ValueKey('passwordField'));
|
||||
await tester.enterText(passwordField, 'password123');
|
||||
await tester.pumpAndSettle();
|
||||
Future<void> _navigateToSignIn() async {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder navToSignIn = find.byKey(const ValueKey<String>('toggleSignInPage'));
|
||||
expect(navToSignIn, findsOneWidget);
|
||||
if (navToSignIn.evaluate().isNotEmpty) {
|
||||
await widget.tap(navToSignIn);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _login(WidgetTester tester) async {
|
||||
// Encontre o botão de login e clique nele
|
||||
final signInButton = find.byKey(const Key('loginCallback'));
|
||||
// expect(signInButton, findsOneWidget);
|
||||
tester.press(signInButton);
|
||||
Future<void> _recoveryPassword() async {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword'));
|
||||
if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword);
|
||||
await widget.ensureVisible(forgotPassword);
|
||||
await widget.pumpAndSettle();
|
||||
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _auth(Map<String, dynamic> credentials) async {
|
||||
await _enterCredentials(credentials);
|
||||
await _submit('SubmitButtonWidget');
|
||||
}
|
||||
|
||||
Future<void> _send(Map<String, dynamic> credentials) async {
|
||||
await _enterCredentials(credentials);
|
||||
await _submit('SendButtonWidget');
|
||||
}
|
||||
|
||||
|
||||
|
||||
Future<void> _enterCredentials(Map<String, dynamic> credentials) async {
|
||||
await widget.pumpAndSettle();
|
||||
|
||||
for (var entry in credentials.entries) {
|
||||
final Finder field = find.byKey(ValueKey<String>(entry.key));
|
||||
await widget.pumpAndSettle();
|
||||
expect(field, findsOneWidget);
|
||||
await widget.enterText(field, entry.value);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
|
||||
Future<void> _submit(String key) async {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder submitButton = find.byKey(ValueKey<String>(key));
|
||||
await widget.pumpAndSettle();
|
||||
if (submitButton.evaluate().isNotEmpty) {
|
||||
await widget.tap(submitButton);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
|
||||
|
||||
final Finder ThrowExceptionWidget = find.byKey(const ValueKey<String>('ThrowExceptionWidget'));
|
||||
await widget.pumpAndSettle();
|
||||
if (ThrowExceptionWidget.evaluate().isNotEmpty) {
|
||||
await widget.ensureVisible(ThrowExceptionWidget);
|
||||
await widget.tap(ThrowExceptionWidget);
|
||||
await widget.pumpAndSettle();
|
||||
} else {
|
||||
await _navigateBackUsingSystemGesture();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -3,8 +3,6 @@ import 'dart:convert';
|
|||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:hub/backend/notifications/firebase_messaging_service.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
|
||||
|
@ -24,6 +22,7 @@ class PhpGroup {
|
|||
static UpdToken updToken = UpdToken();
|
||||
static RegisterCall registerCall = RegisterCall();
|
||||
static ForgotPasswordCall forgotPasswordCall = ForgotPasswordCall();
|
||||
static ChangePasswordCall changePasswordCall = ChangePasswordCall();
|
||||
static GetLocalsCall getLocalsCall = GetLocalsCall();
|
||||
static PostScheduleVisitorCall postScheduleVisitorCall =
|
||||
PostScheduleVisitorCall();
|
||||
|
@ -660,11 +659,50 @@ class RegisterCall {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
class ChangePasswordCall {
|
||||
Future<ApiCallResponse> call({
|
||||
required final String email,
|
||||
required final String token,
|
||||
required final String psswd,
|
||||
}) async {
|
||||
final String baseUrl = PhpGroup.getBaseUrl();
|
||||
final String devUUID = StorageUtil().devUUID;
|
||||
final String userUUID = StorageUtil().userUUID;
|
||||
final String cliID = StorageUtil().cliUUID;
|
||||
|
||||
return ApiManager.instance.makeApiCall(
|
||||
callName: 'changePassword',
|
||||
apiUrl: '$baseUrl/alterarSenha.php',
|
||||
callType: ApiCallType.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
params: {
|
||||
'email': email,
|
||||
'token': token,
|
||||
'senha': psswd,
|
||||
'devUUID': devUUID,
|
||||
'userUUID': userUUID,
|
||||
'cliID': cliID,
|
||||
},
|
||||
bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
|
||||
returnBody: true,
|
||||
encodeBodyUtf8: false,
|
||||
decodeUtf8: false,
|
||||
cache: false,
|
||||
isStreamingApi: false,
|
||||
alwaysAllowBody: false,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ForgotPasswordCall {
|
||||
Future<ApiCallResponse> call({
|
||||
final String? email,
|
||||
}) async {
|
||||
final String baseUrl = PhpGroup.getBaseUrl();
|
||||
const String version = 'FRE-ACCESS-HUB';
|
||||
|
||||
return ApiManager.instance.makeApiCall(
|
||||
callName: 'forgotPassword',
|
||||
|
@ -675,6 +713,7 @@ class ForgotPasswordCall {
|
|||
},
|
||||
params: {
|
||||
'email': email,
|
||||
'appVersion': version,
|
||||
},
|
||||
bodyType: BodyType.X_WWW_FORM_URL_ENCODED,
|
||||
returnBody: true,
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:developer';
|
|||
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
|
|
|
@ -1,26 +1,17 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart';
|
||||
import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
|
||||
import 'package:hub/components/templates_components/message_notificaion_modal_template_component/message_notification_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
|
||||
Future<void> onMessageReceived(
|
||||
Map<String, dynamic> payload, String? extra, String? handleClick) async {
|
||||
Future<void> onMessageReceived(Map<String, dynamic> payload, String? extra, String? handleClick) async {
|
||||
final localId = jsonDecode(payload['local']!)['CLI_ID'];
|
||||
|
||||
final cliUUID = StorageUtil().cliUUID;
|
||||
|
|
|
@ -2,11 +2,9 @@ import 'package:flutter/material.dart';
|
|||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '../../../app_state.dart';
|
||||
|
||||
class MenuButtonWidget extends MenuEntry {
|
||||
const MenuButtonWidget({
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class CustomDatePickerUtil extends StatefulWidget {
|
||||
TextEditingController? controller;
|
||||
final FocusNode? focusNode;
|
||||
|
@ -37,7 +37,6 @@ class CustomDatePickerUtil extends StatefulWidget {
|
|||
|
||||
class _CustomDatePickerState extends State<CustomDatePickerUtil> {
|
||||
DateTime? _selectedDate;
|
||||
TimeOfDay? _selectedTime;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
|
|
@ -2,10 +2,9 @@ import 'package:easy_debounce/easy_debounce.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/tabview.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class CustomInputUtil extends StatefulWidget {
|
||||
final TextEditingController? controller;
|
||||
final String? labelText;
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
import 'dart:developer';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/components/organism_components/message_well_component/message_well_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_drop_down.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/form_field_controller.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class CustomSelect extends StatefulWidget {
|
||||
final List<String> options;
|
||||
final List<String> optionsLabel;
|
||||
|
@ -61,9 +58,7 @@ class _CustomSelectState extends State<CustomSelect> {
|
|||
decoration: const BoxDecoration(),
|
||||
child: FlutterFlowDropDown<String>(
|
||||
fillColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||
controller: widget.controller ??=
|
||||
FormFieldController<String>(
|
||||
widget.dropDownValue ??= ''),
|
||||
controller: widget.controller,
|
||||
options: widget.options,
|
||||
optionLabels: widget.optionsLabel,
|
||||
onChanged: widget.changed,
|
||||
|
|
|
@ -1,14 +1,11 @@
|
|||
import 'dart:developer';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/upload_data.dart';
|
||||
import 'package:hub/flutter_flow/uploaded_file.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class MediaUploadButtonUtil extends StatefulWidget {
|
||||
final Function(FFUploadedFile) onUploadComplete;
|
||||
bool isUploading;
|
||||
|
|
|
@ -2,9 +2,8 @@ import 'package:flutter/material.dart';
|
|||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/internationalization.dart';
|
||||
import 'package:json_path/fun_sdk.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class SubmitButtonUtil extends StatelessWidget {
|
||||
final String labelText;
|
||||
Future Function()? onPressed;
|
||||
|
|
|
@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class TabViewUtil extends StatelessWidget {
|
||||
final BuildContext context;
|
||||
final dynamic model;
|
||||
|
|
|
@ -175,7 +175,6 @@ class _OptModalWidgetState extends State<OptModalWidget> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
double screenWidth = MediaQuery.of(context).size.width;
|
||||
double screenHeight = MediaQuery.of(context).size.height;
|
||||
|
||||
return Center(
|
||||
child: Container(
|
||||
|
|
|
@ -4,6 +4,7 @@ import 'package:hub/components/molecular_components/order_filter_modal/order_fil
|
|||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
// ignore: unused_import
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
|
@ -178,7 +179,6 @@ class _OrderFilterModalWidgetState extends State<OrderFilterModalWidget> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
double screenWidth = MediaQuery.of(context).size.width;
|
||||
double screenHeight = MediaQuery.of(context).size.height;
|
||||
|
||||
return Center(
|
||||
child: Container(
|
||||
|
|
|
@ -11,6 +11,7 @@ import 'throw_exception_model.dart';
|
|||
|
||||
export 'throw_exception_model.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class ThrowExceptionWidget extends StatefulWidget {
|
||||
ThrowExceptionWidget(
|
||||
{super.key, required this.msg, this.type = EnumThrowException.error});
|
||||
|
@ -100,77 +101,63 @@ class _ThrowExceptionWidgetState extends State<ThrowExceptionWidget>
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(10.0, 0.0, 10.0, 0.0),
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
onTap: () async {
|
||||
context.pop();
|
||||
},
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Stack(
|
||||
children: [
|
||||
Align(
|
||||
alignment: const AlignmentDirectional(0.0, 0.0),
|
||||
child: Icon(
|
||||
_getIconByType(context),
|
||||
color: _getColorByType(context),
|
||||
size: 150.0,
|
||||
),
|
||||
),
|
||||
],
|
||||
).animateOnPageLoad(animationsMap['stackOnPageLoadAnimation']!),
|
||||
Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
_getTitleByType(context),
|
||||
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
||||
fontFamily:
|
||||
FlutterFlowTheme.of(context).bodyMediumFamily,
|
||||
fontSize: 20.0,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey(
|
||||
FlutterFlowTheme.of(context).bodyMediumFamily),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(
|
||||
0.0, 10.0, 0.0, 0.0),
|
||||
child: Text(
|
||||
valueOrDefault<String>(
|
||||
widget.msg,
|
||||
'Message Not Found',
|
||||
),
|
||||
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
||||
fontFamily:
|
||||
FlutterFlowTheme.of(context).bodyMediumFamily,
|
||||
letterSpacing: 0.0,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey(
|
||||
FlutterFlowTheme.of(context)
|
||||
.bodyMediumFamily),
|
||||
),
|
||||
),
|
||||
),
|
||||
].addToStart(const SizedBox(height: 20.0)),
|
||||
return InkWell(
|
||||
key: const ValueKey('ThrowExceptionWidget'),
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
onTap: () async {
|
||||
context.pop();
|
||||
},
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Stack(
|
||||
children: <Widget>[
|
||||
Align(
|
||||
alignment: const AlignmentDirectional(0.0, 0.0),
|
||||
child: Icon(
|
||||
_getIconByType(context),
|
||||
color: _getColorByType(context),
|
||||
size: 150.0,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
).animateOnPageLoad(animationsMap['stackOnPageLoadAnimation']!),
|
||||
const SizedBox(height: 20.0),
|
||||
Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
_getTitleByType(context),
|
||||
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
||||
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
|
||||
fontSize: 20.0,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
|
||||
child: Text(
|
||||
valueOrDefault<String>(widget.msg, 'Message Not Found'),
|
||||
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
||||
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
|
||||
letterSpacing: 0.0,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,11 +3,9 @@ import 'package:hub/components/organism_components/bottom_arrow_linked_locals_co
|
|||
import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
|
|
@ -1,18 +1,11 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '/flutter_flow/custom_functions.dart' as functions;
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import '../../../shared/services/localization/localization_service.dart';
|
||||
import 'local_profile_component_model.dart';
|
||||
|
||||
export 'local_profile_component_model.dart';
|
||||
|
@ -41,9 +34,10 @@ class _LocalProfileComponentWidgetState
|
|||
_model = createModel(context, () => LocalProfileComponentModel());
|
||||
_model.setOnUpdate(onUpdate: () => setState(() {}));
|
||||
_model.setStateCallback = () => safeSetState(() {});
|
||||
|
||||
//
|
||||
WidgetsBinding.instance
|
||||
.addPostFrameCallback((_) async => await processLocals());
|
||||
.addPostFrameCallback((_) async => await LocalizationService.processLocals(context).then((value) => value == true ? onUpdate() : null));
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -53,152 +47,14 @@ class _LocalProfileComponentWidgetState
|
|||
super.dispose();
|
||||
}
|
||||
|
||||
Future<void> processData() async {
|
||||
try {
|
||||
final GetDadosCall callback = PhpGroup.getDadosCall;
|
||||
|
||||
var response = await callback.call();
|
||||
|
||||
final error = response.jsonBody['error'];
|
||||
|
||||
if (error == false) {
|
||||
final bool whatsapp = response.jsonBody['whatsapp'] ?? false;
|
||||
final bool provisional = response.jsonBody['provisional'] ?? false;
|
||||
final bool pets = response.jsonBody['pet'] ?? false;
|
||||
final String petAmountRegister =
|
||||
response.jsonBody['petAmountRegister'].toString().isEmpty
|
||||
? '0'
|
||||
: response.jsonBody['petAmountRegister'].toString();
|
||||
final String name = response.jsonBody['visitado']['VDO_NOME'];
|
||||
|
||||
StorageUtil().whatsapp = whatsapp;
|
||||
StorageUtil().provisional = provisional;
|
||||
StorageUtil().pets = pets;
|
||||
StorageUtil().petAmountRegister = petAmountRegister;
|
||||
StorageUtil().userName = name;
|
||||
|
||||
safeSetState(() {});
|
||||
return;
|
||||
} else if (error == true) {
|
||||
log('() => error: $error');
|
||||
DialogUtil.warningDefault(context).whenComplete(() => processLocals());
|
||||
safeSetState(() {});
|
||||
}
|
||||
|
||||
return;
|
||||
} catch (e, s) {
|
||||
log('() => error: $e', stackTrace: s);
|
||||
DialogUtil.warningDefault(context).whenComplete(() => processLocals());
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> processLocals() async {
|
||||
try {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
||||
final ApiCallResponse response = await callback.call();
|
||||
|
||||
final List<dynamic> locals = response.jsonBody['locais'].toList() ?? [];
|
||||
|
||||
for (var local in locals) {
|
||||
final String status = local['CLU_STATUS'];
|
||||
log('() => CLU_STATUS: $status');
|
||||
}
|
||||
|
||||
final bool isActive = response.jsonBody['locais']
|
||||
.where((local) => local['CLU_STATUS'] == 'A')
|
||||
.toList()
|
||||
.isNotEmpty;
|
||||
final bool isInactived = response.jsonBody['locais']
|
||||
.where((local) =>
|
||||
local['CLU_STATUS'] != 'B' && local['CLU_STATUS'] != 'A')
|
||||
.toList()
|
||||
.isNotEmpty;
|
||||
final bool isUnique = locals.length == 1;
|
||||
final bool isBlocked = locals[0]['CLU_STATUS'] == 'B';
|
||||
final bool isEnabled = isUnique && isActive;
|
||||
|
||||
final bool isDisabled = isUnique && isBlocked;
|
||||
final bool isUnselected = StorageUtil().cliUUID.isEmpty &&
|
||||
StorageUtil().cliName.isEmpty & StorageUtil().ownerUUID.isEmpty;
|
||||
final bool isSelected =
|
||||
StorageUtil().cliUUID.isNotEmpty && StorageUtil().cliName.isNotEmpty;
|
||||
final bool isUnavailable = isInactived && isUnselected && isUnique;
|
||||
|
||||
if (!mounted) return;
|
||||
|
||||
if (isDisabled) {
|
||||
if (mounted) context.go('/welcomePage');
|
||||
} else if (isUnavailable) {
|
||||
log('() => isUnavailable');
|
||||
try {
|
||||
StorageUtil().cliName = locals[0]['CLI_NOME'];
|
||||
StorageUtil().cliUUID = locals[0]['CLI_ID'];
|
||||
StorageUtil().ownerUUID = locals[0]['CLU_OWNER_ID'];
|
||||
var response = await PhpGroup.resopndeVinculo.call(tarefa: 'A');
|
||||
if (response.jsonBody['error'] == true) {
|
||||
StorageUtil().cliUUID = '';
|
||||
StorageUtil().cliName = '';
|
||||
StorageUtil().ownerUUID = '';
|
||||
}
|
||||
if (response.jsonBody['error'] == false) await processData();
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'responderVinculo.php', '', 'Responder Vínculo', e, s);
|
||||
}
|
||||
} else if (isEnabled) {
|
||||
log('() => isEnabled');
|
||||
StorageUtil().cliName = locals[0]['CLI_NOME'];
|
||||
StorageUtil().cliUUID = locals[0]['CLI_ID'];
|
||||
StorageUtil().ownerUUID = locals[0]['CLU_OWNER_ID'];
|
||||
|
||||
await processData();
|
||||
} else if (isUnselected) {
|
||||
log('() => isUnselected');
|
||||
await showModalSelectLocal();
|
||||
} else if (isSelected) {
|
||||
log('() => isSelected');
|
||||
await processData();
|
||||
} else {
|
||||
log('() => else');
|
||||
await showModalSelectLocal();
|
||||
}
|
||||
} catch (e) {
|
||||
log('() => catch: $e');
|
||||
if (mounted) await showModalSelectLocal();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> showModalSelectLocal() async {
|
||||
await showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
enableDrag: false,
|
||||
isDismissible: false,
|
||||
showDragHandle: false,
|
||||
useSafeArea: true,
|
||||
context: context,
|
||||
builder: (context) => PopScope(
|
||||
canPop: false,
|
||||
child: Padding(
|
||||
padding: MediaQuery.viewInsetsOf(context),
|
||||
child: const BottomArrowLinkedLocalsComponentWidget(),
|
||||
),
|
||||
),
|
||||
).then((_) async {
|
||||
onUpdate();
|
||||
});
|
||||
|
||||
await processData();
|
||||
}
|
||||
|
||||
void onUpdate() {
|
||||
safeSetState(() {
|
||||
_model.getData();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
|
@ -230,7 +86,7 @@ class _LocalProfileComponentWidgetState
|
|||
hoverColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
onTap: () async {
|
||||
showModalSelectLocal();
|
||||
await LocalizationService.selectLocal(context).then((value) => value == true ? onUpdate() : null);
|
||||
},
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(200.0),
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/extensions/dialog_extensions.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/services/authentication/authentication_service.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
|
||||
import '/components/molecular_components/option_selection_modal/option_selection_modal_widget.dart';
|
||||
import '/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart';
|
||||
|
@ -244,29 +241,20 @@ class MenuComponentModel extends FlutterFlowModel<MenuComponentWidget> {
|
|||
});
|
||||
}
|
||||
|
||||
Future<void> signOut(BuildContext context) async {
|
||||
Future<void> Logout(BuildContext context) async {
|
||||
final String title = FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Sair',
|
||||
enText: 'Logout',
|
||||
);
|
||||
final String content = FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Tem certeza que deseja sair?',
|
||||
enText: 'Are you sure you want to logout?',
|
||||
);
|
||||
showAlertDialog(
|
||||
context,
|
||||
'Logout',
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Are you sure you want to logout?',
|
||||
ptText: 'Tem certeza',
|
||||
), () async {
|
||||
PhpGroup.unregisterDevice.call();
|
||||
StorageUtil.purge();
|
||||
|
||||
context.go(
|
||||
'/welcomePage',
|
||||
extra: <String, dynamic>{
|
||||
kTransitionInfoKey: const TransitionInfo(
|
||||
hasTransition: true,
|
||||
transitionType: PageTransitionType.scale,
|
||||
alignment: Alignment.bottomCenter,
|
||||
),
|
||||
},
|
||||
);
|
||||
await SQLiteStorageHelper().purge();
|
||||
});
|
||||
title,
|
||||
content,
|
||||
() async => await AuthenticationService.signOut(context));
|
||||
}
|
||||
|
||||
Future openPreferencesSettings(BuildContext context) async {
|
||||
|
|
|
@ -3,7 +3,6 @@ import 'package:hub/backend/schema/enums/enums.dart';
|
|||
import 'package:hub/components/atomic_components/menu_button_item/menu_button_item_widget.dart';
|
||||
import 'package:hub/components/atomic_components/menu_card_item/menu_card_item.dart';
|
||||
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
|
||||
import '/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart';
|
||||
import '/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart';
|
||||
|
@ -555,7 +554,7 @@ class _MenuComponentWidgetState extends State<MenuComponentWidget> {
|
|||
MenuCardItem(
|
||||
icon: Icons.logout,
|
||||
action: () async {
|
||||
await _model.signOut(context);
|
||||
await _model.Logout(context);
|
||||
setState(() {});
|
||||
},
|
||||
title: FFLocalizations.of(context).getVariableText(
|
||||
|
|
|
@ -1,14 +1,11 @@
|
|||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:rxdart/rxdart.dart';
|
||||
|
||||
|
@ -178,7 +175,7 @@ class _MessageWellComponentWidgetState
|
|||
}
|
||||
|
||||
Widget _buildMessageItem(BuildContext context, dynamic message, int index) {
|
||||
final theme = FlutterFlowTheme.of(context);
|
||||
FlutterFlowTheme.of(context);
|
||||
String formatMessageOrigin(String messageOrigin) {
|
||||
final words = messageOrigin.split(' ');
|
||||
final formattedWords = words.map((word) {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
|
||||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
import 'package:hub/components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
// ignore: unused_import
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
|
|
@ -2,13 +2,13 @@ import 'package:cached_network_image/cached_network_image.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart';
|
||||
import 'package:hub/components/organism_components/schedule_visit_detail/schedule_visit_detail_model.dart';
|
||||
import 'package:hub/flutter_flow/custom_functions.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
|
||||
class ScheduleVisitDetailWidget extends StatefulWidget {
|
||||
const ScheduleVisitDetailWidget({
|
||||
|
@ -799,22 +799,12 @@ class _ScheduleVisitDetailWidgetState extends State<ScheduleVisitDetailWidget> {
|
|||
false) {
|
||||
context.pop();
|
||||
} else {
|
||||
await showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
enableDrag: false,
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return Padding(
|
||||
padding: MediaQuery.viewInsetsOf(context),
|
||||
child: ThrowExceptionWidget(
|
||||
msg: PhpGroup.postScheduleVisitCall.errorMsg(
|
||||
(_model.postScheduleVisit?.jsonBody ?? ''),
|
||||
)!,
|
||||
),
|
||||
);
|
||||
},
|
||||
).then((value) => safeSetState(() {}));
|
||||
final String? msg = PhpGroup.postScheduleVisitCall.errorMsg(
|
||||
(_model.postScheduleVisit?.jsonBody ?? ''),
|
||||
);
|
||||
await DialogUtil.error(context, msg!).then((value) => safeSetState(() {}));
|
||||
|
||||
|
||||
}
|
||||
|
||||
setState(() {});
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class UpArrowLinkedLocalsComponentModel
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
|
|
|
@ -3,7 +3,6 @@ import 'dart:collection';
|
|||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
|
|
|
@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/services.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
import 'dart:collection';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/components/templates_components/details_component/details_component_model.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/internationalization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
||||
class DetailsComponentWidget extends StatefulWidget {
|
||||
const DetailsComponentWidget({
|
||||
|
@ -35,7 +32,7 @@ class _DetailsComponentWidgetState extends State<DetailsComponentWidget> {
|
|||
late DetailsComponentModel _model;
|
||||
|
||||
LinkedHashMap<String, String> get labelsLinkedHashMap =>
|
||||
LinkedHashMap.from(widget.labelsHashMap ?? {});
|
||||
LinkedHashMap.from(widget.labelsHashMap);
|
||||
|
||||
List<LinkedHashMap<String, Color>> get statusLinkedHashMap =>
|
||||
widget.statusHashMap
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import '/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:easy_debounce/easy_debounce.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/services/authentication/authentication_service.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import '/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'forgot_password_template_component_model.dart';
|
||||
|
||||
export 'forgot_password_template_component_model.dart';
|
||||
|
||||
//
|
||||
|
@ -74,7 +73,6 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// This row exists for when the "app bar" is hidden on desktop, having a way back for the user can work well.
|
||||
if (responsiveVisibility(
|
||||
context: context,
|
||||
phone: false,
|
||||
|
@ -84,6 +82,7 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
padding:
|
||||
const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 8.0),
|
||||
child: InkWell(
|
||||
key: const ValueKey<String>('BackButton'),
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
|
@ -104,19 +103,16 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
),
|
||||
),
|
||||
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: 14.0,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
useGoogleFonts: GoogleFonts.asMap()
|
||||
.containsKey('Plus Jakarta Sans'),
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -128,9 +124,7 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
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,
|
||||
|
@ -145,9 +139,7 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
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,
|
||||
|
@ -168,6 +160,7 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>('recoveryTextFormField'),
|
||||
controller: _model.emailAddressTextController,
|
||||
focusNode: _model.emailAddressFocusNode,
|
||||
onChanged: (_) => EasyDebounce.debounce(
|
||||
|
@ -180,11 +173,8 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
obscureText: false,
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
labelText: FFLocalizations.of(context).getText(
|
||||
'mtz8l7ft' /* E-mail */,
|
||||
),
|
||||
labelStyle:
|
||||
FlutterFlowTheme.of(context).labelMedium.override(
|
||||
labelText: FFLocalizations.of(context).getText('mtz8l7ft' /* E-mail */),
|
||||
labelStyle: FlutterFlowTheme.of(context).labelMedium.override(
|
||||
fontFamily: 'Plus Jakarta Sans',
|
||||
color: FlutterFlowTheme.of(context).primary,
|
||||
fontSize: 14.0,
|
||||
|
@ -253,39 +243,14 @@ class _ForgotPasswordTemplateComponentWidgetState
|
|||
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))
|
||||
? null
|
||||
: () async {
|
||||
try {
|
||||
_model.req = await PhpGroup.forgotPasswordCall.call(
|
||||
email: _model.emailAddressTextController.text,
|
||||
);
|
||||
: () async => AuthenticationService.forgotPassword(context, _model.emailAddressTextController.text),
|
||||
|
||||
if (_model.req?.jsonBody['error'] == false) {
|
||||
await DialogUtil.success(
|
||||
context,
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
enText: "Send E-mail Successful!",
|
||||
ptText: "E-mail Enviado com Sucesso!"));
|
||||
context.pop();
|
||||
} else {
|
||||
await DialogUtil.error(
|
||||
context, _model.req?.jsonBody['error_msg']);
|
||||
}
|
||||
|
||||
setState(() {});
|
||||
} catch (error, stack) {
|
||||
LogUtil.requestAPIFailed(
|
||||
"iforgot.php",
|
||||
_model.emailAddressTextController.text,
|
||||
"Recuperar Senha",
|
||||
error,
|
||||
stack);
|
||||
await DialogUtil.errorDefault(context);
|
||||
}
|
||||
},
|
||||
text: FFLocalizations.of(context).getText(
|
||||
'74rnd5bu' /* Enviar */,
|
||||
),
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/components/templates_components/liberation_history_item_details_template_component/liberation_history_item_details_template_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class LiberationHistoryItemDetailsTemplateComponentModel
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
import 'package:hub/components/templates_components/provisional_schedule_template/provisional_shcedule_template_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class ScheduleProvisionalVisitPageModel
|
||||
|
|
|
@ -529,8 +529,7 @@ class _ScheduleProvisionalVisitPageWidgetState
|
|||
initialDate:
|
||||
getCurrentTimestamp,
|
||||
firstDate:
|
||||
(getCurrentTimestamp ??
|
||||
DateTime(1900)),
|
||||
(getCurrentTimestamp),
|
||||
lastDate: DateTime(2050),
|
||||
builder: (context, child) {
|
||||
return wrapInMaterialDatePickerTheme(
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@ import 'package:google_fonts/google_fonts.dart';
|
|||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/image_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:rxdart/rxdart.dart';
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
|
|
|
@ -1,32 +1,19 @@
|
|||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/flutter_flow/random_data_util.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/device_util.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import 'sign_in_template_component_widget.dart'
|
||||
show SignInTemplateComponentWidget;
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SignInTemplateComponentModel
|
||||
extends FlutterFlowModel<SignInTemplateComponentWidget> {
|
||||
/// State fields for stateful widgets in this component.
|
||||
|
||||
final formKey = GlobalKey<FormState>();
|
||||
final unfocusNode = FocusNode();
|
||||
// State field(s) for emailAddress widget.
|
||||
FocusNode? emailAddressFocusNode;
|
||||
TextEditingController? emailAddressTextController;
|
||||
String? Function(BuildContext, String?)? emailAddressTextControllerValidator;
|
||||
|
||||
SignInTemplateComponentModel();
|
||||
String? _emailAddressTextControllerValidator(
|
||||
BuildContext context, String? val) {
|
||||
String? _emailAddressTextControllerValidator(BuildContext context, String? val) {
|
||||
if (val == null || val.isEmpty) {
|
||||
return FFLocalizations.of(context).getText(
|
||||
'xhnawzcb' /* Campo é necessário */,
|
||||
|
@ -40,8 +27,6 @@ class SignInTemplateComponentModel
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// State field(s) for password widget.
|
||||
FocusNode? passwordFocusNode;
|
||||
TextEditingController? passwordTextController;
|
||||
late bool passwordVisibility;
|
||||
|
@ -56,106 +41,10 @@ class SignInTemplateComponentModel
|
|||
return null;
|
||||
}
|
||||
|
||||
Future<bool> checkLocals({
|
||||
String? cliUUID,
|
||||
required BuildContext context,
|
||||
required FlutterFlowModel model,
|
||||
}) async {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
||||
final response = await callback.call();
|
||||
|
||||
if (response.jsonBody['error']) {
|
||||
DialogUtil.errorDefault(context);
|
||||
return false;
|
||||
}
|
||||
List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
||||
|
||||
if (locals.isEmpty) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Future signInLoginAction(
|
||||
BuildContext context,
|
||||
FlutterFlowModel model, {
|
||||
String? emailAdress,
|
||||
String? password,
|
||||
}) async {
|
||||
try {
|
||||
final ApiCallResponse? response;
|
||||
final LoginCall callback = PhpGroup.loginCall;
|
||||
StorageUtil().deviceDescription = randomString(
|
||||
10,
|
||||
10,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
);
|
||||
|
||||
final String? devUUID;
|
||||
final String userUUID;
|
||||
final String status;
|
||||
final String userDevUUID;
|
||||
final String userName;
|
||||
final String email;
|
||||
final String passwd;
|
||||
|
||||
email = emailAdress!;
|
||||
passwd = password!;
|
||||
|
||||
devUUID = await DeviceUtil.getDevUUID();
|
||||
|
||||
if ((email != '') && (passwd != '')) {
|
||||
StorageUtil().email = email;
|
||||
StorageUtil().passwd = passwd;
|
||||
StorageUtil().devUUID = devUUID!;
|
||||
response = await callback.call();
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
userUUID = response.jsonBody['uid'];
|
||||
status = response.jsonBody['user']['status'];
|
||||
userDevUUID = response.jsonBody['user']['dev_id'];
|
||||
userName = response.jsonBody['user']['name'];
|
||||
|
||||
StorageUtil().userUUID = userUUID;
|
||||
StorageUtil().userDevUUID = userDevUUID;
|
||||
StorageUtil().status = status;
|
||||
StorageUtil().userName = userName;
|
||||
|
||||
await checkLocals(context: context, model: model).then((value) {
|
||||
StorageUtil().haveLocal = value;
|
||||
StorageUtil().isLogged = true;
|
||||
toggleApp(context);
|
||||
});
|
||||
} else {
|
||||
if (response.jsonBody['error'] == null) {
|
||||
DialogUtil.errorDefault(context);
|
||||
} else {
|
||||
DialogUtil.error(
|
||||
context, response.jsonBody['error_msg'].toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'login.php', emailAdress.toString(), "Login", e, s);
|
||||
}
|
||||
}
|
||||
|
||||
Future toggleApp(BuildContext context) async {
|
||||
final haveLocal = StorageUtil().haveLocal;
|
||||
if (haveLocal == true) {
|
||||
context.go('/homePage');
|
||||
} else if (haveLocal == false) {
|
||||
context.go('/receptionPage');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void initState(BuildContext context) {
|
||||
|
|
|
@ -13,6 +13,7 @@ import '/flutter_flow/flutter_flow_animations.dart';
|
|||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import '/flutter_flow/flutter_flow_widgets.dart';
|
||||
import '../../../shared/services/authentication/authentication_service.dart';
|
||||
import 'sign_in_template_component_model.dart';
|
||||
|
||||
export 'sign_in_template_component_model.dart';
|
||||
|
@ -99,15 +100,8 @@ class _SignInTemplateComponentWidgetState
|
|||
}
|
||||
|
||||
bool _isFormInvalid() {
|
||||
if (_model.emailAddressTextController.text == '' ||
|
||||
_model.passwordTextController.text == '') {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!ValidatorUtil.isValidEmail(_model.emailAddressTextController.text)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_model.emailAddressTextController.text == '' || _model.passwordTextController.text == '') return true;
|
||||
if (!ValidatorUtil.isValidEmail(_model.emailAddressTextController.text)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -131,14 +125,11 @@ class _SignInTemplateComponentWidgetState
|
|||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(
|
||||
0.0, 35.0, 0.0, 35.0),
|
||||
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),
|
||||
),
|
||||
decoration: BoxDecoration(borderRadius: BorderRadius.circular(16.0)),
|
||||
alignment: const AlignmentDirectional(0.0, 0.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(20.0),
|
||||
|
@ -148,31 +139,24 @@ class _SignInTemplateComponentWidgetState
|
|||
children: [
|
||||
Expanded(
|
||||
child: Align(
|
||||
alignment:
|
||||
const AlignmentDirectional(0.0, 1.0),
|
||||
alignment: const AlignmentDirectional(0.0, 1.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(3.0),
|
||||
child: Text(
|
||||
FFLocalizations.of(context)
|
||||
.getVariableText(
|
||||
ptText:
|
||||
'VAMOS LÁ! ENTRE COM A SUA CONTA',
|
||||
enText:
|
||||
'LET\'S GO! SIGN IN WITH YOUR ACCOUNT',
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'VAMOS LÁ! ENTRE COM A SUA CONTA',
|
||||
enText: 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT',
|
||||
),
|
||||
textAlign: TextAlign.start,
|
||||
style: FlutterFlowTheme.of(context)
|
||||
.displaySmall
|
||||
.override(
|
||||
fontFamily: 'Plus Jakarta Sans',
|
||||
color: FlutterFlowTheme.of(context)
|
||||
.primaryText,
|
||||
color: FlutterFlowTheme.of(context).primaryText,
|
||||
fontSize: 24.0,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
useGoogleFonts: GoogleFonts.asMap()
|
||||
.containsKey(
|
||||
'Plus Jakarta Sans'),
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -189,8 +173,7 @@ class _SignInTemplateComponentWidgetState
|
|||
decoration: const BoxDecoration(),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(8.0),
|
||||
child: const AtomImageSvgTheme(
|
||||
filename: 'login', width: 600, height: 155),
|
||||
child: const AtomImageSvgTheme(filename: 'login', width: 600, height: 155),
|
||||
),
|
||||
),
|
||||
Column(
|
||||
|
@ -199,16 +182,12 @@ class _SignInTemplateComponentWidgetState
|
|||
Align(
|
||||
alignment: const AlignmentDirectional(0.0, 0.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(
|
||||
34.0, 0.0, 34.0, 0.0),
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(34.0, 0.0, 34.0, 0.0),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 570.0,
|
||||
),
|
||||
constraints: const BoxConstraints(maxWidth: 570.0,),
|
||||
decoration: BoxDecoration(
|
||||
color: FlutterFlowTheme.of(context)
|
||||
.primaryBackground,
|
||||
color: FlutterFlowTheme.of(context).primaryBackground,
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
shape: BoxShape.rectangle,
|
||||
),
|
||||
|
@ -218,8 +197,7 @@ class _SignInTemplateComponentWidgetState
|
|||
padding: const EdgeInsets.all(32.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Form(
|
||||
key: _model.formKey,
|
||||
|
@ -237,7 +215,7 @@ class _SignInTemplateComponentWidgetState
|
|||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>(
|
||||
'emailField'),
|
||||
'emailTextFormField'),
|
||||
controller: _model
|
||||
.emailAddressTextController,
|
||||
focusNode: _model
|
||||
|
@ -378,324 +356,159 @@ class _SignInTemplateComponentWidgetState
|
|||
),
|
||||
),
|
||||
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: SizedBox(
|
||||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>(
|
||||
'passwordField'),
|
||||
controller: _model
|
||||
.passwordTextController,
|
||||
cursorColor:
|
||||
FlutterFlowTheme.of(
|
||||
context)
|
||||
.primary,
|
||||
focusNode:
|
||||
_model.passwordFocusNode,
|
||||
onChanged: (_) =>
|
||||
EasyDebounce.debounce(
|
||||
key: const ValueKey<String>('passwordTextFormField'),
|
||||
controller: _model.passwordTextController,
|
||||
cursorColor: FlutterFlowTheme.of(context).primary,
|
||||
focusNode: _model.passwordFocusNode,
|
||||
onChanged: (_) => EasyDebounce.debounce(
|
||||
'_model.passwordTextController',
|
||||
const Duration(
|
||||
milliseconds: 500),
|
||||
() => setState(() {}),
|
||||
const Duration(milliseconds: 500),
|
||||
() => setState(() {})
|
||||
),
|
||||
autofocus: true,
|
||||
autofillHints: const [
|
||||
AutofillHints.password
|
||||
],
|
||||
textInputAction:
|
||||
TextInputAction.send,
|
||||
obscureText: !_model
|
||||
.passwordVisibility,
|
||||
autofillHints: const [AutofillHints.password],
|
||||
textInputAction: TextInputAction.send,
|
||||
obscureText: !_model.passwordVisibility,
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
labelText:
|
||||
FFLocalizations.of(
|
||||
context)
|
||||
.getText(
|
||||
'2x19ce8k' /* Senha */,
|
||||
),
|
||||
labelStyle: FlutterFlowTheme
|
||||
.of(context)
|
||||
labelText: FFLocalizations.of(context).getText('2x19ce8k' /* Senha */),
|
||||
labelStyle: FlutterFlowTheme.of(context)
|
||||
.labelLarge
|
||||
.override(
|
||||
fontFamily:
|
||||
'Plus Jakarta Sans',
|
||||
color: FlutterFlowTheme
|
||||
.of(context)
|
||||
.primaryText,
|
||||
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(
|
||||
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),
|
||||
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),
|
||||
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),
|
||||
),
|
||||
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),
|
||||
focusedErrorBorder: OutlineInputBorder(
|
||||
borderSide: const BorderSide(
|
||||
color: Color(0xFFFF5963),
|
||||
width: 0.25),
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
),
|
||||
filled: true,
|
||||
fillColor:
|
||||
FlutterFlowTheme.of(
|
||||
context)
|
||||
.primaryBackground,
|
||||
fillColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||
suffixIcon: InkWell(
|
||||
onTap: () => setState(
|
||||
() => _model
|
||||
.passwordVisibility =
|
||||
!_model
|
||||
.passwordVisibility,
|
||||
),
|
||||
focusNode: FocusNode(
|
||||
skipTraversal: true),
|
||||
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,
|
||||
),
|
||||
_model.passwordVisibility ? Icons.visibility_outlined : Icons.visibility_off_outlined,
|
||||
color:FlutterFlowTheme.of(context).accent1,
|
||||
size: 24.0),
|
||||
),
|
||||
),
|
||||
style: FlutterFlowTheme.of(
|
||||
context)
|
||||
style: FlutterFlowTheme.of(context)
|
||||
.bodyLarge
|
||||
.override(
|
||||
fontFamily:
|
||||
'Plus Jakarta Sans',
|
||||
color:
|
||||
FlutterFlowTheme.of(
|
||||
context)
|
||||
.primaryText,
|
||||
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'),
|
||||
fontWeight: FontWeight.w500,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
|
||||
),
|
||||
validator: _model
|
||||
.passwordTextControllerValidator
|
||||
.asValidator(context),
|
||||
validator: _model.passwordTextControllerValidator.asValidator(context),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
Builder(
|
||||
builder: (context) {
|
||||
if (MediaQuery.sizeOf(context).width <
|
||||
kBreakpointSmall
|
||||
? true
|
||||
: false) {
|
||||
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),
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
key: const ValueKey<String>('SubmitButtonWidget'),
|
||||
onPressed: _isFormInvalid()
|
||||
? null
|
||||
: () async {
|
||||
await _model
|
||||
.signInLoginAction(
|
||||
context,
|
||||
_model,
|
||||
emailAdress: _model
|
||||
.emailAddressTextController
|
||||
.text,
|
||||
password: _model
|
||||
.passwordTextController
|
||||
.text,
|
||||
await AuthenticationService.signIn(context, _model,
|
||||
emailAdress: _model.emailAddressTextController.text,
|
||||
password: _model.passwordTextController.text,
|
||||
);
|
||||
setState(() {});
|
||||
},
|
||||
text: FFLocalizations.of(
|
||||
context)
|
||||
.getText(
|
||||
'k44tm7wo' /* Entrar */,
|
||||
),
|
||||
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,
|
||||
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'),
|
||||
),
|
||||
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:
|
||||
FlutterFlowTheme.of(
|
||||
context)
|
||||
.customColor5,
|
||||
disabledTextColor:
|
||||
Colors.white,
|
||||
borderSide: const BorderSide(
|
||||
color: Colors.transparent,
|
||||
width: 1.0),
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
disabledColor: FlutterFlowTheme.of(context).customColor5,
|
||||
disabledTextColor: Colors.white,
|
||||
),
|
||||
showLoadingIndicator: false,
|
||||
),
|
||||
),
|
||||
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(
|
||||
onPressed: () async {
|
||||
await widget
|
||||
.toggleSignUpPage
|
||||
?.call();
|
||||
},
|
||||
text: FFLocalizations.of(
|
||||
context)
|
||||
.getText(
|
||||
'14u7ipws' /* Cadastrar */,
|
||||
key: const ValueKey<String>('toggleSignUpPage'),
|
||||
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,
|
||||
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)
|
||||
FlutterFlowTheme.of(context)
|
||||
.titleSmall
|
||||
.override(
|
||||
fontFamily:
|
||||
'Plus Jakarta Sans',
|
||||
color: FlutterFlowTheme.of(
|
||||
context)
|
||||
.secondaryText,
|
||||
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'),
|
||||
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),
|
||||
borderSide: const BorderSide(color: Colors.transparent, width: 1.0),
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
),
|
||||
showLoadingIndicator: false,
|
||||
),
|
||||
|
@ -705,109 +518,59 @@ class _SignInTemplateComponentWidgetState
|
|||
} else {
|
||||
return Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceEvenly,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsetsDirectional
|
||||
.fromSTEB(0.0, 0.0,
|
||||
0.0, 16.0),
|
||||
.fromSTEB(0.0, 0.0,0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
key: const ValueKey<
|
||||
String>(
|
||||
'loginCallback'),
|
||||
onPressed:
|
||||
_isFormInvalid()
|
||||
? null
|
||||
: () async {
|
||||
key: const ValueKey<String>('SubmitButtonWidget'),
|
||||
onPressed: _isFormInvalid() ? null : () async {
|
||||
try {
|
||||
await _model
|
||||
.signInLoginAction(
|
||||
await AuthenticationService.signIn(
|
||||
context,
|
||||
_model,
|
||||
emailAdress: _model
|
||||
.emailAddressTextController
|
||||
.text,
|
||||
password: _model
|
||||
.passwordTextController
|
||||
.text,
|
||||
emailAdress: _model.emailAddressTextController.text,
|
||||
password: _model.passwordTextController.text,
|
||||
);
|
||||
setState(
|
||||
() {});
|
||||
setState(() {});
|
||||
} catch (e, s) {
|
||||
await DialogUtil
|
||||
.errorDefault(
|
||||
context);
|
||||
await DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'login.php',
|
||||
_model
|
||||
.emailAddressTextController
|
||||
.text,
|
||||
_model.emailAddressTextController.text,
|
||||
"Login",
|
||||
e,
|
||||
s);
|
||||
e, s);
|
||||
}
|
||||
},
|
||||
text: FFLocalizations.of(
|
||||
context)
|
||||
.getText(
|
||||
'1x926nsn' /* Entrar */,
|
||||
),
|
||||
text: FFLocalizations.of(context).getText('1x926nsn'),
|
||||
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)
|
||||
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'),
|
||||
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,
|
||||
borderSide: const BorderSide(
|
||||
color: Colors.transparent,
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius
|
||||
.circular(12.0),
|
||||
disabledColor:
|
||||
const Color(
|
||||
0xE81AAB5F),
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
disabledColor: const Color(0xE81AAB5F),
|
||||
),
|
||||
showLoadingIndicator:
|
||||
true,
|
||||
showLoadingIndicator: true,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -818,79 +581,45 @@ class _SignInTemplateComponentWidgetState
|
|||
.fromSTEB(0.0, 0.0,
|
||||
0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
onPressed: () async {
|
||||
await widget
|
||||
.toggleSignUpPage
|
||||
?.call();
|
||||
},
|
||||
text: FFLocalizations.of(
|
||||
context)
|
||||
.getText(
|
||||
'jwvd4ai1' /* Cadastrar */,
|
||||
),
|
||||
key: const ValueKey<String>('toggleSignUpPage'),
|
||||
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,
|
||||
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)
|
||||
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'),
|
||||
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),
|
||||
borderSide: const BorderSide(color: Colors.transparent,width: 1.0,),
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
),
|
||||
showLoadingIndicator:
|
||||
false,
|
||||
showLoadingIndicator: false,
|
||||
),
|
||||
),
|
||||
),
|
||||
].divide(
|
||||
const SizedBox(width: 7.0)),
|
||||
);
|
||||
].divide(const SizedBox(width: 7.0)));
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
|
||||
Padding(
|
||||
padding: const EdgeInsetsDirectional
|
||||
.fromSTEB(0.0, 12.0, 0.0, 12.0),
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 12.0, 0.0, 12.0),
|
||||
child: InkWell(
|
||||
key: const ValueKey<String>('ForgotPassword'),
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
|
@ -898,100 +627,42 @@ class _SignInTemplateComponentWidgetState
|
|||
onTap: () async {
|
||||
await showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
backgroundColor:
|
||||
Colors.transparent,
|
||||
backgroundColor: Colors.transparent,
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return Padding(
|
||||
padding:
|
||||
MediaQuery.viewInsetsOf(
|
||||
context),
|
||||
child:
|
||||
const ForgotPasswordTemplateComponentWidget(),
|
||||
padding: MediaQuery.viewInsetsOf(context),
|
||||
child: const ForgotPasswordTemplateComponentWidget(),
|
||||
);
|
||||
},
|
||||
).then(
|
||||
(value) => safeSetState(() {}));
|
||||
},
|
||||
}).then((value) => safeSetState(() {}));
|
||||
},
|
||||
child: RichText(
|
||||
textScaler: MediaQuery.of(context)
|
||||
.textScaler,
|
||||
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,
|
||||
),
|
||||
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,
|
||||
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'),
|
||||
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,
|
||||
// useRootNavigator: true,
|
||||
// builder: (context) {
|
||||
// return Padding(
|
||||
// padding: MediaQuery.viewInsetsOf(context),
|
||||
// child: const ForgotPasswordTemplateComponentWidget(),
|
||||
// );
|
||||
// },
|
||||
// ).then((value) =>
|
||||
// safeSetState(
|
||||
// () {}));
|
||||
// },
|
||||
mouseCursor: SystemMouseCursors.click,
|
||||
)
|
||||
],
|
||||
style:
|
||||
FlutterFlowTheme.of(context)
|
||||
style: FlutterFlowTheme.of(context)
|
||||
.bodyMedium
|
||||
.override(
|
||||
fontFamily:
|
||||
FlutterFlowTheme.of(
|
||||
context)
|
||||
.bodyMediumFamily,
|
||||
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
|
||||
letterSpacing: 0.0,
|
||||
useGoogleFonts: GoogleFonts
|
||||
.asMap()
|
||||
.containsKey(
|
||||
FlutterFlowTheme.of(
|
||||
context)
|
||||
.bodyMediumFamily),
|
||||
),
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily)),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -1,25 +1,17 @@
|
|||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/flutter_flow/random_data_util.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import 'sign_up_template_component_widget.dart'
|
||||
show SignUpTemplateComponentWidget;
|
||||
import 'package:flutter/material.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) {
|
||||
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 */,
|
||||
|
@ -29,13 +21,10 @@ class SignUpTemplateComponentModel
|
|||
return null;
|
||||
}
|
||||
|
||||
// State field(s) for emailRegisterForm widget.
|
||||
FocusNode? emailRegisterFormFocusNode;
|
||||
TextEditingController? emailRegisterFormTextController;
|
||||
String? Function(BuildContext, String?)?
|
||||
emailRegisterFormTextControllerValidator;
|
||||
String? _emailRegisterFormTextControllerValidator(
|
||||
BuildContext context, String? val) {
|
||||
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 */,
|
||||
|
@ -50,14 +39,11 @@ class SignUpTemplateComponentModel
|
|||
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) {
|
||||
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 */,
|
||||
|
@ -73,18 +59,14 @@ class SignUpTemplateComponentModel
|
|||
return null;
|
||||
}
|
||||
|
||||
// Stores action output result for [Action Block - signUpRegisterAction] action in SignUpButtonRegisterForm widget.
|
||||
bool? signUp;
|
||||
bool? register;
|
||||
|
||||
@override
|
||||
void initState(BuildContext context) {
|
||||
nameRegisterFormTextControllerValidator =
|
||||
_nameRegisterFormTextControllerValidator;
|
||||
emailRegisterFormTextControllerValidator =
|
||||
_emailRegisterFormTextControllerValidator;
|
||||
nameRegisterFormTextControllerValidator = _nameRegisterFormTextControllerValidator;
|
||||
emailRegisterFormTextControllerValidator = _emailRegisterFormTextControllerValidator;
|
||||
passwordRegisterFormVisibility = false;
|
||||
passwordRegisterFormTextControllerValidator =
|
||||
_passwordRegisterFormTextControllerValidator;
|
||||
passwordRegisterFormTextControllerValidator = _passwordRegisterFormTextControllerValidator;
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -99,61 +81,6 @@ class SignUpTemplateComponentModel
|
|||
passwordRegisterFormTextController?.dispose();
|
||||
}
|
||||
|
||||
Future<bool> signUpRegisterAction(
|
||||
BuildContext context, {
|
||||
required String? name,
|
||||
String? passwd,
|
||||
required String? email,
|
||||
String? device,
|
||||
}) async {
|
||||
try {
|
||||
ApiCallResponse? response;
|
||||
|
||||
if ((email != null && email != '') &&
|
||||
(passwd != null && passwd != '' && passwd.length > 7) &&
|
||||
(name != null && name != '')) {
|
||||
response = await PhpGroup.registerCall.call(
|
||||
name: name,
|
||||
password: passwd,
|
||||
email: email,
|
||||
token: randomString(
|
||||
36,
|
||||
36,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
),
|
||||
uuid: randomString(
|
||||
36,
|
||||
36,
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
),
|
||||
tipo: device!,
|
||||
descricao: randomString(
|
||||
36,
|
||||
36,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
),
|
||||
);
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
return true;
|
||||
}
|
||||
DialogUtil.error(context, response.jsonBody['error_msg']);
|
||||
return false;
|
||||
} else {
|
||||
DialogUtil.errorDefault(context);
|
||||
return false;
|
||||
}
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'registro.php', email.toString(), "Register", e, s);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,35 +4,26 @@ import 'package:flutter_animate/flutter_animate.dart';
|
|||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/atom_image_svg_theme.dart';
|
||||
import 'package:hub/shared/components/atoms/atom_terms_of_use.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '/flutter_flow/flutter_flow_animations.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import '/flutter_flow/flutter_flow_widgets.dart';
|
||||
import '../../../shared/services/authentication/authentication_service.dart';
|
||||
import 'sign_up_template_component_model.dart';
|
||||
|
||||
export 'sign_up_template_component_model.dart';
|
||||
|
||||
class SignUpTemplateComponentWidget extends StatefulWidget {
|
||||
const SignUpTemplateComponentWidget({
|
||||
super.key,
|
||||
required this.toggleSignInPage,
|
||||
});
|
||||
const SignUpTemplateComponentWidget({super.key, required this.toggleSignInPage});
|
||||
final Future Function()? toggleSignInPage;
|
||||
|
||||
@override
|
||||
State<SignUpTemplateComponentWidget> createState() =>
|
||||
_SignUpTemplateComponentWidgetState();
|
||||
@override State<SignUpTemplateComponentWidget> createState() => _SignUpTemplateComponentWidgetState();
|
||||
}
|
||||
|
||||
class _SignUpTemplateComponentWidgetState
|
||||
extends State<SignUpTemplateComponentWidget> with TickerProviderStateMixin {
|
||||
class _SignUpTemplateComponentWidgetState extends State<SignUpTemplateComponentWidget> with TickerProviderStateMixin {
|
||||
late SignUpTemplateComponentModel _model;
|
||||
|
||||
final animationsMap = <String, AnimationInfo>{};
|
||||
|
||||
@override
|
||||
|
@ -246,6 +237,8 @@ class _SignUpTemplateComponentWidgetState
|
|||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>(
|
||||
'nameTextFormField'),
|
||||
controller: _model
|
||||
.nameRegisterFormTextController,
|
||||
focusNode: _model
|
||||
|
@ -388,6 +381,8 @@ class _SignUpTemplateComponentWidgetState
|
|||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>(
|
||||
'emailTextFormField'),
|
||||
controller: _model
|
||||
.emailRegisterFormTextController,
|
||||
focusNode: _model
|
||||
|
@ -532,6 +527,8 @@ class _SignUpTemplateComponentWidgetState
|
|||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>(
|
||||
'passwordTextFormField'),
|
||||
controller: _model
|
||||
.passwordRegisterFormTextController,
|
||||
focusNode: _model
|
||||
|
@ -631,6 +628,7 @@ class _SignUpTemplateComponentWidgetState
|
|||
context)
|
||||
.primaryBackground,
|
||||
suffixIcon: InkWell(
|
||||
key: const ValueKey<String>('passwordVisibilitySuffixIcon'),
|
||||
onTap: () => setState(
|
||||
() => _model
|
||||
.passwordRegisterFormVisibility =
|
||||
|
@ -685,41 +683,24 @@ class _SignUpTemplateComponentWidgetState
|
|||
padding: const EdgeInsetsDirectional
|
||||
.fromSTEB(0.0, 0.0, 0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
key: const ValueKey<String>('SubmitButtonWidget'),
|
||||
onPressed: isFormInvalid()
|
||||
? null
|
||||
: () async {
|
||||
var shouldSetState = false;
|
||||
_model.signUp = await _model
|
||||
.signUpRegisterAction(
|
||||
context,
|
||||
name: _model
|
||||
.nameRegisterFormTextController
|
||||
.text,
|
||||
passwd: _model
|
||||
.passwordRegisterFormTextController
|
||||
.text,
|
||||
email: _model
|
||||
.emailRegisterFormTextController
|
||||
.text,
|
||||
device:
|
||||
StorageUtil()
|
||||
.deviceType,
|
||||
_model.register = await AuthenticationService.signUp(context,
|
||||
email: _model.emailRegisterFormTextController.text,
|
||||
name: _model.nameRegisterFormTextController.text,
|
||||
passwd: _model.passwordRegisterFormTextController.text,
|
||||
device: StorageUtil().deviceType,
|
||||
);
|
||||
shouldSetState = true;
|
||||
if (_model.signUp == true) {
|
||||
await widget
|
||||
.toggleSignInPage
|
||||
?.call();
|
||||
} else {
|
||||
if (shouldSetState) {
|
||||
setState(() {});
|
||||
}
|
||||
if (_model.register == true) await widget.toggleSignInPage?.call();
|
||||
else {
|
||||
if (shouldSetState) setState(() {});
|
||||
return;
|
||||
}
|
||||
|
||||
if (shouldSetState) {
|
||||
setState(() {});
|
||||
}
|
||||
if (shouldSetState) setState(() {});
|
||||
},
|
||||
text: FFLocalizations.of(context)
|
||||
.getText(
|
||||
|
@ -774,14 +755,12 @@ class _SignUpTemplateComponentWidgetState
|
|||
padding: const EdgeInsetsDirectional
|
||||
.fromSTEB(0.0, 12.0, 0.0, 12.0),
|
||||
child: InkWell(
|
||||
key: const ValueKey<String>('toggleSignInPage'),
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
onTap: () async {
|
||||
await widget.toggleSignInPage
|
||||
?.call();
|
||||
},
|
||||
onTap: () async => await widget.toggleSignInPage?.call(),
|
||||
child: RichText(
|
||||
textScaler: MediaQuery.of(context)
|
||||
.textScaler,
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import 'view_visit_detail_widget.dart' show ViewVisitDetailWidget;
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ViewVisitDetailModel extends FlutterFlowModel<ViewVisitDetailWidget> {
|
||||
late final String devUUID;
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
import 'package:hub/components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class VisitorSearchModalTemplateComponentModel
|
||||
|
|
|
@ -12,7 +12,6 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
|||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class VisitorSearchModalTemplateComponentWidget extends StatefulWidget {
|
||||
const VisitorSearchModalTemplateComponentWidget({
|
||||
|
@ -34,7 +33,6 @@ class _VisitorSearchModalTemplateComponentWidgetState
|
|||
with TickerProviderStateMixin {
|
||||
late VisitorSearchModalTemplateComponentModel _model;
|
||||
|
||||
@override
|
||||
safeSetState(VoidCallback callback) {
|
||||
super.setState(callback);
|
||||
_model.onUpdate();
|
||||
|
|
|
@ -26,11 +26,8 @@ class WelcomeTemplateComponentWidget extends StatefulWidget {
|
|||
_WelcomeTemplateComponentWidgetState();
|
||||
}
|
||||
|
||||
class _WelcomeTemplateComponentWidgetState
|
||||
extends State<WelcomeTemplateComponentWidget>
|
||||
with TickerProviderStateMixin {
|
||||
class _WelcomeTemplateComponentWidgetState extends State<WelcomeTemplateComponentWidget> with TickerProviderStateMixin {
|
||||
late WelcomeTemplateComponentModel _model;
|
||||
|
||||
final animationsMap = <String, AnimationInfo>{};
|
||||
|
||||
@override
|
||||
|
@ -44,38 +41,39 @@ class _WelcomeTemplateComponentWidgetState
|
|||
super.initState();
|
||||
_model = createModel(context, () => WelcomeTemplateComponentModel());
|
||||
|
||||
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),
|
||||
animationsMap.addAll(
|
||||
<String, AnimationInfo>{
|
||||
'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),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
@ -85,7 +83,6 @@ class _WelcomeTemplateComponentWidgetState
|
|||
@override
|
||||
void dispose() {
|
||||
_model.maybeDispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
@ -115,10 +112,7 @@ class _WelcomeTemplateComponentWidgetState
|
|||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
FFLocalizations.of(context).getText(
|
||||
'dsc9tuc8' /* UMA EXPERIÊCIA COMPLETA */,
|
||||
),
|
||||
Text( FFLocalizations.of(context).getText('dsc9tuc8' /* UMA EXPERIÊCIA COMPLETA */),
|
||||
textAlign: TextAlign.start,
|
||||
style: FlutterFlowTheme.of(context)
|
||||
.displaySmall
|
||||
|
@ -128,28 +122,22 @@ class _WelcomeTemplateComponentWidgetState
|
|||
fontSize: 24.0,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
useGoogleFonts: GoogleFonts.asMap()
|
||||
.containsKey('Plus Jakarta Sans'),
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
|
||||
),
|
||||
),
|
||||
Align(
|
||||
alignment: const AlignmentDirectional(0.0, -1.0),
|
||||
child: Text(
|
||||
FFLocalizations.of(context).getText(
|
||||
'5bgqn16z' /* COM CONFORTO ONDE VOCÊ ESTIVER... */,
|
||||
),
|
||||
child: Text(FFLocalizations.of(context).getText('5bgqn16z' /* COM CONFORTO ONDE VOCÊ ESTIVER... */),
|
||||
textAlign: TextAlign.start,
|
||||
style: FlutterFlowTheme.of(context)
|
||||
.displaySmall
|
||||
.override(
|
||||
fontFamily: 'Plus Jakarta Sans',
|
||||
color: FlutterFlowTheme.of(context)
|
||||
.primaryText,
|
||||
color: FlutterFlowTheme.of(context).primaryText,
|
||||
fontSize: 15.0,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
useGoogleFonts: GoogleFonts.asMap()
|
||||
.containsKey('Plus Jakarta Sans'),
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -166,8 +154,7 @@ class _WelcomeTemplateComponentWidgetState
|
|||
decoration: const BoxDecoration(),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(0.0),
|
||||
child: const AtomImageSvgTheme(
|
||||
filename: 'welcome', width: 600, height: double.infinity),
|
||||
child: const AtomImageSvgTheme(filename: 'welcome', width: 600, height: double.infinity),
|
||||
),
|
||||
),
|
||||
Align(
|
||||
|
@ -184,10 +171,7 @@ class _WelcomeTemplateComponentWidgetState
|
|||
BoxShadow(
|
||||
blurRadius: 0.0,
|
||||
color: Colors.transparent,
|
||||
offset: Offset(
|
||||
0.0,
|
||||
0.0,
|
||||
),
|
||||
offset: Offset(0.0,0.0),
|
||||
)
|
||||
],
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
|
@ -203,35 +187,23 @@ class _WelcomeTemplateComponentWidgetState
|
|||
children: [
|
||||
Builder(
|
||||
builder: (context) {
|
||||
if (MediaQuery.sizeOf(context).width <
|
||||
kBreakpointSmall
|
||||
? true
|
||||
: false) {
|
||||
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),
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
key: const ValueKey<String>(
|
||||
'toggleSignInPage'),
|
||||
key: const ValueKey<String>('toggleSignInPage'),
|
||||
onPressed: () async {
|
||||
await widget.toggleSignInPage?.call();
|
||||
},
|
||||
text:
|
||||
FFLocalizations.of(context).getText(
|
||||
'dynet730' /* Entrar */,
|
||||
),
|
||||
text: FFLocalizations.of(context).getText( 'dynet730' /* 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),
|
||||
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(
|
||||
|
@ -325,7 +297,10 @@ class _WelcomeTemplateComponentWidgetState
|
|||
padding: const EdgeInsetsDirectional
|
||||
.fromSTEB(0.0, 0.0, 0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
key: const ValueKey<String>('toggleSignInPage'),
|
||||
|
||||
onPressed: () async {
|
||||
|
||||
await widget.toggleSignInPage
|
||||
?.call();
|
||||
},
|
||||
|
@ -378,6 +353,7 @@ class _WelcomeTemplateComponentWidgetState
|
|||
padding: const EdgeInsetsDirectional
|
||||
.fromSTEB(0.0, 0.0, 0.0, 16.0),
|
||||
child: FFButtonWidget(
|
||||
key: const ValueKey<String>('toggleSignUpPage'),
|
||||
onPressed: () async {
|
||||
await widget.toggleSignUpPage
|
||||
?.call();
|
||||
|
|
|
@ -1321,8 +1321,8 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
|
|||
'en': '',
|
||||
},
|
||||
'mqw2z9f3': {
|
||||
'pt': '',
|
||||
'en': '',
|
||||
'pt': 'INSIRA A NOVA SENHA',
|
||||
'en': 'ENTER NEW PASSWORD',
|
||||
},
|
||||
// misc
|
||||
'asjd2q3k2j4l21': {
|
||||
|
|
|
@ -5,13 +5,13 @@ import 'package:flutter/material.dart';
|
|||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/delivery_schedule_page/delivery_schedule_widget.dart';
|
||||
import 'package:hub/pages/fast_pass_page/fast_pass_page_widget.dart';
|
||||
import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart';
|
||||
import 'package:hub/pages/message_history_page/message_history_page_widget.dart';
|
||||
import 'package:hub/pages/package_order_page/package_order_page.dart';
|
||||
import 'package:hub/pages/pets_page/pets_page_widget.dart';
|
||||
import 'package:hub/pages/provisional_schedule_page/provisional_schedule_widget.dart';
|
||||
import 'package:hub/pages/reception_page/reception_page_widget.dart';
|
||||
import 'package:hub/pages/reservation_page/reservation_page_widget.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
@ -90,14 +90,24 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
: const ReceptionPageWidget()
|
||||
: const WelcomePageWidget(),
|
||||
),
|
||||
FFRoute(
|
||||
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);
|
||||
|
||||
return ForgotPasswordScreen(
|
||||
key: UniqueKey(),
|
||||
email: email,
|
||||
token: token,
|
||||
);
|
||||
}
|
||||
),
|
||||
FFRoute(
|
||||
name: 'homePage',
|
||||
path: '/homePage',
|
||||
builder: (context, params) {
|
||||
return HomePageWidget(
|
||||
key: UniqueKey(),
|
||||
);
|
||||
},
|
||||
builder: (context, params) => HomePageWidget(key: UniqueKey()),
|
||||
),
|
||||
FFRoute(
|
||||
name: 'receptionPage',
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:app_links/app_links.dart';
|
||||
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||
|
@ -20,9 +22,11 @@ import 'package:responsive_framework/responsive_framework.dart';
|
|||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
|
||||
void main() async {
|
||||
|
||||
await initializeApp();
|
||||
runApp(const App());
|
||||
FirebaseMessaging.onBackgroundMessage(_backgroundHandlerMessage);
|
||||
|
||||
}
|
||||
|
||||
Future<void> initializeApp() async {
|
||||
|
@ -109,11 +113,14 @@ class App extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _AppState extends State<App> {
|
||||
|
||||
Locale? _locale = FFLocalizations.getStoredLocale();
|
||||
ThemeMode _themeMode = FlutterFlowTheme.themeMode;
|
||||
late AppStateNotifier _appStateNotifier;
|
||||
late GoRouter _router;
|
||||
bool displaySplashImage = true;
|
||||
late AppLinks _appLinks;
|
||||
StreamSubscription<Uri>? _linkSubscription;
|
||||
|
||||
final ThemeData _darkTheme = ThemeData(
|
||||
brightness: Brightness.dark,
|
||||
|
@ -131,7 +138,6 @@ class _AppState extends State<App> {
|
|||
}),
|
||||
),
|
||||
);
|
||||
|
||||
final ThemeData _theme = ThemeData(
|
||||
brightness: Brightness.light,
|
||||
scrollbarTheme: ScrollbarThemeData(
|
||||
|
@ -148,20 +154,16 @@ class _AppState extends State<App> {
|
|||
}),
|
||||
),
|
||||
);
|
||||
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates =
|
||||
const [
|
||||
FFLocalizationsDelegate(),
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
];
|
||||
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = const [
|
||||
FFLocalizationsDelegate(),
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
];
|
||||
final Iterable<Locale> supportedLocales = const [
|
||||
Locale('pt'),
|
||||
Locale('en'),
|
||||
];
|
||||
|
||||
Widget Function(BuildContext, Widget?)? builder = (context, widget) {
|
||||
const String HD4K = '4K';
|
||||
const String ULTRAWIDE = 'ULTRAWIDE';
|
||||
|
@ -179,9 +181,9 @@ class _AppState extends State<App> {
|
|||
);
|
||||
};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@override void initState() {
|
||||
super.initState();
|
||||
initDeepLinks();
|
||||
|
||||
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
|
||||
|
||||
|
@ -192,6 +194,38 @@ class _AppState extends State<App> {
|
|||
|
||||
_setupFirebaseMessaging();
|
||||
}
|
||||
@override void dispose() {
|
||||
_linkSubscription?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
Future<void> initDeepLinks() async {
|
||||
_appLinks = AppLinks();
|
||||
|
||||
// Handle links
|
||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
|
||||
debugPrint('onAppLink: $uri');
|
||||
openAppLink(uri);
|
||||
});
|
||||
}
|
||||
|
||||
void openAppLink(Uri uri) {
|
||||
log('openAppLink');
|
||||
log(uri.toString());
|
||||
|
||||
final String email = uri.queryParameters['email'] ?? '';
|
||||
final String token = uri.queryParameters['token'] ?? '';
|
||||
|
||||
log('Email: $email');
|
||||
log('Token: $token');
|
||||
|
||||
// Use the extracted email and token as needed
|
||||
// navigatorKey.currentState?.pushNamed('/forgotPassword', arguments: {'email': email, 'token': token});
|
||||
if (email.isNotEmpty && token.isNotEmpty)
|
||||
StorageUtil().context?.push('/forgotPassword', extra: {'email': email, 'token': token});
|
||||
|
||||
}
|
||||
|
||||
void _setupFirebaseMessaging() async {
|
||||
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
||||
|
@ -220,12 +254,10 @@ class _AppState extends State<App> {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
void setLocale(String language) {
|
||||
setState(() => _locale = createLocale(language));
|
||||
FFLocalizations.storeLocale(language);
|
||||
}
|
||||
|
||||
void setThemeMode(ThemeMode mode) {
|
||||
setState(() {
|
||||
_themeMode = mode;
|
||||
|
@ -233,9 +265,11 @@ class _AppState extends State<App> {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp.router(
|
||||
key: navigatorKey,
|
||||
title: 'FRE ACCESS HUB',
|
||||
builder: builder,
|
||||
localizationsDelegates: localizationsDelegates,
|
||||
|
@ -247,4 +281,5 @@ class _AppState extends State<App> {
|
|||
routerConfig: _router,
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import 'package:hub/components/molecular_components/message_opt_modal/opt_modal_
|
|||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
import 'package:hub/flutter_flow/request_manager.dart';
|
||||
import 'package:hub/pages/acess_history_page/acess_history_page_widget.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class AcessHistoryPageModel extends FlutterFlowModel<AccessHistoryScreen> {
|
||||
|
|
|
@ -15,6 +15,7 @@ import 'package:hub/shared/utils/log_util.dart';
|
|||
import 'package:rxdart/rxdart.dart';
|
||||
|
||||
@immutable
|
||||
// ignore: must_be_immutable
|
||||
class AccessHistoryScreen extends StatefulWidget {
|
||||
late Map<String, String> opt = {
|
||||
'personType': '.*',
|
||||
|
|
|
@ -3,11 +3,8 @@ import 'dart:io' show Platform;
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:hub/app_state.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/webview_util.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
@ -21,7 +18,6 @@ class FastPassPageWidget extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _FastPassPageWidgetState extends State<FastPassPageWidget> {
|
||||
late InAppWebViewController _controllerIOS;
|
||||
late WebViewController _controllerAll;
|
||||
|
||||
Future<Map<String, String>> initVariables() async {
|
||||
|
@ -76,7 +72,6 @@ class _FastPassPageWidgetState extends State<FastPassPageWidget> {
|
|||
javaScriptEnabled: true,
|
||||
),
|
||||
onWebViewCreated: (controller) async {
|
||||
_controllerIOS = controller;
|
||||
},
|
||||
onLoadStop: (controller, url) async {
|
||||
await controller.evaluateJavascript(
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../shared/utils/validator_util.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import 'forgot_password_screen.dart';
|
||||
|
||||
class ForgotPasswordScreenModel extends FlutterFlowModel<ForgotPasswordScreen> {
|
||||
final formKey = GlobalKey<FormState>();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
FocusNode? passwordConfirmFormFocusNode;
|
||||
TextEditingController? passwordConfirmFormTextController;
|
||||
late bool passwordConfirmFormVisibility;
|
||||
String? Function(BuildContext, String?)? passwordConfirmFormTextControllerValidator;
|
||||
String? _passwordConfirmFormTextControllerValidator(BuildContext context, String? val) {
|
||||
if (val == null || val.isEmpty) {
|
||||
return FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Campo é necessário',
|
||||
enText: 'Field is required',
|
||||
);
|
||||
}
|
||||
if (val != passwordRegisterFormTextController?.text) {
|
||||
return FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'As senhas não coincidem',
|
||||
enText: 'Passwords do not match',
|
||||
);
|
||||
}
|
||||
if (val.length < 8) {
|
||||
return FFLocalizations.of(context).getText(
|
||||
'duq5gpp6' /* A senha deve ter pelo menos 8 ... */,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
bool? register;
|
||||
|
||||
|
||||
|
||||
|
||||
bool isFormInvalid() {
|
||||
final password = passwordRegisterFormTextController?.text ?? '';
|
||||
final confirmPassword = passwordConfirmFormTextController?.text ?? '';
|
||||
return password.isEmpty || confirmPassword.isEmpty || password != confirmPassword
|
||||
|| !ValidatorUtil.isValidPassword(password) || !ValidatorUtil.isValidPassword(confirmPassword);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@override void initState(BuildContext context) {
|
||||
|
||||
|
||||
|
||||
passwordRegisterFormVisibility = false;
|
||||
passwordRegisterFormTextControllerValidator = _passwordRegisterFormTextControllerValidator;
|
||||
passwordConfirmFormVisibility = false;
|
||||
passwordConfirmFormTextControllerValidator = _passwordConfirmFormTextControllerValidator;
|
||||
}
|
||||
@override void dispose() {
|
||||
passwordRegisterFormFocusNode?.dispose();
|
||||
passwordRegisterFormTextController?.dispose();
|
||||
passwordConfirmFormFocusNode?.dispose();
|
||||
passwordConfirmFormTextController?.dispose();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,340 @@
|
|||
|
||||
|
||||
import 'package:easy_debounce/easy_debounce.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_animate/flutter_animate.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
|
||||
import '../../components/atomic_components/shared_components_atoms/atom_image_svg_theme.dart';
|
||||
import '../../flutter_flow/flutter_flow_animations.dart';
|
||||
import '../../flutter_flow/flutter_flow_icon_button.dart';
|
||||
import '../../flutter_flow/flutter_flow_model.dart';
|
||||
import '../../flutter_flow/flutter_flow_theme.dart';
|
||||
import '../../flutter_flow/flutter_flow_widgets.dart';
|
||||
import '../../flutter_flow/internationalization.dart';
|
||||
import '../../shared/services/authentication/authentication_service.dart';
|
||||
import '../../shared/utils/validator_util.dart';
|
||||
import 'forgot_password_model.dart';
|
||||
|
||||
class ForgotPasswordScreen extends StatefulWidget {
|
||||
const ForgotPasswordScreen({super.key, required this.email, required this.token});
|
||||
final String email;
|
||||
final String token;
|
||||
|
||||
@override State<ForgotPasswordScreen> createState() => _ForgotPasswordScreenState();
|
||||
}
|
||||
|
||||
class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with TickerProviderStateMixin {
|
||||
late ForgotPasswordScreenModel _model;
|
||||
final animationsMap = <String, AnimationInfo>{};
|
||||
|
||||
@override void setState(VoidCallback callback) {
|
||||
super.setState(callback);
|
||||
_model.onUpdate();
|
||||
}
|
||||
@override void initState() {
|
||||
super.initState();
|
||||
_model = createModel(context, () => ForgotPasswordScreenModel());
|
||||
|
||||
_model.passwordRegisterFormTextController ??= TextEditingController();
|
||||
_model.passwordRegisterFormFocusNode ??= FocusNode();
|
||||
_model.passwordRegisterFormFocusNode!.addListener(() => setState(() {}));
|
||||
|
||||
_model.passwordConfirmFormTextController ??= TextEditingController();
|
||||
_model.passwordConfirmFormFocusNode ??= FocusNode();
|
||||
_model.passwordConfirmFormFocusNode!.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) {
|
||||
final MediaQueryData mediaQuery = MediaQuery.of(context);
|
||||
return Scaffold(
|
||||
appBar: buildAppBar(context),
|
||||
body: buildBody(context),
|
||||
);
|
||||
}
|
||||
|
||||
AppBar buildAppBar(BuildContext context) {
|
||||
return AppBar(
|
||||
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();
|
||||
},
|
||||
),
|
||||
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) {
|
||||
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),
|
||||
),
|
||||
),
|
||||
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<String>('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}){
|
||||
return Padding(
|
||||
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 16.0),
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: TextFormField(
|
||||
key: const ValueKey<String>('passwordTextFormField'),
|
||||
controller: controller,
|
||||
focusNode: focusNode,
|
||||
onChanged: (_) => EasyDebounce.debounce(
|
||||
'_model.passwordRegisterFormTextController',
|
||||
const Duration(milliseconds: 500),
|
||||
() => setState(() {}),
|
||||
),
|
||||
autofocus: false,
|
||||
autofillHints: const [AutofillHints.password],
|
||||
obscureText: !visibility,
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
labelText: FFLocalizations.of(context).getText('0firji8'),
|
||||
labelStyle: FlutterFlowTheme.of(context).labelLarge.override(
|
||||
fontFamily: 'Plus Jakarta Sans',
|
||||
color: FlutterFlowTheme.of(context).primaryText,
|
||||
fontSize: 16.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(
|
||||
key: const ValueKey<String>('passwordVisibilitySuffixIcon'),
|
||||
onTap: onVisibilityToggle,
|
||||
focusNode: FocusNode(skipTraversal: true),
|
||||
child: Icon(
|
||||
visibility ? 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,
|
||||
fontWeight: FontWeight.w500,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
|
||||
),
|
||||
validator: _model.passwordRegisterFormTextControllerValidator.asValidator(context),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,3 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -11,8 +10,6 @@ import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
|||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/pages/home_page/home_page_model.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart';
|
||||
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
import 'package:hub/flutter_flow/request_manager.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/pages/liberation_history/liberation_history_widget.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class LiberationHistoryModel extends FlutterFlowModel<LiberationHistoryWidget> {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
@ -14,7 +13,6 @@ import 'package:hub/pages/liberation_history/liberation_history_model.dart';
|
|||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class LiberationHistoryWidget extends StatefulWidget {
|
||||
const LiberationHistoryWidget({super.key});
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
import 'package:hub/flutter_flow/request_manager.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/pages/message_history_page/message_history_page_widget.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
class MessageHistoryPageModel
|
||||
|
|
|
@ -8,7 +8,6 @@ import 'package:hub/flutter_flow/nav/nav.dart';
|
|||
import 'package:hub/pages/message_history_page/message_history_page_model.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class MessageHistoryPageWidget extends StatefulWidget {
|
||||
const MessageHistoryPageWidget({super.key});
|
||||
|
|
|
@ -9,7 +9,6 @@ import 'package:hub/components/templates_components/details_component/details_co
|
|||
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
|
|
@ -3,14 +3,10 @@ import 'package:hub/backend/api_requests/api_calls.dart';
|
|||
import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/pages/liberation_history/liberation_history_model.dart';
|
||||
import 'package:hub/pages/pets_page/pets_page_model.dart';
|
||||
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
|
||||
class PetsHistoryScreen extends StatefulWidget {
|
||||
const PetsHistoryScreen({super.key, required this.model});
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/backend/api_requests/api_manager.dart';
|
||||
import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
|
@ -12,10 +12,8 @@ import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
|||
import 'package:hub/flutter_flow/form_field_controller.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/pets_page/pets_page_widget.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/image_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
|
||||
|
|
|
@ -1,28 +1,21 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:http/http.dart';
|
||||
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/appbar.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/custom_input.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/custom_select.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/media_upload_button.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/submit_button.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/tabview.dart';
|
||||
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/form_field_controller.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/pets_page/pets_history_screen.dart';
|
||||
import 'package:hub/pages/pets_page/pets_page_model.dart';
|
||||
|
||||
import 'package:hub/shared/utils/image_util.dart';
|
||||
import 'package:hub/shared/utils/validator_util.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class PetsPageWidget extends StatefulWidget {
|
||||
dynamic pet;
|
||||
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
import 'dart:developer';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/components/templates_components/change_passs_qr_code_pass_key_template_component/change_pass_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/services/authentication/authentication_service.dart';
|
||||
import 'package:hub/shared/services/localization/localization_service.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
import '../../shared/utils/snackbar_util.dart';
|
||||
|
||||
class PreferencesPageModel with ChangeNotifier {
|
||||
final unfocusNode = FocusNode();
|
||||
bool fingerprint = false;
|
||||
|
@ -50,7 +52,7 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
ptText: 'Notificação alterada com sucesso',
|
||||
);
|
||||
context.pop();
|
||||
_showSnackBar(context, content);
|
||||
SnackBarUtil.showSnackBar(context, content);
|
||||
notify = await _toggleBoolInDb('notify');
|
||||
notifyListeners();
|
||||
} catch (err) {
|
||||
|
@ -59,7 +61,7 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
ptText: 'Erro ao alterar notificação',
|
||||
);
|
||||
context.pop();
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,20 +84,20 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Access pass changed successfully',
|
||||
ptText: 'Senha de acesso alterada com sucesso',
|
||||
);
|
||||
_showSnackBar(context, content);
|
||||
SnackBarUtil.showSnackBar(context, content);
|
||||
} else {
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Erro ao alterar senha de acesso',
|
||||
enText: 'Error changing access pass',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}
|
||||
}).catchError((e, s) {
|
||||
final String content = FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Erro ao alterar senha de acesso',
|
||||
enText: 'Error changing access pass',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}).whenComplete(() => notifyListeners());
|
||||
}
|
||||
|
||||
|
@ -118,20 +120,20 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Panic password changed successfully',
|
||||
ptText: 'Senha de pânico alterada com sucesso',
|
||||
);
|
||||
_showSnackBar(context, content);
|
||||
SnackBarUtil.showSnackBar(context, content);
|
||||
} else {
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Erro ao alterar senha de pânico',
|
||||
enText: 'Error changing panic password',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}
|
||||
}).catchError((e, s) {
|
||||
final String content = FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'Erro ao alterar senha de pânico',
|
||||
enText: 'Error changing panic password',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}).whenComplete(() => notifyListeners());
|
||||
}
|
||||
|
||||
|
@ -151,7 +153,7 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
fingerprint = await _toggleBoolInDb('fingerprint');
|
||||
notifyListeners();
|
||||
|
||||
_showSnackBar(context, content);
|
||||
SnackBarUtil.showSnackBar(context, content);
|
||||
}
|
||||
|
||||
fingerprint ? onChange(null) : _showPassKey(context, onChange);
|
||||
|
@ -196,7 +198,7 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Error deleting account',
|
||||
ptText: 'Erro ao deletar conta',
|
||||
);
|
||||
_showSnackBar(context, content);
|
||||
SnackBarUtil.showSnackBar(context, content);
|
||||
});
|
||||
notifyListeners();
|
||||
} catch (err) {
|
||||
|
@ -205,7 +207,7 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Error deleting account',
|
||||
ptText: 'Erro ao deletar conta',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -221,20 +223,7 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Are you sure you want to logout?',
|
||||
ptText: 'Tem certeza que deseja sair?',
|
||||
);
|
||||
onConfirm() async {
|
||||
StorageUtil.purge();
|
||||
|
||||
context.go(
|
||||
'/welcomePage',
|
||||
extra: <String, dynamic>{
|
||||
kTransitionInfoKey: const TransitionInfo(
|
||||
hasTransition: true,
|
||||
transitionType: PageTransitionType.scale,
|
||||
alignment: Alignment.bottomCenter,
|
||||
),
|
||||
},
|
||||
);
|
||||
}
|
||||
onConfirm() async => AuthenticationService.deleteAccount(context);
|
||||
|
||||
showAlertDialog(context, title, content, onConfirm);
|
||||
}
|
||||
|
@ -248,57 +237,12 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Are you sure you want to unlink your device?',
|
||||
ptText: 'Tem certeza que deseja desvincular seu dispositivo?',
|
||||
);
|
||||
onConfirm() async {
|
||||
String content;
|
||||
try {
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Device unlinked successfully',
|
||||
ptText: 'Dispositivo desvinculado com sucesso',
|
||||
);
|
||||
|
||||
await PhpGroup.resopndeVinculo.call(tarefa: 'I').then((value) {
|
||||
if (value.jsonBody['error'] == false) {
|
||||
StorageUtil().cliName = '';
|
||||
StorageUtil().cliUUID = '';
|
||||
// StorageUtil().ownerUUID = '';
|
||||
|
||||
context.pop();
|
||||
|
||||
context.go(
|
||||
'/homePage',
|
||||
extra: <String, dynamic>{
|
||||
kTransitionInfoKey: const TransitionInfo(
|
||||
hasTransition: true,
|
||||
transitionType: PageTransitionType.scale,
|
||||
alignment: Alignment.bottomCenter,
|
||||
),
|
||||
},
|
||||
);
|
||||
|
||||
_showSnackBar(context, content);
|
||||
}
|
||||
}).catchError((err, stack) {
|
||||
context.pop();
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Error unlinking device',
|
||||
ptText: 'Erro ao desvincular dispositivo',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
});
|
||||
} catch (err, stack) {
|
||||
context.pop();
|
||||
log(err.toString(), stackTrace: stack);
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Error unlinking device',
|
||||
ptText: 'Erro ao desvincular dispositivo',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
}
|
||||
}
|
||||
onConfirm() async => LocalizationService.unlinkLocal(context);
|
||||
|
||||
showAlertDialog(context, title, content, onConfirm);
|
||||
}
|
||||
|
||||
|
||||
Future<void> initVariables() async {
|
||||
fingerprint = await _getBoolFromDb('fingerprint');
|
||||
person = await _getBoolFromDb('person');
|
||||
|
@ -321,38 +265,11 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
return newValue;
|
||||
}
|
||||
|
||||
void _showAlertDialog(BuildContext context, String title, String content,
|
||||
Function() onConfirm) {
|
||||
showAlertDialog(
|
||||
context,
|
||||
'Delete account',
|
||||
'Are you sure you want to delete your account?',
|
||||
onConfirm(),
|
||||
);
|
||||
}
|
||||
|
||||
void _showSnackBar(BuildContext context, String text,
|
||||
{bool isError = false}) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
text,
|
||||
style: TextStyle(color: FlutterFlowTheme.of(context).info),
|
||||
),
|
||||
backgroundColor: isError
|
||||
? FlutterFlowTheme.of(context).error
|
||||
: FlutterFlowTheme.of(context).success,
|
||||
duration: const Duration(seconds: 3),
|
||||
behavior: SnackBarBehavior.floating,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(30),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _showPassKey(
|
||||
BuildContext context, void Function(String) onChange) async {
|
||||
|
||||
|
||||
void _showPassKey(BuildContext context, void Function(String) onChange) async {
|
||||
await showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
|
@ -373,7 +290,8 @@ class PreferencesPageModel with ChangeNotifier {
|
|||
enText: 'Error changing key',
|
||||
ptText: 'Erro ao alterar senha',
|
||||
);
|
||||
_showSnackBar(context, content, isError: true);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}).whenComplete(() => notifyListeners());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -3,10 +3,8 @@ import 'package:google_fonts/google_fonts.dart';
|
|||
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/internationalization.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/preferences_settings_page/preferences_settings_model.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_model.dart';
|
||||
import 'package:hub/pages/qr_code_page/qr_code_page_widget.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:qr_flutter/qr_flutter.dart';
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:barcode_widget/barcode_widget.dart';
|
||||
// import 'package:barcode_widget/barcode_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter_animate/flutter_animate.dart';
|
||||
|
@ -15,12 +14,10 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
|||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/qr_code_page/qr_code_page_model.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
|
||||
import 'package:hub/shared/utils/biometric_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:percent_indicator/circular_percent_indicator.dart';
|
||||
// import 'package:percent_indicator/percent_indicator.dart';
|
||||
|
||||
import 'package:qr_flutter/qr_flutter.dart';
|
||||
|
||||
|
|
|
@ -1,19 +1,17 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hub/backend/api_requests/api_calls.dart';
|
||||
import 'package:hub/backend/notifications/firebase_messaging_service.dart';
|
||||
import 'package:hub/components/atomic_components/shared_components_atoms/atom_image_svg_theme.dart';
|
||||
import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/reception_page/reception_page_model.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/services/localization/localization_service.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
@ -36,8 +34,7 @@ class _ReceptionPageWidgetState extends State<ReceptionPageWidget>
|
|||
}();
|
||||
|
||||
FirebaseMessagingService().updateDeviceToken();
|
||||
|
||||
processLocals();
|
||||
LocalizationService.checkLocals(context);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -47,42 +44,16 @@ class _ReceptionPageWidgetState extends State<ReceptionPageWidget>
|
|||
super.dispose();
|
||||
}
|
||||
|
||||
Future<void> processLocals() async {
|
||||
try {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
||||
var response = await callback.call();
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
final List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
||||
final bool isEmpty = locals.isEmpty;
|
||||
final bool isActive = locals
|
||||
.where((local) => local['CLU_STATUS'] != 'B')
|
||||
.toList()
|
||||
.isNotEmpty;
|
||||
final bool isEnable = !isEmpty && isActive;
|
||||
|
||||
if (isEnable) {
|
||||
StorageUtil().haveLocal = true;
|
||||
StorageUtil().isLogged = true;
|
||||
await WidgetsBinding.instance.endOfFrame;
|
||||
// dispose();
|
||||
StorageUtil().cliUUID = '';
|
||||
StorageUtil().ownerUUID = '';
|
||||
StorageUtil().context?.go('/homePage');
|
||||
}
|
||||
}
|
||||
} catch (e, s) {
|
||||
log(e.toString(), stackTrace: s);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||
log('() => state: $state');
|
||||
if (state == AppLifecycleState.resumed) {
|
||||
setState(() {
|
||||
processLocals();
|
||||
LocalizationService.checkLocals(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,14 +3,10 @@ import 'dart:io' show Platform;
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:hub/app_state.dart';
|
||||
import 'package:hub/flutter_flow/internationalization.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:hub/shared/utils/webview_util.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
|
@ -22,7 +18,6 @@ class ReservationPageWidget extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _ReservationPageWidgetState extends State<ReservationPageWidget> {
|
||||
late InAppWebViewController _controllerIOS;
|
||||
late WebViewController _controllerAll;
|
||||
|
||||
Future<Map<String, String>> initVariables() async {
|
||||
|
@ -79,7 +74,6 @@ class _ReservationPageWidgetState extends State<ReservationPageWidget> {
|
|||
javaScriptEnabled: true,
|
||||
),
|
||||
onWebViewCreated: (controller) async {
|
||||
_controllerIOS = controller;
|
||||
},
|
||||
onLoadStop: (controller, url) async {
|
||||
await controller.evaluateJavascript(
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
@ -23,7 +21,6 @@ import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_p
|
|||
import 'package:hub/pages/schedule_complete_visit_page/visit_history_page_widget.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/share_util.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ScheduleComplete extends StatefulWidget {
|
||||
const ScheduleComplete({super.key});
|
||||
|
@ -1501,17 +1498,16 @@ Widget scheduleVisit(BuildContext context, ScheduleCompleteVisitPageModel model,
|
|||
devDesc: model.textController3.text,
|
||||
idVisitante: model.visitorStrList,
|
||||
dtInicio: model
|
||||
.convertDateFormat(model.textController1.text ?? ''),
|
||||
.convertDateFormat(model.textController1.text),
|
||||
dtFim: model
|
||||
.convertDateFormat(model.textController2.text ?? ''),
|
||||
.convertDateFormat(model.textController2.text),
|
||||
unica: model.switchValue == true ? 'Sim' : 'Não',
|
||||
idMotivo: extractIdToStr(model.dropDownValue1!),
|
||||
idNAC: extractIdToStr(model.dropDownValue2!),
|
||||
obs: model.textController3.text,
|
||||
)
|
||||
.catchError((e) async {
|
||||
await DialogUtil.errorDefault(context);
|
||||
}).then((value) async {
|
||||
.catchError((e) async => await DialogUtil.errorDefault(context))
|
||||
.then((value) async {
|
||||
if (PhpGroup.postScheduleVisitCall.error(
|
||||
(value.jsonBody ?? ''),
|
||||
) ==
|
||||
|
@ -1604,7 +1600,7 @@ Widget scheduleVisit(BuildContext context, ScheduleCompleteVisitPageModel model,
|
|||
labelsHashMap: {
|
||||
'Nome': model.visitorJsonList[0]['VTE_NOME'],
|
||||
'Start': model.textController1.text,
|
||||
'End': model.textController2.text ?? '',
|
||||
'End': model.textController2.text,
|
||||
'Reason': (RegExp(r'MOT_DESCRICAO:\s*([^,]+)')
|
||||
.firstMatch(
|
||||
model.dropDownValue1.toString())
|
||||
|
|
|
@ -5,7 +5,6 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
|||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart';
|
||||
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart';
|
||||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/mixins/status_mixin.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||
|
||||
import '../../shared/utils/storage_util.dart';
|
||||
import '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
|
@ -34,6 +35,7 @@ class _SignInPageWidgetState extends State<SignInPageWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
StorageUtil().context = context;
|
||||
return GestureDetector(
|
||||
onTap: () => _model.unfocusNode.canRequestFocus
|
||||
? FocusScope.of(context).requestFocus(_model.unfocusNode)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||
|
||||
import '../../shared/utils/storage_util.dart';
|
||||
import '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
|
@ -35,6 +36,7 @@ class _SignUpPageWidgetState extends State<SignUpPageWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
StorageUtil().context = context;
|
||||
return GestureDetector(
|
||||
onTap: () => _model.unfocusNode.canRequestFocus
|
||||
? FocusScope.of(context).requestFocus(_model.unfocusNode)
|
||||
|
|
|
@ -1,13 +1,17 @@
|
|||
import 'package:hub/shared/helpers/secure_storage_helper.dart';
|
||||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:app_links/app_links.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'welcome_page_model.dart';
|
||||
|
||||
export 'welcome_page_model.dart';
|
||||
|
||||
class WelcomePageWidget extends StatefulWidget with Switcher {
|
||||
|
@ -22,8 +26,7 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
|
|||
|
||||
final scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@override void initState() {
|
||||
super.initState();
|
||||
_model = createModel(context, () => WelcomePageModel());
|
||||
|
||||
|
@ -42,15 +45,17 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
|
|||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
@override void dispose() {
|
||||
_model.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
StorageUtil().context = context;
|
||||
return GestureDetector(
|
||||
onTap: () => _model.unfocusNode.canRequestFocus
|
||||
? FocusScope.of(context).requestFocus(_model.unfocusNode)
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
export 'context_entensions.dart' show ContextExtensions;
|
||||
|
||||
extension ContextExtensions on BuildContext {
|
||||
void setStateStatic(VoidCallback callback) {
|
||||
final element = findAncestorStateOfType<State<StatefulWidget>>();
|
||||
element?.setState(callback);
|
||||
}
|
||||
}
|
|
@ -108,6 +108,7 @@ class SecureStorageHelper extends ChangeNotifier implements Storage {
|
|||
Future<void> purge() async {
|
||||
log('SecureStorageHelper -> Purging secure storage');
|
||||
await _secureStorage.deleteAll();
|
||||
|
||||
CacheUtil.instance.clear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,197 @@
|
|||
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
|
||||
import '../../../backend/api_requests/api_calls.dart';
|
||||
import '../../../flutter_flow/flutter_flow_util.dart';
|
||||
import '../../../flutter_flow/random_data_util.dart';
|
||||
import '../../utils/device_util.dart';
|
||||
import '../../utils/dialog_util.dart';
|
||||
import '../../utils/log_util.dart';
|
||||
import '../../utils/storage_util.dart';
|
||||
|
||||
class AuthenticationService {
|
||||
|
||||
|
||||
|
||||
static Future<void> login(BuildContext context) async {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
||||
final response = await callback.call();
|
||||
|
||||
if (response.jsonBody['error']) {
|
||||
DialogUtil.errorDefault(context);
|
||||
return;
|
||||
}
|
||||
List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
||||
|
||||
if (locals.isEmpty) {
|
||||
StorageUtil().haveLocal = false;
|
||||
context.go('/receptionPage');
|
||||
} else {
|
||||
StorageUtil().haveLocal = true;
|
||||
context.go('/homePage');
|
||||
}
|
||||
StorageUtil().isLogged = true;
|
||||
|
||||
}
|
||||
|
||||
static Future signIn(BuildContext context, FlutterFlowModel model, {String? emailAdress, String? password,}) async {
|
||||
try {
|
||||
final ApiCallResponse? response;
|
||||
final LoginCall callback = PhpGroup.loginCall;
|
||||
StorageUtil().deviceDescription = randomString(
|
||||
10,
|
||||
10,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
);
|
||||
|
||||
final String? devUUID;
|
||||
final String userUUID;
|
||||
final String status;
|
||||
final String userDevUUID;
|
||||
final String userName;
|
||||
final String email;
|
||||
final String passwd;
|
||||
|
||||
email = emailAdress!;
|
||||
passwd = password!;
|
||||
devUUID = await DeviceUtil.getDevUUID();
|
||||
|
||||
if ((email != '') && (passwd != '')) {
|
||||
StorageUtil().email = email;
|
||||
StorageUtil().passwd = passwd;
|
||||
StorageUtil().devUUID = devUUID!;
|
||||
response = await callback.call();
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
userUUID = response.jsonBody['uid'];
|
||||
status = response.jsonBody['user']['status'];
|
||||
userDevUUID = response.jsonBody['user']['dev_id'];
|
||||
userName = response.jsonBody['user']['name'];
|
||||
|
||||
StorageUtil().userUUID = userUUID;
|
||||
StorageUtil().userDevUUID = userDevUUID;
|
||||
StorageUtil().status = status;
|
||||
StorageUtil().userName = userName;
|
||||
|
||||
await login(context);
|
||||
} else {
|
||||
if (response.jsonBody['error'] == null) {
|
||||
DialogUtil.errorDefault(context);
|
||||
} else {
|
||||
DialogUtil.error(
|
||||
context, response.jsonBody['error_msg'].toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'login.php', emailAdress.toString(), "Login", e, s);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<bool> signUp(BuildContext context, {required String? name, String? passwd, required String? email, String? device,}) async {
|
||||
try {
|
||||
ApiCallResponse? response;
|
||||
if ((email != null && email != '') && (passwd != null && passwd != '' && passwd.length > 7) && (name != null && name != '')) {
|
||||
response = await PhpGroup.registerCall.call(
|
||||
name: name,
|
||||
password: passwd,
|
||||
email: email,
|
||||
token: randomString(36, 36, false, false, true),
|
||||
uuid: randomString(36, 36, false, false, true),
|
||||
tipo: device!,
|
||||
descricao: randomString(36, 36, true, false, false),
|
||||
);
|
||||
|
||||
if (response.jsonBody['error'] == false) return true;
|
||||
DialogUtil.error(context, response.jsonBody['error_msg']);
|
||||
return false;
|
||||
} else {
|
||||
DialogUtil.errorDefault(context);
|
||||
return false;
|
||||
}
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed('registro.php', email.toString(), "Register", e, s);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<void> signOut(BuildContext context) async {
|
||||
await PhpGroup.unregisterDevice.call();
|
||||
await StorageUtil.purge();
|
||||
context.go(
|
||||
'/welcomePage',
|
||||
extra: <String, dynamic>{
|
||||
kTransitionInfoKey: const TransitionInfo(
|
||||
hasTransition: true,
|
||||
transitionType: PageTransitionType.scale,
|
||||
alignment: Alignment.bottomCenter,
|
||||
),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
static Future<void> forgotPassword(BuildContext context, String email) async {
|
||||
try {
|
||||
final ApiCallResponse? response;
|
||||
final ForgotPasswordCall callback = PhpGroup.forgotPasswordCall;
|
||||
final String message = FFLocalizations.of(context).getVariableText(
|
||||
enText: "Send E-mail Successful!",
|
||||
ptText: "E-mail Enviado com Sucesso!");
|
||||
|
||||
response = await callback.call(email: email);
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
DialogUtil.success(context, message);
|
||||
} else {
|
||||
DialogUtil.error(context, response.jsonBody['error_msg']);
|
||||
}
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'forgotPassword.php', email, "Forgot Password", e, s);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<void> changePassword(BuildContext context, String email, String password, String token) async {
|
||||
final ApiCallResponse response = await PhpGroup.changePasswordCall.call(email: email, psswd: password, token: token);
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
final String message = FFLocalizations.of(context).getVariableText(
|
||||
enText: "Password changed successfully!",
|
||||
ptText: "Senha alterada com sucesso!",
|
||||
);
|
||||
DialogUtil.success(context, message);
|
||||
context.go('/homePage');
|
||||
} else {
|
||||
final String message = response.jsonBody['error_msg'];
|
||||
DialogUtil.error(context, message);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static Future<void> deleteAccount(BuildContext context) async {
|
||||
StorageUtil.purge();
|
||||
context.go(
|
||||
'/welcomePage',
|
||||
extra: <String, dynamic>{
|
||||
kTransitionInfoKey: const TransitionInfo(
|
||||
hasTransition: true,
|
||||
transitionType: PageTransitionType.scale,
|
||||
alignment: Alignment.bottomCenter,
|
||||
),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,243 @@
|
|||
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
|
||||
import '../../../backend/api_requests/api_calls.dart';
|
||||
import '../../../components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
|
||||
import '../../../flutter_flow/flutter_flow_util.dart';
|
||||
import '../../utils/log_util.dart';
|
||||
import '../../utils/snackbar_util.dart';
|
||||
|
||||
class LocalizationService {
|
||||
|
||||
|
||||
|
||||
|
||||
static Future<void> checkLocals(BuildContext context) async {
|
||||
try {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
||||
var response = await callback.call();
|
||||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
final List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
||||
final bool isEmpty = locals.isEmpty;
|
||||
final bool isActive = locals
|
||||
.where((local) => local['CLU_STATUS'] != 'B')
|
||||
.toList()
|
||||
.isNotEmpty;
|
||||
final bool isEnable = !isEmpty && isActive;
|
||||
|
||||
if (isEnable) {
|
||||
StorageUtil().haveLocal = true;
|
||||
StorageUtil().isLogged = true;
|
||||
await WidgetsBinding.instance.endOfFrame;
|
||||
StorageUtil().cliUUID = '';
|
||||
StorageUtil().ownerUUID = '';
|
||||
StorageUtil().context?.go('/homePage');
|
||||
}
|
||||
}
|
||||
} catch (e, s) {
|
||||
log(e.toString(), stackTrace: s);
|
||||
}
|
||||
}
|
||||
|
||||
static Future<bool> processLocals(BuildContext context) async{
|
||||
try {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
||||
final ApiCallResponse response = await callback.call();
|
||||
|
||||
final List<dynamic> locals = response.jsonBody['locais'].toList() ?? [];
|
||||
|
||||
for (var local in locals) {
|
||||
final String status = local['CLU_STATUS'];
|
||||
log('() => CLU_STATUS: $status');
|
||||
}
|
||||
|
||||
final bool isActive = locals
|
||||
.where((local) => local['CLU_STATUS'] == 'A')
|
||||
.toList()
|
||||
.isNotEmpty;
|
||||
final bool isInactived = locals
|
||||
.where((local) => local['CLI_ID'] != StorageUtil().cliUUID && local['CLU_STATUS'] == 'A').toList().isNotEmpty;
|
||||
final bool isPending = locals
|
||||
.where((local) =>
|
||||
local['CLU_STATUS'] != 'B' && local['CLU_STATUS'] != 'A')
|
||||
.toList()
|
||||
.isNotEmpty;
|
||||
final bool isUnique = locals.length == 1;
|
||||
final bool isBlocked = locals[0]['CLU_STATUS'] == 'B';
|
||||
final bool isEnabled = isUnique && isActive;
|
||||
|
||||
final bool isDisabled = isUnique && isBlocked;
|
||||
final bool isUnselected = StorageUtil().cliUUID.isEmpty &&
|
||||
StorageUtil().cliName.isEmpty & StorageUtil().ownerUUID.isEmpty;
|
||||
final bool isSelected =
|
||||
StorageUtil().cliUUID.isNotEmpty && StorageUtil().cliName.isNotEmpty && isInactived;
|
||||
final bool isUnavailable = isPending && isUnselected && isUnique;
|
||||
|
||||
|
||||
|
||||
|
||||
if (isDisabled) {
|
||||
context.go('/welcomePage');
|
||||
return true;
|
||||
} else if (isUnavailable) {
|
||||
log('() => isUnavailable');
|
||||
try {
|
||||
StorageUtil().cliUUID = locals[0]['CLI_ID'];
|
||||
StorageUtil().ownerUUID = locals[0]['CLU_OWNER_ID'];
|
||||
var response = await PhpGroup.resopndeVinculo.call(tarefa: 'A');
|
||||
if (response.jsonBody['error'] == true) {
|
||||
StorageUtil().cliUUID = '';
|
||||
StorageUtil().cliName = '';
|
||||
StorageUtil().ownerUUID = '';
|
||||
return false;
|
||||
}
|
||||
if (response.jsonBody['error'] == false) return await processData(context).then( (value) => value);
|
||||
} catch (e, s) {
|
||||
DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'responderVinculo.php', '', 'Responder Vínculo', e, s);
|
||||
return false;
|
||||
}
|
||||
} else if (isEnabled) {
|
||||
log('() => isEnabled');
|
||||
final dynamic local = locals[0];
|
||||
StorageUtil().cliName = local['CLI_NOME'];
|
||||
StorageUtil().userName = local['USU_NOME'];
|
||||
StorageUtil().cliUUID = local['CLI_ID'];
|
||||
StorageUtil().ownerUUID = local['CLU_OWNER_ID'];
|
||||
|
||||
return await processData(context);
|
||||
|
||||
|
||||
} else if (isUnselected) {
|
||||
log('() => isUnselected');
|
||||
return await selectLocal(context);
|
||||
} else if (isSelected) {
|
||||
log('() => isSelected');
|
||||
return await processData(context);
|
||||
} else {
|
||||
log('() => else');
|
||||
return await selectLocal(context);
|
||||
}
|
||||
} catch (e) {
|
||||
log('() => catch: $e');
|
||||
return await selectLocal(context);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static Future<bool> processData(BuildContext context) async {
|
||||
|
||||
try {
|
||||
final GetDadosCall callback = PhpGroup.getDadosCall;
|
||||
|
||||
var response = await callback.call();
|
||||
|
||||
final error = response.jsonBody['error'];
|
||||
|
||||
if (error == false) {
|
||||
final bool whatsapp = response.jsonBody['whatsapp'] ?? false;
|
||||
final bool provisional = response.jsonBody['provisional'] ?? false;
|
||||
final bool pets = response.jsonBody['pet'] ?? false;
|
||||
final String petAmountRegister =
|
||||
response.jsonBody['petAmountRegister'].toString().isEmpty
|
||||
? '0'
|
||||
: response.jsonBody['petAmountRegister'].toString();
|
||||
final String name = response.jsonBody['visitado']['VDO_NOME'];
|
||||
StorageUtil().whatsapp = whatsapp;
|
||||
StorageUtil().provisional = provisional;
|
||||
StorageUtil().pets = pets;
|
||||
StorageUtil().petAmountRegister = petAmountRegister;
|
||||
StorageUtil().userName = name;
|
||||
return true;
|
||||
} else if (error == true) {
|
||||
log('() => error: $error');
|
||||
DialogUtil.warningDefault(context).whenComplete(() => selectLocal(context));
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
} catch (e, s) {
|
||||
log('() => error: $e', stackTrace: s);
|
||||
DialogUtil.warningDefault(context).whenComplete(() => selectLocal(context));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<bool> selectLocal(BuildContext context) async {
|
||||
return await showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
enableDrag: false,
|
||||
isDismissible: false,
|
||||
showDragHandle: false,
|
||||
useSafeArea: true,
|
||||
context: context,
|
||||
builder: (context) => PopScope(
|
||||
canPop: false,
|
||||
child: Padding(
|
||||
padding: MediaQuery.viewInsetsOf(context),
|
||||
child: const BottomArrowLinkedLocalsComponentWidget(),
|
||||
),
|
||||
),
|
||||
).then((_) async => await processData(context));
|
||||
}
|
||||
|
||||
static Future<void> unlinkLocal(BuildContext context) async {
|
||||
String content;
|
||||
try {
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Device unlinked successfully',
|
||||
ptText: 'Dispositivo desvinculado com sucesso',
|
||||
);
|
||||
|
||||
await PhpGroup.resopndeVinculo.call(tarefa: 'I').then((value) {
|
||||
if (value.jsonBody['error'] == false) {
|
||||
StorageUtil().cliName = '';
|
||||
StorageUtil().cliUUID = '';
|
||||
// StorageUtil().ownerUUID = '';
|
||||
|
||||
context.pop();
|
||||
|
||||
context.go(
|
||||
'/homePage',
|
||||
extra: <String, dynamic>{
|
||||
kTransitionInfoKey: const TransitionInfo(
|
||||
hasTransition: true,
|
||||
transitionType: PageTransitionType.scale,
|
||||
alignment: Alignment.bottomCenter,
|
||||
),
|
||||
},
|
||||
);
|
||||
|
||||
SnackBarUtil.showSnackBar(context, content);
|
||||
}
|
||||
}).catchError((err, stack) {
|
||||
context.pop();
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Error unlinking device',
|
||||
ptText: 'Erro ao desvincular dispositivo',
|
||||
);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
});
|
||||
} catch (err, stack) {
|
||||
context.pop();
|
||||
log(err.toString(), stackTrace: stack);
|
||||
content = FFLocalizations.of(context).getVariableText(
|
||||
enText: 'Error unlinking device',
|
||||
ptText: 'Erro ao desvincular dispositivo',
|
||||
);
|
||||
SnackBarUtil.showSnackBar(context, content, isError: true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,11 +1,6 @@
|
|||
import '/backend/schema/structs/index.dart';
|
||||
import 'dart:developer';
|
||||
import '/backend/schema/enums/enums.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:device_info_plus/device_info_plus.dart';
|
||||
|
||||
class DeviceUtil {
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
// Automatic FlutterFlow imports
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
import '../../flutter_flow/uploaded_file.dart';
|
||||
|
||||
class ImageUtils {
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import 'package:hub/shared/helpers/sqlite_storage_helper.dart';
|
||||
import 'package:hub/shared/utils/storage_util.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../flutter_flow/flutter_flow_theme.dart';
|
||||
|
||||
class SnackBarUtil {
|
||||
|
||||
|
||||
static void showSnackBar(BuildContext context, String text, {bool isError = false}) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(
|
||||
text,
|
||||
style: TextStyle(color: FlutterFlowTheme.of(context).info),
|
||||
),
|
||||
backgroundColor: isError
|
||||
? FlutterFlowTheme.of(context).error
|
||||
: FlutterFlowTheme.of(context).success,
|
||||
duration: const Duration(seconds: 3),
|
||||
behavior: SnackBarBehavior.floating,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(30),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -131,6 +131,7 @@ class StorageUtil {
|
|||
isFirstRun = false;
|
||||
await _sharedPreferences.prefs?.setBool('milestone', false);
|
||||
_secureStorage.purge();
|
||||
_sqliteStorage.purge();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
|
|
279
pubspec.lock
279
pubspec.lock
|
@ -1,14 +1,6 @@
|
|||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "72.0.0"
|
||||
_flutterfire_internals:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -17,19 +9,38 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.37"
|
||||
_macros:
|
||||
dependency: transitive
|
||||
description: dart
|
||||
source: sdk
|
||||
version: "0.3.2"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
app_links:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
|
||||
name: app_links
|
||||
sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.7.0"
|
||||
version: "6.3.2"
|
||||
app_links_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: app_links_linux
|
||||
sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
app_links_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: app_links_platform_interface
|
||||
sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
app_links_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: app_links_web
|
||||
sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
app_tracking_transparency:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -110,70 +121,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
build:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
build_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_config
|
||||
sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
build_daemon:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_daemon
|
||||
sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
build_resolvers:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.13"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.3.2"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_collection
|
||||
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.1"
|
||||
built_value:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.9.2"
|
||||
cached_network_image:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -270,14 +217,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.10.0"
|
||||
collection:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -302,14 +241,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
crop_your_image:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -350,14 +281,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.8"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.7"
|
||||
dbus:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -831,27 +754,11 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
fuchsia_remote_debug_protocol:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
go_router:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -884,14 +791,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.11.1"
|
||||
graphs:
|
||||
gtk:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: graphs
|
||||
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
|
||||
name: gtk
|
||||
sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.1.0"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -900,14 +807,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1001,14 +900,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.19.0"
|
||||
io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: io
|
||||
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
iregexp:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1121,14 +1012,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
macros:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: macros
|
||||
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.2-main.4"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1185,14 +1068,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
mockito:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: mockito
|
||||
sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.4.4"
|
||||
nested:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1217,14 +1092,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
page_transition:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1385,14 +1252,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.8"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
process:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1409,22 +1268,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.2"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
pubspec_parse:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pubspec_parse
|
||||
sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
qr:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1545,35 +1388,11 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1686,14 +1505,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.6.1"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timing
|
||||
sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1814,14 +1625,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.5"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1830,22 +1633,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.1"
|
||||
web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket
|
||||
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.6"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
webdriver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -21,6 +21,7 @@ dependencies:
|
|||
webview_flutter: ^4.8.0
|
||||
rxdart: ^0.27.7
|
||||
collection: 1.18.0
|
||||
app_links: ^6.3.2
|
||||
crop_your_image: 1.1.0
|
||||
csv: 6.0.0
|
||||
device_info_plus: 10.1.0
|
||||
|
@ -90,7 +91,6 @@ dependencies:
|
|||
# video_player_web: 2.3.1
|
||||
material_symbols_icons: ^4.2784.0
|
||||
fluttertoast: ^8.2.8
|
||||
|
||||
cupertino_icons: ^1.0.0
|
||||
flutter_bloc: ^8.1.6
|
||||
flutter_riverpod: ^2.5.1
|
||||
|
@ -112,10 +112,10 @@ dev_dependencies:
|
|||
flutter_lints: 4.0.0
|
||||
image: 4.2.0
|
||||
lints: 4.0.0
|
||||
# build_runner: ^2.4.13
|
||||
# mockito: ^5.4.4
|
||||
integration_test:
|
||||
sdk: flutter
|
||||
build_runner: ^2.4.13
|
||||
mockito: ^5.4.4
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
|
@ -134,7 +134,6 @@ flutter_launcher_icons:
|
|||
|
||||
|
||||
flutter:
|
||||
|
||||
uses-material-design: true
|
||||
|
||||
assets:
|
||||
|
@ -161,4 +160,4 @@ fonts:
|
|||
- asset: assets/fonts/icons.ttf
|
||||
- family: Menu
|
||||
fonts:
|
||||
- asset: assets/fonts/menu.ttf
|
||||
- asset: assets/fonts/menu.ttf
|
Loading…
Reference in New Issue