import 'dart:developer'; import 'package:flutter/material.dart'; // import 'package:hub/components/organisms/bottom_arrow_linked_locals/bottom_arrow_linked_locals_component_widget.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/molecular_components/option_selection_modal/option_selection_modal_widget.dart'; import 'package:hub/custom_code/actions/get_dev_u_u_i_d.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/random_data_util.dart'; import 'package:hub/shared/helpers/db_helper.dart'; import 'package:hub/shared/utils/dialog_util.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:share_plus/share_plus.dart'; import 'package:url_launcher/url_launcher.dart'; import '../shared/utils/log_util.dart'; Future openTermsOfUse(BuildContext context) async { final Uri url = Uri.parse('https://freaccess.com.br/pp/'); if (!await launchUrl(url)) { throw Exception('Could not launch $url'); } } Future repeatVisitScheduleAction( BuildContext context, { List? visitorJsonList, String? visitorStrList, String? visitStartDateStr, String? visitEndDateStr, String? visitReasonStr, String? visitLevelStr, bool? visitTempBol, String? visitObsStr, }) async { context.go( '/scheduleCompleteVisitPage', extra: { 'visitStartDateStr': visitStartDateStr, 'visitEndDateStr': visitEndDateStr, 'visitReasonStr': visitReasonStr, 'visitLevelStr': visitLevelStr, 'visitTempBol': visitTempBol, 'visitObsStr': visitObsStr, 'visitorStrList': visitorStrList, 'visitorJsonList': visitorJsonList, }, ); } Future manageStatusColorAction( BuildContext context, { required String? visitStatusStr, }) async { if (visitStatusStr == 'A') { return FlutterFlowTheme.of(context).success; } else if ((visitStatusStr == 'C') || (visitStatusStr == 'F') || (visitStatusStr == 'B') || (visitStatusStr == 'I')) { return FlutterFlowTheme.of(context).error; } return FlutterFlowTheme.of(context).warning; } Future signInLoginAction( BuildContext context, FlutterFlowModel model, { String? emailAdress, String? password, }) async { try { final ApiCallResponse? response; final DatabaseHelper db = DatabaseHelper(); final LoginCall callback = PhpGroup.loginCall; AppState().deviceDescription = randomString( 10, 10, true, false, false, ); final String? devUUID; final String userUUID; final String status; final String userDevUUID; final String userName; final String email; final String passwd; final bool isLogged; email = emailAdress!; passwd = password!; devUUID = await getDevUUID(); if ((email != '') && (passwd != '')) { AppState().email = email; AppState().passwd = passwd; response = await callback.call(); if (response.jsonBody['error'] == false) { userUUID = response.jsonBody['uid']; status = response.jsonBody['user']['status']; userDevUUID = response.jsonBody['user']['dev_id']; userName = response.jsonBody['user']['name']; db.update('devUUID', devUUID, 'user'); db.update('userUUID', userUUID, 'user'); db.update('userDevUUID', userDevUUID, 'user'); db.update('status', status, 'user'); db.update('userName', userName, 'user'); isLogged = true; await checkLocals(context: context, model: model).then((value) { AppState().haveLocal = value; AppState().isLogged = isLogged; AppState().update(() {}); toggleApp(context); }); } else { if (response.jsonBody['error'] == null) { DialogUtil.errorDefault(context); } else { DialogUtil.error(context, response.jsonBody['error_msg'].toString()); } } } return; } catch (e, s) { DialogUtil.errorDefault(context); LogUtil.requestAPIFailed( 'login.php', emailAdress.toString(), "Login", e, s); } } Future signUpRegisterAction( BuildContext context, { required String? name, String? passwd, required String? email, String? device, }) async { try { ApiCallResponse? response; if ((email != null && email != '') && (passwd != null && passwd != '' && passwd.length > 7) && (name != null && name != '')) { response = await PhpGroup.registerCall.call( name: name, password: passwd, email: email, token: randomString( 36, 36, false, false, true, ), uuid: randomString( 36, 36, false, false, true, ), tipo: device, descricao: randomString( 36, 36, true, false, false, ), ); if (response.jsonBody['error'] == false) { return true; } DialogUtil.error(context, response.jsonBody['error_msg']); return false; } else { DialogUtil.errorDefault(context); return false; } } catch (e, s) { DialogUtil.errorDefault(context); LogUtil.requestAPIFailed( 'registro.php', email.toString(), "Register", e, s); return false; } } Future forgotPasswdAction( BuildContext context, { required String? email, }) async { ApiCallResponse? response; ForgotPasswordCall callback = PhpGroup.forgotPasswordCall; response = await PhpGroup.forgotPasswordCall.call( email: email, ); if (response.jsonBody['error'] != false) { return; } } Future toggleSignInPage(BuildContext context) async { context.go( '/signInPage', extra: { kTransitionInfoKey: const TransitionInfo( hasTransition: true, transitionType: PageTransitionType.fade, ), }, ); } Future toggleSignUpPage(BuildContext context) async { context.go( '/signUpPage', extra: { kTransitionInfoKey: const TransitionInfo( hasTransition: true, transitionType: PageTransitionType.fade, ), }, ); } Future toggleApp(BuildContext context) async { final haveLocal = AppState().haveLocal; if (haveLocal == true) { context.go('/homePage'); } else if (haveLocal == false) { context.go( '/receptionPage', extra: { kTransitionInfoKey: const TransitionInfo( hasTransition: true, transitionType: PageTransitionType.fade, ) }, ); } } Future visitCancelAction(BuildContext context, {required int? idDestino, required int? idVisita, required String? accessKey, required String? email}) async { final ApiCallResponse? response; final CancelaVisita callback = PhpGroup.cancelaVisita; response = await callback.call( idDestino: idDestino, idVisita: idVisita, AccessKey: accessKey, UsuEmail: email, DevDesc: '', ); if (response.statusCode == 200) { return !response.jsonBody['error']; } else { return false; } } Future snackbar(BuildContext context, {required bool opt}) async { ScaffoldMessenger.of(context).showSnackBar( SnackBar( elevation: 10, margin: const EdgeInsets.all(50), content: Center( child: Text( opt ? FFLocalizations.of(context).getText('asjd2q3k2j4l21') : FFLocalizations.of(context).getText('asda2e42fafa'), style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.normal, color: FlutterFlowTheme.of(context).info, ), ), ), backgroundColor: opt ? FlutterFlowTheme.of(context).success.withOpacity(0.5) : FlutterFlowTheme.of(context).error.withOpacity(0.5), duration: const Duration(seconds: 3), behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), ), ); } Future checkLocals({ String? cliUUID, required BuildContext context, required FlutterFlowModel model, }) async { final GetLocalsCall callback = PhpGroup.getLocalsCall; final response = await callback.call(); if (response.jsonBody['error']) { DialogUtil.errorDefault(context); return false; } List locals = response.jsonBody['locais'] ?? []; if (locals.isEmpty) { return false; } else { return true; } } Future showShare(payload) async { final DatabaseHelper db = DatabaseHelper(); final cliName = await db .get(key: 'cliName', field: 'value') .then((value) => value.toString()); final cliUUID = await db .get(key: 'cliUUID', field: 'value') .then((value) => value.toString()); for (var i = 0; i < payload['convites'].length; i++) { await Share.share(''' Olá, \*${payload['convites'][i]['VTE_NOME']}\*! Você foi convidado para \*$cliName\*. \*Validade do Convite\*: - Início: ${payload['convites'][i]['VAW_DTINICIO']} - Fim: ${payload['convites'][i]['VAW_DTFIM']} URL do Convite: https://visita.freaccess.com.br/${payload['convites'][i]['VAW_ID']}/$cliUUID/${payload['convites'][i]['VAW_CHAVE']} '''); } } Future answersRequest( {required BuildContext context, required String? ref, required String? task, required String? response, required String? id}) async { final ApiCallResponse? respondeSolicitacaoCall; final RespondeSolicitacaoCall callback = PhpGroup.respondeSolicitacaoCall; respondeSolicitacaoCall = await callback.call( referencia: ref, tarefa: task, resposta: response, idVisitante: id, ); if (respondeSolicitacaoCall.statusCode == 200) { return !respondeSolicitacaoCall.jsonBody['error']; } else { return false; } } Future changeStatusAction( BuildContext context, int idDestino, int idVisita, String accessKey, String email, ) async { // Navigator.pop(context, true); context.pop(true); bool? blockVisitRequest; blockVisitRequest = await visitCancelAction( context, accessKey: accessKey, idDestino: idDestino, idVisita: idVisita, email: email, ); if (!context.mounted) return; if (blockVisitRequest == true) { return true; } else { return false; } } /// QR Code Uint8List assembleQRPacket(int direction, String identifier, String password) { List packet = [direction]; String paddedBadge = identifier.padLeft(30, '0'); for (var i = 0; i < paddedBadge.length; i += 2) { packet.add(int.parse(paddedBadge.substring(i, i + 2), radix: 16)); } DateTime now = DateTime.now(); int year = now.year % 100; int month = now.month; int day = now.day; int hour = now.hour; int minute = now.minute; int sum = year + month + day + hour + minute; if (sum == int.parse('0D', radix: 16) || sum == int.parse('0A', radix: 16)) { packet.add(int.parse('FF', radix: 16)); } else { packet.add(sum); } String paddedPassword = password.length != 4 ? 'FFFF' : password; for (var i = 0; i < paddedPassword.length; i += 2) { packet.add(int.parse(paddedPassword.substring(i, i + 2), radix: 16)); } int check = 0x00; for (var b in packet) { check ^= b; } if (check == int.parse('0D', radix: 16) || check == int.parse('0A', radix: 16)) { packet.add(int.parse('FF', radix: 16)); } else { packet.add(check); } var bytes = packet.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join((' ')); return Uint8List.fromList(packet); } Uint8List hexStringToByteArray(String s) { int len = s.length; Uint8List data = Uint8List(len ~/ 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)); } return data; } String byteToHexa(Uint8List pDados) { return pDados .map((byte) => byte.toRadixString(16).padLeft(2, '0').toUpperCase()) .join(); } Future byteToString(Uint8List bytes) async { return String.fromCharCodes(bytes); } Widget buildQrCode( { // required String data, // required String type, // required int version, // required int maskPattern, required int errorCorrectLevel, required double dimension, required String identifier, required String pass, required int direction}) { try { const Color backgroundColor = Colors.white; 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); } catch (e) { return Text("Erro ao gerar QR Code: ${e.toString()}"); } } Future scheduleVisitOptAction(BuildContext context) async { await showAdaptiveDialog( context: context, builder: (context) { return Padding( padding: MediaQuery.viewInsetsOf(context), child: OptionSelectionModalWidget( routesListStr: [ 'scheduleCompleteVisitPage', 'scheduleProvisionalVisitPage', 'fastPassPage', ], iconsListIcon: [ Icons.date_range_rounded, Icons.date_range_rounded, Icons.date_range_rounded, ], nameListStr: [ FFLocalizations.of(context).getVariableText( ptText: 'Visita\nCompleta', enText: 'Complete\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.go( '/registerVisitorPage', extra: { kTransitionInfoKey: const TransitionInfo( hasTransition: true, transitionType: PageTransitionType.scale, alignment: Alignment.bottomCenter, ), }, ); } Future peopleOnThePropertyAction(BuildContext context) async { context.go( '/peopleOnThePropertyPage', extra: { kTransitionInfoKey: const TransitionInfo( hasTransition: true, transitionType: PageTransitionType.fade, ), }, ); } Future preferencesSettings(BuildContext context) async { context.go( '/preferencesSettings', extra: { 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: [ 'liberationHistory', 'acessHistoryPage', 'scheduleCompleteVisitPage', // 'messageHistoryPage', ], iconsListIcon: [ Icons.history_rounded, Icons.history_rounded, Icons.history_rounded, // Icons.history_rounded, ], nameListStr: [ 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.go( '/qrCodePage', extra: { kTransitionInfoKey: const TransitionInfo( hasTransition: true, transitionType: PageTransitionType.scale, alignment: Alignment.bottomCenter, ), }, ); } enum status { active, unknown, canceled, finished, blocked, inactive } status? getStatus(dynamic data) { switch (data) { case 'A': return status.active; case 'F': return status.finished; case 'B': return status.blocked; case 'C': return status.canceled; case 'I': return status.inactive; default: return status.unknown; } }