Merge branch 'main' into bugfix/fd-597

This commit is contained in:
Lucas 2024-08-02 08:19:34 -03:00
commit 0ec7f051ad
38 changed files with 5352 additions and 5836 deletions

View File

@ -42,6 +42,9 @@ PODS:
- FirebaseAnalytics (~> 10.27.0) - FirebaseAnalytics (~> 10.27.0)
- Firebase/CoreOnly (10.27.0): - Firebase/CoreOnly (10.27.0):
- FirebaseCore (= 10.27.0) - FirebaseCore (= 10.27.0)
- Firebase/Crashlytics (10.27.0):
- Firebase/CoreOnly
- FirebaseCrashlytics (~> 10.27.0)
- Firebase/Messaging (10.27.0): - Firebase/Messaging (10.27.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseMessaging (~> 10.27.0) - FirebaseMessaging (~> 10.27.0)
@ -52,6 +55,10 @@ PODS:
- firebase_core (3.1.0): - firebase_core (3.1.0):
- Firebase/CoreOnly (= 10.27.0) - Firebase/CoreOnly (= 10.27.0)
- Flutter - Flutter
- firebase_crashlytics (4.0.1):
- Firebase/Crashlytics (= 10.27.0)
- firebase_core
- Flutter
- firebase_messaging (15.0.1): - firebase_messaging (15.0.1):
- Firebase/Messaging (= 10.27.0) - Firebase/Messaging (= 10.27.0)
- firebase_core - firebase_core
@ -78,8 +85,19 @@ PODS:
- FirebaseCoreInternal (~> 10.0) - FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.12) - GoogleUtilities/Environment (~> 7.12)
- GoogleUtilities/Logger (~> 7.12) - GoogleUtilities/Logger (~> 7.12)
- FirebaseCoreExtension (10.29.0):
- FirebaseCore (~> 10.0)
- FirebaseCoreInternal (10.28.0): - FirebaseCoreInternal (10.28.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)" - "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseCrashlytics (10.27.0):
- FirebaseCore (~> 10.5)
- FirebaseInstallations (~> 10.0)
- FirebaseRemoteConfigInterop (~> 10.23)
- FirebaseSessions (~> 10.5)
- GoogleDataTransport (~> 9.2)
- GoogleUtilities/Environment (~> 7.8)
- nanopb (< 2.30911.0, >= 2.30908.0)
- PromisesObjC (~> 2.1)
- FirebaseInstallations (10.28.0): - FirebaseInstallations (10.28.0):
- FirebaseCore (~> 10.0) - FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Environment (~> 7.8)
@ -94,6 +112,16 @@ PODS:
- GoogleUtilities/Reachability (~> 7.8) - GoogleUtilities/Reachability (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8)
- nanopb (< 2.30911.0, >= 2.30908.0) - nanopb (< 2.30911.0, >= 2.30908.0)
- FirebaseRemoteConfigInterop (10.29.0)
- FirebaseSessions (10.29.0):
- FirebaseCore (~> 10.5)
- FirebaseCoreExtension (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleDataTransport (~> 9.2)
- GoogleUtilities/Environment (~> 7.13)
- GoogleUtilities/UserDefaults (~> 7.13)
- nanopb (< 2.30911.0, >= 2.30908.0)
- PromisesSwift (~> 2.1)
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_inappwebview_ios (0.0.1): - flutter_inappwebview_ios (0.0.1):
- Flutter - Flutter
@ -174,6 +202,8 @@ PODS:
- permission_handler_apple (9.3.0): - permission_handler_apple (9.3.0):
- Flutter - Flutter
- PromisesObjC (2.4.0) - PromisesObjC (2.4.0)
- PromisesSwift (2.4.0):
- PromisesObjC (= 2.4.0)
- SDWebImage (5.19.2): - SDWebImage (5.19.2):
- SDWebImage/Core (= 5.19.2) - SDWebImage/Core (= 5.19.2)
- SDWebImage/Core (5.19.2) - SDWebImage/Core (5.19.2)
@ -199,6 +229,7 @@ DEPENDENCIES:
- file_picker (from `.symlinks/plugins/file_picker/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`)
- firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`) - flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
@ -222,15 +253,20 @@ SPEC REPOS:
- Firebase - Firebase
- FirebaseAnalytics - FirebaseAnalytics
- FirebaseCore - FirebaseCore
- FirebaseCoreExtension
- FirebaseCoreInternal - FirebaseCoreInternal
- FirebaseCrashlytics
- FirebaseInstallations - FirebaseInstallations
- FirebaseMessaging - FirebaseMessaging
- FirebaseRemoteConfigInterop
- FirebaseSessions
- GoogleAppMeasurement - GoogleAppMeasurement
- GoogleDataTransport - GoogleDataTransport
- GoogleUtilities - GoogleUtilities
- nanopb - nanopb
- OrderedSet - OrderedSet
- PromisesObjC - PromisesObjC
- PromisesSwift
- SDWebImage - SDWebImage
- SwiftyGif - SwiftyGif
@ -243,6 +279,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_analytics/ios" :path: ".symlinks/plugins/firebase_analytics/ios"
firebase_core: firebase_core:
:path: ".symlinks/plugins/firebase_core/ios" :path: ".symlinks/plugins/firebase_core/ios"
firebase_crashlytics:
:path: ".symlinks/plugins/firebase_crashlytics/ios"
firebase_messaging: firebase_messaging:
:path: ".symlinks/plugins/firebase_messaging/ios" :path: ".symlinks/plugins/firebase_messaging/ios"
Flutter: Flutter:
@ -282,12 +320,17 @@ SPEC CHECKSUMS:
Firebase: 26b040b20866a55f55eb3611b9fcf3ae64816b86 Firebase: 26b040b20866a55f55eb3611b9fcf3ae64816b86
firebase_analytics: 0627e95b73eb9e04f59167687ed5bc3f6fb50f23 firebase_analytics: 0627e95b73eb9e04f59167687ed5bc3f6fb50f23
firebase_core: 483cfad66d24d8f3c233f31db4263830c625c909 firebase_core: 483cfad66d24d8f3c233f31db4263830c625c909
firebase_crashlytics: 8f04c663c8734f97c4ccbe81b8511ce7060e3b28
firebase_messaging: e60c0694699d8a2e56a319e043709583f6544123 firebase_messaging: e60c0694699d8a2e56a319e043709583f6544123
FirebaseAnalytics: f9211b719db260cc91aebee8bb539cb367d0dfd1 FirebaseAnalytics: f9211b719db260cc91aebee8bb539cb367d0dfd1
FirebaseCore: a2b95ae4ce7c83ceecfbbbe3b6f1cddc7415a808 FirebaseCore: a2b95ae4ce7c83ceecfbbbe3b6f1cddc7415a808
FirebaseCoreExtension: 705ca5b14bf71d2564a0ddc677df1fc86ffa600f
FirebaseCoreInternal: 58d07f1362fddeb0feb6a857d1d1d1c5e558e698 FirebaseCoreInternal: 58d07f1362fddeb0feb6a857d1d1d1c5e558e698
FirebaseCrashlytics: 81ea6ec96519388687f6061beb838a8eec482293
FirebaseInstallations: 60c1d3bc1beef809fd1ad1189a8057a040c59f2e FirebaseInstallations: 60c1d3bc1beef809fd1ad1189a8057a040c59f2e
FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e
FirebaseRemoteConfigInterop: 6efda51fb5e2f15b16585197e26eaa09574e8a4d
FirebaseSessions: dbd14adac65ce996228652c1fc3a3f576bdf3ecc
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0 flutter_inappwebview_ios: 97215cf7d4677db55df76782dbd2930c5e1c1ea0
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
@ -302,6 +345,7 @@ SPEC CHECKSUMS:
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78

View File

@ -51,8 +51,8 @@
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
6436409D27A31CDC00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 6436409227A31CD800820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = "<group>"; };
6436409227A31CDD00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 6436409127A31CDB00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C1B4A503715BC7B0F8826983 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; C1B4A503715BC7B0F8826983 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
@ -301,8 +301,8 @@
6436409C27A31CD800820AF7 /* InfoPlist.strings */ = { 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
6436409D27A31CDC00820AF7 /* pt */, 6436409227A31CD800820AF7 /* pt */,
6436409227A31CDD00820AF7 /* en */, 6436409127A31CDB00820AF7 /* en */,
); );
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";

View File

@ -14,13 +14,13 @@ import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/flutter_flow/random_data_util.dart'; import 'package:hub/flutter_flow/random_data_util.dart';
import 'package:hub/pages/home_page/home_page_model.dart'; import 'package:hub/pages/home_page/home_page_model.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../shared/utils/log_util.dart';
Future<void> openTermsOfUse(BuildContext context) async { Future<void> openTermsOfUse(BuildContext context) async {
log('openTermsOfUse'); log('openTermsOfUse');
final Uri url = Uri.parse('https://freaccess.com.br/pp/'); final Uri url = Uri.parse('https://freaccess.com.br/pp/');
@ -108,91 +108,88 @@ Future singInLoginAction(
String? emailAdress, String? emailAdress,
String? password, String? password,
}) async { }) async {
String? devUUID; try {
ApiCallResponse? loginCall; String? devUUID;
ApiCallResponse? loginCall;
await Future.wait([ await Future.wait([
Future(() async { Future(() async {
FFAppState().email = emailAdress!; FFAppState().email = emailAdress!;
}), }),
Future(() async { Future(() async {
FFAppState().passwd = password!; FFAppState().passwd = password!;
}), }),
]); ]);
if ((FFAppState().email != '') && (FFAppState().passwd != '')) {
devUUID = await getDevUUID();
FFAppState().devUUID = devUUID!;
loginCall = await PhpGroup.loginCall.call(
email: FFAppState().email,
password: FFAppState().passwd,
uuid: FFAppState().devUUID,
type: FFAppState().device,
description: randomString(
10,
10,
true,
false,
false,
),
);
if (PhpGroup.loginCall.error( if ((FFAppState().email != '') && (FFAppState().passwd != '')) {
devUUID = await getDevUUID();
FFAppState().devUUID = devUUID!;
loginCall = await PhpGroup.loginCall.call(
email: FFAppState().email,
password: FFAppState().passwd,
uuid: FFAppState().devUUID,
type: FFAppState().device,
description: randomString(
10,
10,
true,
false,
false,
),
);
if (PhpGroup.loginCall.error((loginCall.jsonBody ?? '')) == false) {
FFAppState().userUUID = PhpGroup.loginCall.userUUID(
(loginCall.jsonBody ?? ''), (loginCall.jsonBody ?? ''),
) == )!;
false) {
FFAppState().userUUID = PhpGroup.loginCall.userUUID(
(loginCall.jsonBody ?? ''),
)!;
// FFAppState().token = await FirebaseMessaging.instance.getToken();
FFAppState().createdAt = dateTimeFormat(
'd/M/y H:mm:ss',
getCurrentTimestamp,
locale: FFLocalizations.of(context).languageCode,
);
FFAppState().updatedAt = '00/00/0000 00:00:00';
FFAppState().status = PhpGroup.loginCall.userStatus(
(loginCall.jsonBody ?? ''),
)!;
FFAppState().userDevUUID = PhpGroup.loginCall.userDeviceId(
(loginCall.jsonBody ?? ''),
)!;
FFAppState().name = PhpGroup.loginCall.userName(
(loginCall.jsonBody ?? ''),
)!;
FFAppState().serialNumber = await getSerialNumber() ?? '';
FFAppState().isLogged = true;
await toggleHomePage(context);
return;
} else {
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
useSafeArea: true,
context: context,
builder: (context) {
return Padding(
padding: MediaQuery.viewInsetsOf(context),
child: ThrowExceptionWidget(
msg: PhpGroup.loginCall.msg(
(loginCall?.jsonBody ?? ''),
)!,
),
);
},
);
FFAppState().deleteEmail(); FFAppState().createdAt = dateTimeFormat(
FFAppState().email = ''; 'd/M/y H:mm:ss',
getCurrentTimestamp,
locale: FFLocalizations.of(context).languageCode,
);
FFAppState().deletePasswd(); FFAppState().updatedAt = '00/00/0000 00:00:00';
FFAppState().passwd = '';
FFAppState().update(() {}); FFAppState().status =
PhpGroup.loginCall.userStatus((loginCall.jsonBody ?? ''))!;
FFAppState().userDevUUID =
PhpGroup.loginCall.userDeviceId((loginCall.jsonBody ?? ''))!;
FFAppState().name =
PhpGroup.loginCall.userName((loginCall.jsonBody ?? ''))!;
FFAppState().serialNumber = await getSerialNumber() ?? '';
FFAppState().isLogged = true;
await toggleHomePage(context);
} else {
if (PhpGroup.loginCall.msg((loginCall?.jsonBody ?? '')) == null) {
DialogUtil.errorDefault(context);
} else {
DialogUtil.error(context,
PhpGroup.loginCall.msg((loginCall?.jsonBody ?? '')).toString());
}
FFAppState().deleteEmail();
FFAppState().email = '';
FFAppState().deletePasswd();
FFAppState().passwd = '';
FFAppState().update(() {});
}
} }
return; return;
} else { } catch (e, s) {
return; DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed(
'login.php', emailAdress.toString(), "Login", e, s);
} }
} }
@ -333,7 +330,6 @@ Future toggleSignInPage(BuildContext context) async {
} }
Future toggleSignUpPage(BuildContext context) async { Future toggleSignUpPage(BuildContext context) async {
context.pushNamed( context.pushNamed(
'signUpPage', 'signUpPage',
extra: <String, dynamic>{ extra: <String, dynamic>{
@ -468,12 +464,12 @@ Future<bool> checkLocals({
), ),
), ),
); );
safeSetState(() {}); // Chamada otimizada fora do then para evitar encadeamentos desnecessários. safeSetState(
() {}); // Chamada otimizada fora do then para evitar encadeamentos desnecessários.
return false; return false;
} }
} }
Future changeStatusAction( Future changeStatusAction(
BuildContext context, BuildContext context,
String status, String status,
@ -523,14 +519,10 @@ Future changeStatusAction(
default: default:
break; break;
} }
} }
/// QR Code /// QR Code
Uint8List assembleQRPacket(int direction, String identifier, String password) { Uint8List assembleQRPacket(int direction, String identifier, String password) {
List<int> packet = [direction]; List<int> packet = [direction];
@ -569,13 +561,15 @@ Uint8List assembleQRPacket(int direction, String identifier, String password) {
check ^= b; check ^= b;
} }
if (check == int.parse('0D', radix: 16) || check == int.parse('0A', radix: 16)) { if (check == int.parse('0D', radix: 16) ||
check == int.parse('0A', radix: 16)) {
packet.add(int.parse('FF', radix: 16)); packet.add(int.parse('FF', radix: 16));
} else { } else {
packet.add(check); packet.add(check);
} }
var bytes = packet.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join((' ')); var bytes =
packet.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join((' '));
log("Pacote: $packet"); log("Pacote: $packet");
log("Bytes: $bytes"); log("Bytes: $bytes");
@ -586,22 +580,24 @@ Uint8List hexStringToByteArray(String s) {
int len = s.length; int len = s.length;
Uint8List data = Uint8List(len ~/ 2); Uint8List data = Uint8List(len ~/ 2);
for (int i = 0; i < len; i += 2) { for (int i = 0; i < len; i += 2) {
data[i ~/ 2] = ((int.parse(s[i], radix: 16) << 4) + int.parse(s[i + 1], radix: 16)); data[i ~/ 2] =
((int.parse(s[i], radix: 16) << 4) + int.parse(s[i + 1], radix: 16));
} }
return data; return data;
} }
String byteToHexa(Uint8List pDados) { String byteToHexa(Uint8List pDados) {
return pDados.map((byte) => byte.toRadixString(16).padLeft(2, '0').toUpperCase()).join(); return pDados
.map((byte) => byte.toRadixString(16).padLeft(2, '0').toUpperCase())
.join();
} }
Future<String> byteToString(Uint8List bytes) async { Future<String> byteToString(Uint8List bytes) async {
return String.fromCharCodes(bytes); return String.fromCharCodes(bytes);
} }
Widget buildQrCode( Widget buildQrCode(
{ {
// required String data, // required String data,
// required String type, // required String type,
// required int version, // required int version,
@ -610,204 +606,207 @@ Widget buildQrCode(
required double dimension, required double dimension,
required String identifier, required String identifier,
required String pass, required String pass,
required int direction required int direction}) {
}
) {
try { try {
log("pass: $pass"); log("pass: $pass");
const Color backgroundColor = Colors.white; const Color backgroundColor = Colors.white;
const Color foregroundColor = Colors.black; const Color foregroundColor = Colors.black;
return QrImageView.withQr(qr: QrCode.fromUint8List(data: assembleQRPacket(direction, identifier, pass), errorCorrectLevel: errorCorrectLevel), size: dimension, padding: const EdgeInsets.all(10), backgroundColor: backgroundColor, foregroundColor: foregroundColor); return QrImageView.withQr(
qr: QrCode.fromUint8List(
data: assembleQRPacket(direction, identifier, pass),
errorCorrectLevel: errorCorrectLevel),
size: dimension,
padding: const EdgeInsets.all(10),
backgroundColor: backgroundColor,
foregroundColor: foregroundColor);
} catch (e) { } catch (e) {
return Text("Erro ao gerar QR Code: ${e.toString()}"); return Text("Erro ao gerar QR Code: ${e.toString()}");
} }
} }
// // Retorna o conteúdo a ser codificado no QR Code.
// String getContents() {
// return data;
// }
// // Retorna o conteúdo a ser codificado no QR Code. // // Retorna uma versão do conteúdo otimizada para exibição.
// String getContents() { // String getDisplayContents() {
// return data; // return data.trim();
// } // }
// // Retorna uma versão do conteúdo otimizada para exibição. // // Retorna o título baseado no tipo de conteúdo.
// String getDisplayContents() { // String getTitle() {
// return data.trim(); // return type;
// } // }
// // Retorna o título baseado no tipo de conteúdo. // // Codifica o conteúdo em uma string adequada para o QR Code.
// String getTitle() { // Future<String> encodeContents() async {
// return type; // // Implementação específica para codificar o conteúdo.
// } // return data; // Exemplo simplificado.
// }
// // Codifica o conteúdo em uma string adequada para o QR Code. // // Codifica o conteúdo específico do QR Code.
// Future<String> encodeContents() async { // Future<Widget> encodeQRCodeContents() async {
// // Implementação específica para codificar o conteúdo. // return getQrCode();
// return data; // Exemplo simplificado. // }
// }
// // Codifica o conteúdo específico do QR Code. // // Gera o QR Code como um widget.
// Future<Widget> encodeQRCodeContents() async {
// return getQrCode();
// }
// // Gera o QR Code como um widget. // // Codifica o conteúdo como um bitmap (pode ser útil para operações de baixo nível).
// // Future<Image> encodeAsBitmap() async {
// // // Implementação para codificar como bitmap.
// // return Image(image); // Exemplo simplificado.
// // }
// // Adivinha a codificação apropriada para o conteúdo.
// String guessAppropriateEncoding(String content) {
// // Implementação para adivinhar a codificação.
// return "UTF-8"; // Exemplo simplificado.
// }
// // Codifica o conteúdo como um bitmap (pode ser útil para operações de baixo nível). // // Remove espaços em branco do início e do fim do conteúdo.
// // Future<Image> encodeAsBitmap() async { // String trim(String content) {
// // // Implementação para codificar como bitmap. // return content.trim();
// // return Image(image); // Exemplo simplificado. // }
// // }
// // Adivinha a codificação apropriada para o conteúdo. // // Escapa caracteres especiais para o formato MECARD.
// String guessAppropriateEncoding(String content) { // String escapeMECARD(String content) {
// // Implementação para adivinhar a codificação. // // Implementação para escapar caracteres.
// return "UTF-8"; // Exemplo simplificado. // return content.replaceAll(':', '\\:'); // Exemplo simplificado.
// } // }
// // Remove espaços em branco do início e do fim do conteúdo. /// menu
// String trim(String content) {
// return content.trim();
// }
// // Escapa caracteres especiais para o formato MECARD. Future scheduleVisitOptAction(BuildContext context) async {
// String escapeMECARD(String content) { await showAdaptiveDialog(
// // Implementação para escapar caracteres. context: context,
// return content.replaceAll(':', '\\:'); // Exemplo simplificado. builder: (context) {
// } return Padding(
padding: MediaQuery.viewInsetsOf(context),
/// menu child: OptionSelectionModalWidget(
routesListStr: <String>[
Future scheduleVisitOptAction(BuildContext context) async { 'scheduleCompleteVisitPage',
await showAdaptiveDialog( 'scheduleProvisionalVisitPage',
context: context, 'fastPassPage',
builder: (context) { ],
return Padding( iconsListIcon: <IconData>[
padding: MediaQuery.viewInsetsOf(context), Icons.date_range_rounded,
child: OptionSelectionModalWidget( Icons.date_range_rounded,
routesListStr: <String>[ Icons.date_range_rounded,
'scheduleCompleteVisitPage', ],
'scheduleProvisionalVisitPage', nameListStr: <String>[
'fastPassPage', FFLocalizations.of(context).getVariableText(
], ptText: 'Visita\nCompleta',
iconsListIcon: <IconData>[ enText: 'Complete\nSchedule',
Icons.date_range_rounded, ),
Icons.date_range_rounded, FFLocalizations.of(context).getVariableText(
Icons.date_range_rounded, ptText: 'Visita\nProvisória',
], enText: 'Provisional\nSchedule',
nameListStr: <String>[ ),
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
ptText: 'Visita\nCompleta', ptText: 'Visita\nRápida',
enText: 'Complete\nSchedule', enText: 'Fast\nSchedule',
), ),
FFLocalizations.of(context).getVariableText( ],
ptText: 'Visita\nProvisória',
enText: 'Provisional\nSchedule',
),
FFLocalizations.of(context).getVariableText(
ptText: 'Visita\nRápida',
enText: 'Fast\nSchedule',
),
],
),
);
},
);
}
Future registerVisitorOptAction(BuildContext context) async {
context.pushNamed(
'registerVisitorPage',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
), ),
}, );
); },
} );
}
Future peopleOnThePropertyAction(BuildContext context) async { Future registerVisitorOptAction(BuildContext context) async {
context.pushNamed( context.pushNamed(
'peopleOnThePropertyPage', 'registerVisitorPage',
extra: <String, dynamic>{ extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo( kTransitionInfoKey: const TransitionInfo(
hasTransition: true, hasTransition: true,
transitionType: PageTransitionType.fade, transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
}
Future peopleOnThePropertyAction(BuildContext context) async {
context.pushNamed(
'peopleOnThePropertyPage',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.fade,
),
},
);
}
Future preferencesSettings(BuildContext context) async {
context.pushNamed(
'preferencesSettings',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
}
Future liberationHistoryOptAction(BuildContext context) async {
await showAdaptiveDialog(
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// enableDrag: false,
context: context,
builder: (context) {
return Padding(
padding: MediaQuery.viewInsetsOf(context),
child: OptionSelectionModalWidget(
routesListStr: <String>[
'liberationHistory',
'acessHistoryPage',
'scheduleCompleteVisitPage',
// 'messageHistoryPage',
],
iconsListIcon: <IconData>[
Icons.history_rounded,
Icons.history_rounded,
Icons.history_rounded,
// Icons.history_rounded,
],
nameListStr: <String>[
FFLocalizations.of(context).getVariableText(
ptText: 'Histórico\nde Liberação',
enText: 'Liberation\nHistory',
),
FFLocalizations.of(context).getVariableText(
ptText: 'Histórico\nde Acesso',
enText: 'Access\nHistory',
),
FFLocalizations.of(context).getVariableText(
ptText: 'Histórico\nde Visita',
enText: 'Visit\nHistory',
),
// FFLocalizations.of(context).getVariableText(
// ptText: 'Histórico\nde Mensagens',
// enText: 'Message\nHistory',
// ),
],
), ),
}, );
); },
} );
}
Future preferencesSettings(BuildContext context) async { Future accessQRCodeOptAction(BuildContext context) async {
context.pushNamed( context.pushNamed(
'preferencesSettings', 'qrCodePage',
extra: <String, dynamic>{ extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo( kTransitionInfoKey: const TransitionInfo(
hasTransition: true, hasTransition: true,
transitionType: PageTransitionType.scale, transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
), ),
}, },
); );
} }
Future liberationHistoryOptAction(BuildContext context) async {
await showAdaptiveDialog(
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// enableDrag: false,
context: context,
builder: (context) {
return Padding(
padding: MediaQuery.viewInsetsOf(context),
child: OptionSelectionModalWidget(
routesListStr: <String>[
'liberationHistory',
'acessHistoryPage',
'scheduleCompleteVisitPage',
// 'messageHistoryPage',
],
iconsListIcon: <IconData>[
Icons.history_rounded,
Icons.history_rounded,
Icons.history_rounded,
// Icons.history_rounded,
],
nameListStr: <String>[
FFLocalizations.of(context).getVariableText(
ptText: 'Histórico\nde Liberação',
enText: 'Liberation\nHistory',
),
FFLocalizations.of(context).getVariableText(
ptText: 'Histórico\nde Acesso',
enText: 'Access\nHistory',
),
FFLocalizations.of(context).getVariableText(
ptText: 'Histórico\nde Visita',
enText: 'Visit\nHistory',
),
// FFLocalizations.of(context).getVariableText(
// ptText: 'Histórico\nde Mensagens',
// enText: 'Message\nHistory',
// ),
],
),
);
},
);
}
Future accessQRCodeOptAction(BuildContext context) async {
context.pushNamed(
'qrCodePage',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
}

View File

@ -30,14 +30,13 @@ class FFAppState extends ChangeNotifier {
bool authenticated = false; bool authenticated = false;
try { try {
authenticated = await auth.authenticate( authenticated = await auth.authenticate(
localizedReason: 'Scan your fingerprint to authenticate', localizedReason: 'Scan your fingerprint to authenticate',
options: const AuthenticationOptions( options: const AuthenticationOptions(
biometricOnly: true, biometricOnly: true,
stickyAuth: true, stickyAuth: true,
useErrorDialogs: true, useErrorDialogs: true,
sensitiveTransaction: true, sensitiveTransaction: true,
) ));
);
if (authenticated) { if (authenticated) {
_isBiometricAuthenticated = true; _isBiometricAuthenticated = true;
notifyListeners(); notifyListeners();
@ -50,7 +49,8 @@ class FFAppState extends ChangeNotifier {
clearBiometricAuthentication(); clearBiometricAuthentication();
return Future.error(e); return Future.error(e);
} }
return Future.error(''); // Add this line to ensure a value is always returned return Future.error(
''); // Add this line to ensure a value is always returned
} }
// Função para limpar o estado de autenticação biométrica // Função para limpar o estado de autenticação biométrica
@ -60,9 +60,6 @@ class FFAppState extends ChangeNotifier {
// Limpar a informação salva, se necessário // Limpar a informação salva, se necessário
} }
static FFAppState _instance = FFAppState._internal(); static FFAppState _instance = FFAppState._internal();
factory FFAppState() { factory FFAppState() {
@ -123,13 +120,16 @@ class FFAppState extends ChangeNotifier {
_tokenAPNS = await secureStorage.getString('ff_tokenAPNS') ?? _tokenAPNS; _tokenAPNS = await secureStorage.getString('ff_tokenAPNS') ?? _tokenAPNS;
}); });
await _safeInitAsync(() async { await _safeInitAsync(() async {
_userDevUUID = await secureStorage.getString('ff_user_dev_id') ?? _userDevUUID; _userDevUUID =
await secureStorage.getString('ff_user_dev_id') ?? _userDevUUID;
}); });
await _safeInitAsync(() async { await _safeInitAsync(() async {
_serialNumber = await secureStorage.getString('ff_serialNumber') ?? _serialNumber; _serialNumber =
await secureStorage.getString('ff_serialNumber') ?? _serialNumber;
}); });
await _safeInitAsync(() async { await _safeInitAsync(() async {
_fingerprintOPT = await secureStorage.getBool('fingerprint') ?? _fingerprintOPT; _fingerprintOPT =
await secureStorage.getBool('fingerprint') ?? _fingerprintOPT;
}); });
await _safeInitAsync(() async { await _safeInitAsync(() async {
_personOPT = await secureStorage.getBool('person') ?? _personOPT; _personOPT = await secureStorage.getBool('person') ?? _personOPT;
@ -137,6 +137,9 @@ class FFAppState extends ChangeNotifier {
await _safeInitAsync(() async { await _safeInitAsync(() async {
_passOPT = await secureStorage.getBool('pass') ?? _passOPT; _passOPT = await secureStorage.getBool('pass') ?? _passOPT;
}); });
await _safeInitAsync(() async {
_panicOPT = await secureStorage.getBool('panic') ?? _panicOPT;
});
await _safeInitAsync(() async { await _safeInitAsync(() async {
_notifyOPT = await secureStorage.getBool('notify') ?? _notifyOPT; _notifyOPT = await secureStorage.getBool('notify') ?? _notifyOPT;
}); });
@ -147,9 +150,9 @@ class FFAppState extends ChangeNotifier {
_panicPass = await secureStorage.getString('panicPass') ?? _panicPass; _panicPass = await secureStorage.getString('panicPass') ?? _panicPass;
}); });
await _safeInitAsync(() async { await _safeInitAsync(() async {
_fingerprintPass = await secureStorage.getString('fingerprintPass') ?? _fingerprintPass; _fingerprintPass =
await secureStorage.getString('fingerprintPass') ?? _fingerprintPass;
}); });
} }
void update(VoidCallback callback) { void update(VoidCallback callback) {
@ -159,6 +162,17 @@ class FFAppState extends ChangeNotifier {
late FlutterSecureStorage secureStorage; late FlutterSecureStorage secureStorage;
bool _panicOPT = false;
bool get panic => _panicOPT;
set panic(bool value) {
_panicOPT = value;
secureStorage.setBool('panic', value);
}
void deletePanic() {
secureStorage.delete(key: 'panic');
}
String _fingerprintPass = ''; String _fingerprintPass = '';
String get fingerprintPass => _fingerprintPass; String get fingerprintPass => _fingerprintPass;
set fingerprintPass(String value) { set fingerprintPass(String value) {
@ -185,8 +199,7 @@ class FFAppState extends ChangeNotifier {
String get panicPass => _panicPass; String get panicPass => _panicPass;
set panicPass(String value) { set panicPass(String value) {
_panicPass = value; _panicPass = value;
secureStorage.setString secureStorage.setString('panicPass', value);
('panicPass', value);
} }
void deletePanicPass() { void deletePanicPass() {
@ -203,8 +216,7 @@ class FFAppState extends ChangeNotifier {
bool _passOPT = false; bool _passOPT = false;
bool get pass => _passOPT; bool get pass => _passOPT;
set pass(bool value) { set pass(bool value) {
_passOPT = _passOPT = value;
value;
secureStorage.setBool('pass', value); secureStorage.setBool('pass', value);
} }

View File

@ -1,3 +1,5 @@
import 'package:hub/shared/enums/enum_throw_exception.dart';
import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
@ -7,15 +9,12 @@ import 'package:google_fonts/google_fonts.dart';
import 'throw_exception_model.dart'; import 'throw_exception_model.dart';
export 'throw_exception_model.dart'; export 'throw_exception_model.dart';
///
class ThrowExceptionWidget extends StatefulWidget { class ThrowExceptionWidget extends StatefulWidget {
const ThrowExceptionWidget({ ThrowExceptionWidget(
super.key, {super.key, required this.msg, this.type = EnumThrowException.error});
required this.msg,
});
final String? msg; final String? msg;
EnumThrowException type;
@override @override
State<ThrowExceptionWidget> createState() => _ThrowExceptionWidgetState(); State<ThrowExceptionWidget> createState() => _ThrowExceptionWidgetState();
@ -61,6 +60,43 @@ class _ThrowExceptionWidgetState extends State<ThrowExceptionWidget>
super.dispose(); super.dispose();
} }
Color _getColorByType(BuildContext context) {
switch (widget.type) {
case EnumThrowException.error:
return FlutterFlowTheme.of(context).error;
case EnumThrowException.warning:
return FlutterFlowTheme.of(context).warning;
case EnumThrowException.success:
return FlutterFlowTheme.of(context).success;
}
}
IconData _getIconByType(BuildContext context) {
switch (widget.type) {
case EnumThrowException.error:
return Icons.cancel_outlined;
case EnumThrowException.warning:
return Icons.warning_amber_outlined;
case EnumThrowException.success:
return Icons.check_circle_outline;
}
}
String _getTitleByType(BuildContext context) {
switch (widget.type) {
case EnumThrowException.error:
return FFLocalizations.of(context)
.getVariableText(ptText: "Falha :(", enText: "Fail :(");
case EnumThrowException.warning:
return FFLocalizations.of(context)
.getVariableText(ptText: "Aviso :O", enText: "Warning :O");
case EnumThrowException.success:
return FFLocalizations.of(context)
.getVariableText(ptText: "Sucesso ;)", enText: "Success ;)");
;
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
@ -77,85 +113,59 @@ class _ThrowExceptionWidgetState extends State<ThrowExceptionWidget>
onTap: () async { onTap: () async {
Navigator.pop(context); Navigator.pop(context);
}, },
child: Container( child: Column(
height: 400.0, mainAxisSize: MainAxisSize.max,
decoration: BoxDecoration( mainAxisAlignment: MainAxisAlignment.center,
color: FlutterFlowTheme.of(context).primaryBackground, children: [
borderRadius: const BorderRadius.only( Stack(
bottomLeft: Radius.circular(10.0), children: [
bottomRight: Radius.circular(10.0), Align(
topLeft: Radius.circular(10.0), alignment: const AlignmentDirectional(0.0, 0.0),
topRight: Radius.circular(10.0), child: Icon(
), _getIconByType(context),
), color: _getColorByType(context),
child: Column( size: 150.0,
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Stack(
children: [
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Icon(
Icons.circle_outlined,
color: FlutterFlowTheme.of(context).error,
size: 200.0,
),
), ),
Align( ),
alignment: const AlignmentDirectional(0.0, 0.0), ],
child: Icon( ).animateOnPageLoad(animationsMap['stackOnPageLoadAnimation']!),
Icons.close_outlined, Column(
color: FlutterFlowTheme.of(context).error, mainAxisSize: MainAxisSize.max,
size: 200.0, mainAxisAlignment: MainAxisAlignment.start,
), children: [
), Text(
], _getTitleByType(context),
).animateOnPageLoad( style: FlutterFlowTheme.of(context).bodyMedium.override(
animationsMap['stackOnPageLoadAnimation']!), fontFamily:
Column( FlutterFlowTheme.of(context).bodyMediumFamily,
mainAxisSize: MainAxisSize.max, fontSize: 20.0,
mainAxisAlignment: MainAxisAlignment.start, letterSpacing: 0.0,
children: [ fontWeight: FontWeight.bold,
Text( useGoogleFonts: GoogleFonts.asMap().containsKey(
FFLocalizations.of(context).getText( FlutterFlowTheme.of(context).bodyMediumFamily),
'e58xxxiq' /* ERRO */, ),
),
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( style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily, FlutterFlowTheme.of(context).bodyMediumFamily,
fontSize: 20.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context) FlutterFlowTheme.of(context)
.bodyMediumFamily), .bodyMediumFamily),
), ),
), ),
Padding( ),
padding: ].addToStart(const SizedBox(height: 20.0)),
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: 50.0)),
),
],
),
), ),
), ),
), ),

View File

@ -1,16 +1,13 @@
import 'package:hub/components/molecular_components/visitor_not_found_component/visitor_not_found_component_model.dart'; import 'package:hub/components/molecular_components/visitor_not_found_component/visitor_not_found_component_model.dart';
import 'package:hub/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart'; import 'package:hub/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.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_theme.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
class VisitorNotFoundComponentWidget extends StatefulWidget { class VisitorNotFoundComponentWidget extends StatefulWidget {
const VisitorNotFoundComponentWidget({super.key}); const VisitorNotFoundComponentWidget({super.key});
@ -44,136 +41,138 @@ class _VisitorNotFoundComponentWidgetState
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Align( return Container(
alignment: const AlignmentDirectional(0.0, 0.0), width: MediaQuery.of(context).size.height * 0.5,
child: Container( height: MediaQuery.of(context).size.height * 0.4,
width: 350.0, decoration: BoxDecoration(
height: 350.0, color: FlutterFlowTheme.of(context).primaryBackground,
decoration: BoxDecoration( borderRadius: const BorderRadius.only(
color: FlutterFlowTheme.of(context).primaryBackground, bottomLeft: Radius.circular(25.0),
borderRadius: const BorderRadius.only( bottomRight: Radius.circular(25.0),
bottomLeft: Radius.circular(25.0), topLeft: Radius.circular(25.0),
bottomRight: Radius.circular(25.0), topRight: Radius.circular(25.0),
topLeft: Radius.circular(25.0), ),
topRight: Radius.circular(25.0), ),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Align(
alignment: const AlignmentDirectional(1.0, -1.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 5.0, 5.0, 0.0),
child: FlutterFlowIconButton(
borderRadius: 20.0,
borderWidth: 1.0,
buttonSize: 40.0,
icon: Icon(
Icons.close,
color: FlutterFlowTheme.of(context).accent1,
size: 24.0,
),
onPressed: () async {
Navigator.pop(context);
},
),
),
), ),
), Icon(
child: Column( Icons.notifications_none,
mainAxisSize: MainAxisSize.max, color: FlutterFlowTheme.of(context).accent1,
mainAxisAlignment: MainAxisAlignment.start, size: 72.0,
children: [ ),
Align( Padding(
alignment: const AlignmentDirectional(1.0, -1.0), padding: const EdgeInsetsDirectional.fromSTEB(0.0, 16.0, 0.0, 0.0),
child: Padding( child: Text(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 5.0, 5.0, 0.0), FFLocalizations.of(context).getText(
child: FlutterFlowIconButton( '1p9mykbj' /* Usuário não encontrado */,
borderRadius: 20.0, ),
borderWidth: 1.0, style: FlutterFlowTheme.of(context).headlineMedium.override(
buttonSize: 40.0, fontFamily:
icon: Icon( FlutterFlowTheme.of(context).headlineMediumFamily,
Icons.close, letterSpacing: 0.0,
color: FlutterFlowTheme.of(context).accent1, useGoogleFonts: GoogleFonts.asMap().containsKey(
size: 24.0, FlutterFlowTheme.of(context).headlineMediumFamily),
), ),
onPressed: () async { ),
Navigator.pop(context); ),
}, Padding(
), padding: const EdgeInsetsDirectional.fromSTEB(20.0, 4.0, 20.0, 0.0),
child: Text(
FFLocalizations.of(context).getText(
'kt937sp6' /* O documento inserido não corre... */,
), ),
), style: FlutterFlowTheme.of(context).labelMedium.override(
Icon( fontFamily: FlutterFlowTheme.of(context).labelMediumFamily,
Icons.notifications_none, color: FlutterFlowTheme.of(context).primaryText,
color: FlutterFlowTheme.of(context).accent1, fontSize: 14.0,
size: 72.0, letterSpacing: 0.0,
), fontStyle: FontStyle.italic,
Padding( useGoogleFonts: GoogleFonts.asMap().containsKey(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 16.0, 0.0, 0.0), FlutterFlowTheme.of(context).labelMediumFamily),
child: Text(
FFLocalizations.of(context).getText(
'1p9mykbj' /* Usuário não encontrado */,
),
style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily:
FlutterFlowTheme.of(context).headlineMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).headlineMediumFamily),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(10.0, 4.0, 10.0, 0.0),
child: Text(
FFLocalizations.of(context).getText(
'kt937sp6' /* O documento inserido não corre... */,
),
style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily:
FlutterFlowTheme.of(context).labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontStyle: FontStyle.italic,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).labelMediumFamily),
),
),
),
Expanded(
child: Align(
alignment: const AlignmentDirectional(0.0, 1.0),
child: FFButtonWidget(
onPressed: () async {
Navigator.pop(context);
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
enableDrag: false,
context: context,
builder: (context) {
return Padding(
padding: MediaQuery.viewInsetsOf(context),
child: const RegisiterVistorTemplateComponentWidget(),
);
},
).then((value) => safeSetState(() {}));
},
text: FFLocalizations.of(context).getText(
'y2x4nfcn' /* Adicionar */,
), ),
options: FFButtonOptions( ),
width: double.infinity, ),
height: 30.0, Expanded(
padding: child: Align(
const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0), alignment: const AlignmentDirectional(0.0, 1.0),
iconPadding: child: FFButtonWidget(
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), onPressed: () async {
color: FlutterFlowTheme.of(context).primary, Navigator.pop(context);
textStyle: FlutterFlowTheme.of(context).titleSmall.override( await showModalBottomSheet(
fontFamily: isScrollControlled: true,
FlutterFlowTheme.of(context).titleSmallFamily, backgroundColor: Colors.transparent,
color: Colors.white, enableDrag: true,
letterSpacing: 0.0, useSafeArea: true,
useGoogleFonts: GoogleFonts.asMap().containsKey( isDismissible: true,
FlutterFlowTheme.of(context).titleSmallFamily), context: context,
), builder: (context) {
elevation: 3.0, return Padding(
borderSide: const BorderSide( padding: MediaQuery.viewInsetsOf(context),
color: Colors.transparent, child: SizedBox(
width: 1.0, width: double.infinity,
), height: MediaQuery.of(context).size.height * 0.9,
borderRadius: const BorderRadius.only( child: const RegisiterVistorTemplateComponentWidget(
bottomLeft: Radius.circular(25.0), source: 'VisitorNotFoundComponent',
bottomRight: Radius.circular(25.0), )),
topLeft: Radius.circular(15.0), );
topRight: Radius.circular(15.0), },
), ).then((value) => safeSetState(() {}));
},
text: FFLocalizations.of(context)
.getVariableText(enText: 'Add', ptText: 'Adicionar'),
options: FFButtonOptions(
width: double.infinity,
height: 30.0,
padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.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:
FlutterFlowTheme.of(context).titleSmallFamily,
color: Colors.white,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).titleSmallFamily),
),
elevation: 3.0,
borderSide: const BorderSide(
color: Colors.transparent,
width: 1.0,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(25.0),
bottomRight: Radius.circular(25.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
), ),
), ),
), ),
), ),
], ),
), ],
), ),
); );
} }

View File

@ -1,9 +1,11 @@
import 'package:hub/backend/api_requests/api_manager.dart'; import 'dart:developer';
import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart'; import 'package:hub/components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:intl/intl.dart';
class ScheduleVisitDetailModel class ScheduleVisitDetailModel
extends FlutterFlowModel<ScheduleVisitDetailWidget> { extends FlutterFlowModel<ScheduleVisitDetailWidget> {
@ -36,6 +38,36 @@ class ScheduleVisitDetailModel
// Stores action output result for [Backend Call - API (postScheduleVisit)] action in Icon widget. // Stores action output result for [Backend Call - API (postScheduleVisit)] action in Icon widget.
ApiCallResponse? postScheduleVisit; ApiCallResponse? postScheduleVisit;
String convertDateFormat(String dateStr) {
try {
log('Received date string: $dateStr');
// Formato original
DateFormat originalFormat = DateFormat('d/M/y H:mm:ss');
// Novo formato
DateFormat newFormat = DateFormat('y-M-d H:mm:ss');
// Validate the input string format
if (!RegExp(r'^\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}:\d{2}$')
.hasMatch(dateStr)) {
log('Invalid date format: $dateStr');
return 'Invalid date format';
}
// Converte a string para DateTime
DateTime dateTime = originalFormat.parse(dateStr);
// Converte DateTime para a nova string formatada
String formattedDate = newFormat.format(dateTime);
log('Formatted date: $formattedDate');
return formattedDate;
} catch (e) {
// Handle the exception by returning an error message or a default value
log('Error parsing date: $e');
return 'Invalid date format';
}
}
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {}

View File

@ -1,24 +1,43 @@
import 'package:hub/shared/utils/validator_util.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import 'forgot_password_template_component_widget.dart' import 'forgot_password_template_component_widget.dart'
show ForgotPasswordTemplateComponentWidget; show ForgotPasswordTemplateComponentWidget;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ForgotPasswordTemplateComponentModel class ForgotPasswordTemplateComponentModel
extends FlutterFlowModel<ForgotPasswordTemplateComponentWidget> { extends FlutterFlowModel<ForgotPasswordTemplateComponentWidget> {
/// State fields for stateful widgets in this component. /// State fields for stateful widgets in this component.
final formKey = GlobalKey<FormState>();
// State field(s) for emailAddress widget. // State field(s) for emailAddress widget.
FocusNode? emailAddressFocusNode; FocusNode? emailAddressFocusNode;
TextEditingController? emailAddressTextController; TextEditingController? emailAddressTextController;
String? Function(BuildContext, String?)? emailAddressTextControllerValidator; String? Function(BuildContext, String?)? emailAddressTextControllerValidator;
String? _emailAddressTextControllerValidator(
BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getText(
'3hqg8buh' /* E-mail é Obrigatório */,
);
}
if (!ValidatorUtil.isValidEmail(val)) {
return FFLocalizations.of(context).getText(
'jh5r2b1w' /* E-mail Inválido */,
);
}
return null;
}
// Stores action output result for [Backend Call - API (forgotPassword)] action in Button-Login widget. // Stores action output result for [Backend Call - API (forgotPassword)] action in Button-Login widget.
ApiCallResponse? req; ApiCallResponse? req;
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {
emailAddressTextControllerValidator = _emailAddressTextControllerValidator;
}
@override @override
void dispose() { void dispose() {

View File

@ -1,18 +1,21 @@
import 'dart:developer';
import 'package:hub/flutter_flow/nav/nav.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/validator_util.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/components/molecular_components/throw_exception/throw_exception_widget.dart'; import '/components/molecular_components/throw_exception/throw_exception_widget.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart'; import '/flutter_flow/flutter_flow_widgets.dart';
import 'package:easy_debounce/easy_debounce.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'forgot_password_template_component_model.dart'; import 'forgot_password_template_component_model.dart';
export 'forgot_password_template_component_model.dart'; export 'forgot_password_template_component_model.dart';
//
class ForgotPasswordTemplateComponentWidget extends StatefulWidget { class ForgotPasswordTemplateComponentWidget extends StatefulWidget {
const ForgotPasswordTemplateComponentWidget({super.key}); const ForgotPasswordTemplateComponentWidget({super.key});
@ -101,19 +104,19 @@ class _ForgotPasswordTemplateComponentWidgetState
), ),
Padding( Padding(
padding: padding:
const EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), const EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0),
child: Text( child: Text(
'', '',
style: style:
FlutterFlowTheme.of(context).bodyMedium.override( FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Plus Jakarta Sans', fontFamily: 'Plus Jakarta Sans',
color: const Color(0xFF15161E), color: const Color(0xFF15161E),
fontSize: 14.0, fontSize: 14.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap() useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'), .containsKey('Plus Jakarta Sans'),
), ),
), ),
), ),
], ],
@ -127,13 +130,13 @@ class _ForgotPasswordTemplateComponentWidgetState
'xxm3ajsy' /* ESQUECEU SUA SENHA? */, 'xxm3ajsy' /* ESQUECEU SUA SENHA? */,
), ),
style: FlutterFlowTheme.of(context).headlineMedium.override( style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: 'Outfit', fontFamily: 'Outfit',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
fontSize: 24.0, fontSize: 24.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap().containsKey('Outfit'), useGoogleFonts: GoogleFonts.asMap().containsKey('Outfit'),
), ),
), ),
), ),
Padding( Padding(
@ -143,105 +146,100 @@ class _ForgotPasswordTemplateComponentWidgetState
'wu2f7yzo' /* Não se preucupe nós vamos te a... */, 'wu2f7yzo' /* Não se preucupe nós vamos te a... */,
), ),
style: FlutterFlowTheme.of(context).labelMedium.override( style: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts:
GoogleFonts.asMap().containsKey('Plus Jakarta Sans'),
),
),
),
Form(
key: _model.formKey,
autovalidateMode: AutovalidateMode.onUserInteraction,
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0),
child: SizedBox(
width: double.infinity,
child: TextFormField(
controller: _model.emailAddressTextController,
focusNode: _model.emailAddressFocusNode,
onChanged: (_) => EasyDebounce.debounce(
'_model.emailAddressTextController',
const Duration(milliseconds: 500),
() => setState(() {}),
),
autofocus: true,
autofillHints: const [AutofillHints.email],
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'mtz8l7ft' /* E-mail */,
),
labelStyle:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primary,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: Colors.black,
width: 2.00,
),
borderRadius: BorderRadius.circular(12.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 2.00,
),
borderRadius: BorderRadius.circular(12.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2.00,
),
borderRadius: BorderRadius.circular(12.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2.00,
),
borderRadius: BorderRadius.circular(12.0),
),
contentPadding: const EdgeInsetsDirectional.fromSTEB(
24.0, 24.0, 20.0, 24.0),
suffixIcon: Icon(
Icons.email,
color: FlutterFlowTheme.of(context).primary,
size: 22.0,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Plus Jakarta Sans', fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0, fontSize: 14.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
useGoogleFonts: useGoogleFonts: GoogleFonts.asMap()
GoogleFonts.asMap().containsKey('Plus Jakarta Sans'), .containsKey('Plus Jakarta Sans'),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0),
child: SizedBox(
width: double.infinity,
child: TextFormField(
controller: _model.emailAddressTextController,
focusNode: _model.emailAddressFocusNode,
autofillHints: const [AutofillHints.email],
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'mtz8l7ft' /* Email */,
),
labelStyle:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).accent1,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
hintText: FFLocalizations.of(context).getText(
'w7y5wlnv' /* digite o seu email..... */,
),
hintStyle:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).accent1,
width: 2.0,
),
borderRadius: BorderRadius.circular(12.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).accent3,
width: 2.0,
),
borderRadius: BorderRadius.circular(12.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2.0,
),
borderRadius: BorderRadius.circular(12.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 2.0,
),
borderRadius: BorderRadius.circular(12.0),
),
filled: true,
fillColor: FlutterFlowTheme.of(context).primaryBackground,
contentPadding:
const EdgeInsetsDirectional.fromSTEB(24.0, 24.0, 20.0, 24.0),
suffixIcon: Icon(
Icons.email,
color: FlutterFlowTheme.of(context).accent1,
size: 22.0,
), ),
maxLines: null,
keyboardType: TextInputType.emailAddress,
cursorColor: FlutterFlowTheme.of(context).primary,
validator: _model.emailAddressTextControllerValidator
.asValidator(context),
), ),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
maxLines: null,
keyboardType: TextInputType.emailAddress,
cursorColor: const Color(0xFF6F61EF),
validator: _model.emailAddressTextControllerValidator
.asValidator(context),
), ),
), ),
), ),
@ -250,36 +248,31 @@ class _ForgotPasswordTemplateComponentWidgetState
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0), padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0),
child: FFButtonWidget( child: FFButtonWidget(
onPressed: () async { onPressed: (_model.emailAddressTextController.text == '' || !ValidatorUtil.isValidEmail(_model.emailAddressTextController.text))
_model.req = await PhpGroup.forgotPasswordCall.call( ? null
email: _model.emailAddressTextController.text, : () async {
);
if (PhpGroup.forgotPasswordCall.error( try {
(_model.req?.jsonBody ?? ''), _model.req = await PhpGroup.forgotPasswordCall.call(
) == email: _model.emailAddressTextController.text,
false) { );
Navigator.pop(context);
} else { if (PhpGroup.forgotPasswordCall.error((_model.req?.jsonBody ?? '')) == false) {
await showModalBottomSheet( await DialogUtil.success(context, FFLocalizations.of(context).getVariableText(
isScrollControlled: true, enText: "Send E-mail Successful!",
backgroundColor: Colors.transparent, ptText: "E-mail Enviado com Sucesso!"
enableDrag: false, ));
context: context, Navigator.pop(context);
builder: (context) { } else {
return Padding( await DialogUtil.error(context, PhpGroup.forgotPasswordCall.msg((_model.req?.jsonBody ?? ''))!);
padding: MediaQuery.viewInsetsOf(context), }
child: ThrowExceptionWidget(
msg: PhpGroup.forgotPasswordCall.msg( setState(() {});
(_model.req?.jsonBody ?? ''),
)!, } catch (error, stack) {
), LogUtil.requestAPIFailed("iforgot.php", _model.emailAddressTextController.text, "Recuperar Senha", error, stack);
); await DialogUtil.errorDefault(context);
},
).then((value) => safeSetState(() {}));
} }
setState(() {});
}, },
text: FFLocalizations.of(context).getText( text: FFLocalizations.of(context).getText(
'74rnd5bu' /* Enviar */, '74rnd5bu' /* Enviar */,
@ -289,24 +282,30 @@ class _ForgotPasswordTemplateComponentWidgetState
height: 50.0, height: 50.0,
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
iconPadding: iconPadding:
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
color: const Color(0xFF1AAB5F), color: FlutterFlowTheme.of(context).primary,
textStyle: FlutterFlowTheme.of(context).titleSmall.override( textStyle: FlutterFlowTheme.of(context).titleSmall.override(
fontFamily: 'Plus Jakarta Sans', fontFamily: 'Plus Jakarta Sans',
color: Colors.white, color: Colors.white,
fontSize: 16.0, fontSize: 16.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap() useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'), .containsKey('Plus Jakarta Sans'),
), ),
elevation: 3.0, elevation: 3.0,
borderSide: const BorderSide( borderSide: const BorderSide(
color: Colors.transparent, color: Colors.transparent,
width: 1.0, width: 1.0,
), ),
disabledColor:
FlutterFlowTheme.of(
context)
.customColor5,
disabledTextColor:
Colors.white,
), ),
showLoadingIndicator: false, showLoadingIndicator: true,
), ),
), ),
), ),

View File

@ -1,17 +1,21 @@
import 'dart:developer';
import 'dart:typed_data'; import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart';
import 'package:hub/custom_code/actions/convert_image_file_to_base64.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import '/backend/api_requests/api_calls.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/form_field_controller.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart'; import 'regisiter_vistor_template_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/flutter_flow/form_field_controller.dart';
import 'package:hub/flutter_flow/uploaded_file.dart';
class RegisiterVistorTemplateComponentModel class RegisiterVistorTemplateComponentModel
extends FlutterFlowModel<RegisiterVistorTemplateComponentWidget> { extends FlutterFlowModel<RegisiterVistorTemplateComponentWidget> {
/// State fields for stateful widgets in this component. /// State fields for stateful widgets in this page.
final unfocusNode = FocusNode();
bool isDataUploading = false; bool isDataUploading = false;
FFUploadedFile uploadedLocalFile = FFUploadedFile uploadedLocalFile =
FFUploadedFile(bytes: Uint8List.fromList([])); FFUploadedFile(bytes: Uint8List.fromList([]));
@ -20,31 +24,116 @@ class RegisiterVistorTemplateComponentModel
FocusNode? textFieldFocusNode1; FocusNode? textFieldFocusNode1;
TextEditingController? textController1; TextEditingController? textController1;
String? Function(BuildContext, String?)? textController1Validator; String? Function(BuildContext, String?)? textController1Validator;
// State field(s) for DropDown widget. String? _textController1Validator(BuildContext context, String? val) {
String? dropDownValue; if (val == null || val.isEmpty) {
FormFieldController<String>? dropDownValueController; return FFLocalizations.of(context).getVariableText(
enText: 'This field is required',
ptText: 'Este campo é obrigatório',
);
}
return null;
}
Future<bool?> getVisitanteByDocument(
String document, BuildContext context) async {
final response = await PhpGroup.getVisitorByDocCall.call(
devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID,
cliID: FFAppState().cliUUID,
atividade: 'getVisitante',
documento: document,
);
log('${response.jsonBody}');
if (response.jsonBody['visitante']['VTE_ID'] != '0' &&
response.jsonBody['error'] != 'false') {
return true;
}
return null;
}
// State field(s) for TextField widget. // State field(s) for TextField widget.
FocusNode? textFieldFocusNode2; FocusNode? textFieldFocusNode2;
TextEditingController? textController2; TextEditingController? textController2;
String? Function(BuildContext, String?)? textController2Validator; String? Function(BuildContext, String?)? textController2Validator;
String? _textController2Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required',
ptText: 'Este campo é obrigatório',
);
}
return null;
}
// State field(s) for DropDown widget.
String? dropDownValue;
FormFieldController<String>? dropDownValueController;
// State field(s) for TextField widget. // State field(s) for TextField widget.
FocusNode? textFieldFocusNode3; FocusNode? textFieldFocusNode3;
TextEditingController? textController3; TextEditingController? textController3;
String? Function(BuildContext, String?)? textController3Validator; String? Function(BuildContext, String?)? textController3Validator;
String? _textController3Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required',
ptText: 'Este campo é obrigatório',
);
}
return null;
}
// State field(s) for TextField widget. // State field(s) for TextField widget.
FocusNode? textFieldFocusNode4; FocusNode? textFieldFocusNode4;
TextEditingController? textController4; TextEditingController? textController4;
String? Function(BuildContext, String?)? textController4Validator; String? Function(BuildContext, String?)? textController4Validator;
String? _textController4Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required',
ptText: 'Este campo é obrigatório',
);
}
if (!val.contains('@') || !val.contains('.')) {
return FFLocalizations.of(context).getVariableText(
enText: 'Invalid email',
ptText: 'Email inválido',
);
}
return null;
}
// Stores action output result for [Custom Action - convertImageFileToBase64] action in Button widget. // Stores action output result for [Custom Action - convertImageFileToBase64] action in Button widget.
String? imgBase64; String? imgBase64;
// Stores action output result for [Backend Call - API (postScheduleVisitor)] action in Button widget. // Stores action output result for [Backend Call - API (postScheduleVisitor)] action in Button widget.
ApiCallResponse? registerVisitor; ApiCallResponse? scheduleVisitor;
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {
textFieldFocusNode1 = FocusNode();
textController1 = TextEditingController();
textController1Validator = _textController1Validator;
textFieldFocusNode2 = FocusNode();
textController2 = TextEditingController();
textController2Validator = _textController2Validator;
dropDownValue = '';
// dropDownValueController = FormFieldController<String>(initialValue: dropDownValue);
textFieldFocusNode3 = FocusNode();
textController3 = TextEditingController();
textController3Validator = _textController3Validator;
textFieldFocusNode4 = FocusNode();
textController4 = TextEditingController();
textController4Validator = _textController4Validator;
}
@override @override
void dispose() { void dispose() {
unfocusNode.dispose();
textFieldFocusNode1?.dispose(); textFieldFocusNode1?.dispose();
textController1?.dispose(); textController1?.dispose();
@ -58,4 +147,3 @@ class RegisiterVistorTemplateComponentModel
textController4?.dispose(); textController4?.dispose();
} }
} }

View File

@ -8,6 +8,7 @@ class SignInTemplateComponentModel
/// State fields for stateful widgets in this component. /// State fields for stateful widgets in this component.
final formKey = GlobalKey<FormState>(); final formKey = GlobalKey<FormState>();
final unfocusNode = FocusNode();
// State field(s) for emailAddress widget. // State field(s) for emailAddress widget.
FocusNode? emailAddressFocusNode; FocusNode? emailAddressFocusNode;
TextEditingController? emailAddressTextController; TextEditingController? emailAddressTextController;

View File

@ -1,3 +1,9 @@
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/utils/dialog_util.dart';
import 'package:hub/shared/utils/log_util.dart';
import 'package:hub/shared/utils/validator_util.dart';
import '/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart'; import '/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart';
import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_animations.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
@ -93,6 +99,18 @@ class _SignInTemplateComponentWidgetState
super.dispose(); super.dispose();
} }
bool _isFormInvalid() {
if (_model.emailAddressTextController.text == '' || _model.passwordTextController.text == '') {
return true;
}
if (!ValidatorUtil.isValidEmail(_model.emailAddressTextController.text)) {
return true;
}
return false;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
@ -113,8 +131,8 @@ class _SignInTemplateComponentWidgetState
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Padding( Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 35.0), 0.0, 35.0, 0.0, 35.0),
child: Container( child: Container(
width: 548.0, width: 548.0,
height: 112.0, height: 112.0,
@ -130,7 +148,8 @@ class _SignInTemplateComponentWidgetState
children: [ children: [
Expanded( Expanded(
child: Align( child: Align(
alignment: const AlignmentDirectional(0.0, 1.0), alignment:
const AlignmentDirectional(0.0, 1.0),
child: Padding( child: Padding(
padding: const EdgeInsets.all(3.0), padding: const EdgeInsets.all(3.0),
child: Text( child: Text(
@ -166,12 +185,7 @@ class _SignInTemplateComponentWidgetState
decoration: const BoxDecoration(), decoration: const BoxDecoration(),
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(8.0), borderRadius: BorderRadius.circular(8.0),
child: Image.network( child: const AtomImageSvgTheme(filename: 'login', width: 600, height: 155),
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/sr43ucngg4a4/Vector.png',
width: 603.0,
height: 155.0,
fit: BoxFit.contain,
),
), ),
), ),
Column( Column(
@ -205,13 +219,14 @@ class _SignInTemplateComponentWidgetState
Form( Form(
key: _model.formKey, key: _model.formKey,
autovalidateMode: autovalidateMode:
AutovalidateMode.always, AutovalidateMode.onUserInteraction,
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: [ children: [
Padding( Padding(
padding: const EdgeInsetsDirectional padding:
.fromSTEB( const EdgeInsetsDirectional
.fromSTEB(
0.0, 0.0, 0.0, 16.0), 0.0, 0.0, 0.0, 16.0),
child: SizedBox( child: SizedBox(
width: double.infinity, width: double.infinity,
@ -223,7 +238,8 @@ class _SignInTemplateComponentWidgetState
onChanged: (_) => onChanged: (_) =>
EasyDebounce.debounce( EasyDebounce.debounce(
'_model.emailAddressTextController', '_model.emailAddressTextController',
const Duration(milliseconds: 500), const Duration(
milliseconds: 500),
() => setState(() {}), () => setState(() {}),
), ),
autofocus: true, autofocus: true,
@ -351,8 +367,9 @@ class _SignInTemplateComponentWidgetState
), ),
), ),
Padding( Padding(
padding: const EdgeInsetsDirectional padding:
.fromSTEB( const EdgeInsetsDirectional
.fromSTEB(
0.0, 0.0, 0.0, 16.0), 0.0, 0.0, 0.0, 16.0),
child: SizedBox( child: SizedBox(
width: double.infinity, width: double.infinity,
@ -364,7 +381,8 @@ class _SignInTemplateComponentWidgetState
onChanged: (_) => onChanged: (_) =>
EasyDebounce.debounce( EasyDebounce.debounce(
'_model.passwordTextController', '_model.passwordTextController',
const Duration(milliseconds: 500), const Duration(
milliseconds: 500),
() => setState(() {}), () => setState(() {}),
), ),
autofocus: true, autofocus: true,
@ -417,7 +435,8 @@ class _SignInTemplateComponentWidgetState
), ),
focusedBorder: focusedBorder:
OutlineInputBorder( OutlineInputBorder(
borderSide: const BorderSide( borderSide:
const BorderSide(
color: color:
Color(0xFF1AAB5F), Color(0xFF1AAB5F),
width: 0.25, width: 0.25,
@ -428,7 +447,8 @@ class _SignInTemplateComponentWidgetState
), ),
errorBorder: errorBorder:
OutlineInputBorder( OutlineInputBorder(
borderSide: const BorderSide( borderSide:
const BorderSide(
color: color:
Color(0xFFFF5963), Color(0xFFFF5963),
width: 0.25, width: 0.25,
@ -439,7 +459,8 @@ class _SignInTemplateComponentWidgetState
), ),
focusedErrorBorder: focusedErrorBorder:
OutlineInputBorder( OutlineInputBorder(
borderSide: const BorderSide( borderSide:
const BorderSide(
color: color:
Color(0xFFFF5963), Color(0xFFFF5963),
width: 0.25, width: 0.25,
@ -514,16 +535,12 @@ class _SignInTemplateComponentWidgetState
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: [ children: [
Padding( Padding(
padding: const EdgeInsetsDirectional padding:
.fromSTEB( const EdgeInsetsDirectional
.fromSTEB(
0.0, 0.0, 0.0, 16.0), 0.0, 0.0, 0.0, 16.0),
child: FFButtonWidget( child: FFButtonWidget(
onPressed: ((_model.emailAddressTextController onPressed: _isFormInvalid()
.text ==
'') &&
(_model.passwordTextController
.text ==
''))
? null ? null
: () async { : () async {
await action_blocks await action_blocks
@ -548,18 +565,12 @@ class _SignInTemplateComponentWidgetState
height: 44.0, height: 44.0,
padding: padding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
iconPadding: iconPadding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
color: color:
FlutterFlowTheme.of( FlutterFlowTheme.of(
context) context)
@ -586,7 +597,8 @@ class _SignInTemplateComponentWidgetState
'Plus Jakarta Sans'), 'Plus Jakarta Sans'),
), ),
elevation: 3.0, elevation: 3.0,
borderSide: const BorderSide( borderSide:
const BorderSide(
color: color:
Colors.transparent, Colors.transparent,
width: 1.0, width: 1.0,
@ -605,8 +617,9 @@ class _SignInTemplateComponentWidgetState
), ),
), ),
Padding( Padding(
padding: const EdgeInsetsDirectional padding:
.fromSTEB( const EdgeInsetsDirectional
.fromSTEB(
0.0, 0.0, 0.0, 16.0), 0.0, 0.0, 0.0, 16.0),
child: FFButtonWidget( child: FFButtonWidget(
onPressed: () async { onPressed: () async {
@ -624,18 +637,12 @@ class _SignInTemplateComponentWidgetState
height: 44.0, height: 44.0,
padding: padding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
iconPadding: iconPadding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
color: color:
FlutterFlowTheme.of( FlutterFlowTheme.of(
context) context)
@ -662,7 +669,8 @@ class _SignInTemplateComponentWidgetState
'Plus Jakarta Sans'), 'Plus Jakarta Sans'),
), ),
elevation: 3.0, elevation: 3.0,
borderSide: const BorderSide( borderSide:
const BorderSide(
color: color:
Colors.transparent, Colors.transparent,
width: 1.0, width: 1.0,
@ -687,36 +695,27 @@ class _SignInTemplateComponentWidgetState
padding: padding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB(0.0, 0.0, .fromSTEB(0.0, 0.0,
0.0, 16.0), 0.0, 16.0),
child: FFButtonWidget( child: FFButtonWidget(
onPressed: (((_model.emailAddressTextController onPressed: _isFormInvalid()
.text ==
'') ||
((_model.emailAddressFocusNode
?.hasFocus ??
false) !=
null)) &&
((_model.emailAddressTextController
.text ==
'') ||
((_model.passwordTextController.text ==
'') ||
((_model.passwordFocusNode?.hasFocus ??
false) !=
null))))
? null ? null
: () async { : () async {
await action_blocks try {
.singInLoginAction( await action_blocks
context, .singInLoginAction(
emailAdress: _model context,
.emailAddressTextController emailAdress: _model
.text, .emailAddressTextController
password: _model .text,
.passwordTextController password: _model
.text, .passwordTextController
); .text,
setState(() {}); );
setState(() {});
} catch (e, s) {
await DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed('login.php', _model.emailAddressTextController.text, "Login", e, s);
}
}, },
text: FFLocalizations.of( text: FFLocalizations.of(
context) context)
@ -728,18 +727,12 @@ class _SignInTemplateComponentWidgetState
height: 44.0, height: 44.0,
padding: padding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
iconPadding: iconPadding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
color: color:
FlutterFlowTheme.of( FlutterFlowTheme.of(
context) context)
@ -767,7 +760,8 @@ class _SignInTemplateComponentWidgetState
'Plus Jakarta Sans'), 'Plus Jakarta Sans'),
), ),
elevation: 3.0, elevation: 3.0,
borderSide: const BorderSide( borderSide:
const BorderSide(
color: Colors color: Colors
.transparent, .transparent,
width: 1.0, width: 1.0,
@ -776,10 +770,10 @@ class _SignInTemplateComponentWidgetState
BorderRadius BorderRadius
.circular(12.0), .circular(12.0),
disabledColor: disabledColor:
const Color(0xE81AAB5F), const Color(
0xE81AAB5F),
), ),
showLoadingIndicator: showLoadingIndicator: true,
false,
), ),
), ),
), ),
@ -788,7 +782,7 @@ class _SignInTemplateComponentWidgetState
padding: padding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB(0.0, 0.0, .fromSTEB(0.0, 0.0,
0.0, 16.0), 0.0, 16.0),
child: FFButtonWidget( child: FFButtonWidget(
onPressed: () async { onPressed: () async {
await widget await widget
@ -805,18 +799,12 @@ class _SignInTemplateComponentWidgetState
height: 44.0, height: 44.0,
padding: padding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
iconPadding: iconPadding:
const EdgeInsetsDirectional const EdgeInsetsDirectional
.fromSTEB( .fromSTEB(0.0,
0.0, 0.0, 0.0, 0.0),
0.0,
0.0,
0.0),
color: color:
FlutterFlowTheme.of( FlutterFlowTheme.of(
context) context)
@ -844,7 +832,8 @@ class _SignInTemplateComponentWidgetState
'Plus Jakarta Sans'), 'Plus Jakarta Sans'),
), ),
elevation: 3.0, elevation: 3.0,
borderSide: const BorderSide( borderSide:
const BorderSide(
color: Colors color: Colors
.transparent, .transparent,
width: 1.0, width: 1.0,
@ -858,7 +847,8 @@ class _SignInTemplateComponentWidgetState
), ),
), ),
), ),
].divide(const SizedBox(width: 7.0)), ].divide(
const SizedBox(width: 7.0)),
); );
} }
}, },
@ -866,8 +856,8 @@ class _SignInTemplateComponentWidgetState
// You will have to add an action on this rich text to go to your login page. // You will have to add an action on this rich text to go to your login page.
Padding( Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional
0.0, 12.0, 0.0, 12.0), .fromSTEB(0.0, 12.0, 0.0, 12.0),
child: InkWell( child: InkWell(
splashColor: Colors.transparent, splashColor: Colors.transparent,
focusColor: Colors.transparent, focusColor: Colors.transparent,
@ -876,21 +866,15 @@ class _SignInTemplateComponentWidgetState
onTap: () async { onTap: () async {
await showModalBottomSheet( await showModalBottomSheet(
isScrollControlled: true, isScrollControlled: true,
backgroundColor: backgroundColor: Colors.transparent,
Colors.transparent,
enableDrag: false,
context: context, context: context,
builder: (context) { builder: (context) {
return Padding( return Padding(
padding: padding: MediaQuery.viewInsetsOf(context),
MediaQuery.viewInsetsOf( child: const ForgotPasswordTemplateComponentWidget(),
context),
child:
const ForgotPasswordTemplateComponentWidget(),
); );
}, },
).then( ).then((value) => safeSetState(() {}));
(value) => safeSetState(() {}));
}, },
child: RichText( child: RichText(
textScaler: MediaQuery.of(context) textScaler: MediaQuery.of(context)
@ -936,29 +920,23 @@ class _SignInTemplateComponentWidgetState
), ),
mouseCursor: mouseCursor:
SystemMouseCursors.click, SystemMouseCursors.click,
recognizer: // recognizer: TapGestureRecognizer()
TapGestureRecognizer() // ..onTap = () async {
..onTap = () async { // await showModalBottomSheet(
await showModalBottomSheet( // isScrollControlled: true,
isScrollControlled: // backgroundColor: Colors.transparent,
true, // context: context,
backgroundColor: // useRootNavigator: true,
Colors // builder: (context) {
.transparent, // return Padding(
context: context, // padding: MediaQuery.viewInsetsOf(context),
builder: (context) { // child: const ForgotPasswordTemplateComponentWidget(),
return Padding( // );
padding: MediaQuery // },
.viewInsetsOf( // ).then((value) =>
context), // safeSetState(
child: // () {}));
const ForgotPasswordTemplateComponentWidget(), // },
);
},
).then((value) =>
safeSetState(
() {}));
},
) )
], ],
style: style:
@ -981,29 +959,7 @@ class _SignInTemplateComponentWidgetState
), ),
), ),
), ),
Text( const AtomTermsOfUse(),
FFLocalizations.of(context).getText(
'olf967cj' /* Termo de Uso */,
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
color:
FlutterFlowTheme.of(context)
.primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(
context)
.bodyMediumFamily),
),
),
], ],
), ),
), ),

View File

@ -101,8 +101,7 @@ class _ViewVisitDetailWidgetState extends State<ViewVisitDetailWidget> {
TextEditingController(text: widget.visitStartDate); TextEditingController(text: widget.visitStartDate);
_model.textFieldFocusNode2 ??= FocusNode(); _model.textFieldFocusNode2 ??= FocusNode();
_model.textController3 ??= _model.textController3 ??= TextEditingController(text: widget.visitEndDate);
TextEditingController(text: widget.visitEndDate);
_model.textFieldFocusNode3 ??= FocusNode(); _model.textFieldFocusNode3 ??= FocusNode();
_model.textController4 ??= _model.textController4 ??=
@ -212,20 +211,26 @@ class _ViewVisitDetailWidgetState extends State<ViewVisitDetailWidget> {
hoverColor: Colors.transparent, hoverColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
onTap: () async { onTap: () async {
Navigator.pop(context); // Navigator.pop(context);
await showModalBottomSheet( // await showModalBottomSheet(
isScrollControlled: true, // isScrollControlled: true,
backgroundColor: Colors.transparent, // backgroundColor: Colors.transparent,
useSafeArea: true, // useSafeArea: true,
context: context, // context: context,
builder: (context) { // builder: (context) {
return Padding( // return Padding(
padding: MediaQuery.viewInsetsOf(context), // padding: MediaQuery.viewInsetsOf(context),
child: // child:
const VisitorDetailsModalTemplateComponentWidget(), // const VisitorDetailsModalTemplateComponentWidget(
); // visitorImageURL: '',
}, // visitorEmail: '',
).then((value) => safeSetState(() {})); // visitorName: '',
// visitorPhone: '',
// visitorType: '',
// ),
// );
// },
// ).then((value) => safeSetState(() {}));
}, },
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(100.0), borderRadius: BorderRadius.circular(100.0),
@ -870,7 +875,6 @@ class _ViewVisitDetailWidgetState extends State<ViewVisitDetailWidget> {
Share.share( Share.share(
'Visita agendada para ${widget.visitStartDate} com término previsto para ${widget.visitEndDate}. Motivo: ${widget.visitReasonStr}. Nível de acesso: ${widget.visitLevelStr}. Observações: ${widget.visitObsStr}.', 'Visita agendada para ${widget.visitStartDate} com término previsto para ${widget.visitEndDate}. Motivo: ${widget.visitReasonStr}. Nível de acesso: ${widget.visitLevelStr}. Observações: ${widget.visitObsStr}.',
); );
}, },
), ),
], ],

View File

@ -1,6 +1,3 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart'; import 'package:hub/components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart';
import 'package:hub/components/templates_components/view_visit_detail/view_visit_detail_widget.dart'; import 'package:hub/components/templates_components/view_visit_detail/view_visit_detail_widget.dart';
@ -74,50 +71,47 @@ class _VisitDetailsModalTemplateComponentWidgetState
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Align( return Builder(
alignment: const AlignmentDirectional(0.0, 1.0), builder: (context) {
child: Builder( if (widget.visitStatusStr != null && widget.visitStatusStr != '') {
builder: (context) { return wrapWithModel(
if (widget.visitStatusStr != null && widget.visitStatusStr != '') { model: _model.viewVisitDetailModel,
return wrapWithModel( updateCallback: () => setState(() {}),
model: _model.viewVisitDetailModel, updateOnChange: true,
updateCallback: () => setState(() {}), child: ViewVisitDetailWidget(
updateOnChange: true, visitorImgPath: widget.visitorImgPath,
child: ViewVisitDetailWidget( visitStartDate: widget.visitStartDateStr!,
visitorImgPath: widget.visitorImgPath, visitEndDate: widget.visitEndDateStr!,
visitStartDate: widget.visitStartDateStr!, visitReasonStr: widget.visitReasonStr!,
visitEndDate: widget.visitEndDateStr!, visitLevelStr: widget.visitLevelStr!,
visitReasonStr: widget.visitReasonStr!, visitTempStr: widget.visitTempStr!,
visitLevelStr: widget.visitLevelStr!, visitObsStr: widget.visitObsStr!,
visitTempStr: widget.visitTempStr!, visitStatusStr: widget.visitStatusStr!,
visitObsStr: widget.visitObsStr!, visitorStrList: widget.visitorStrList!,
visitStatusStr: widget.visitStatusStr!, visitorJsonList: widget.visitorJsonList,
visitorStrList: widget.visitorStrList!, visitIdStr: widget.visitIdStr!,
visitorJsonList: widget.visitorJsonList, visitStatusColor: widget.visitStatusColor!,
visitIdStr: widget.visitIdStr!, ),
visitStatusColor: widget.visitStatusColor!, );
), } else {
); return wrapWithModel(
} else { model: _model.scheduleVisitDetailModel,
return wrapWithModel( updateCallback: () => setState(() {}),
model: _model.scheduleVisitDetailModel, updateOnChange: true,
updateCallback: () => setState(() {}), child: ScheduleVisitDetailWidget(
updateOnChange: true, visitorStrList: widget.visitorStrList!,
child: ScheduleVisitDetailWidget( visitorImgPath: widget.visitorImgPath,
visitorStrList: widget.visitorStrList!, visitStartDate: widget.visitStartDateStr!,
visitorImgPath: widget.visitorImgPath, visitEndDate: widget.visitEndDateStr!,
visitStartDate: widget.visitStartDateStr!, visitResonStr: widget.visitReasonStr!,
visitEndDate: widget.visitEndDateStr!, visitLevelStr: widget.visitLevelStr!,
visitResonStr: widget.visitReasonStr!, visitTempStr: widget.visitTempStr!,
visitLevelStr: widget.visitLevelStr!, visitObsStr: widget.visitObsStr!,
visitTempStr: widget.visitTempStr!, visitorJsonList: widget.visitorJsonList!,
visitObsStr: widget.visitObsStr!, ),
visitorJsonList: widget.visitorJsonList!, );
), }
); },
}
},
),
); );
} }
} }

View File

@ -6,7 +6,19 @@ import 'visitor_details_modal_template_component_model.dart';
export 'visitor_details_modal_template_component_model.dart'; export 'visitor_details_modal_template_component_model.dart';
class VisitorDetailsModalTemplateComponentWidget extends StatefulWidget { class VisitorDetailsModalTemplateComponentWidget extends StatefulWidget {
const VisitorDetailsModalTemplateComponentWidget({super.key}); const VisitorDetailsModalTemplateComponentWidget(
{super.key,
required this.visitorImageURL,
required this.visitorName,
required this.visitorType,
required this.visitorPhone,
required this.visitorEmail});
final String? visitorImageURL;
final String? visitorName;
final String? visitorType;
final String? visitorPhone;
final String? visitorEmail;
@override @override
State<VisitorDetailsModalTemplateComponentWidget> createState() => State<VisitorDetailsModalTemplateComponentWidget> createState() =>
@ -50,20 +62,40 @@ class _VisitorDetailsModalTemplateComponentWidgetState
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
borderRadius: BorderRadius.circular(25.0), borderRadius: BorderRadius.circular(25.0),
), ),
child: Stack( child: Column(
mainAxisSize: MainAxisSize.max,
children: [ children: [
Align( Container(
alignment: const AlignmentDirectional(0.0, 1.0), width: double.infinity,
child: Container( height: 34.0,
width: double.infinity, decoration: BoxDecoration(
height: 34.0, color: FlutterFlowTheme.of(context).primaryText,
decoration: BoxDecoration( borderRadius: const BorderRadius.only(
color: FlutterFlowTheme.of(context).primaryText, bottomLeft: Radius.circular(0.0),
borderRadius: const BorderRadius.only( bottomRight: Radius.circular(0.0),
bottomLeft: Radius.circular(0.0), topLeft: Radius.circular(25.0),
bottomRight: Radius.circular(0.0), topRight: Radius.circular(25.0),
topLeft: Radius.circular(0.0), ),
topRight: Radius.circular(0.0), shape: BoxShape.rectangle,
),
child: Align(
alignment: const AlignmentDirectional(1.0, -1.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
10.0, 5.0, 15.0, 0.0),
child: InkWell(
splashColor: Colors.transparent,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
onTap: () async {
Navigator.pop(context);
},
child: Icon(
Icons.close,
color: FlutterFlowTheme.of(context).primaryBackground,
size: 24.0,
),
), ),
), ),
), ),
@ -71,68 +103,99 @@ class _VisitorDetailsModalTemplateComponentWidgetState
Align( Align(
alignment: const AlignmentDirectional(0.0, -1.0), alignment: const AlignmentDirectional(0.0, -1.0),
child: Padding( child: Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(20.0, 40.0, 20.0, 0.0), 20.0, 40.0, 20.0, 0.0),
child: Container( child: Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
shape: BoxShape.rectangle, shape: BoxShape.rectangle,
), ),
child: Stack( child: Padding(
children: [ padding: const EdgeInsetsDirectional.fromSTEB(
Padding( 0.0, 10.0, 0.0, 0.0),
padding: const EdgeInsetsDirectional.fromSTEB( child: Column(
0.0, 10.0, 0.0, 0.0), mainAxisSize: MainAxisSize.max,
child: Column( mainAxisAlignment: MainAxisAlignment.start,
children: [
if (widget.visitorImageURL != '' &&
widget.visitorImageURL != null)
Container(
width: 100.0,
height: 100.0,
clipBehavior: Clip.antiAlias,
decoration: const BoxDecoration(
shape: BoxShape.circle,
),
child: Image.network(
widget.visitorImageURL!,
fit: BoxFit.cover,
),
),
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0),
child: Text(
widget.visitorName ?? '',
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
fontSize: 24.0,
letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 30.0),
child: Text(
FFLocalizations.of(context).getText(
'hz7ivuqn' /* Tipo de Visitante */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Container( Icon(
width: 100.0, Icons.phone,
height: 100.0, color: FlutterFlowTheme.of(context).primary,
clipBehavior: Clip.antiAlias, size: 24.0,
decoration: const BoxDecoration(
shape: BoxShape.circle,
),
child: Image.network(
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
fit: BoxFit.cover,
),
), ),
Align( Align(
alignment: const AlignmentDirectional(0.0, 0.0), alignment:
const AlignmentDirectional(-1.0, 0.0),
child: Padding( child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0), 20.0, 0.0, 20.0, 0.0),
child: Text( child: Text(
FFLocalizations.of(context).getText( FFLocalizations.of(context).getText(
'kqzf7nx2' /* Nome do Visitante */, 'rwqn0det' /* (00) 0 0000-0000 */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
fontSize: 24.0,
letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 30.0),
child: Text(
FFLocalizations.of(context).getText(
'hz7ivuqn' /* Tipo de Visitante */,
), ),
textAlign: TextAlign.start, textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(context)
@ -151,128 +214,67 @@ class _VisitorDetailsModalTemplateComponentWidgetState
), ),
), ),
), ),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.phone,
color: FlutterFlowTheme.of(context).primary,
size: 24.0,
),
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0),
child: Text(
FFLocalizations.of(context).getText(
'rwqn0det' /* (00) 0 0000-0000 */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(
context)
.bodyMediumFamily),
),
),
),
),
],
),
Row(
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.email,
color: FlutterFlowTheme.of(context).primary,
size: 24.0,
),
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 20.0, 0.0),
child: Text(
FFLocalizations.of(context).getText(
'0wqbiekp' /* email@provider.etc */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(
context)
.bodyMediumFamily),
),
),
),
),
],
),
], ],
), ),
), Row(
], mainAxisSize: MainAxisSize.max,
), children: [
), Icon(
), Icons.email,
), color: FlutterFlowTheme.of(context).primary,
Align( size: 24.0,
alignment: const AlignmentDirectional(-1.0, -1.0), ),
child: Container( Align(
width: double.infinity, alignment:
height: 34.0, const AlignmentDirectional(-1.0, 0.0),
decoration: BoxDecoration( child: Padding(
color: FlutterFlowTheme.of(context).primaryText, padding: const EdgeInsetsDirectional.fromSTEB(
borderRadius: const BorderRadius.only( 20.0, 0.0, 20.0, 0.0),
bottomLeft: Radius.circular(0.0), child: Text(
bottomRight: Radius.circular(0.0), FFLocalizations.of(context).getText(
topLeft: Radius.circular(25.0), '0wqbiekp' /* email@provider.etc */,
topRight: Radius.circular(25.0), ),
), textAlign: TextAlign.start,
shape: BoxShape.rectangle, style: FlutterFlowTheme.of(context)
), .bodyMedium
child: Align( .override(
alignment: const AlignmentDirectional(1.0, -1.0), fontFamily:
child: Padding( FlutterFlowTheme.of(context)
padding: .bodyMediumFamily,
const EdgeInsetsDirectional.fromSTEB(10.0, 5.0, 15.0, 0.0), letterSpacing: 0.0,
child: InkWell( fontWeight: FontWeight.bold,
splashColor: Colors.transparent, useGoogleFonts: GoogleFonts.asMap()
focusColor: Colors.transparent, .containsKey(
hoverColor: Colors.transparent, FlutterFlowTheme.of(context)
highlightColor: Colors.transparent, .bodyMediumFamily),
onTap: () async { ),
Navigator.pop(context); ),
}, ),
child: Icon( ),
Icons.close, ],
color: FlutterFlowTheme.of(context).primaryBackground, ),
size: 24.0, ],
),
), ),
), ),
), ),
), ),
), ),
// Align(
// alignment: const AlignmentDirectional(0.0, 1.0),
// child: Container(
// width: double.infinity,
// height: 34.0,
// decoration: BoxDecoration(
// color: FlutterFlowTheme.of(context).primaryText,
// borderRadius: const BorderRadius.only(
// bottomLeft: Radius.circular(0.0),
// bottomRight: Radius.circular(0.0),
// topLeft: Radius.circular(0.0),
// topRight: Radius.circular(0.0),
// ),
// ),
// ),
// ),
], ],
), ),
), ),

View File

@ -1,4 +1,3 @@
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart'; import 'package:hub/components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart';
import 'package:hub/components/templates_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart'; import 'package:hub/components/templates_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart';
@ -9,8 +8,6 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -50,12 +47,6 @@ class _VisitorSearchModalTemplateComponentWidgetState
_model.textController ??= TextEditingController(); _model.textController ??= TextEditingController();
_model.textFieldFocusNode ??= FocusNode(); _model.textFieldFocusNode ??= FocusNode();
WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {
_model.textController?.text = FFLocalizations.of(context).getText(
'oj12tamm' /* test */,
);
}));
} }
@override @override
@ -69,171 +60,168 @@ class _VisitorSearchModalTemplateComponentWidgetState
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.watch<FFAppState>(); context.watch<FFAppState>();
return Align( return Padding(
alignment: const AlignmentDirectional(0.0, 0.0), padding: const EdgeInsetsDirectional.fromSTEB(0.0, 50.0, 0.0, 0.0),
child: Padding( child: Container(
padding: const EdgeInsetsDirectional.fromSTEB(0.0, 300.0, 0.0, 0.0), width: MediaQuery.of(context).size.width,
child: Container( decoration: BoxDecoration(
width: double.infinity, color: FlutterFlowTheme.of(context).primaryBackground,
decoration: BoxDecoration( borderRadius: const BorderRadius.only(
color: FlutterFlowTheme.of(context).primaryBackground, bottomLeft: Radius.circular(0.0),
borderRadius: const BorderRadius.only( bottomRight: Radius.circular(0.0),
bottomLeft: Radius.circular(0.0), topLeft: Radius.circular(15.0),
bottomRight: Radius.circular(0.0), topRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
), ),
child: Column( ),
mainAxisSize: MainAxisSize.max, child: Column(
crossAxisAlignment: CrossAxisAlignment.end, mainAxisSize: MainAxisSize.max,
children: [ crossAxisAlignment: CrossAxisAlignment.end,
Padding( children: [
padding: const EdgeInsetsDirectional.fromSTEB(16.0, 10.0, 16.0, 0.0), Padding(
child: TextFormField( padding:
controller: _model.textController, const EdgeInsetsDirectional.fromSTEB(16.0, 10.0, 16.0, 0.0),
focusNode: _model.textFieldFocusNode, child: TextFormField(
onFieldSubmitted: (_) async { controller: _model.textController,
setState(() { focusNode: _model.textFieldFocusNode,
_model.textController?.text = valueOrDefault<String>( onFieldSubmitted: (_) async {
_model.textController.text, setState(() {
'69696777', _model.textController?.text = _model.textController.text;
); _model.textController?.selection = TextSelection.collapsed(
_model.textController?.selection = offset: _model.textController!.text.length);
TextSelection.collapsed( });
offset: _model.textController!.text.length); _model.getVisitorByDoc =
}); await PhpGroup.getVisitorByDocCall.call(
_model.getVisitorByDoc = devUUID: FFAppState().devUUID,
await PhpGroup.getVisitorByDocCall.call( userUUID: FFAppState().userUUID,
devUUID: FFAppState().devUUID, cliID: FFAppState().cliUUID,
userUUID: FFAppState().userUUID, atividade: 'getVisitante',
cliID: FFAppState().cliUUID, documento: _model.textController.text,
atividade: 'getVisitante', );
documento: _model.textController.text,
);
if (PhpGroup.getVisitorByDocCall.vistanteId( if (PhpGroup.getVisitorByDocCall.vistanteId(
(_model.getVisitorByDoc?.jsonBody ?? ''),
) !=
'0') {
_model
.addToVisitors(PhpGroup.getVisitorByDocCall.visitante(
(_model.getVisitorByDoc?.jsonBody ?? ''), (_model.getVisitorByDoc?.jsonBody ?? ''),
)); ) !=
setState(() {}); '0') {
_model.addToDocs(_model.textController.text); _model.addToVisitors(PhpGroup.getVisitorByDocCall.visitante(
setState(() {}); (_model.getVisitorByDoc?.jsonBody ?? ''),
} else { ));
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
context: context,
builder: (context) {
return Padding(
padding: MediaQuery.viewInsetsOf(context),
child: const VisitorNotFoundComponentWidget(),
);
},
).then((value) => safeSetState(() {}));
}
setState(() {}); setState(() {});
}, _model.addToDocs(_model.textController.text);
autofocus: false, setState(() {});
textInputAction: TextInputAction.done, } else {
obscureText: false, await showAdaptiveDialog(
decoration: InputDecoration( useSafeArea: true,
isDense: false, context: context,
labelText: FFLocalizations.of(context).getText( builder: (context) {
'cjlpru1m' /* Procure pelo documento do visi... */, return Dialog(
), child: Padding(
labelStyle: FlutterFlowTheme.of(context) padding: MediaQuery.viewInsetsOf(context),
.labelMedium child: Container(
.override( color: Colors.transparent,
fontFamily: // width: MediaQuery.of(context).size.height * 0.1,
FlutterFlowTheme.of(context).labelMediumFamily, // height:
color: FlutterFlowTheme.of(context).primaryText, // MediaQuery.of(context).size.height * 0.4,
letterSpacing: 0.0, child: const VisitorNotFoundComponentWidget()),
useGoogleFonts: GoogleFonts.asMap().containsKey( ),
FlutterFlowTheme.of(context).labelMediumFamily), );
), },
hintText: FFLocalizations.of(context).getText( ).then((value) => safeSetState(() {}));
'8i1qszba' /* test */, }
),
enabledBorder: OutlineInputBorder( setState(() {});
borderSide: BorderSide( },
color: FlutterFlowTheme.of(context).accent1, autofocus: false,
width: 0.5, textInputAction: TextInputAction.done,
), obscureText: false,
borderRadius: const BorderRadius.only( decoration: InputDecoration(
bottomLeft: Radius.circular(15.0), isDense: false,
bottomRight: Radius.circular(15.0), labelText: FFLocalizations.of(context).getText(
topLeft: Radius.circular(15.0), 'cjlpru1m' /* Procure pelo documento do visi... */,
topRight: Radius.circular(15.0),
),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
filled: true,
fillColor: FlutterFlowTheme.of(context).primaryBackground,
prefixIcon: Icon(
Icons.search_outlined,
color: FlutterFlowTheme.of(context).accent1,
),
), ),
style: FlutterFlowTheme.of(context).bodyMedium.override( labelStyle: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily, FlutterFlowTheme.of(context).labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0, letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily), FlutterFlowTheme.of(context).labelMediumFamily),
), ),
keyboardType: TextInputType.number, hintText: FFLocalizations.of(context).getText(
validator: '8i1qszba' /* test */,
_model.textControllerValidator.asValidator(context), ),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).accent1,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
filled: true,
fillColor: FlutterFlowTheme.of(context).primaryBackground,
prefixIcon: Icon(
Icons.search_outlined,
color: FlutterFlowTheme.of(context).accent1,
),
), ),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
keyboardType: TextInputType.number,
validator: _model.textControllerValidator.asValidator(context),
), ),
),
if (_model.visitors.isNotEmpty && _model.visitors.length > 0)
Row( Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 0.0, 0.0), 16.0, 12.0, 0.0, 0.0),
child: Text( child: Text(
FFLocalizations.of(context).getText( FFLocalizations.of(context).getText(
'9coywebh' /* Visitantes encontrados */, '9coywebh' /* Visitantes encontrados */,
@ -249,12 +237,10 @@ class _VisitorSearchModalTemplateComponentWidgetState
), ),
), ),
Padding( Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(4.0, 12.0, 16.0, 0.0), 4.0, 12.0, 16.0, 0.0),
child: Text( child: Text(
FFLocalizations.of(context).getText( _model.visitors.length.toString(),
'6f5p0fv6' /* 24 */,
),
style: FlutterFlowTheme.of(context).bodyMedium.override( style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily, FlutterFlowTheme.of(context).bodyMediumFamily,
@ -266,271 +252,229 @@ class _VisitorSearchModalTemplateComponentWidgetState
), ),
], ],
), ),
Expanded( Expanded(
child: Builder( child: Builder(
builder: (context) { builder: (context) {
if (_model.visitors.isNotEmpty) { if (_model.visitors.isNotEmpty) {
return Padding( return Padding(
padding: padding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(8.0, 8.0, 8.0, 0.0), 8.0, 8.0, 8.0, 0.0),
child: Builder( child: Builder(
builder: (context) { builder: (context) {
final visitor = final visitor =
_model.visitors.map((e) => e).toList(); _model.visitors.map((e) => e).toList();
return ListView.builder(
return ListView.builder( padding: EdgeInsets.zero,
padding: EdgeInsets.zero, scrollDirection: Axis.vertical,
scrollDirection: Axis.vertical, itemCount: visitor.length,
itemCount: visitor.length, itemBuilder: (context, visitorIndex) {
itemBuilder: (context, visitorIndex) { final visitorItem = visitor[visitorIndex];
final visitorItem = visitor[visitorIndex]; return Padding(
return Padding( padding: const EdgeInsetsDirectional.fromSTEB(
padding: const EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 0.0, 1.0),
0.0, 0.0, 0.0, 1.0), child: InkWell(
child: InkWell( splashColor: Colors.transparent,
splashColor: Colors.transparent, focusColor: Colors.transparent,
focusColor: Colors.transparent, hoverColor: Colors.transparent,
hoverColor: Colors.transparent, highlightColor: Colors.transparent,
highlightColor: Colors.transparent, onTap: () async {
onTap: () async { // await showModalBottomSheet(
await showModalBottomSheet( // isScrollControlled: true,
isScrollControlled: true, // enableDrag: true,
enableDrag: false, // isDismissible: true,
context: context, // context: context,
builder: (context) { // builder: (context) {
return Padding( // return Padding(
padding: MediaQuery.viewInsetsOf( // padding:
context), // MediaQuery.viewInsetsOf(context),
child: const SizedBox( // child: SizedBox(
height: 610.0, // height: 610.0,
child: // child:
VisitorDetailsModalTemplateComponentWidget(), // VisitorDetailsModalTemplateComponentWidget(
// visitorImageURL:
// "https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
// visitorItem,
// r'''$.VTE_DOCUMENTO''',
// ).toString()}&tipo=E",
// visitorEmail: '',
// visitorName: getJsonField(
// visitorItem,
// r'''$.VTE_NOME''',
// )?.toString(),
// visitorPhone: '',
// visitorType: '',
// ),
// ),
// );
// },
// ).then((value) => safeSetState(() {}));
},
child: Container(
width: 100.0,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context)
.primaryBackground,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
ClipRRect(
borderRadius:
BorderRadius.circular(40.0),
child: CachedNetworkImage(
fadeInDuration: const Duration(
milliseconds: 500),
fadeOutDuration: const Duration(
milliseconds: 500),
imageUrl:
"https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField(
visitorItem,
r'''$.VTE_DOCUMENTO''',
).toString()}&tipo=E",
width: 60.0,
height: 60.0,
fit: BoxFit.cover,
), ),
); ),
}, Expanded(
).then((value) => safeSetState(() {})); child: Column(
}, mainAxisSize: MainAxisSize.max,
child: Container( mainAxisAlignment:
width: 100.0, MainAxisAlignment.center,
decoration: BoxDecoration( crossAxisAlignment:
color: FlutterFlowTheme.of(context) CrossAxisAlignment.start,
.secondaryBackground, children: [
boxShadow: [ Padding(
BoxShadow( padding:
blurRadius: 0.0, const EdgeInsetsDirectional
color: FlutterFlowTheme.of(context) .fromSTEB(
.alternate, 12.0, 0.0, 0.0, 0.0),
offset: const Offset( child: Text(
0.0,
1.0,
),
)
],
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
ClipRRect(
borderRadius:
BorderRadius.circular(40.0),
child: CachedNetworkImage(
fadeInDuration:
const Duration(milliseconds: 500),
fadeOutDuration:
const Duration(milliseconds: 500),
imageUrl:
valueOrDefault<String>( valueOrDefault<String>(
'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( getJsonField(
visitorItem, visitorItem,
r'''$.VTE_DOCUMENTO''', r'''$.VTE_NOME''',
).toString()}&tipo=E', )?.toString(),
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', 'NOT FOUND',
),
width: 60.0,
height: 60.0,
fit: BoxFit.cover,
),
),
Expanded(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Padding(
padding:
const EdgeInsetsDirectional
.fromSTEB(12.0, 0.0,
0.0, 0.0),
child: Text(
valueOrDefault<String>(
getJsonField(
visitorItem,
r'''$.VTE_NOME''',
)?.toString(),
'NOT FOUND',
),
style:
FlutterFlowTheme.of(
context)
.bodyLarge
.override(
fontFamily: FlutterFlowTheme.of(
context)
.bodyLargeFamily,
letterSpacing:
0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyLargeFamily),
),
), ),
), style: FlutterFlowTheme.of(
Padding( context)
padding: .bodyLarge
const EdgeInsetsDirectional .override(
.fromSTEB(4.0, 4.0, fontFamily:
0.0, 0.0), FlutterFlowTheme.of(
child: Row( context)
mainAxisSize: .bodyLargeFamily,
MainAxisSize.max, letterSpacing: 0.0,
mainAxisAlignment: useGoogleFonts: GoogleFonts
MainAxisAlignment .asMap()
.start, .containsKey(
children: [ FlutterFlowTheme.of(
Align( context)
alignment: .bodyLargeFamily),
const AlignmentDirectional(
0.0, -1.0),
child: Padding(
padding:
const EdgeInsetsDirectional
.fromSTEB(
10.0,
0.0,
0.0,
0.0),
child: Text(
getJsonField(
visitorItem,
r'''$.VTE_TELEFONE''',
).toString(),
style: FlutterFlowTheme
.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
color: FlutterFlowTheme.of(
context)
.primary,
letterSpacing:
0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily),
),
),
),
), ),
],
),
), ),
], ),
), ],
), ),
FlutterFlowIconButton( ),
borderRadius: 20.0, FlutterFlowIconButton(
borderWidth: 1.0, borderRadius: 20.0,
buttonSize: 40.0, borderWidth: 1.0,
icon: Icon( buttonSize: 40.0,
Icons.restore_from_trash, icon: Icon(
color: Icons.close,
FlutterFlowTheme.of(context) color:
.primary, FlutterFlowTheme.of(context)
size: 20.0, .customColor6,
), size: 20.0,
onPressed: () async {
_model.removeFromVisitors(
visitorItem);
setState(() {});
},
), ),
], onPressed: () async {
), _model.removeFromVisitors(
visitorItem);
setState(() {});
},
),
],
), ),
), ),
), ),
); ),
}, );
); },
}, );
), },
);
} else {
return Container(
width: 100.0,
height: 100.0,
decoration: BoxDecoration(
color:
FlutterFlowTheme.of(context).secondaryBackground,
),
);
}
},
),
),
FFButtonWidget(
onPressed: () async {
await widget.getVisitors?.call(
_model.visitors,
);
await widget.getDocs?.call(
_model.docs,
);
Navigator.pop(context);
},
text: FFLocalizations.of(context).getText(
'ug6qzyla' /* Adicionar */,
),
options: FFButtonOptions(
width: double.infinity,
height: 30.0,
padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.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:
FlutterFlowTheme.of(context).titleSmallFamily,
color: Colors.white,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).titleSmallFamily),
), ),
elevation: 3.0, );
borderSide: const BorderSide( } else {
color: Colors.transparent, return Container(
width: 1.0, width: 100.0,
height: 100.0,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground,
),
);
}
},
),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
FFButtonWidget(
onPressed: () async {
await widget.getVisitors?.call(
_model.visitors,
);
await widget.getDocs?.call(
_model.docs,
);
Navigator.pop(context);
},
text: FFLocalizations.of(context).getVariableText(
enText: 'Add',
ptText: 'Adicionar',
), ),
borderRadius: const BorderRadius.only( options: FFButtonOptions(
bottomLeft: Radius.circular(0.0), width: MediaQuery.of(context).size.width * 0.3,
bottomRight: Radius.circular(0.0), height: MediaQuery.of(context).size.width * 0.1,
topLeft: Radius.circular(0.0), padding: const EdgeInsetsDirectional.fromSTEB(
topRight: Radius.circular(0.0), 24.0, 0.0, 24.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:
FlutterFlowTheme.of(context).titleSmallFamily,
color: Colors.white,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).titleSmallFamily),
),
elevation: 3.0,
borderSide: const BorderSide(
color: Colors.transparent,
width: 1.0,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15),
bottomRight: Radius.circular(15),
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
),
), ),
), ),
), ],
], ),
), const SizedBox(
height: 10.0,
)
],
), ),
), ),
); );

View File

@ -13,7 +13,6 @@ import 'package:url_launcher/url_launcher.dart';
import '../main.dart'; import '../main.dart';
export 'keep_alive_wrapper.dart'; export 'keep_alive_wrapper.dart';
export 'lat_lng.dart'; export 'lat_lng.dart';
export 'place.dart'; export 'place.dart';
@ -87,6 +86,46 @@ Theme wrapInMaterialDatePickerTheme(
return Theme( return Theme(
data: baseTheme.copyWith( data: baseTheme.copyWith(
textSelectionTheme: baseTheme.textSelectionTheme.copyWith(
cursorColor: headerBackgroundColor,
selectionColor: headerBackgroundColor.withOpacity(0.4),
selectionHandleColor: headerBackgroundColor,
),
inputDecorationTheme: baseTheme.inputDecorationTheme.copyWith(
isDense: true,
hoverColor: headerBackgroundColor.withOpacity(0.04),
floatingLabelStyle: baseTheme.textTheme.labelMedium!.copyWith(
color: headerBackgroundColor,
),
labelStyle: baseTheme.textTheme.labelMedium!.copyWith(
color: headerBackgroundColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor.withOpacity(0.6),
),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
),
colorScheme: baseTheme.colorScheme.copyWith( colorScheme: baseTheme.colorScheme.copyWith(
onSurface: pickerForegroundColor, onSurface: pickerForegroundColor,
), ),
@ -149,9 +188,54 @@ Theme wrapInMaterialTimePickerTheme(
final baseTheme = Theme.of(context); final baseTheme = Theme.of(context);
return Theme( return Theme(
data: baseTheme.copyWith( data: baseTheme.copyWith(
focusColor: headerBackgroundColor,
iconTheme: baseTheme.iconTheme.copyWith( iconTheme: baseTheme.iconTheme.copyWith(
size: iconSize, size: iconSize,
), ),
textSelectionTheme: baseTheme.textSelectionTheme.copyWith(
cursorColor: headerBackgroundColor,
selectionColor: headerBackgroundColor.withOpacity(0.4),
selectionHandleColor: headerBackgroundColor,
),
inputDecorationTheme: baseTheme.inputDecorationTheme.copyWith(
isDense: true,
focusColor: headerBackgroundColor,
hoverColor: headerBackgroundColor.withOpacity(0.04),
floatingLabelStyle: baseTheme.textTheme.labelMedium!.copyWith(
color: headerBackgroundColor,
),
labelStyle: baseTheme.textTheme.labelMedium!.copyWith(
color: headerBackgroundColor,
),
outlineBorder: BorderSide(
color: headerBackgroundColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor.withOpacity(0.6),
),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: headerBackgroundColor,
),
),
),
textButtonTheme: TextButtonThemeData( textButtonTheme: TextButtonThemeData(
style: ButtonStyle( style: ButtonStyle(
foregroundColor: WidgetStatePropertyAll( foregroundColor: WidgetStatePropertyAll(
@ -169,6 +253,7 @@ Theme wrapInMaterialTimePickerTheme(
})), })),
), ),
timePickerTheme: baseTheme.timePickerTheme.copyWith( timePickerTheme: baseTheme.timePickerTheme.copyWith(
hourMinuteColor: selectedDateTimeBackgroundColor,
backgroundColor: pickerBackgroundColor, backgroundColor: pickerBackgroundColor,
hourMinuteTextColor: pickerForegroundColor, hourMinuteTextColor: pickerForegroundColor,
dialHandColor: selectedDateTimeBackgroundColor, dialHandColor: selectedDateTimeBackgroundColor,

View File

@ -569,8 +569,8 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
// throwException // throwException
{ {
'e58xxxiq': { 'e58xxxiq': {
'pt': 'ERRO', 'pt': 'Falha :(',
'en': 'ERROR', 'en': 'Fail :(',
}, },
}, },
// regisiterVistorTemplateComponent // regisiterVistorTemplateComponent
@ -873,28 +873,28 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT',
}, },
'1ltg0ylb': { '1ltg0ylb': {
'pt': 'Email', 'pt': 'E-mail',
'en': 'Email', 'en': 'E-mail',
}, },
'2x19ce8k': { '2x19ce8k': {
'pt': 'Senha', 'pt': 'Senha',
'en': 'Password', 'en': 'Password',
}, },
'xhnawzcb': { 'xhnawzcb': {
'pt': 'Campo é necessário', 'pt': 'E-mail é Obrigatório',
'en': 'Field is required', 'en': 'E-mail is required',
}, },
's3j1hjqx': { 's3j1hjqx': {
'pt': 'E-mail Inv', 'pt': 'E-mail Inválido',
'en': '', 'en': 'Invalid E-mail',
}, },
'2ib9bf67': { '2ib9bf67': {
'pt': 'Please choose an option from the dropdown', 'pt': 'Please choose an option from the dropdown',
'en': '', 'en': '',
}, },
'9cs5wlmc': { '9cs5wlmc': {
'pt': 'Campo é necessário', 'pt': 'Senha é Obrigatório',
'en': 'Field is required', 'en': 'Password is required',
}, },
'rkxwb0sg': { 'rkxwb0sg': {
'pt': 'Please choose an option from the dropdown', 'pt': 'Please choose an option from the dropdown',
@ -922,7 +922,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
}, },
'p5c6d54y': { 'p5c6d54y': {
'pt': ' Recupere aqui', 'pt': ' Recupere aqui',
'en': ' recover here', 'en': ' Recover here',
}, },
'olf967cj': { 'olf967cj': {
'pt': 'Termo de Uso', 'pt': 'Termo de Uso',
@ -1032,12 +1032,24 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
'Don\'t worry, we will help you, enter the email registered in the application and click send.', 'Don\'t worry, we will help you, enter the email registered in the application and click send.',
}, },
'mtz8l7ft': { 'mtz8l7ft': {
'pt': 'Email', 'pt': 'E-mail',
'en': 'Email', 'en': 'E-mail',
}, },
'w7y5wlnv': { 'w7y5wlnv': {
'pt': 'digite o seu email.....', 'pt': '',
'en': 'enter your email.....', 'en': '',
},
'3hqg8buh': {
'pt': 'E-mail é Obrigatório',
'en': 'E-mail is Required',
},
'jh5r2b1w': {
'pt': 'E-mail Inválido',
'en': 'Invalid E-mail',
},
'1p76vmkn': {
'pt': 'Please choose an option from the dropdown',
'en': '',
}, },
'74rnd5bu': { '74rnd5bu': {
'pt': 'Enviar', 'pt': 'Enviar',

View File

@ -52,32 +52,32 @@ Future<List<SelectedFile>?> selectMediaWithSourceBottomSheet({
required bool allowPhoto, required bool allowPhoto,
bool allowVideo = false, bool allowVideo = false,
String pickerFontFamily = 'Roboto', String pickerFontFamily = 'Roboto',
Color textColor = const Color(0xFF111417), // Color textColor = const Color(0xFF111417),
Color backgroundColor = const Color(0xFFF5F5F5), // Color backgroundColor = const Color(0xFFF5F5F5),
bool includeDimensions = false, bool includeDimensions = false,
bool includeBlurHash = false, bool includeBlurHash = false,
}) async { }) async {
createUploadMediaListTile(String label, MediaSource mediaSource) => ListTile( createUploadMediaListTile(String label, MediaSource mediaSource) => ListTile(
title: Text( title: Text(
label, label,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: GoogleFonts.getFont( style: GoogleFonts.getFont(
pickerFontFamily, pickerFontFamily,
color: textColor, color: FlutterFlowTheme.of(context).primaryText,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 20, fontSize: 20,
), ),
), ),
tileColor: backgroundColor, tileColor: FlutterFlowTheme.of(context).primaryBackground,
dense: false, dense: false,
onTap: () => Navigator.pop( onTap: () => Navigator.pop(
context, context,
mediaSource, mediaSource,
), ),
); );
final mediaSource = await showModalBottomSheet<MediaSource>( final mediaSource = await showModalBottomSheet<MediaSource>(
context: context, context: context,
backgroundColor: backgroundColor, backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
builder: (context) { builder: (context) {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -91,13 +91,15 @@ Future<List<SelectedFile>?> selectMediaWithSourceBottomSheet({
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: GoogleFonts.getFont( style: GoogleFonts.getFont(
pickerFontFamily, pickerFontFamily,
color: textColor.withOpacity(0.65), color: FlutterFlowTheme.of(context)
.primaryText
.withOpacity(0.65),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 20, fontSize: 20,
), ),
), ),
tileColor: backgroundColor, tileColor: FlutterFlowTheme.of(context).primaryBackground,
dense: false, dense: true,
), ),
), ),
const Divider(), const Divider(),
@ -360,14 +362,22 @@ void showUploadMessage(
child: CircularProgressIndicator( child: CircularProgressIndicator(
valueColor: Theme.of(context).brightness == Brightness.dark valueColor: Theme.of(context).brightness == Brightness.dark
? AlwaysStoppedAnimation<Color>( ? AlwaysStoppedAnimation<Color>(
FlutterFlowTheme.of(context).accent4) FlutterFlowTheme.of(context).info)
: null, : null,
), ),
), ),
Text(message), Text(message, style: FlutterFlowTheme.of(context).bodyMedium),
], ],
), ),
duration: showLoading ? const Duration(days: 1) : const Duration(seconds: 4), backgroundColor: FlutterFlowTheme.of(context).primary,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
),
),
duration:
showLoading ? const Duration(days: 1) : const Duration(seconds: 4),
), ),
); );
} }

View File

@ -1,5 +1,6 @@
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:hub/app_state.dart'; import 'package:hub/app_state.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
@ -29,6 +30,8 @@ void main() async {
Future<void> initializeApp() async { Future<void> initializeApp() async {
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
await FlutterFlowTheme.initialize(); await FlutterFlowTheme.initialize();
await FFLocalizations.initialize(); await FFLocalizations.initialize();
final appState = FFAppState(); final appState = FFAppState();
@ -57,6 +60,9 @@ class _MyAppState extends State<MyApp> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
_appStateNotifier = AppStateNotifier.instance; _appStateNotifier = AppStateNotifier.instance;
_router = createRouter(_appStateNotifier); _router = createRouter(_appStateNotifier);
Future.delayed(const Duration(milliseconds: 1000), Future.delayed(const Duration(milliseconds: 1000),

View File

@ -22,17 +22,11 @@ import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/home_page/home_page_model.dart'; import 'package:hub/pages/home_page/home_page_model.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class HomePageWidget extends StatefulWidget { class HomePageWidget extends StatefulWidget {
const HomePageWidget({super.key}); const HomePageWidget({super.key});
@override @override
State<HomePageWidget> createState() => _HomePageWidgetState(); State<HomePageWidget> createState() => _HomePageWidgetState();
} }
@ -42,7 +36,6 @@ class _HomePageWidgetState extends State<HomePageWidget> {
bool localStatus = false; bool localStatus = false;
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
Future<void> checkLocalStatus() async { Future<void> checkLocalStatus() async {
localStatus = await checkLocals( localStatus = await checkLocals(
context: context, context: context,
@ -58,9 +51,6 @@ class _HomePageWidgetState extends State<HomePageWidget> {
SchedulerBinding.instance.addPostFrameCallback((_) async { SchedulerBinding.instance.addPostFrameCallback((_) async {
await PushNotificationService().initialize(context); await PushNotificationService().initialize(context);
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -105,7 +95,6 @@ class _HomePageWidgetState extends State<HomePageWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.watch<FFAppState>(); context.watch<FFAppState>();
return GestureDetector( return GestureDetector(
onTap: () => _model.unfocusNode.canRequestFocus onTap: () => _model.unfocusNode.canRequestFocus
@ -122,523 +111,485 @@ class _HomePageWidgetState extends State<HomePageWidget> {
Container buildPage(BuildContext context, bool localStatus) { Container buildPage(BuildContext context, bool localStatus) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Wrap(
spacing: 0.0,
runSpacing: 0.0,
alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start,
direction: Axis.horizontal,
runAlignment: WrapAlignment.start,
verticalDirection: VerticalDirection.down,
clipBehavior: Clip.none,
children: [
createHeader(context),
createLocal(localStatus),
createBody(),
],
),
],
), ),
child: SingleChildScrollView( ),
child: Column( );
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Wrap(
spacing: 0.0,
runSpacing: 0.0,
alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start,
direction: Axis.horizontal,
runAlignment: WrapAlignment.start,
verticalDirection: VerticalDirection.down,
clipBehavior: Clip.none,
children: [
createHeader(context),
createLocal(localStatus),
createBody(),
],
),
],
),
),
);
} }
Wrap createBody() { Wrap createBody() {
return Wrap( return Wrap(
spacing: 0.0, spacing: 0.0,
runSpacing: 0.0, runSpacing: 0.0,
alignment: WrapAlignment.start, alignment: WrapAlignment.start,
crossAxisAlignment: WrapCrossAlignment.start, crossAxisAlignment: WrapCrossAlignment.start,
direction: Axis.horizontal, direction: Axis.horizontal,
runAlignment: WrapAlignment.start, runAlignment: WrapAlignment.start,
verticalDirection: VerticalDirection.down, verticalDirection: VerticalDirection.down,
clipBehavior: Clip.none, clipBehavior: Clip.none,
children: [ children: [
wrapWithModel( wrapWithModel(
model: _model.menuComponentModel, model: _model.menuComponentModel,
updateCallback: () => setState(() {}), updateCallback: () => setState(() {}),
child: const MenuComponentWidget( child: const MenuComponentWidget(
expandable: true, expandable: true,
style: MenuView.list_grid, style: MenuView.list_grid,
item: MenuItem.button, item: MenuItem.button,
), ),
), ),
Align( Align(
alignment: const AlignmentDirectional(0.0, 0.0), alignment: const AlignmentDirectional(0.0, 0.0),
child: Provider<MessageWellNotifier>( child: Provider<MessageWellNotifier>(
create: (_) => MessageWellNotifier(), create: (_) => MessageWellNotifier(),
child: wrapWithModel( child: wrapWithModel(
model: _model.messageWellComponentModel, model: _model.messageWellComponentModel,
updateCallback: () => setState(() {}), updateCallback: () => setState(() {}),
child: const MessageWellComponentWidget(), child: const MessageWellComponentWidget(),
), ),
), ),
), ),
//footer //footer
const SizedBox( const SizedBox(
height: 100, height: 100,
width: double.infinity, width: double.infinity,
) )
], ],
); );
} }
Widget createLocal(bool localStatus) { Widget createLocal(bool localStatus) {
return wrapWithModel( return wrapWithModel(
model: _model.localComponentModel, model: _model.localComponentModel,
updateCallback: () => setState(() {}), updateCallback: () => setState(() {}),
child: LocalProfileComponentWidget( child: LocalProfileComponentWidget(
localStatus: localStatus, localStatus: localStatus,
), ),
); );
} }
Row createHeader(BuildContext context) { Row createHeader(BuildContext context) {
return Row( return Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
width: 100.0, width: 100.0,
height: 100.0, height: 100.0,
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Color(0xFF1AAB5F), color: Color(0xFF1AAB5F),
), ),
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Align( Align(
alignment: alignment: const AlignmentDirectional(0.0, 1.0),
const AlignmentDirectional(0.0, 1.0), child: Container(
child: Container( height: 50.0,
height: 50.0, decoration: const BoxDecoration(),
decoration: const BoxDecoration(), child: Align(
child: Align( alignment: const AlignmentDirectional(0.0, 0.0),
alignment: child: Row(
const AlignmentDirectional(0.0, 0.0), mainAxisSize: MainAxisSize.max,
child: Row( children: [
mainAxisSize: MainAxisSize.max, Align(
children: [ alignment: const AlignmentDirectional(-1.0, 0.0),
Align( child: Padding(
alignment: padding: const EdgeInsetsDirectional.fromSTEB(
const AlignmentDirectional( 10.0, 0.0, 0.0, 0.0),
-1.0, 0.0), child: FlutterFlowIconButton(
child: Padding( borderRadius: 20.0,
padding: borderWidth: 1.0,
const EdgeInsetsDirectional buttonSize: 40.0,
.fromSTEB( fillColor: FlutterFlowTheme.of(context).primary,
10.0, 0.0, 0.0, 0.0), icon: const Icon(
child: FlutterFlowIconButton( Icons.menu_rounded,
borderRadius: 20.0, color: Colors.white,
borderWidth: 1.0, size: 28.0,
buttonSize: 40.0, ),
fillColor: onPressed: () async {
FlutterFlowTheme.of(context) scaffoldKey.currentState!.openDrawer();
.primary, },
icon: const Icon( ),
Icons.menu_rounded, ),
color: Colors.white, ),
size: 28.0, Align(
), alignment: const AlignmentDirectional(-1.0, 0.0),
onPressed: () async { child: Padding(
scaffoldKey.currentState! padding: const EdgeInsetsDirectional.fromSTEB(
.openDrawer(); 60.0, 15.0, 0.0, 0.0),
}, child: ClipRRect(
), borderRadius: BorderRadius.circular(8.0),
), child: Image.network(
), 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/8r2vsbd9i03k/logo.png',
Align( width: 50.0,
alignment: height: 200.0,
const AlignmentDirectional( fit: BoxFit.none,
-1.0, 0.0),
child: Padding(
padding:
const EdgeInsetsDirectional
.fromSTEB(
60.0, 15.0, 0.0, 0.0),
child: ClipRRect(
borderRadius:
BorderRadius.circular(8.0),
child: Image.network(
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/8r2vsbd9i03k/logo.png',
width: 50.0,
height: 200.0,
fit: BoxFit.none,
),
),
),
),
Align(
alignment:
const AlignmentDirectional(
0.0, 0.0),
child: Padding(
padding:
const EdgeInsetsDirectional
.fromSTEB(
0.0, 15.0, 0.0, 0.0),
child: Text(
FFLocalizations.of(context)
.getText(
'rg9pzkpz' /* FRE ACCESS */,
),
style:
FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(
context)
.bodyMediumFamily,
color: FlutterFlowTheme
.of(context)
.info,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(
context)
.bodyMediumFamily),
),
),
),
),
],
),
), ),
), ),
), ),
Align( ),
alignment: Align(
const AlignmentDirectional(0.0, 1.0), alignment: const AlignmentDirectional(0.0, 0.0),
child: Container( child: Padding(
width: 100.0, padding: const EdgeInsetsDirectional.fromSTEB(
height: 50.0, 0.0, 15.0, 0.0, 0.0),
decoration: const BoxDecoration(), child: Text(
child: Align( FFLocalizations.of(context).getText(
alignment: 'rg9pzkpz' /* FRE ACCESS */,
const AlignmentDirectional(1.0, 1.0), ),
child: FlutterFlowIconButton( style: FlutterFlowTheme.of(context)
borderRadius: 20.0, .bodyMedium
borderWidth: 1.0, .override(
buttonSize: 40.0, fontFamily: FlutterFlowTheme.of(context)
icon: Icon( .bodyMediumFamily,
Icons.notifications_sharp, color: FlutterFlowTheme.of(context).info,
color: letterSpacing: 0.0,
FlutterFlowTheme.of(context).info, useGoogleFonts: GoogleFonts.asMap()
size: 24.0, .containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
), ),
onPressed: () {
log('IconButton pressed ...');
},
),
),
), ),
), ),
], ),
), ],
), ),
), ),
], ),
); ),
Align(
alignment: const AlignmentDirectional(0.0, 1.0),
child: Container(
width: 100.0,
height: 50.0,
decoration: const BoxDecoration(),
child: Align(
alignment: const AlignmentDirectional(1.0, 1.0),
child: FlutterFlowIconButton(
borderRadius: 20.0,
borderWidth: 1.0,
buttonSize: 40.0,
icon: Icon(
Icons.notifications_sharp,
color: FlutterFlowTheme.of(context).info,
size: 24.0,
),
onPressed: () {
log('IconButton pressed ...');
},
),
),
),
),
],
),
),
),
],
);
} }
SizedBox buildDrawer(BuildContext context) { SizedBox buildDrawer(BuildContext context) {
return SizedBox( return SizedBox(
width: 750.0, width: 750.0,
child: Drawer( child: Drawer(
elevation: 16.0, elevation: 16.0,
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
shape: BoxShape.rectangle, shape: BoxShape.rectangle,
), ),
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
width: double.infinity, width: double.infinity,
decoration: const BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(5.0), bottomLeft: Radius.circular(5.0),
bottomRight: Radius.circular(5.0), bottomRight: Radius.circular(5.0),
topLeft: Radius.circular(0.0), topLeft: Radius.circular(0.0),
topRight: Radius.circular(0.0), topRight: Radius.circular(0.0),
),
shape: BoxShape.rectangle,
), ),
child: Column( shape: BoxShape.rectangle,
mainAxisSize: MainAxisSize.max, ),
children: [ child: Column(
Padding( mainAxisSize: MainAxisSize.max,
padding: const EdgeInsets.fromLTRB(30, 30, 10, 0), children: [
child: Row( Padding(
mainAxisSize: MainAxisSize.max, padding: const EdgeInsets.fromLTRB(30, 30, 10, 0),
mainAxisAlignment: MainAxisAlignment.spaceBetween, child: Row(
crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.max,
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
Flexible( crossAxisAlignment: CrossAxisAlignment.start,
child: Container( children: [
width: double.infinity, Flexible(
decoration: const BoxDecoration(), child: Container(
child: Row( width: double.infinity,
mainAxisSize: MainAxisSize.max, decoration: const BoxDecoration(),
mainAxisAlignment: MainAxisAlignment.start, child: Row(
children: [ mainAxisSize: MainAxisSize.max,
Container( mainAxisAlignment: MainAxisAlignment.start,
width: 50.0, children: [
height: 50.0, Container(
clipBehavior: Clip.antiAlias, width: 50.0,
decoration: const BoxDecoration( height: 50.0,
shape: BoxShape.circle, clipBehavior: Clip.antiAlias,
), decoration: const BoxDecoration(
child: Image.network( shape: BoxShape.circle,
valueOrDefault<String>(
'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png',
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
),
fit: BoxFit.cover,
),
), ),
Container( child: Image.network(
width: 150.0, valueOrDefault<String>(
child: Text( 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png',
valueOrDefault<String>( 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
convertToUppercase(
FFAppState().local),
'NOME DO LOCAL',
),
style: FlutterFlowTheme.of(context)
.bodyLarge
.override(
fontFamily: 'Nunito Sans',
color:
FlutterFlowTheme.of(context)
.primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.normal,
useGoogleFonts:
GoogleFonts.asMap()
.containsKey(
'Nunito Sans'),
),
), ),
fit: BoxFit.cover,
), ),
].divide(const SizedBox(width: 20.0)), ),
), Container(
width: 150.0,
child: Text(
valueOrDefault<String>(
convertToUppercase(FFAppState().local),
'NOME DO LOCAL',
),
style: FlutterFlowTheme.of(context)
.bodyLarge
.override(
fontFamily: 'Nunito Sans',
color: FlutterFlowTheme.of(context)
.primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.normal,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Nunito Sans'),
),
),
),
].divide(const SizedBox(width: 20.0)),
), ),
), ),
Container( ),
width: 50.0, Container(
child: Container( width: 50.0,
height: 30.0, child: Container(
decoration: const BoxDecoration(), height: 30.0,
child: Row( decoration: const BoxDecoration(),
mainAxisSize: MainAxisSize.min, child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.min,
children: [ mainAxisAlignment: MainAxisAlignment.end,
Flexible( children: [
child: FlutterFlowIconButton( Flexible(
borderRadius: 100.0, child: FlutterFlowIconButton(
borderWidth: 1.0, borderRadius: 100.0,
buttonSize: 40.0, borderWidth: 1.0,
icon: Icon( buttonSize: 40.0,
Icons.close_sharp, icon: Icon(
color: FlutterFlowTheme.of(context) Icons.close_sharp,
.primary, color: FlutterFlowTheme.of(context)
size: 20.0, .primary,
), size: 20.0,
onPressed: () async {
if (scaffoldKey.currentState!
.isDrawerOpen ||
scaffoldKey.currentState!
.isEndDrawerOpen) {
Navigator.pop(context);
}
},
), ),
onPressed: () async {
if (scaffoldKey
.currentState!.isDrawerOpen ||
scaffoldKey.currentState!
.isEndDrawerOpen) {
Navigator.pop(context);
}
},
), ),
], ),
), ],
), ),
), ),
] ),
.divide(const SizedBox(width: 0.0)) ]
.around(const SizedBox(width: 0.0)), .divide(const SizedBox(width: 0.0))
), .around(const SizedBox(width: 0.0)),
), ),
].addToStart(const SizedBox(height: 30.0)),
), ),
), ].addToStart(const SizedBox(height: 30.0)),
Padding( ),
padding: ),
const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0), Padding(
child: Row( padding:
mainAxisSize: MainAxisSize.min, const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0),
mainAxisAlignment: MainAxisAlignment.start, child: Row(
children: [ mainAxisSize: MainAxisSize.min,
Flexible( mainAxisAlignment: MainAxisAlignment.start,
child: Padding( children: [
padding: const EdgeInsetsDirectional.fromSTEB( Flexible(
8.0, 0.0, 8.0, 0.0), child: Padding(
child: TextFormField( padding: const EdgeInsetsDirectional.fromSTEB(
controller: _model.textController, 8.0, 0.0, 8.0, 0.0),
focusNode: _model.textFieldFocusNode, child: TextFormField(
autofocus: false, controller: _model.textController,
obscureText: false, focusNode: _model.textFieldFocusNode,
decoration: InputDecoration( autofocus: false,
isDense: true, obscureText: false,
labelStyle: FlutterFlowTheme.of(context) decoration: InputDecoration(
.labelMedium isDense: true,
.override( labelStyle: FlutterFlowTheme.of(context)
fontFamily: FlutterFlowTheme.of(context) .labelMedium
.labelMediumFamily,
color: FlutterFlowTheme.of(context)
.primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
alignLabelWithHint: false,
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context)
.customColor1,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
errorBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
focusedErrorBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
prefixIcon: const Icon(
Icons.search_sharp,
),
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override( .override(
fontFamily: FlutterFlowTheme.of(context) fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily, .labelMediumFamily,
color:
FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0, letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap() useGoogleFonts: GoogleFonts.asMap()
.containsKey( .containsKey(FlutterFlowTheme.of(context)
FlutterFlowTheme.of(context) .labelMediumFamily),
.bodyMediumFamily),
), ),
validator: _model.textControllerValidator alignLabelWithHint: false,
.asValidator(context), hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color:
FlutterFlowTheme.of(context).customColor1,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
errorBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
focusedErrorBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(2.0),
),
prefixIcon: const Icon(
Icons.search_sharp,
),
), ),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
validator: _model.textControllerValidator
.asValidator(context),
), ),
), ),
]
.addToStart(const SizedBox(width: 30.0))
.addToEnd(const SizedBox(width: 30.0)),
),
),
Expanded(
child: wrapWithModel(
model: _model.menuComponentModel,
updateCallback: () => setState(() {}),
child: MenuComponentWidget(
expandable: false,
style: MenuView.list,
item: MenuItem.card,
),
),
),
FFButtonWidget(
onPressed: () async {
FFAppState().isLogged = false;
setState(() {});
context.goNamed(
'welcomePage',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
},
text: FFLocalizations.of(context).getText(
'xx0db4wi' /* Sair */,
),
options: FFButtonOptions(
height: 40.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: const Color(0x00D70000),
textStyle:
FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
elevation: 0.0,
borderSide: const BorderSide(
width: 0.0,
), ),
borderRadius: BorderRadius.circular(50.0), ]
.addToStart(const SizedBox(width: 30.0))
.addToEnd(const SizedBox(width: 30.0)),
),
),
Expanded(
child: wrapWithModel(
model: _model.menuComponentModel,
updateCallback: () => setState(() {}),
child: MenuComponentWidget(
expandable: false,
style: MenuView.list,
item: MenuItem.card,
), ),
), ),
].addToEnd(const SizedBox(height: 64.0)),
), ),
), FFButtonWidget(
onPressed: () async {
FFAppState().isLogged = false;
setState(() {});
context.goNamed(
'welcomePage',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: true,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
},
text: FFLocalizations.of(context).getText(
'xx0db4wi' /* Sair */,
),
options: FFButtonOptions(
height: 40.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: const Color(0x00D70000),
textStyle: FlutterFlowTheme.of(context).labelMedium.override(
fontFamily: 'Plus Jakarta Sans',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
fontWeight: FontWeight.w500,
useGoogleFonts: GoogleFonts.asMap()
.containsKey('Plus Jakarta Sans'),
),
elevation: 0.0,
borderSide: const BorderSide(
width: 0.0,
),
borderRadius: BorderRadius.circular(50.0),
),
),
].addToEnd(const SizedBox(height: 64.0)),
), ),
); ),
),
);
// body: Container( // body: Container(
// decoration: BoxDecoration( // decoration: BoxDecoration(
@ -836,6 +787,5 @@ class _HomePageWidgetState extends State<HomePageWidget> {
// ), // ),
// ), // ),
// ); // );
} }
} }

View File

@ -1,12 +1,13 @@
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/flutter_flow/request_manager.dart'; import 'package:hub/flutter_flow/request_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/pages/message_history_page/message_history_page_widget.dart'; import 'package:hub/pages/message_history_page/message_history_page_widget.dart';
class MessageHistoryPageModel extends FlutterFlowModel<MessageHistoryPageWidget> { class MessageHistoryPageModel
extends FlutterFlowModel<MessageHistoryPageWidget> {
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
/// ///
@ -49,7 +50,6 @@ class MessageHistoryPageModel extends FlutterFlowModel<MessageHistoryPageWidget>
textController?.dispose(); textController?.dispose();
tabBarController?.dispose(); tabBarController?.dispose();
/// Dispose query cache managers for this widget. /// Dispose query cache managers for this widget.
clearGetLiberationsCache(); clearGetLiberationsCache();

View File

@ -12,7 +12,6 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/message_history_page/message_history_page_model.dart'; import 'package:hub/pages/message_history_page/message_history_page_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -26,7 +25,8 @@ class MessageHistoryPageWidget extends StatefulWidget {
_MessageHistoryPageWidgetState(); _MessageHistoryPageWidgetState();
} }
class _MessageHistoryPageWidgetState extends State<MessageHistoryPageWidget> with TickerProviderStateMixin { class _MessageHistoryPageWidgetState extends State<MessageHistoryPageWidget>
with TickerProviderStateMixin {
late MessageHistoryPageModel _model; late MessageHistoryPageModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
@ -36,7 +36,7 @@ class _MessageHistoryPageWidgetState extends State<MessageHistoryPageWidget> wit
super.initState(); super.initState();
_model = createModel(context, () => MessageHistoryPageModel()); _model = createModel(context, () => MessageHistoryPageModel());
_model.tabBarController = TabController( _model.tabBarController = TabController(
vsync: this, vsync: this,
length: 3, length: 3,
initialIndex: 1, initialIndex: 1,
@ -106,8 +106,7 @@ PreferredSizeWidget appBarMessage(BuildContext context) {
); );
} }
Widget bodyMessage( Widget bodyMessage(BuildContext context, MessageHistoryPageModel _model) {
BuildContext context, MessageHistoryPageModel _model) {
return SafeArea( return SafeArea(
top: true, top: true,
child: Column( child: Column(
@ -155,33 +154,26 @@ Widget bodyMessage(
}, },
), ),
), ),
Expanded(child: TabBarView( Expanded(
controller: _model.tabBarController, child: TabBarView(controller: _model.tabBarController, children: [
children: [ liberationDynamicListView(context, _model, 'P'),
liberationDynamicListView(context, _model, 'P'), liberationDynamicListView(context, _model, 'A'),
liberationDynamicListView(context, _model, 'A'), liberationDynamicListView(context, _model, 'T'),
liberationDynamicListView(context, _model, 'T'), ])),
]
)),
].addToStart(const SizedBox(height: 0)), ].addToStart(const SizedBox(height: 0)),
), ),
); );
} }
Widget liberationDynamicListView( Widget liberationDynamicListView(
BuildContext context, BuildContext context, MessageHistoryPageModel _model, String DestIndex) {
MessageHistoryPageModel _model,
String DestIndex
) {
return Container( return Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
decoration: const BoxDecoration(), decoration: const BoxDecoration(),
child: FutureBuilder<ApiCallResponse>( child: FutureBuilder<ApiCallResponse>(
future: PhpGroup.getMessagesCall.call( future: PhpGroup.getMessagesCall
.call(
devUUID: FFAppState().devUUID.toString(), devUUID: FFAppState().devUUID.toString(),
userUUID: FFAppState().userUUID.toString(), userUUID: FFAppState().userUUID.toString(),
cliID: FFAppState().cliUUID.toString(), cliID: FFAppState().cliUUID.toString(),
@ -189,7 +181,8 @@ Widget liberationDynamicListView(
pageSize: '100', pageSize: '100',
pageNumber: '1', pageNumber: '1',
tipoDestino: DestIndex, tipoDestino: DestIndex,
).catchError((error) { )
.catchError((error) {
log('Error: ${error.toString()}'); log('Error: ${error.toString()}');
return Future.delayed(Duration(seconds: 1), () { return Future.delayed(Duration(seconds: 1), () {
return Center( return Center(
@ -217,8 +210,15 @@ Widget liberationDynamicListView(
child: Text('Erro ao carregar mensagens'), child: Text('Erro ao carregar mensagens'),
); );
} }
final mensagens = snapshot.data!.jsonBody['mensagens'];
final totalRows = snapshot.data!.jsonBody['total_rows'];
if (totalRows == 0 || mensagens == null || mensagens.isEmpty) {
return const Center(
child: Text('Nenhuma mensagem encontrada'),
);
}
return ListView.builder( return ListView.builder(
itemCount: snapshot.data!.jsonBody['total_rows'], itemCount: totalRows,
addAutomaticKeepAlives: false, addAutomaticKeepAlives: false,
addRepaintBoundaries: true, addRepaintBoundaries: true,
cacheExtent: 1000.0, cacheExtent: 1000.0,
@ -234,8 +234,7 @@ Widget liberationDynamicListView(
); );
} }
Widget messageHistoryItem( Widget messageHistoryItem(BuildContext context, dynamic jsonBody) {
BuildContext context, dynamic jsonBody) {
log(jsonBody.toString()); log(jsonBody.toString());
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 15), padding: const EdgeInsets.symmetric(horizontal: 15),
@ -250,55 +249,60 @@ Widget messageHistoryItem(
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Padding( Row(
padding: const EdgeInsets.only(left: 15.0), mainAxisAlignment: MainAxisAlignment.end,
child: Text( mainAxisSize: MainAxisSize.max,
jsonBody['MSG_DATE'].toString(), children: [
style: TextStyle( Padding(
fontWeight: FontWeight.bold, padding: const EdgeInsets.only(left: 15.0),
fontSize: 16, child: Text(
color: FlutterFlowTheme.of(context).primary, jsonBody['MSG_DATE'].toString(),
overflow: TextOverflow.ellipsis, style: TextStyle(
), fontWeight: FontWeight.bold,
), fontSize: 10,
), color: FlutterFlowTheme.of(context).customColor6,
Icon( overflow: TextOverflow.ellipsis,
jsonBody['MSG_DESTINO_TP'] == 'T' ),
? Icons.group
: Icons.person,
color: FlutterFlowTheme.of(context).accent1,
)
],
),
SizedBox(height: 8),
Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Text(
jsonBody['MSG_ORIGEM_DESC'].toString(),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
color: FlutterFlowTheme.of(context).primary,
), ),
overflow: TextOverflow.fade,
), ),
), ],
),
Row(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Text(
jsonBody['MSG_ORIGEM_DESC'].toString(),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
color: FlutterFlowTheme.of(context).primary,
),
overflow: TextOverflow.fade,
),
),
Icon(
jsonBody['MSG_DESTINO_TP'] == 'T'
? Icons.group
: Icons.person,
color: FlutterFlowTheme.of(context).primary,
),
],
), ),
], ],
), ),
SizedBox(height: 8), SizedBox(height: 8),
Text(jsonBody['MSG_TEXTO'].toString(),), Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
jsonBody['MSG_TEXTO'].toString(),
),
),
SizedBox(height: 8),
], ],
), ),
), ),
), ),
), ),
); );
} }

View File

@ -1,23 +1,20 @@
import 'dart:developer'; import 'dart:developer';
import 'package:hub/app_state.dart'; import 'package:hub/app_state.dart';
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/components/templates_components/change_passs_qr_code_pass_key_template_component/change_pass_widget.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_icon_button.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.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_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:share_plus/share_plus.dart';
class PreferencesPageModel with ChangeNotifier { class PreferencesPageModel with ChangeNotifier {
final unfocusNode = FocusNode(); final unfocusNode = FocusNode();
Future<void> toggleFingerprint(BuildContext context) async { Future<void> toggleFingerprint(BuildContext context) async {
// FFAppState().checkBiometrics() // FFAppState().checkBiometrics()
// .then((value) => FFAppState().authenticateBiometric() // .then((value) => FFAppState().authenticateBiometric()
// .then( (value) { // .then( (value) {
@ -26,69 +23,104 @@ class PreferencesPageModel with ChangeNotifier {
// }) // })
// .whenComplete(() => notifyListeners())); // .whenComplete(() => notifyListeners()));
if(FFAppState().fingerprint) { if (FFAppState().fingerprint) {
FFAppState().fingerprint = false; FFAppState().fingerprint = false;
FFAppState().deleteFingerprintPass(); FFAppState().deleteFingerprintPass();
notifyListeners(); notifyListeners();
} else { } else {
await showModalBottomSheet( await showModalBottomSheet(
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
useSafeArea: true, useSafeArea: true,
context: context, context: context,
builder: (context) { builder: (context) {
return Padding( return Padding(
padding: padding: MediaQuery.viewInsetsOf(context),
MediaQuery.viewInsetsOf(context), child: PassKeyTemplateWidget(
child: toggleActionStatus: (key) async {
PassKeyTemplateWidget( log(key);
toggleActionStatus: (key) async { FFAppState().fingerprintPass = key;
log(key); FFAppState().fingerprint = true;
FFAppState().fingerprintPass = key; },
FFAppState().fingerprint = true; ),
}, );
), },
); ).whenComplete(() => notifyListeners());
},
).whenComplete(() => notifyListeners());
} }
} }
void enablePerson(BuildContext context) { void enablePerson(BuildContext context) {
notifyListeners(); notifyListeners();
ScaffoldMessenger.of(context).showSnackBar( Share.share(
SnackBar( FFAppState().userDevUUID,
content: Text(FFAppState().userDevUUID, style: TextStyle(color: FlutterFlowTheme.of(context).info) ),
backgroundColor: FlutterFlowTheme.of(context).primary,
duration: const Duration(seconds: 1),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
); );
} }
void toggleNotify() { void toggleNotify(BuildContext context) {
FFAppState().notify = !FFAppState().notify; FFAppState().notify = !FFAppState().notify;
PhpGroup.changeNotifica.call( PhpGroup.changeNotifica
.call(
userUUID: FFAppState().userUUID, userUUID: FFAppState().userUUID,
devUUID: FFAppState().devUUID, devUUID: FFAppState().devUUID,
cliID: FFAppState().cliUUID, cliID: FFAppState().cliUUID,
atividade: 'updVisitado', atividade: 'updVisitado',
notifica: FFAppState().notify ? 'S' : 'N', notifica: FFAppState().notify ? 'S' : 'N',
); )
.catchError((err) {
log(err.toString());
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
FFLocalizations.of(context).getVariableText(
enText: 'Error changing notification',
ptText: 'Erro ao alterar notificação',
),
style: TextStyle(color: FlutterFlowTheme.of(context).info)),
backgroundColor: FlutterFlowTheme.of(context).error,
duration: const Duration(seconds: 3),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
);
});
notifyListeners(); notifyListeners();
} }
void localLogout(){ void localUnlink(BuildContext context) {
PhpGroup.resopndeVinculo.call( PhpGroup.resopndeVinculo
.call(
userUUID: FFAppState().userUUID, userUUID: FFAppState().userUUID,
devUUID: FFAppState().devUUID, devUUID: FFAppState().devUUID,
cliID: FFAppState().cliUUID, cliID: FFAppState().cliUUID,
tarefa: 'I', tarefa: 'I',
)
.catchError((err) {
log(err.toString());
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
FFLocalizations.of(context).getVariableText(
enText: 'Error unlinking device',
ptText: 'Erro ao desvincular dispositivo',
),
style: TextStyle(color: FlutterFlowTheme.of(context).info)),
backgroundColor: FlutterFlowTheme.of(context).error,
duration: const Duration(seconds: 3),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
);
}).then(
(value) {
FFAppState().deleteCliUUID();
FFAppState().deleteLocal();
FFAppState().deleteOwnerUUID();
Navigator.pop(context);
},
); );
notifyListeners(); notifyListeners();
} }
@ -108,57 +140,99 @@ class PreferencesPageModel with ChangeNotifier {
); );
} }
Future<void> togglePass(BuildContext context) async {
Future<void> togglePass(BuildContext context) async {
debugPrint('pass: ${FFAppState().pass}'); debugPrint('pass: ${FFAppState().pass}');
if(FFAppState().pass) { if (FFAppState().pass) {
FFAppState().pass = false; FFAppState().pass = false;
FFAppState().deleteAccessPass(); FFAppState().deleteAccessPass();
notifyListeners(); notifyListeners();
} else { } else {
await showModalBottomSheet( await showModalBottomSheet(
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
useSafeArea: true, useSafeArea: true,
context: context, context: context,
builder: (context) { builder: (context) {
return Padding( return Padding(
padding: padding: MediaQuery.viewInsetsOf(context),
MediaQuery.viewInsetsOf(context), child: PassKeyTemplateWidget(
child: toggleActionStatus: (key) async {
PassKeyTemplateWidget( FFAppState().accessPass = key;
toggleActionStatus: (key) async {
FFAppState().accessPass = key;
notifyListeners(); notifyListeners();
debugPrint('key: $key'); debugPrint('key: $key');
await PhpGroup.changePass.call( await PhpGroup.changePass
.call(
userUUID: FFAppState().userUUID, userUUID: FFAppState().userUUID,
devUUID: FFAppState().devUUID, devUUID: FFAppState().devUUID,
cliID: FFAppState().cliUUID, cliID: FFAppState().cliUUID,
atividade: 'updVisitado', atividade: 'updVisitado',
newSenha: FFAppState().accessPass, newSenha: FFAppState().accessPass,
) )
.then((value) { .then((value) {
FFAppState().pass = true; FFAppState().pass = true;
// var error = jsonDecode(value.jsonBody['error'].toString()); // var error = jsonDecode(value.jsonBody['error'].toString());
// log('${jsonDecode(value.jsonBody['error'].toString())}'); // log('${jsonDecode(value.jsonBody['error'].toString())}');
if(jsonDecode(value.jsonBody['error'].toString()) == false) { if (jsonDecode(value.jsonBody['error'].toString()) == false) {
FFAppState().pass = true; FFAppState().pass = true;
} else { } else {
FFAppState().pass = false; FFAppState().pass = false;
} }
}) }).onError((error, StackTrace) {
.onError((error, StackTrace) { FFAppState().pass = false;
FFAppState().pass = false; log(error.toString());
log(error.toString()); log(StackTrace.toString());
log(StackTrace.toString()); }).whenComplete(() => notifyListeners());
}) },
.whenComplete(() => notifyListeners()); ),
}, );
), },
); );
}, }
); }
Future<void> togglePanic(BuildContext context) async {
if (FFAppState().panic) {
FFAppState().panic = false;
FFAppState().deletePanicPass();
notifyListeners();
} else {
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
useSafeArea: true,
context: context,
builder: (context) {
return Padding(
padding: MediaQuery.viewInsetsOf(context),
child: PassKeyTemplateWidget(
toggleActionStatus: (key) async {
FFAppState().panicPass = key;
notifyListeners();
await PhpGroup.changePass
.call(
userUUID: FFAppState().userUUID,
devUUID: FFAppState().devUUID,
cliID: FFAppState().cliUUID,
atividade: 'updVisitado',
newSenha: FFAppState().panicPass,
)
.then((value) {
FFAppState().panic = true;
if (jsonDecode(value.jsonBody['error'].toString()) == false) {
FFAppState().panic = true;
} else {
FFAppState().panic = false;
}
}).onError((e, s) {
FFAppState().panic = false;
log(e.toString());
log(s.toString());
}).whenComplete(() => notifyListeners());
},
),
);
},
);
} }
} }

View File

@ -9,7 +9,6 @@ import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/preferences_settings_page/preferences_settings_model.dart'; import 'package:hub/pages/preferences_settings_page/preferences_settings_model.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class PreferencesPageWidget extends StatelessWidget { class PreferencesPageWidget extends StatelessWidget {
const PreferencesPageWidget({super.key}); const PreferencesPageWidget({super.key});
@ -46,7 +45,7 @@ class PreferencesPageWidget extends StatelessWidget {
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
enText: 'Preferences', enText: 'Preferences',
ptText: 'Preferências', ptText: 'Preferências',
), ),
style: FlutterFlowTheme.of(context).headlineMedium.override( style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: 'Nunito', fontFamily: 'Nunito',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
@ -74,7 +73,7 @@ class PreferencesPageWidget extends StatelessWidget {
// childAspectRatio: 1.0, // childAspectRatio: 1.0,
// mainAxisExtent: 100.0, // mainAxisExtent: 100.0,
// ), // ),
itemCount: 6, // Assuming 4 items for simplicity itemCount: 7, // Assuming 4 items for simplicity
padding: const EdgeInsets.symmetric(horizontal: 20.0), padding: const EdgeInsets.symmetric(horizontal: 20.0),
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
@ -90,82 +89,110 @@ class PreferencesPageWidget extends StatelessWidget {
); );
} }
Widget _buildIconButton(BuildContext context, int index, PreferencesPageModel model) { Widget _buildIconButton(
BuildContext context, int index, PreferencesPageModel model) {
IconData icon; IconData icon;
Function() onPressed =() => {}; Function() onPressed = () => {};
bool isEnabled; bool isEnabled;
String content; String content;
switch (index) { switch (index) {
case 0: case 0:
icon = Icons.fingerprint; icon = Icons.fingerprint;
onPressed = () => model.toggleFingerprint(context); // Disable if fingerprint is false onPressed = () =>
model.toggleFingerprint(context); // Disable if fingerprint is false
isEnabled = FFAppState().fingerprint; isEnabled = FFAppState().fingerprint;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Ative a autenticação por impressão digital para login seguro.', ptText:
'Ative a autenticação por impressão digital para login seguro.',
enText: 'Enable fingerprint authentication for secure login.', enText: 'Enable fingerprint authentication for secure login.',
); );
break; break;
case 1: case 1:
icon = Icons.person; icon = Icons.person;
onPressed = () => model.enablePerson(context); onPressed = () => model.enablePerson(context);
isEnabled = FFAppState().person; isEnabled = FFAppState().person;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Exibir código de identificação remota', ptText: 'Compartilhe o código de identificação remota',
enText: 'Display remote identification code', enText: 'Share the remote identification code',
); );
break; break;
case 2: case 2:
icon = Icons.notifications; icon = Icons.notifications;
onPressed = model.toggleNotify; onPressed = () => model.toggleNotify(context);
isEnabled = FFAppState().notify; isEnabled = FFAppState().notify;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Ative para receber sua notificação de acesso', ptText: 'Ative para receber sua notificação de acesso',
enText: 'Enable to receive your access notification', enText: 'Enable to receive your access notification',
); );
break; break;
case 3: case 3:
icon = Icons.lock_clock_sharp; icon = Icons.lock;
// onLongPress = model.togglePass(context, model); // onLongPress = model.togglePass(context, model);
isEnabled = FFAppState().pass; isEnabled = FFAppState().pass;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Ative para inserir uma credencial de acesso para o QRCode', ptText: 'Ative para inserir uma credencial de acesso para o QRCode',
enText: 'Enable to enter an access credential for the QRCode', enText: 'Enable to enter an access credential for the QRCode',
); );
break; break;
case 4: case 4:
icon = Icons.landscape; icon = Icons.lock_clock_sharp;
onPressed = model.localLogout; // onLongPress = model.togglePass(context, model);
isEnabled = false; isEnabled = FFAppState().panic;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Ative para se desvincular do local selecionado', ptText: 'Ative para inserir uma credencial de pânico para o QRCode',
enText: 'Enable to unlink from the selected location', enText: 'Enable to enter an panic credential for the QRCode',
); );
break; break;
case 5: case 5:
icon = Icons.landscape;
onPressed = () => model.localUnlink(context);
isEnabled = true;
content = FFLocalizations.of(context).getVariableText(
ptText: 'Desative para se desvincular do local selecionado',
enText: 'Enable to unlink from the selected location',
);
break;
case 6:
icon = Icons.delete; icon = Icons.delete;
onPressed = () => model.deleteAccount(context); onPressed = () => model.deleteAccount(context);
isEnabled = false; isEnabled = true;
content = FFLocalizations.of(context).getVariableText( content = FFLocalizations.of(context).getVariableText(
ptText: 'Delete sua conta e todos os dados associados permanentemente.', ptText:
'Delete sua conta e todos os dados associados permanentemente.',
enText: 'Delete your account and all associated data permanently.', enText: 'Delete your account and all associated data permanently.',
); );
break; break;
default: default:
throw Exception('Invalid index: $index'); throw Exception('Invalid index: $index');
} }
return Container( return SizedBox(
height: 100, height: 100,
child: GestureDetector( child: GestureDetector(
onTap: index != 3 ? onPressed : () {model.togglePass(context);}, onTap: () {
switch (index) {
case 3:
model.togglePass(context);
break;
case 4:
model.togglePanic(context);
break;
default:
onPressed();
}
},
child: Row( child: Row(
children: [ children: [
CircleAvatar( CircleAvatar(
backgroundColor: isEnabled ? FlutterFlowTheme.of(context).primary : FlutterFlowTheme.of(context).alternate, backgroundColor: isEnabled
? FlutterFlowTheme.of(context).primary
: FlutterFlowTheme.of(context).alternate,
child: Icon( child: Icon(
icon, icon,
color: isEnabled ? FlutterFlowTheme.of(context).primaryBackground : FlutterFlowTheme.of(context).primary, color: isEnabled
? FlutterFlowTheme.of(context).primaryBackground
: FlutterFlowTheme.of(context).primary,
// icon: Icon(icon, color: isEnabled ? FlutterFlowTheme.of(context).primaryBackground : FlutterFlowTheme.of(context).primary, size: 40.0), // icon: Icon(icon, color: isEnabled ? FlutterFlowTheme.of(context).primaryBackground : FlutterFlowTheme.of(context).primary, size: 40.0),
// onPressed: index != 3 ? onPressed : () {model.togglePass(context);}, // onPressed: index != 3 ? onPressed : () {model.togglePass(context);},
// borderRadius: 20.0, // borderRadius: 20.0,
@ -181,13 +208,13 @@ class PreferencesPageWidget extends StatelessWidget {
child: Text( child: Text(
content, content,
style: FlutterFlowTheme.of(context).bodySmall.override( style: FlutterFlowTheme.of(context).bodySmall.override(
fontFamily: 'Nunito', fontFamily: 'Nunito',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
fontSize: 14.0, fontSize: 14.0,
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.normal, fontWeight: FontWeight.normal,
fontStyle: FontStyle.normal, fontStyle: FontStyle.normal,
), ),
overflow: TextOverflow.clip, overflow: TextOverflow.clip,
), ),
), ),

View File

@ -1,3 +1,5 @@
import 'package:hub/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/form_field_controller.dart'; import '/flutter_flow/form_field_controller.dart';
@ -8,51 +10,12 @@ class RegisterVisitorPageModel
extends FlutterFlowModel<RegisterVisitorPageWidget> { extends FlutterFlowModel<RegisterVisitorPageWidget> {
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
final unfocusNode = FocusNode(); late RegisiterVistorTemplateComponentModel
bool isDataUploading = false; regisiterVistorTemplateComponentModel;
FFUploadedFile uploadedLocalFile =
FFUploadedFile(bytes: Uint8List.fromList([]));
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode1;
TextEditingController? textController1;
String? Function(BuildContext, String?)? textController1Validator;
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode2;
TextEditingController? textController2;
String? Function(BuildContext, String?)? textController2Validator;
// State field(s) for DropDown widget.
String? dropDownValue;
FormFieldController<String>? dropDownValueController;
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode3;
TextEditingController? textController3;
String? Function(BuildContext, String?)? textController3Validator;
// State field(s) for TextField widget.
FocusNode? textFieldFocusNode4;
TextEditingController? textController4;
String? Function(BuildContext, String?)? textController4Validator;
// Stores action output result for [Custom Action - convertImageFileToBase64] action in Button widget.
String? imgBase64;
// Stores action output result for [Backend Call - API (postScheduleVisitor)] action in Button widget.
ApiCallResponse? scheduleVisitor;
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {}
@override @override
void dispose() { void dispose() {}
unfocusNode.dispose();
textFieldFocusNode1?.dispose();
textController1?.dispose();
textFieldFocusNode2?.dispose();
textController2?.dispose();
textFieldFocusNode3?.dispose();
textController3?.dispose();
textFieldFocusNode4?.dispose();
textController4?.dispose();
}
} }

View File

@ -1,17 +1,10 @@
import 'package:hub/flutter_flow/nav/nav.dart';
import '/backend/api_requests/api_calls.dart';
import '/components/molecular_components/throw_exception/throw_exception_widget.dart';
import '/flutter_flow/flutter_flow_drop_down.dart';
import '/flutter_flow/flutter_flow_icon_button.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart';
import '/flutter_flow/form_field_controller.dart';
import '/flutter_flow/upload_data.dart';
import '/custom_code/actions/index.dart' as actions;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:hub/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_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/nav/nav.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'register_visitor_page_model.dart'; import 'register_visitor_page_model.dart';
export 'register_visitor_page_model.dart'; export 'register_visitor_page_model.dart';
@ -33,18 +26,6 @@ class _RegisterVisitorPageWidgetState extends State<RegisterVisitorPageWidget> {
void initState() { void initState() {
super.initState(); super.initState();
_model = createModel(context, () => RegisterVisitorPageModel()); _model = createModel(context, () => RegisterVisitorPageModel());
_model.textController1 ??= TextEditingController();
_model.textFieldFocusNode1 ??= FocusNode();
_model.textController2 ??= TextEditingController();
_model.textFieldFocusNode2 ??= FocusNode();
_model.textController3 ??= TextEditingController();
_model.textFieldFocusNode3 ??= FocusNode();
_model.textController4 ??= TextEditingController();
_model.textFieldFocusNode4 ??= FocusNode();
} }
@override @override
@ -57,837 +38,46 @@ class _RegisterVisitorPageWidgetState extends State<RegisterVisitorPageWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.watch<FFAppState>(); context.watch<FFAppState>();
return Scaffold(
return GestureDetector( appBar: AppBar(
onTap: () => _model.unfocusNode.canRequestFocus
? FocusScope.of(context).requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Scaffold(
key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
appBar: AppBar( automaticallyImplyLeading: false,
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, leading: FlutterFlowIconButton(
automaticallyImplyLeading: false, borderColor: Colors.transparent,
leading: FlutterFlowIconButton( borderRadius: 30.0,
borderColor: Colors.transparent, borderWidth: 1.0,
borderRadius: 30.0, buttonSize: 60.0,
borderWidth: 1.0, icon: Icon(
buttonSize: 60.0, Icons.keyboard_arrow_left,
icon: Icon( color: FlutterFlowTheme.of(context).primaryText,
Icons.keyboard_arrow_left, size: 30.0,
color: FlutterFlowTheme.of(context).primaryText,
size: 30.0,
),
onPressed: () async {
context.pop();
},
), ),
title: Text( onPressed: () async {
FFLocalizations.of(context).getText( context.pop();
'megskb6s' /* Cadastro Visitante */, },
),
style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: FlutterFlowTheme.of(context).headlineMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 15.0,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).headlineMediumFamily),
),
),
actions: const [],
centerTitle: true,
elevation: 0.0,
), ),
body: SafeArea( title: Text(
top: true, FFLocalizations.of(context).getText(
child: Align( 'megskb6s' /* Cadastro Visitante */,
alignment: const AlignmentDirectional(0.0, 1.0),
child: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(0.0),
bottomRight: Radius.circular(0.0),
topLeft: Radius.circular(25.0),
topRight: Radius.circular(25.0),
),
),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Builder(
builder: (context) {
if ((_model.uploadedLocalFile.bytes?.isNotEmpty ??
false)) {
return InkWell(
splashColor: Colors.transparent,
focusColor: Colors.transparent,
hoverColor: Colors.transparent,
highlightColor: Colors.transparent,
onTap: () async {
setState(() {
_model.isDataUploading = false;
_model.uploadedLocalFile = FFUploadedFile(
bytes: Uint8List.fromList([]));
});
},
child: ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child: Image.memory(
_model.uploadedLocalFile.bytes ??
Uint8List.fromList([]),
width: 300.0,
height: 200.0,
fit: BoxFit.cover,
),
),
);
} else {
return Stack(
children: [
Align(
alignment: const AlignmentDirectional(0.01, 0.0),
child: FFButtonWidget(
onPressed: () async {
final selectedMedia =
await selectMediaWithSourceBottomSheet(
context: context,
maxWidth: 300.00,
maxHeight: 300.00,
imageQuality: 0,
allowPhoto: true,
includeDimensions: true,
);
if (selectedMedia != null &&
selectedMedia.every((m) =>
validateFileFormat(
m.storagePath, context))) {
setState(
() => _model.isDataUploading = true);
var selectedUploadedFiles =
<FFUploadedFile>[];
try {
showUploadMessage(
context,
'Uploading file...',
showLoading: true,
);
selectedUploadedFiles = selectedMedia
.map((m) => FFUploadedFile(
name: m.storagePath
.split('/')
.last,
bytes: m.bytes,
height: m.dimensions?.height,
width: m.dimensions?.width,
blurHash: m.blurHash,
))
.toList();
} finally {
ScaffoldMessenger.of(context)
.hideCurrentSnackBar();
_model.isDataUploading = false;
}
if (selectedUploadedFiles.length ==
selectedMedia.length) {
setState(() {
_model.uploadedLocalFile =
selectedUploadedFiles.first;
});
showUploadMessage(context, 'Success!');
} else {
setState(() {});
showUploadMessage(
context, 'Failed to upload data');
return;
}
}
},
text: '',
icon: Icon(
Icons.photo_camera,
color: FlutterFlowTheme.of(context).accent1,
size: 30.0,
),
options: FFButtonOptions(
width: 300.0,
height: 80.0,
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 0.0),
iconPadding: const EdgeInsetsDirectional.fromSTEB(
14.0, 0.0, 0.0, 20.0),
color: FlutterFlowTheme.of(context)
.primaryBackground,
textStyle: FlutterFlowTheme.of(context)
.titleSmall
.override(
fontFamily:
FlutterFlowTheme.of(context)
.titleSmallFamily,
color: FlutterFlowTheme.of(context)
.primaryText,
fontSize: 16.0,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.titleSmallFamily),
),
borderSide: BorderSide(
color:
FlutterFlowTheme.of(context).accent1,
width: 0.5,
),
borderRadius: BorderRadius.circular(8.0),
),
),
),
Align(
alignment: const AlignmentDirectional(0.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 50.0, 0.0, 0.0),
child: Text(
FFLocalizations.of(context).getText(
'p4ftwxcy' /* Clique para adicionar a foto p... */,
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
color: FlutterFlowTheme.of(context)
.primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
],
);
}
},
),
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 30.0, 0.0, 15.0),
child: Text(
FFLocalizations.of(context).getText(
'zazj5d8b' /* Preencha o formulário com os d... */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController1,
focusNode: _model.textFieldFocusNode1,
autofocus: false,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'v7g73yik' /* Nome */,
),
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.person,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
maxLines: null,
keyboardType: TextInputType.name,
validator: _model.textController1Validator
.asValidator(context),
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController2,
focusNode: _model.textFieldFocusNode2,
autofocus: false,
textCapitalization: TextCapitalization.none,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'rl8tvwnr' /* Documento */,
),
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.document_scanner,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
validator: _model.textController2Validator
.asValidator(context),
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 10.0),
child: Container(
width: MediaQuery.sizeOf(context).width * 0.95,
decoration: const BoxDecoration(),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 7.0),
child: Text(
FFLocalizations.of(context).getText(
'yp23q90m' /* Selecione o tipo: */,
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
0.0, 0.0, 0.0, 5.0),
child: FlutterFlowDropDown<String>(
controller: _model.dropDownValueController ??=
FormFieldController<String>(null),
options: [
FFLocalizations.of(context).getText(
'n8vddmcq' /* Visitante */,
),
FFLocalizations.of(context).getText(
'9luaa09e' /* Prestador de Serviço */,
)
],
onChanged: (val) =>
setState(() => _model.dropDownValue = val),
width: 200.0,
height: 44.0,
textStyle: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
color: FlutterFlowTheme.of(context)
.primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
hintText: FFLocalizations.of(context).getText(
'pmezihb4' /* Selecione... */,
),
icon: Icon(
Icons.keyboard_arrow_down_rounded,
color:
FlutterFlowTheme.of(context).primaryText,
size: 24.0,
),
elevation: 2.0,
borderColor:
FlutterFlowTheme.of(context).customColor6,
borderWidth: 0.5,
borderRadius: 8.0,
margin: const EdgeInsetsDirectional.fromSTEB(
16.0, 0.0, 16.0, 0.0),
hidesUnderline: true,
isOverButton: true,
isSearchable: false,
isMultiSelect: false,
),
),
]
.divide(const SizedBox(width: 19.0))
.addToStart(const SizedBox(width: 30.0)),
),
),
),
Align(
alignment: const AlignmentDirectional(-1.0, 0.0),
child: Padding(
padding: const EdgeInsetsDirectional.fromSTEB(
20.0, 0.0, 0.0, 15.0),
child: Text(
FFLocalizations.of(context).getText(
'bqpucwh0' /* Contatos */,
),
textAlign: TextAlign.start,
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.bodyMediumFamily,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
),
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController3,
focusNode: _model.textFieldFocusNode3,
autofocus: false,
textInputAction: TextInputAction.next,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'h84ls2r6' /* Telefone */,
),
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.phone,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
validator: _model.textController3Validator
.asValidator(context),
),
),
Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0),
child: TextFormField(
controller: _model.textController4,
focusNode: _model.textFieldFocusNode4,
autofocus: false,
textInputAction: TextInputAction.done,
obscureText: false,
decoration: InputDecoration(
isDense: true,
labelText: FFLocalizations.of(context).getText(
'fqp7qmka' /* Email */,
),
labelStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
hintStyle: FlutterFlowTheme.of(context)
.labelMedium
.override(
fontFamily: FlutterFlowTheme.of(context)
.labelMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.labelMediumFamily),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).customColor6,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).primary,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: FlutterFlowTheme.of(context).error,
width: 0.5,
),
borderRadius: BorderRadius.circular(10.0),
),
suffixIcon: Icon(
Icons.email,
color: FlutterFlowTheme.of(context).accent1,
),
),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily:
FlutterFlowTheme.of(context).bodyMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context)
.bodyMediumFamily),
),
keyboardType: TextInputType.emailAddress,
validator: _model.textController4Validator
.asValidator(context),
),
),
Align(
alignment: const AlignmentDirectional(0.0, 1.0),
child: Padding(
padding:
const EdgeInsetsDirectional.fromSTEB(0.0, 65.0, 0.0, 0.0),
child: FFButtonWidget(
onPressed: () async {
if (((_model.uploadedLocalFile.bytes
?.isNotEmpty ??
false)) &&
(_model.textController1.text != '') &&
(_model.dropDownValue != null &&
_model.dropDownValue != '') &&
(_model.textController2.text != '')) {
_model.imgBase64 =
await actions.convertImageFileToBase64(
_model.uploadedLocalFile,
);
_model.scheduleVisitor =
await PhpGroup.postScheduleVisitorCall.call(
devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID,
cliID: FFAppState().cliUUID,
atividade: 'putVisitante',
documento: '7654553234232342',
nome: 'Test',
tipo: 'V',
foto: 'base64;jpeg,klajsalkjslkajslkajl',
);
if (PhpGroup.postScheduleVisitorCall.error(
(_model.scheduleVisitor?.jsonBody ?? ''),
) ==
false) {
setState(() {
_model.textController1?.clear();
_model.textController2?.clear();
_model.textController3?.clear();
_model.textController4?.clear();
});
setState(() {
_model.dropDownValueController?.reset();
});
} else {
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
enableDrag: false,
context: context,
builder: (context) {
return GestureDetector(
onTap: () => _model
.unfocusNode.canRequestFocus
? FocusScope.of(context)
.requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Padding(
padding:
MediaQuery.viewInsetsOf(context),
child: ThrowExceptionWidget(
msg:
'\\devUUID=${FFAppState().devUUID}\\userUUID=${FFAppState().userUUID}\\cliID=${FFAppState().cliUUID}\\Documento=${_model.textController2.text}\\Nome=${_model.textController1.text}\\dropdown${_model.dropDownValue}\\${PhpGroup.postScheduleVisitorCall.errorMsg(
(_model.scheduleVisitor?.jsonBody ??
''),
)}',
),
),
);
},
).then((value) => safeSetState(() {}));
}
} else {
await showModalBottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
enableDrag: false,
context: context,
builder: (context) {
return GestureDetector(
onTap: () => _model
.unfocusNode.canRequestFocus
? FocusScope.of(context)
.requestFocus(_model.unfocusNode)
: FocusScope.of(context).unfocus(),
child: Padding(
padding: MediaQuery.viewInsetsOf(context),
child: ThrowExceptionWidget(
msg:
'Você esqueceu de adicionar algum dado obrigatório. Verifique se a imagem, nome, tipo e documento estão foram preenchidos corretamente.- devUUID=${FFAppState().devUUID}- userUUID=${FFAppState().userUUID}- cliID=${FFAppState().cliUUID}- Documento=${_model.textController2.text}- Nome=${_model.textController1.text}- Tipo=${_model.dropDownValue}',
),
),
);
},
).then((value) => safeSetState(() {}));
}
setState(() {});
},
text: FFLocalizations.of(context).getText(
'okbw0aiu' /* Cadastrar */,
),
options: FFButtonOptions(
width: 250.0,
height: 36.0,
padding: const EdgeInsetsDirectional.fromSTEB(
80.0, 0.0, 80.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: FlutterFlowTheme.of(context)
.titleSmallFamily,
color: FlutterFlowTheme.of(context).info,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap()
.containsKey(FlutterFlowTheme.of(context)
.titleSmallFamily),
),
borderSide: const BorderSide(
color: Colors.transparent,
width: 30.0,
),
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(15.0),
bottomRight: Radius.circular(15.0),
topLeft: Radius.circular(15.0),
topRight: Radius.circular(15.0),
),
),
),
),
),
]
.divide(const SizedBox(height: 10.0))
.addToStart(const SizedBox(height: 30.0)),
),
),
),
), ),
style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: FlutterFlowTheme.of(context).headlineMediumFamily,
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 15.0,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).headlineMediumFamily),
),
), ),
actions: const [],
centerTitle: true,
elevation: 0.0,
), ),
body: const SafeArea(
top: true,
child: RegisiterVistorTemplateComponentWidget(
source: 'RegisterVisitorPage',
)),
); );
} }
} }

View File

@ -1,12 +1,14 @@
import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/flutter_flow/form_field_controller.dart'; import 'package:hub/flutter_flow/form_field_controller.dart';
import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/flutter_flow/request_manager.dart'; import 'package:hub/flutter_flow/request_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart'; import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart';
import 'package:intl/intl.dart';
class ScheduleCompleteVisitPageModel class ScheduleCompleteVisitPageModel
extends FlutterFlowModel<ScheduleCompleteVisitPageWidget> { extends FlutterFlowModel<ScheduleCompleteVisitPageWidget> {
@ -38,6 +40,18 @@ class ScheduleCompleteVisitPageModel
visitorJsonList[index] = updateFn(visitorJsonList[index]); visitorJsonList[index] = updateFn(visitorJsonList[index]);
String visitorStrList = '0'; String visitorStrList = '0';
bool? dropDownValidator1;
bool? dropDownValidator2;
bool isValid() {
if ((textController1!.text != '') &&
(textController2!.text != '') &&
(dropDownValue1 != null && dropDownValue1 != '') &&
(dropDownValue2 != null && dropDownValue2 != '')) {
return true;
}
return false;
}
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
@ -51,15 +65,78 @@ class ScheduleCompleteVisitPageModel
FocusNode? textFieldFocusNode1; FocusNode? textFieldFocusNode1;
TextEditingController? textController1; TextEditingController? textController1;
String? Function(BuildContext, String?)? textController1Validator; String? Function(BuildContext, String?)? textController1Validator;
String? _textController1Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required.',
ptText: 'Este campo é obrigatório.',
);
}
if (val != null) {
try {
DateTime startDate = DateFormat('d/M/y H:mm:ss').parse(val);
DateTime endDate =
DateFormat('d/M/y H:mm:ss').parse(textController2!.text);
if (startDate.isAfter(endDate)) {
return FFLocalizations.of(context).getVariableText(
ptText: 'A data de início deve ser anterior à data de término.',
enText: 'Start date must be before end date.',
);
}
if (startDate.isBefore(DateTime.now())) {
return FFLocalizations.of(context).getVariableText(
enText: 'Start date must be after current date.',
ptText: 'A data de início deve ser posterior à data atual.',
);
}
} catch (e) {
return '$e';
}
}
return null;
}
DateTime? datePicked1; DateTime? datePicked1;
// State field(s) for TextField widget. // State field(s) for TextField widget.
FocusNode? textFieldFocusNode2; FocusNode? textFieldFocusNode2;
TextEditingController? textController2; TextEditingController? textController2;
String? Function(BuildContext, String?)? textController2Validator; String? Function(BuildContext, String?)? textController2Validator;
String? _textController2Validator(BuildContext context, String? val) {
if (val == null || val.isEmpty) {
return FFLocalizations.of(context).getVariableText(
enText: 'This field is required.',
ptText: 'Este campo é obrigatório.',
);
}
if (val != null) {
try {
DateTime endDate = DateFormat('d/M/y H:mm:ss').parse(val);
DateTime startDate =
DateFormat('d/M/y H:mm:ss').parse(textController1!.text);
if (endDate.isBefore(startDate)) {
return FFLocalizations.of(context).getVariableText(
enText: 'End date must be after start date.',
ptText: 'A data de término deve ser posterior à data de início.',
);
}
if (endDate.isBefore(DateTime.now())) {
return FFLocalizations.of(context).getVariableText(
enText: 'End date must be after current date.',
ptText: 'A data de término deve ser posterior à data atual.',
);
}
} catch (e) {
return '$e';
}
}
return null;
}
DateTime? datePicked2; DateTime? datePicked2;
// State field(s) for DropDown widget. // State field(s) for DropDown widget.
String? dropDownValue1; String? dropDownValue1;
FormFieldController<String>? dropDownValueController1; FormFieldController<String>? dropDownValueController1;
// State field(s) for DropDown widget. // State field(s) for DropDown widget.
String? dropDownValue2; String? dropDownValue2;
FormFieldController<String>? dropDownValueController2; FormFieldController<String>? dropDownValueController2;
@ -69,9 +146,35 @@ class ScheduleCompleteVisitPageModel
FocusNode? textFieldFocusNode3; FocusNode? textFieldFocusNode3;
TextEditingController? textController3; TextEditingController? textController3;
String? Function(BuildContext, String?)? textController3Validator; String? Function(BuildContext, String?)? textController3Validator;
String? _textController3Validator(BuildContext context, String? val) {
// if (val == null || val.isEmpty) {
// return FFLocalizations.of(context).getVariableText(
// enText: 'This field is required.',
// ptText: 'Este campo é obrigatório.',
// );
// }
return null;
}
@override @override
void initState(BuildContext context) {} void initState(BuildContext context) {
tabBarController = TabController(
vsync: Navigator.of(context),
length: 2,
);
textFieldFocusNode1 = FocusNode();
textController1 = TextEditingController();
textController1Validator = _textController1Validator;
textFieldFocusNode2 = FocusNode();
textController2 = TextEditingController();
textController2Validator = _textController2Validator;
textFieldFocusNode3 = FocusNode();
textController3 = TextEditingController();
textController3Validator = _textController3Validator;
}
@override @override
void dispose() { void dispose() {

View File

@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../../flutter_flow/flutter_flow_theme.dart';
import '../../../flutter_flow/flutter_flow_util.dart';
class AtomTermsOfUse extends StatelessWidget {
const AtomTermsOfUse({super.key});
@override
Widget build(BuildContext context) {
return InkWell(
child: Text(
FFLocalizations.of(context).getText(
'olf967cj' /* Termo de Uso */,
),
style: FlutterFlowTheme.of(context)
.bodyMedium
.override(
fontFamily:
FlutterFlowTheme.of(context)
.bodyMediumFamily,
color:
FlutterFlowTheme.of(context)
.primaryText,
fontSize: 14.0,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts
.asMap()
.containsKey(
FlutterFlowTheme.of(
context)
.bodyMediumFamily),
),
),
onTap: () => launchURL('https://freaccess.com.br/pp'),
);
}
}

View File

@ -0,0 +1,5 @@
enum EnumThrowException {
success,
error,
warning
}

View File

@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/shared/enums/enum_throw_exception.dart';
class DialogUtil {
static const double _height = 350;
static Future<dynamic> errorDefault(BuildContext context) {
return error(context, FFLocalizations.of(context).getVariableText(
ptText: "Falha ao efetuar operação, Tente Novamente mais tarde.",
enText: "Failed to perform operation, please try again later."
));
}
static Future<dynamic> error(BuildContext context, String message) async {
return await showDialog(
context: context,
builder: (context) {
return Dialog(
child: SizedBox(
height: _height,
child: Padding(padding: MediaQuery.viewInsetsOf(context), child: ThrowExceptionWidget(msg: message, type: EnumThrowException.error))
)
);
}
);
}
static Future<dynamic> warning(BuildContext context, String message) async {
return await showDialog(
context: context,
builder: (context) {
return Dialog(
child: SizedBox(
height: _height,
child: Padding(padding: MediaQuery.viewInsetsOf(context), child: ThrowExceptionWidget(msg: message, type: EnumThrowException.warning))
)
);
}
);
}
static Future<dynamic> success(BuildContext context, String message) async {
return await showDialog(
context: context,
builder: (context) {
return Dialog(
child: SizedBox(
height: _height,
child: Padding(padding: MediaQuery.viewInsetsOf(context), child: ThrowExceptionWidget(msg: message, type: EnumThrowException.success))
)
);
}
);
}
}

View File

@ -0,0 +1,15 @@
import 'dart:developer';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:hub/backend/api_requests/api_calls.dart';
class LogUtil {
static void requestAPIFailed(String url, String body, String reason, dynamic error, StackTrace stack) async {
FirebaseCrashlytics.instance.setCustomKey('URL', "${PhpGroup.getBaseUrl()}/$url");
FirebaseCrashlytics.instance.setCustomKey('Body', body);
await FirebaseCrashlytics.instance.recordError(error, stack, reason: reason);
}
}

View File

@ -0,0 +1,10 @@
class ValidatorUtil {
static bool isValidEmail(String email) {
if (RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email)) {
return true;
} else {
return false;
}
}
}

View File

@ -345,6 +345,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.17.2" version: "2.17.2"
firebase_crashlytics:
dependency: "direct main"
description:
name: firebase_crashlytics
sha256: ad7510d9bcf1f40fc895944942f553a4c5603acb4715c0d6386dd587f82f6ae5
url: "https://pub.dev"
source: hosted
version: "4.0.1"
firebase_crashlytics_platform_interface:
dependency: transitive
description:
name: firebase_crashlytics_platform_interface
sha256: "318589f1da3bb858872002fa20170234566f0fb080669a8256c85a81513a802a"
url: "https://pub.dev"
source: hosted
version: "3.6.37"
firebase_messaging: firebase_messaging:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -107,6 +107,7 @@ dependencies:
flutter_riverpod: ^2.5.1 flutter_riverpod: ^2.5.1
qr_flutter: ^4.1.0 qr_flutter: ^4.1.0
permission_handler: ^11.3.1 permission_handler: ^11.3.1
firebase_crashlytics: ^4.0.1
dependency_overrides: dependency_overrides:
http: 1.2.1 http: 1.2.1