diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart deleted file mode 100644 index d4953428..00000000 --- a/lib/actions/actions.dart +++ /dev/null @@ -1,650 +0,0 @@ -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; - } -} diff --git a/lib/backend/notifications/notification_service.dart b/lib/backend/notifications/notification_service.dart index 424cdb2a..32398ec5 100644 --- a/lib/backend/notifications/notification_service.dart +++ b/lib/backend/notifications/notification_service.dart @@ -3,7 +3,8 @@ import 'dart:developer'; import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:hub/actions/actions.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; import 'package:hub/components/templates_components/message_notificaion_modal_template_component/message_notification_widget.dart'; @@ -23,6 +24,28 @@ Future onMessageReceived( final cliUUID = await db .get(key: 'cliUUID', field: 'value') .then((value) => value.toString()); + 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; + } + } switch (handleClick) { case 'visit_request': diff --git a/lib/components/atomic_components/shared_components_atoms/custom_input.dart b/lib/components/atomic_components/shared_components_atoms/custom_input.dart index 608f60af..b9878f1c 100644 --- a/lib/components/atomic_components/shared_components_atoms/custom_input.dart +++ b/lib/components/atomic_components/shared_components_atoms/custom_input.dart @@ -58,6 +58,7 @@ class _CustomInputUtilState extends State { controller: widget.controller, autovalidateMode: AutovalidateMode.onUserInteraction, validator: widget.validator, + cursorColor: FlutterFlowTheme.of(context).primary, autofocus: widget.autoFocus, focusNode: widget.focusNode, onChanged: (value) { diff --git a/lib/components/templates_components/details_component/details_component_action.dart b/lib/components/templates_components/details_component/details_component_action.dart index 6cf56968..48dbabee 100644 --- a/lib/components/templates_components/details_component/details_component_action.dart +++ b/lib/components/templates_components/details_component/details_component_action.dart @@ -3,7 +3,6 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -import 'package:hub/actions/actions.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; import 'package:hub/custom_code/actions/convert_to_upload_file.dart'; @@ -13,6 +12,7 @@ import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/form_field_controller.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/pages/pets_page/pets_page_model.dart'; +import 'package:hub/shared/mixins/status_mixin.dart'; import 'package:hub/shared/utils/validator_util.dart'; import 'package:share_plus/share_plus.dart'; @@ -28,7 +28,8 @@ Widget buildVisitDetails({ }) { return DetailsComponentWidget( buttons: [ - if (getStatus(item['VAW_STATUS']) == status.active) // REJECT ACTION + if (Status.getStatus(item['VAW_STATUS']) == + StatusEnum.active) // REJECT ACTION FFButtonWidget( text: FFLocalizations.of(context).getVariableText( ptText: 'Cancelar', @@ -105,7 +106,8 @@ Widget buildVisitDetails({ // borderRadius: 12, ), ), - if (getStatus(item['VAW_STATUS']) != status.active) // RECALL ACTION + if (Status.getStatus(item['VAW_STATUS']) != + StatusEnum.active) // RECALL ACTION FFButtonWidget( text: FFLocalizations.of(context).getVariableText( ptText: 'Reagendar', @@ -138,7 +140,8 @@ Widget buildVisitDetails({ // borderRadius: 12, ), ), - if (getStatus(item['VAW_STATUS']) == status.active) // SHARE ACTION + if (Status.getStatus(item['VAW_STATUS']) == + StatusEnum.active) // SHARE ACTION FFButtonWidget( text: FFLocalizations.of(context).getVariableText( ptText: 'Compartilhar', @@ -189,42 +192,42 @@ URL do Convite: https://visita.freaccess.com.br/${item['VAW_ID']}/${cliUUID}/${i imagePath: 'https://freaccess.com.br/freaccess/getImage.php?cliID=${cliUUID}&atividade=getFoto&Documento=${item['VTE_DOCUMENTO'] ?? ''}&tipo=E', statusHashMap: [ - if (getStatus(item['VAW_STATUS']) == status.active) + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.active) Map.from({ FFLocalizations.of(context).getVariableText( ptText: 'Ativo', enText: 'Active', ): FlutterFlowTheme.of(context).warning, }), - if (getStatus(item['VAW_STATUS']) == status.unknown) + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.unknown) Map.from({ FFLocalizations.of(context).getVariableText( ptText: 'Pendente', enText: 'Pending', ): FlutterFlowTheme.of(context).alternate, }), - if (getStatus(item['VAW_STATUS']) == status.canceled) + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.canceled) Map.from({ FFLocalizations.of(context).getVariableText( ptText: 'Cancelado', enText: 'Canceled', ): FlutterFlowTheme.of(context).error, }), - if (getStatus(item['VAW_STATUS']) == status.finished) + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.finished) Map.from({ FFLocalizations.of(context).getVariableText( ptText: 'Finalizado', enText: 'Finished', ): FlutterFlowTheme.of(context).success, }), - if (getStatus(item['VAW_STATUS']) == status.blocked) + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.blocked) Map.from({ FFLocalizations.of(context).getVariableText( ptText: 'Bloqueado', enText: 'Blocked', ): FlutterFlowTheme.of(context).error, }), - if (getStatus(item['VAW_STATUS']) == status.inactive) + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.inactive) Map.from({ FFLocalizations.of(context).getVariableText( ptText: 'Inativo', @@ -238,8 +241,6 @@ URL do Convite: https://visita.freaccess.com.br/${item['VAW_ID']}/${cliUUID}/${i Widget buildPetDetails({ required dynamic item, required BuildContext context, - required Future Function(BuildContext, int, int, String, String) - changeStatusAction, required String devUUID, required String userUUID, required String cliUUID, diff --git a/lib/components/templates_components/provisional_schedule_template/provisional_shcedule_template_widget.dart b/lib/components/templates_components/provisional_schedule_template/provisional_shcedule_template_widget.dart index f68c3264..68f8a91f 100644 --- a/lib/components/templates_components/provisional_schedule_template/provisional_shcedule_template_widget.dart +++ b/lib/components/templates_components/provisional_schedule_template/provisional_shcedule_template_widget.dart @@ -250,6 +250,9 @@ class _ScheduleProvisionalVisitPageWidgetState model.personNameTextController, focusNode: model.personNameFocusNode, + cursorColor: + FlutterFlowTheme.of(context) + .primary, onChanged: (_) => EasyDebounce.debounce( 'model.personNameTextController', @@ -261,7 +264,7 @@ class _ScheduleProvisionalVisitPageWidgetState TextInputAction.next, obscureText: false, decoration: InputDecoration( - isDense: false, + isDense: true, labelText: FFLocalizations.of(context) .getText( @@ -402,6 +405,9 @@ class _ScheduleProvisionalVisitPageWidgetState model.dateTimeTextController, focusNode: model.dateTimeFocusNode, + cursorColor: + FlutterFlowTheme.of(context) + .primary, onChanged: (_) => EasyDebounce.debounce( 'model.dateTimeTextController', @@ -413,7 +419,7 @@ class _ScheduleProvisionalVisitPageWidgetState autofocus: false, obscureText: false, decoration: InputDecoration( - isDense: false, + isDense: true, labelText: FFLocalizations.of(context) .getText( @@ -738,11 +744,16 @@ class _ScheduleProvisionalVisitPageWidgetState focusNode: model.notesFocusNode, autofocus: false, + showCursor: true, + cursorColor: + FlutterFlowTheme.of( + context) + .primary, textInputAction: TextInputAction.next, obscureText: false, decoration: InputDecoration( - isDense: false, + isDense: true, labelText: FFLocalizations.of( context) diff --git a/lib/components/templates_components/qr_code_pass_key_template_component/qr_code_pass_key_template_component_widget.dart b/lib/components/templates_components/qr_code_pass_key_template_component/qr_code_pass_key_template_component_widget.dart index dd902f7c..cc89233e 100644 --- a/lib/components/templates_components/qr_code_pass_key_template_component/qr_code_pass_key_template_component_widget.dart +++ b/lib/components/templates_components/qr_code_pass_key_template_component/qr_code_pass_key_template_component_widget.dart @@ -170,6 +170,7 @@ class _QrCodePassKeyTemplateComponentWidgetState child: TextFormField( controller: _model.keyTextFieldTextController, focusNode: _model.keyTextFieldFocusNode, + cursorColor: FlutterFlowTheme.of(context).primary, onChanged: (_) => EasyDebounce.debounce( '_model.keyTextFieldTextController', const Duration(milliseconds: 2000), @@ -271,7 +272,6 @@ class _QrCodePassKeyTemplateComponentWidgetState maxLength}) => null, keyboardType: TextInputType.number, - cursorColor: FlutterFlowTheme.of(context).primary, validator: _model.keyTextFieldTextControllerValidator .asValidator(context), inputFormatters: [ diff --git a/lib/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart b/lib/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart index 1d97bbf3..3abfdf48 100644 --- a/lib/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart +++ b/lib/components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart @@ -171,6 +171,7 @@ class _RegisiterVistorTemplateComponentWidgetState TextFormField( controller: _model.textController2, focusNode: _model.textFieldFocusNode2, + cursorColor: FlutterFlowTheme.of(context).primary, autovalidateMode: AutovalidateMode.onUserInteraction, autofocus: true, textCapitalization: TextCapitalization.none, @@ -307,6 +308,7 @@ class _RegisiterVistorTemplateComponentWidgetState child: TextFormField( controller: _model.textController1, autovalidateMode: AutovalidateMode.onUserInteraction, + cursorColor: FlutterFlowTheme.of(context).primary, focusNode: _model.textFieldFocusNode1, onChanged: (_) => EasyDebounce.debounce( '_model.textFieldFocusNode1', @@ -661,6 +663,7 @@ class _RegisiterVistorTemplateComponentWidgetState child: TextFormField( controller: _model.textController3, focusNode: _model.textFieldFocusNode3, + cursorColor: FlutterFlowTheme.of(context).primary, autovalidateMode: AutovalidateMode.onUserInteraction, autofocus: false, textInputAction: TextInputAction.next, @@ -749,6 +752,7 @@ class _RegisiterVistorTemplateComponentWidgetState 24.0, 0.0, 24.0, 0.0), child: TextFormField( controller: _model.textController4, + cursorColor: FlutterFlowTheme.of(context).primary, focusNode: _model.textFieldFocusNode4, autovalidateMode: AutovalidateMode.onUserInteraction, autofocus: true, diff --git a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart index 165de263..4869dc1f 100644 --- a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart +++ b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart @@ -1,4 +1,12 @@ +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/backend/api_requests/api_manager.dart'; +import 'package:hub/custom_code/actions/get_dev_u_u_i_d.dart'; +import 'package:hub/flutter_flow/nav/nav.dart'; +import 'package:hub/flutter_flow/random_data_util.dart'; import 'package:hub/pages/home_page/home_page_model.dart'; +import 'package:hub/shared/helpers/db_helper.dart'; +import 'package:hub/shared/utils/dialog_util.dart'; +import 'package:hub/shared/utils/log_util.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'sign_in_template_component_widget.dart' @@ -48,6 +56,120 @@ class SignInTemplateComponentModel return null; } + 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 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 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, + ) + }, + ); + } + } + @override void initState(BuildContext context) { emailAddressTextControllerValidator = _emailAddressTextControllerValidator; diff --git a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart index bebc5c10..945fa394 100644 --- a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart +++ b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart @@ -8,7 +8,6 @@ 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 '/actions/actions.dart' as action_blocks; 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_theme.dart'; @@ -241,6 +240,10 @@ class _SignInTemplateComponentWidgetState .emailAddressTextController, focusNode: _model .emailAddressFocusNode, + cursorColor: + FlutterFlowTheme.of( + context) + .primary, onChanged: (_) => EasyDebounce.debounce( '_model.emailAddressTextController', @@ -382,6 +385,10 @@ class _SignInTemplateComponentWidgetState child: TextFormField( controller: _model .passwordTextController, + cursorColor: + FlutterFlowTheme.of( + context) + .primary, focusNode: _model.passwordFocusNode, onChanged: (_) => @@ -549,7 +556,7 @@ class _SignInTemplateComponentWidgetState onPressed: _isFormInvalid() ? null : () async { - await action_blocks + await _model .signInLoginAction( context, _model, @@ -709,7 +716,7 @@ class _SignInTemplateComponentWidgetState ? null : () async { try { - await action_blocks + await _model .signInLoginAction( context, _model, diff --git a/lib/components/templates_components/sign_up_template_component/sign_up_template_component_model.dart b/lib/components/templates_components/sign_up_template_component/sign_up_template_component_model.dart index 370ff262..57fc1e84 100644 --- a/lib/components/templates_components/sign_up_template_component/sign_up_template_component_model.dart +++ b/lib/components/templates_components/sign_up_template_component/sign_up_template_component_model.dart @@ -1,3 +1,9 @@ +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/backend/api_requests/api_manager.dart'; +import 'package:hub/flutter_flow/random_data_util.dart'; +import 'package:hub/shared/utils/dialog_util.dart'; +import 'package:hub/shared/utils/log_util.dart'; + import '/flutter_flow/flutter_flow_util.dart'; import 'sign_up_template_component_widget.dart' show SignUpTemplateComponentWidget; @@ -93,4 +99,62 @@ class SignUpTemplateComponentModel passwordRegisterFormFocusNode?.dispose(); passwordRegisterFormTextController?.dispose(); } + + 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; + } + } } diff --git a/lib/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart b/lib/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart index ecc3ab07..fe35911d 100644 --- a/lib/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart +++ b/lib/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart @@ -7,7 +7,6 @@ import 'package:hub/shared/components/atoms/atom_terms_of_use.dart'; import 'package:hub/shared/utils/validator_util.dart'; import 'package:provider/provider.dart'; -import '/actions/actions.dart' as action_blocks; import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; @@ -690,9 +689,8 @@ class _SignUpTemplateComponentWidgetState ? null : () async { var shouldSetState = false; - _model.signUp = - await action_blocks - .signUpRegisterAction( + _model.signUp = await _model + .signUpRegisterAction( context, name: _model .nameRegisterFormTextController diff --git a/lib/custom_code/actions/convert_to_upload_file.dart b/lib/custom_code/actions/convert_to_upload_file.dart index e72f0efe..709be7ad 100644 --- a/lib/custom_code/actions/convert_to_upload_file.dart +++ b/lib/custom_code/actions/convert_to_upload_file.dart @@ -1,7 +1,6 @@ // Automatic FlutterFlow imports import '/backend/schema/structs/index.dart'; import '/backend/schema/enums/enums.dart'; -import '/actions/actions.dart' as action_blocks; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'index.dart'; // Imports other custom actions @@ -14,7 +13,6 @@ import 'dart:convert'; // Import for base64 decoding import 'dart:io'; // Import for file operations import 'package:path_provider/path_provider.dart'; // Import for temporary directory - Future convertToUploadFile(String img) async { // Decode the base64 string into bytes Uint8List bytes = base64.decode(img); @@ -30,4 +28,4 @@ Future convertToUploadFile(String img) async { bytes: bytes, name: 'image.jpg', ); -} \ No newline at end of file +} diff --git a/lib/custom_code/actions/get_dev_u_u_i_d.dart b/lib/custom_code/actions/get_dev_u_u_i_d.dart index 3e70fa5d..1be7def9 100644 --- a/lib/custom_code/actions/get_dev_u_u_i_d.dart +++ b/lib/custom_code/actions/get_dev_u_u_i_d.dart @@ -1,7 +1,6 @@ import '/backend/schema/structs/index.dart'; import 'dart:developer'; import '/backend/schema/enums/enums.dart'; -import '/actions/actions.dart' as action_blocks; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'index.dart'; // Imports other custom actions diff --git a/lib/custom_code/widgets/image_cropper.dart b/lib/custom_code/widgets/image_cropper.dart index 9b79b434..36cefae4 100644 --- a/lib/custom_code/widgets/image_cropper.dart +++ b/lib/custom_code/widgets/image_cropper.dart @@ -1,7 +1,6 @@ // // Automatic FlutterFlow imports // import '/backend/schema/structs/index.dart'; // import '/backend/schema/enums/enums.dart'; -// import '/actions/actions.dart' as action_blocks; // import '/flutter_flow/flutter_flow_theme.dart'; // import '/flutter_flow/flutter_flow_util.dart'; // import 'index.dart'; // Imports other custom widgets diff --git a/lib/pages/liberation_history/liberation_history_model.dart b/lib/pages/liberation_history/liberation_history_model.dart index 7eb11c14..493b34e9 100644 --- a/lib/pages/liberation_history/liberation_history_model.dart +++ b/lib/pages/liberation_history/liberation_history_model.dart @@ -1,3 +1,4 @@ +import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/request_manager.dart'; @@ -49,6 +50,29 @@ class LiberationHistoryModel extends FlutterFlowModel { .then((value) => value.toString()); } + 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; + } + } + @override void dispose() { unfocusNode.dispose(); diff --git a/lib/pages/liberation_history/liberation_history_widget.dart b/lib/pages/liberation_history/liberation_history_widget.dart index ebaa4be7..42bda80d 100644 --- a/lib/pages/liberation_history/liberation_history_widget.dart +++ b/lib/pages/liberation_history/liberation_history_widget.dart @@ -2,7 +2,6 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:hub/actions/actions.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; @@ -234,7 +233,7 @@ class _LiberationHistoryWidgetState extends State { ), icon: const Icon(Icons.done), onPressed: () async { - answersRequest + _model.answersRequest .call( context: context, ref: liberationHistoryItem['NOT_ID'].toString(), @@ -286,7 +285,7 @@ class _LiberationHistoryWidgetState extends State { ), icon: const Icon(Icons.close), onPressed: () async { - return answersRequest + return _model.answersRequest .call( context: context, ref: liberationHistoryItem['NOT_ID'].toString(), diff --git a/lib/pages/pets_page/pets_history_screen.dart b/lib/pages/pets_page/pets_history_screen.dart index fbabbb47..18ff3e77 100644 --- a/lib/pages/pets_page/pets_history_screen.dart +++ b/lib/pages/pets_page/pets_history_screen.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:hub/actions/actions.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_action.dart'; @@ -267,7 +266,6 @@ class _PetsHistoryScreenState extends State child: buildPetDetails( item: uItem, context: context, - changeStatusAction: changeStatusAction, devUUID: devUUID, userUUID: userUUID, cliUUID: cliUUID, diff --git a/lib/pages/pets_page/pets_page_widget.dart b/lib/pages/pets_page/pets_page_widget.dart index 4132f447..e704d5a6 100644 --- a/lib/pages/pets_page/pets_page_widget.dart +++ b/lib/pages/pets_page/pets_page_widget.dart @@ -309,6 +309,8 @@ class _PetsPageWidgetState extends State child: TextFormField( controller: _model.textControllerData, focusNode: _model.textFieldFocusData, + cursorColor: + FlutterFlowTheme.of(context).primary, readOnly: true, autovalidateMode: AutovalidateMode.onUserInteraction, @@ -772,6 +774,8 @@ class _PetsPageWidgetState extends State child: TextFormField( controller: _model.textControllerData, focusNode: _model.textFieldFocusData, + cursorColor: + FlutterFlowTheme.of(context).primary, readOnly: true, autovalidateMode: AutovalidateMode.onUserInteraction, diff --git a/lib/pages/qr_code_page/qr_code_page_model.dart b/lib/pages/qr_code_page/qr_code_page_model.dart index da5b873a..bfe62ece 100644 --- a/lib/pages/qr_code_page/qr_code_page_model.dart +++ b/lib/pages/qr_code_page/qr_code_page_model.dart @@ -1,8 +1,10 @@ import 'dart:async'; +import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/pages/qr_code_page/qr_code_page_widget.dart'; import 'package:hub/shared/helpers/db_helper.dart'; +import 'package:qr_flutter/qr_flutter.dart'; class QrCodePageModel extends FlutterFlowModel { /// Local state fields for this page. @@ -39,6 +41,100 @@ class QrCodePageModel extends FlutterFlowModel { unfocusNode.dispose(); } + 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 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()}"); + } + } + /// Action blocks. Future qrCodeEncoder( BuildContext context, { diff --git a/lib/pages/qr_code_page/qr_code_page_widget.dart b/lib/pages/qr_code_page/qr_code_page_widget.dart index 0b6e3f29..c2aae8b3 100644 --- a/lib/pages/qr_code_page/qr_code_page_widget.dart +++ b/lib/pages/qr_code_page/qr_code_page_widget.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:hub/actions/actions.dart'; import 'package:hub/components/templates_components/qr_code_pass_key_template_component/qr_code_pass_key_template_component_widget.dart'; import 'package:hub/flutter_flow/custom_functions.dart'; import 'package:hub/flutter_flow/flutter_flow_animations.dart'; @@ -146,7 +145,7 @@ class _QrCodePageWidgetState extends State ? await _showBiometricsAuth(context) : await _showQrCodeBottomSheet(context); }, - child: buildQrCode( + child: _model.buildQrCode( dimension: dimension, errorCorrectLevel: QrErrorCorrectLevel.M, identifier: _model.userDevUUID, diff --git a/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart b/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart index 9e0ae402..625efa57 100644 --- a/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart +++ b/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart @@ -5,7 +5,6 @@ import 'package:flutter/scheduler.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:hub/actions/actions.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/atomic_components/shared_components_atoms/toast.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; @@ -21,6 +20,7 @@ import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart'; import 'package:hub/pages/visit_history_page/visit_history_page_widget.dart'; import 'package:hub/shared/utils/dialog_util.dart'; +import 'package:hub/shared/utils/share_util.dart'; import 'package:provider/provider.dart'; class ScheduleCompleteVisitPageWidget extends StatefulWidget { @@ -1500,6 +1500,7 @@ Widget scheduleVisit(BuildContext context, controller: _model.textController3, focusNode: _model.textFieldFocusNode3, autofocus: false, + cursorColor: FlutterFlowTheme.of(context).primary, textInputAction: TextInputAction.next, obscureText: false, decoration: InputDecoration( @@ -1640,7 +1641,7 @@ Widget scheduleVisit(BuildContext context, gravity: ToastGravity.TOP, backgroundColor: Colors.green); - await showShare(value.jsonBody); + await ShareUtil.showShare(value.jsonBody); } else { await DialogUtil.errorDefault(context); context.pop(); diff --git a/lib/pages/sign_in_page/sign_in_page_widget.dart b/lib/pages/sign_in_page/sign_in_page_widget.dart index 23b13170..ecb7180d 100644 --- a/lib/pages/sign_in_page/sign_in_page_widget.dart +++ b/lib/pages/sign_in_page/sign_in_page_widget.dart @@ -1,12 +1,13 @@ +import 'package:hub/shared/mixins/switcher_mixin.dart'; + import '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import '/actions/actions.dart' as action_blocks; import 'package:flutter/material.dart'; import 'sign_in_page_model.dart'; export 'sign_in_page_model.dart'; -class SignInPageWidget extends StatefulWidget { +class SignInPageWidget extends StatefulWidget with Switcher { const SignInPageWidget({super.key}); @override @@ -48,7 +49,7 @@ class _SignInPageWidgetState extends State { updateOnChange: true, child: SignInTemplateComponentWidget( toggleSignUpPage: () async { - await action_blocks.toggleSignUpPage(context); + await Switcher.toggleSignUpPage(context); }, ), ), @@ -56,4 +57,4 @@ class _SignInPageWidgetState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/pages/sign_up_page/sign_up_page_widget.dart b/lib/pages/sign_up_page/sign_up_page_widget.dart index 8d68605b..4af08b3a 100644 --- a/lib/pages/sign_up_page/sign_up_page_widget.dart +++ b/lib/pages/sign_up_page/sign_up_page_widget.dart @@ -1,12 +1,13 @@ +import 'package:hub/shared/mixins/switcher_mixin.dart'; + import '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import '/actions/actions.dart' as action_blocks; import 'package:flutter/material.dart'; import 'sign_up_page_model.dart'; export 'sign_up_page_model.dart'; -class SignUpPageWidget extends StatefulWidget { +class SignUpPageWidget extends StatefulWidget with Switcher { const SignUpPageWidget({super.key}); @override @@ -48,7 +49,7 @@ class _SignUpPageWidgetState extends State { updateOnChange: true, child: SignUpTemplateComponentWidget( toggleSignInPage: () async { - await action_blocks.toggleSignInPage(context); + await Switcher.toggleSignInPage(context); setState(() {}); }, ), @@ -57,4 +58,4 @@ class _SignUpPageWidgetState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/pages/visit_history_page/visit_history_page_model.dart b/lib/pages/visit_history_page/visit_history_page_model.dart index 8b137891..574a33e3 100644 --- a/lib/pages/visit_history_page/visit_history_page_model.dart +++ b/lib/pages/visit_history_page/visit_history_page_model.dart @@ -1 +1,67 @@ +import 'package:flutter/src/widgets/framework.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/backend/api_requests/api_manager.dart'; +import 'package:hub/flutter_flow/flutter_flow_model.dart'; +import 'package:hub/flutter_flow/nav/nav.dart'; +import 'package:hub/pages/visit_history_page/visit_history_page_widget.dart'; +class VisitHistoryModel extends FlutterFlowModel { + @override + void dispose() { + // TODO: implement dispose + } + + @override + void initState(BuildContext context) { + // TODO: implement initState + } + + 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; + } + } + + 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; + } + } +} diff --git a/lib/pages/visit_history_page/visit_history_page_widget.dart b/lib/pages/visit_history_page/visit_history_page_widget.dart index 45072dfb..f7773f11 100644 --- a/lib/pages/visit_history_page/visit_history_page_widget.dart +++ b/lib/pages/visit_history_page/visit_history_page_widget.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:hub/actions/actions.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_action.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart'; +import 'package:hub/pages/visit_history_page/visit_history_page_model.dart'; import 'package:hub/shared/helpers/db_helper.dart'; +import 'package:hub/shared/mixins/status_mixin.dart'; import 'package:hub/shared/utils/dialog_util.dart'; import 'package:hub/shared/utils/log_util.dart'; import 'package:hub/shared/utils/validator_util.dart'; @@ -19,7 +20,7 @@ class VisitHistoryWidget extends StatefulWidget { } class _VisitHistoryWidgetState extends State - with TickerProviderStateMixin { + with TickerProviderStateMixin, Status { final DatabaseHelper db = DatabaseHelper(); late final String devUUID; late final String userUUID; @@ -29,6 +30,7 @@ class _VisitHistoryWidgetState extends State final int _pageSize = 10; bool _hasData = false; bool _loading = false; + late VisitHistoryModel _model; late Future _visitFuture; List _visitWrap = []; @@ -48,6 +50,8 @@ class _VisitHistoryWidgetState extends State @override void initState() { super.initState(); + + _model = createModel(context, () => VisitHistoryModel()); _initVariables(); _visitFuture = _fetchVisits(); @@ -200,42 +204,47 @@ class _VisitHistoryWidgetState extends State : '', }, statusHashMap: [ - if (getStatus(visitaWrapItem['VAW_STATUS']) == status.active) + if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == StatusEnum.active) { FFLocalizations.of(context).getVariableText( ptText: 'Ativo', enText: 'Active', ): FlutterFlowTheme.of(context).warning, }, - if (getStatus(visitaWrapItem['VAW_STATUS']) == status.finished) + if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == + StatusEnum.finished) { FFLocalizations.of(context).getVariableText( ptText: 'Finalizado', enText: 'Finished', ): FlutterFlowTheme.of(context).success, }, - if (getStatus(visitaWrapItem['VAW_STATUS']) == status.unknown) + if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == + StatusEnum.unknown) { FFLocalizations.of(context).getVariableText( ptText: 'Desconhecido', enText: 'Unknown', ): FlutterFlowTheme.of(context).alternate, }, - if (getStatus(visitaWrapItem['VAW_STATUS']) == status.canceled) + if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == + StatusEnum.canceled) { FFLocalizations.of(context).getVariableText( ptText: 'Cancelado', enText: 'Canceled', ): FlutterFlowTheme.of(context).error, }, - if (getStatus(visitaWrapItem['VAW_STATUS']) == status.blocked) + if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == + StatusEnum.blocked) { FFLocalizations.of(context).getVariableText( ptText: 'Bloqueado', enText: 'Blocked', ): FlutterFlowTheme.of(context).error, }, - if (getStatus(visitaWrapItem['VAW_STATUS']) == status.inactive) + if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == + StatusEnum.inactive) { FFLocalizations.of(context).getVariableText( ptText: 'Inativo', @@ -266,7 +275,7 @@ class _VisitHistoryWidgetState extends State child: buildVisitDetails( item: visitaWrapItem, context: context, - changeStatusAction: changeStatusAction, + changeStatusAction: _model.changeStatusAction, devUUID: devUUID, userUUID: userUUID, cliUUID: cliUUID, diff --git a/lib/pages/welcome_page/welcome_page_widget.dart b/lib/pages/welcome_page/welcome_page_widget.dart index 9df3c31b..6b74a753 100644 --- a/lib/pages/welcome_page/welcome_page_widget.dart +++ b/lib/pages/welcome_page/welcome_page_widget.dart @@ -1,14 +1,15 @@ +import 'package:hub/shared/mixins/switcher_mixin.dart'; + import '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import '/actions/actions.dart' as action_blocks; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; import 'welcome_page_model.dart'; export 'welcome_page_model.dart'; -class WelcomePageWidget extends StatefulWidget { +class WelcomePageWidget extends StatefulWidget with Switcher { const WelcomePageWidget({super.key}); @override @@ -66,10 +67,10 @@ class _WelcomePageWidgetState extends State { updateOnChange: true, child: WelcomeTemplateComponentWidget( toggleSignUpPage: () async { - await action_blocks.toggleSignUpPage(context); + await Switcher.toggleSignUpPage(context); }, toggleSignInPage: () async { - await action_blocks.toggleSignInPage(context); + await Switcher.toggleSignInPage(context); }, ), ), diff --git a/lib/shared/mixins/status_mixin.dart b/lib/shared/mixins/status_mixin.dart new file mode 100644 index 00000000..8167f449 --- /dev/null +++ b/lib/shared/mixins/status_mixin.dart @@ -0,0 +1,20 @@ +enum StatusEnum { active, unknown, canceled, finished, blocked, inactive } + +mixin Status { + static StatusEnum? getStatus(dynamic data) { + switch (data) { + case 'A': + return StatusEnum.active; + case 'F': + return StatusEnum.finished; + case 'B': + return StatusEnum.blocked; + case 'C': + return StatusEnum.canceled; + case 'I': + return StatusEnum.inactive; + default: + return StatusEnum.unknown; + } + } +} diff --git a/lib/shared/mixins/switcher_mixin.dart b/lib/shared/mixins/switcher_mixin.dart new file mode 100644 index 00000000..ef0ed7e2 --- /dev/null +++ b/lib/shared/mixins/switcher_mixin.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:hub/flutter_flow/flutter_flow_util.dart'; +import 'package:hub/flutter_flow/nav/nav.dart'; + +mixin Switcher { + static Future toggleSignInPage(BuildContext context) async { + context.go( + '/signInPage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + } + + static Future toggleSignUpPage(BuildContext context) async { + context.go( + '/signUpPage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + } +} diff --git a/lib/shared/utils/share_util.dart b/lib/shared/utils/share_util.dart new file mode 100644 index 00000000..bfcb1cec --- /dev/null +++ b/lib/shared/utils/share_util.dart @@ -0,0 +1,26 @@ +import 'package:hub/shared/helpers/db_helper.dart'; +import 'package:share_plus/share_plus.dart'; + +class ShareUtil { + static 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']} + '''); + } + } +}