From 8d829ca9977f18d299ef3124738c3467d72061de Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Fri, 20 Sep 2024 15:13:42 -0300 Subject: [PATCH] save for fd-374 --- .../card_item_template_component_widget.dart | 2 +- .../details_component_action.dart | 415 ------------------ lib/flutter_flow/flutter_flow_drop_down.dart | 2 + lib/flutter_flow/nav/nav.dart | 24 +- .../acess_history_page_model.dart | 137 +----- .../acess_history_page_widget.dart | 243 +++++----- lib/pages/pets_page/pets_history_screen.dart | 3 +- lib/pages/pets_page/pets_page_model.dart | 181 ++++++++ .../schedule_complete_visit_page_model.dart | 405 +++++++++++++++-- .../schedule_complete_visit_page_widget.dart | 210 +++------ .../visit_history_page_widget.dart | 13 +- .../visit_history_page_model.dart | 67 --- 12 files changed, 741 insertions(+), 961 deletions(-) delete mode 100644 lib/components/templates_components/details_component/details_component_action.dart rename lib/pages/{visit_history_page => schedule_complete_visit_page}/visit_history_page_widget.dart (95%) delete mode 100644 lib/pages/visit_history_page/visit_history_page_model.dart diff --git a/lib/components/templates_components/card_item_template_component/card_item_template_component_widget.dart b/lib/components/templates_components/card_item_template_component/card_item_template_component_widget.dart index 7dfc1d7f..01386be5 100644 --- a/lib/components/templates_components/card_item_template_component/card_item_template_component_widget.dart +++ b/lib/components/templates_components/card_item_template_component/card_item_template_component_widget.dart @@ -98,7 +98,7 @@ class _CardItemTemplateComponentWidgetState } Widget _generateImage() { - // CachedNetworkImage.evictFromCache(widget.imagePath ?? ''); + CachedNetworkImage.evictFromCache(widget.imagePath ?? ''); return ClipRRect( borderRadius: BorderRadius.circular(20), child: CachedNetworkImage( diff --git a/lib/components/templates_components/details_component/details_component_action.dart b/lib/components/templates_components/details_component/details_component_action.dart deleted file mode 100644 index d4c2d9a3..00000000 --- a/lib/components/templates_components/details_component/details_component_action.dart +++ /dev/null @@ -1,415 +0,0 @@ -import 'dart:convert'; -import 'dart:developer'; - -import 'package:flutter/material.dart'; -import 'package:http/http.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/flutter_flow/flutter_flow_theme.dart'; -import 'package:hub/flutter_flow/flutter_flow_util.dart'; -import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; -import 'package:hub/flutter_flow/form_field_controller.dart'; -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'; - -Widget buildVisitDetails({ - required dynamic item, - required BuildContext context, - required Future Function(BuildContext, int, int, String, String) - changeStatusAction, - required String devUUID, - required String userUUID, - required String cliUUID, - required String cliName, -}) { - return DetailsComponentWidget( - buttons: [ - if (Status.getStatus(item['VAW_STATUS']) == - StatusEnum.active) // REJECT ACTION - FFButtonWidget( - text: FFLocalizations.of(context).getVariableText( - ptText: 'Cancelar', - enText: 'Cancel', - ), - icon: const Icon(Icons.close), - onPressed: () async { - showAlertDialog( - context, - FFLocalizations.of(context).getVariableText( - ptText: 'Cancelar Visita', - enText: 'Cancel Visit', - ), - FFLocalizations.of(context).getVariableText( - ptText: 'Você tem certeza que deseja bloquear essa visita?', - enText: 'Are you sure you want to block this visit?', - ), () async { - await changeStatusAction - ?.call( - context, - int.parse(item['VAW_DESTINO']), - int.parse(item['VAW_ID']), - item['VAW_CHAVE'] ?? '', - item['VTE_DOCUMENTO'] ?? '', - ) - .then((value) { - // Navigator.pop(context, value); - context.pop(value); - - if (value == false) { - showSnackbar( - context, - FFLocalizations.of(context).getVariableText( - enText: 'Error blocking visit', - ptText: 'Erro ao bloquear visita', - ), - true, - ); - } else if (value == true) { - showSnackbar( - context, - FFLocalizations.of(context).getVariableText( - enText: 'Success canceling visit', - ptText: 'Succeso ao cancelar visita', - ), - false, - ); - } - }).catchError((err, stack) { - context.pop(); - showSnackbar( - context, - FFLocalizations.of(context).getVariableText( - enText: 'Error blocking visit', - ptText: 'Erro ao bloquear visita', - ), - true, - ); - }); - }); - }, - options: FFButtonOptions( - width: 130, - height: 40, - color: FlutterFlowTheme.of(context).primaryBackground, - elevation: 0, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context).primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).primaryBackground, - width: 1, - ), - // borderRadius: 12, - ), - ), - if (Status.getStatus(item['VAW_STATUS']) != - StatusEnum.active) // RECALL ACTION - FFButtonWidget( - text: FFLocalizations.of(context).getVariableText( - ptText: 'Reagendar', - enText: 'Reschedule', - ), - icon: const Icon(Icons.refresh), - onPressed: () async { - context.pop(); - context.pop(); - - context.pushNamed('scheduleCompleteVisitPage', extra: { - 'dropdownValue1': item['MOT_DESCRICAO'], - 'dropdownValue2': item['NAC_DESCRICAO'], - 'visitorJsonList': [item], - 'visitorStrList': item['VTE_DOCUMENTO'], - }); - }, - options: FFButtonOptions( - width: 130, - height: 40, - color: FlutterFlowTheme.of(context).primaryBackground, - elevation: 0, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context).primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).primaryBackground, - width: 1, - ), - // borderRadius: 12, - ), - ), - if (Status.getStatus(item['VAW_STATUS']) == - StatusEnum.active) // SHARE ACTION - FFButtonWidget( - text: FFLocalizations.of(context).getVariableText( - ptText: 'Compartilhar', - enText: 'Share', - ), - icon: const Icon(Icons.share), - onPressed: () async { - Share.share(''' -Olá, \*${item['VTE_NOME']}\*! Você foi convidado para \*${cliName}\*. - -\*Validade do Convite\*: -- Início: ${item['VAW_DTINICIO']} -- Fim: ${item['VAW_DTFIM']} - -URL do Convite: https://visita.freaccess.com.br/${item['VAW_ID']}/${cliUUID}/${item['VAW_CHAVE']} - '''); - }, - options: FFButtonOptions( - width: 130, - height: 40, - color: FlutterFlowTheme.of(context).primaryBackground, - elevation: 0, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context).primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).primaryBackground, - width: 1, - ), - // borderRadius: 12, - ), - ), - ], - labelsHashMap: Map.from({ - '${FFLocalizations.of(context).getVariableText(ptText: "Nome", enText: "Name")}:': - item['VTE_NOME'] ?? '', - '${FFLocalizations.of(context).getVariableText(ptText: "Inicio", enText: "Start")}:': - item['VAW_DTINICIO'] != '' && item['VAW_DTINICIO'] != null - ? ValidatorUtil.toLocalDateTime( - 'yyyy-MM-dd HH:mm:ss', item['VAW_DTINICIO']) - : '', - '${FFLocalizations.of(context).getVariableText(ptText: "Fim", enText: "End")}:': - item['VAW_DTFIM'] != '' && item['VAW_DTFIM'] != null - ? ValidatorUtil.toLocalDateTime( - 'yyyy-MM-dd HH:mm:ss', item['VAW_DTFIM']) - : '', - }), - imagePath: - 'https://freaccess.com.br/freaccess/getImage.php?cliID=${cliUUID}&atividade=getFoto&Documento=${item['VTE_DOCUMENTO'] ?? ''}&tipo=E', - statusHashMap: [ - if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.active) - Map.from({ - FFLocalizations.of(context).getVariableText( - ptText: 'Ativo', - enText: 'Active', - ): FlutterFlowTheme.of(context).warning, - }), - if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.unknown) - Map.from({ - FFLocalizations.of(context).getVariableText( - ptText: 'Pendente', - enText: 'Pending', - ): FlutterFlowTheme.of(context).alternate, - }), - if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.canceled) - Map.from({ - FFLocalizations.of(context).getVariableText( - ptText: 'Cancelado', - enText: 'Canceled', - ): FlutterFlowTheme.of(context).error, - }), - if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.finished) - Map.from({ - FFLocalizations.of(context).getVariableText( - ptText: 'Finalizado', - enText: 'Finished', - ): FlutterFlowTheme.of(context).success, - }), - if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.blocked) - Map.from({ - FFLocalizations.of(context).getVariableText( - ptText: 'Bloqueado', - enText: 'Blocked', - ): FlutterFlowTheme.of(context).error, - }), - if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.inactive) - Map.from({ - FFLocalizations.of(context).getVariableText( - ptText: 'Inativo', - enText: 'Inactive', - ): FlutterFlowTheme.of(context).warning, - }), - ], - ); -} - -Widget buildPetDetails({ - required dynamic item, - required BuildContext context, - required String devUUID, - required String userUUID, - required String cliUUID, - required String cliName, - required PetsPageModel model, -}) { - return DetailsComponentWidget( - buttons: [ - // EDIT ACTION - FFButtonWidget( - text: FFLocalizations.of(context).getVariableText( - ptText: 'Editar', - enText: 'Edit', - ), - icon: const Icon(Icons.edit), - onPressed: () async { - context.pop(); - - model.isEditing = true; - model.item = item; - model.switchTab(0); - model.setEditForm(); - // model.safeSetState!(); - }, - options: FFButtonOptions( - width: 130, - height: 40, - color: FlutterFlowTheme.of(context).primaryBackground, - elevation: 0, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context).primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).primaryBackground, - width: 1, - ), - // borderRadius: 12, - ), - ), - - // DELETE ACTION - FFButtonWidget( - text: FFLocalizations.of(context).getVariableText( - ptText: 'Excluir', - enText: 'Delete', - ), - icon: const Icon(Icons.close), - onPressed: () async { - showAlertDialog( - context, - FFLocalizations.of(context).getVariableText( - ptText: 'Excluir Pet', - enText: 'Delete Pet', - ), - FFLocalizations.of(context).getVariableText( - ptText: 'Você tem certeza que deseja excluir esse pet?', - enText: 'Are you sure you want to delete this pet?', - ), () async { - int id = item['id']; - await PhpGroup.deletePet - .call( - petID: id, - ) - .then((value) { - // Navigator.pop(context, value); - context.pop(value); - context.pop(value); - - if (value == false) { - showSnackbar( - context, - FFLocalizations.of(context).getVariableText( - ptText: 'Erro ao excluir pet', - enText: 'Error deleting pet', - ), - true, - ); - } else if (value == true) { - showSnackbar( - context, - FFLocalizations.of(context).getVariableText( - enText: 'Success deleting pet', - ptText: 'Succeso ao excluir pet', - ), - false, - ); - } - }).catchError((err, stack) { - context.pop(); - showSnackbar( - context, - FFLocalizations.of(context).getVariableText( - enText: 'Error deleting pet', - ptText: 'Erro ao excluir pet', - ), - true, - ); - }); - }); - }, - options: FFButtonOptions( - width: 130, - height: 40, - color: FlutterFlowTheme.of(context).primaryBackground, - elevation: 0, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context).primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context).primaryBackground, - width: 1, - ), - // borderRadius: 12, - ), - ), - ], - // 'MIN', 'PEQ', 'MED', 'GRA', 'GIG' - labelsHashMap: Map.from({ - if (item['species'] != null && item['species'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Espécie", enText: "Species")}:': - item['species'].toString().toUpperCase(), - if (item['breed'] != null && item['breed'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Raça", enText: "Breed")}:': - item['breed'].toString().toUpperCase(), - if (item['color'] != null && item['color'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Cor", enText: "Color")}:': - item['color'].toString().toUpperCase(), - if (item['birthdayDate'] != null && item['birthdayDate'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Data de Nascimento", enText: "Date of Birth")}:': - ValidatorUtil.formatDateTimePicker(item['birthdayDate']), - if (item['gender'] != null && item['gender'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Gênero", enText: "Gender")}:': - item['gender'] == 'MAC' - ? FFLocalizations.of(context) - .getVariableText(ptText: 'MACHO', enText: 'MALE') - : FFLocalizations.of(context) - .getVariableText(enText: 'FEMALE', ptText: 'FÊMEA'), - if (item['size'] != null && item['size'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Porte", enText: "Size")}:': - item['size'] == 'MIN' - ? FFLocalizations.of(context) - .getVariableText(ptText: 'MINI', enText: 'MINI') - : item['size'] == 'PEQ' - ? FFLocalizations.of(context) - .getVariableText(ptText: 'PEQUENO', enText: 'SMALL') - : item['size'] == 'MED' - ? FFLocalizations.of(context) - .getVariableText(ptText: 'MÉDIO', enText: 'MEDIUM') - : item['size'] == 'GRD' - ? FFLocalizations.of(context).getVariableText( - ptText: 'GRANDE', enText: 'LARGE') - : item['size'] == 'GIG' - ? FFLocalizations.of(context).getVariableText( - ptText: 'GIGANTE', enText: 'GIANT') - : '', - if (item['notes'] != null && item['notes'] != '') - '${FFLocalizations.of(context).getVariableText(ptText: "Observação", enText: "Notes")}:': - item['notes'] ?? '', - }), - imagePath: - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${devUUID}&userUUID=${userUUID}&cliID=${cliUUID}&atividade=consultaFotoPet&petId=${item['id'] ?? ''}', - statusHashMap: [ - if (item['gender'] == "MAC") - Map.from({ - item['name']: Color(0xFF094CB0), - }), - if (item['gender'] == "FEM") - Map.from({ - item['name']: Color(0xFFE463E7), - }), - ], - ); -} diff --git a/lib/flutter_flow/flutter_flow_drop_down.dart b/lib/flutter_flow/flutter_flow_drop_down.dart index c82ebb61..35831023 100644 --- a/lib/flutter_flow/flutter_flow_drop_down.dart +++ b/lib/flutter_flow/flutter_flow_drop_down.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'form_field_controller.dart'; +import 'package:flutter/material.dart'; + class FlutterFlowDropDown extends StatefulWidget { const FlutterFlowDropDown({ super.key, diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index a10061f8..3947cd2b 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -104,29 +104,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( name: 'scheduleCompleteVisitPage', path: '/scheduleCompleteVisitPage', builder: (context, params) { - final dropdownValue1 = params.getParam( - 'dropdownValue1', - ParamType.String, - ); - final dropdownValue2 = params.getParam( - 'dropdownValue2', - ParamType.String, - ); - final visitorStrList = params.getParam( - 'visitorStrList', - ParamType.String, - ); - final visitorJsonList = params.getParam( - 'visitorJsonList', - ParamType.JSON, - isList: true, - ); - return ScheduleCompleteVisitPageWidget( - dropdownValue1: dropdownValue1 ?? '', - dropdownValue2: dropdownValue2 ?? '', - visitorStrList: visitorStrList ?? '', - visitorJsonList: visitorJsonList ?? [], - ); + return const ScheduleCompleteVisitPageWidget(); }), FFRoute( name: 'deliverySchedule', diff --git a/lib/pages/acess_history_page/acess_history_page_model.dart b/lib/pages/acess_history_page/acess_history_page_model.dart index fcfbb302..ca9a17ad 100644 --- a/lib/pages/acess_history_page/acess_history_page_model.dart +++ b/lib/pages/acess_history_page/acess_history_page_model.dart @@ -1,48 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/components/molecular_components/message_opt_modal/opt_modal_widget.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart'; -import 'package:hub/flutter_flow/flutter_flow_theme.dart'; -import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/request_manager.dart'; import 'package:hub/pages/acess_history_page/acess_history_page_widget.dart'; import 'package:hub/shared/helpers/db_helper.dart'; -import 'package:hub/shared/utils/dialog_util.dart'; -import 'package:hub/shared/utils/log_util.dart'; -import 'package:rxdart/rxdart.dart'; - -class AccessHistoryModel extends FlutterFlowModel { - // Singleton instance - static final AccessHistoryModel _instance = AccessHistoryModel._internal(); - - // Private constructor - AccessHistoryModel._internal() : super(); - - // Factory constructor to return the singleton instance - factory AccessHistoryModel() { - return _instance; - } +class AcessHistoryPageModel extends FlutterFlowModel { final DatabaseHelper db = DatabaseHelper(); late final String devUUID; late final String userUUID; late final String cliUUID; - final BehaviorSubject> selectedTypeSubject; - bool isSubjectClosed = false; - final scaffoldKey = GlobalKey(); - late Function(Function) safeSetState; - - late ScrollController scrollController; - int pageNumber = 1; - final int pageSize = 10; - bool hasData = false; - bool loading = false; - - String personType = '.*'; - - late Future accessFuture; - List accessWrap = []; final unfocusNode = FocusNode(); final _accessHistoryManager = FutureRequestManager(); @@ -62,10 +30,10 @@ class AccessHistoryModel extends FlutterFlowModel { @override void initState(BuildContext context) { - _initAsync(); + initDatabase(); } - Future _initAsync() async { + Future initDatabase() async { devUUID = await db .get(key: 'devUUID', field: 'value') .then((value) => value.toString()); @@ -77,95 +45,11 @@ class AccessHistoryModel extends FlutterFlowModel { .then((value) => value.toString()); } - void _updateAccessHistoryAction( - Map newType, BuildContext context) { - if (!isSubjectClosed) { - final currentType = selectedTypeSubject.value; - final updatedType = Map.from(currentType); - bool needsUpdate = false; - newType.forEach((key, newValue) { - if (currentType[key] != newValue) { - updatedType[key] = newValue; - needsUpdate = true; - } - }); - if (needsUpdate) { - selectedTypeSubject.add(updatedType); - fetchCardListViewService(updatedType, context); - safeSetState?.call(() {}); - } - } - } + @override + void dispose() { + unfocusNode.dispose(); - Future fetchAccessHistoryService( - BuildContext context) async { - try { - safeSetState.call(() => loading = true); - var response = await PhpGroup.getAccessCall.call( - pageSize: pageSize.toString(), - pageNumber: pageNumber.toString(), - pesTipo: personType != 'E' && personType != 'O' ? 'T' : personType, - ); - - final List accessHistory = response.jsonBody['acessos'] ?? []; - - List filteredAccess = accessHistory.where((item) { - final personTypeMatches = - personType == '.*' || item["PES_TIPO"].toString() == personType; - return personTypeMatches; - }).toList(); - - if (filteredAccess != null && filteredAccess.isNotEmpty) { - safeSetState.call(() { - accessWrap.addAll(filteredAccess); - hasData = true; - loading = false; - }); - return response; - } - _showNoMoreDataSnackbar(context); - safeSetState.call(() { - hasData = false; - loading = false; - }); - return null; - } catch (e, s) { - DialogUtil.errorDefault(context); - LogUtil.requestAPIFailed('processRequest', "", "Busca Acesso", e, s); - safeSetState.call(() { - hasData = false; - loading = false; - }); - } - return null; - } - - void _showNoMoreDataSnackbar(BuildContext context) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - FFLocalizations.of(context).getVariableText( - ptText: "Não há mais dados.", enText: "No more data."), - ), - duration: const Duration(seconds: 3), - backgroundColor: FlutterFlowTheme.of(context).primary, - ), - ); - } - - void _loadMoreAccess(BuildContext context) { - if (hasData == true) { - pageNumber++; - accessFuture = fetchAccessHistoryService(context); - } - } - - void fetchCardListViewService( - Map select, BuildContext context) { - personType = select['personType']!; - accessWrap = []; - pageNumber = 1; - accessFuture = fetchAccessHistoryService(context); + clearAccessHistoryCache(); } Future toggleOptionsAction(BuildContext context) async { @@ -187,11 +71,4 @@ class AccessHistoryModel extends FlutterFlowModel { }, ); } - - @override - void dispose() { - unfocusNode.dispose(); - - clearAccessHistoryCache(); - } } diff --git a/lib/pages/acess_history_page/acess_history_page_widget.dart b/lib/pages/acess_history_page/acess_history_page_widget.dart index 4876f91c..854d8eb6 100644 --- a/lib/pages/acess_history_page/acess_history_page_widget.dart +++ b/lib/pages/acess_history_page/acess_history_page_widget.dart @@ -15,7 +15,6 @@ import 'package:hub/shared/utils/log_util.dart'; import 'package:rxdart/rxdart.dart'; @immutable -// ignore: must_be_immutable class AccessHistoryScreen extends StatefulWidget { late Map opt = { 'personType': '.*', @@ -24,13 +23,27 @@ class AccessHistoryScreen extends StatefulWidget { }; AccessHistoryScreen({super.key, required this.opt}); @override - State createState() => _AccessHistoryScreenState(opt); + State createState() => _AccessHistoryState(opt); } -class _AccessHistoryScreenState extends State { - late AccessHistoryModel _model; +class _AccessHistoryState extends State { + late AcessHistoryPageModel _model; + final BehaviorSubject> selectedTypeSubject; + bool _isSubjectClosed = false; + final scaffoldKey = GlobalKey(); - _AccessHistoryScreenState(Map opt) + late ScrollController _scrollController; + int _pageNumber = 1; + final int _pageSize = 10; + bool _hasData = false; + bool _loading = false; + + String _personType = '.*'; + + late Future _accessFuture; + List _accessWrap = []; + + _AccessHistoryState(Map opt) : selectedTypeSubject = BehaviorSubject.seeded(opt) { selectedTypeSubject.listen((value) {}); } @@ -38,13 +51,13 @@ class _AccessHistoryScreenState extends State { @override void initState() { super.initState(); - _model = createModel(context, () => AccessHistoryModel()); - _model.accessFuture = fetchAccessHistoryService(); + _model = createModel(context, () => AcessHistoryPageModel()); + _accessFuture = fetchAccessHistoryService(); - _model.scrollController = ScrollController() + _scrollController = ScrollController() ..addListener(() { - if (_model.scrollController.position.atEdge && - _model.scrollController.position.pixels != 0) { + if (_scrollController.position.atEdge && + _scrollController.position.pixels != 0) { _loadMoreAccess(); } }); @@ -53,7 +66,7 @@ class _AccessHistoryScreenState extends State { @override void dispose() { selectedTypeSubject.close(); - _model.isSubjectClosed = true; + _isSubjectClosed = true; super.dispose(); } @@ -62,7 +75,7 @@ class _AccessHistoryScreenState extends State { final theme = FlutterFlowTheme.of(context); return Scaffold( - key: _model.scaffoldKey, + key: scaffoldKey, backgroundColor: FlutterFlowTheme.of(context).primaryBackground, appBar: _appBar(context, theme), body: _body(context)); @@ -150,13 +163,84 @@ class _AccessHistoryScreenState extends State { ); } + void _updateAccessHistoryAction(Map newType) { + if (!_isSubjectClosed) { + final currentType = selectedTypeSubject.value; + final updatedType = Map.from(currentType); + bool needsUpdate = false; + newType.forEach((key, newValue) { + if (currentType[key] != newValue) { + updatedType[key] = newValue; + needsUpdate = true; + } + }); + if (needsUpdate) { + selectedTypeSubject.add(updatedType); + fetchCardListViewService(updatedType); + safeSetState(() {}); + } + } + } + + Future fetchAccessHistoryService() async { + try { + setState(() => _loading = true); + var response = await PhpGroup.getAccessCall.call( + pageSize: _pageSize.toString(), + pageNumber: _pageNumber.toString(), + pesTipo: _personType != 'E' && _personType != 'O' ? 'T' : _personType, + ); + + final List accessHistory = response.jsonBody['acessos'] ?? []; + + List filteredAccess = accessHistory.where((item) { + final personTypeMatches = + _personType == '.*' || item["PES_TIPO"].toString() == _personType; + return personTypeMatches; + }).toList(); + + if (filteredAccess != null && filteredAccess.isNotEmpty) { + setState(() { + _accessWrap.addAll(filteredAccess); + _hasData = true; + _loading = false; + }); + return response; + } + _showNoMoreDataSnackbar(context); + setState(() { + _hasData = false; + _loading = false; + }); + return null; + } catch (e, s) { + DialogUtil.errorDefault(context); + LogUtil.requestAPIFailed('processRequest', "", "Busca Acesso", e, s); + setState(() { + _hasData = false; + _loading = false; + }); + } + } + + void _showNoMoreDataSnackbar(BuildContext context) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + FFLocalizations.of(context).getVariableText( + ptText: "Não há mais dados.", enText: "No more data."), + ), + duration: const Duration(seconds: 3), + backgroundColor: FlutterFlowTheme.of(context).primary, + ), + ); + } + Widget _body(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - if (_model.hasData == false && - _model.pageNumber <= 1 && - _model.loading == false) + if (_hasData == false && _pageNumber <= 1 && _loading == false) Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -171,9 +255,9 @@ class _AccessHistoryScreenState extends State { ], ), ) - else if (_model.hasData || _model.pageNumber >= 1) + else if (_hasData || _pageNumber >= 1) Expanded(child: _cardListViewOrganismWidget()), - if (_model.hasData == true && _model.loading) + if (_hasData == true && _loading) Container( padding: const EdgeInsets.only(top: 15, bottom: 15), child: Center( @@ -188,12 +272,26 @@ class _AccessHistoryScreenState extends State { ); } + void _loadMoreAccess() { + if (_hasData == true) { + _pageNumber++; + _accessFuture = fetchAccessHistoryService(); + } + } + + void fetchCardListViewService(Map select) { + _personType = select['personType']!; + _accessWrap = []; + _pageNumber = 1; + _accessFuture = fetchAccessHistoryService(); + } + Widget _cardListViewOrganismWidget() { return FutureBuilder( - future: _model.accessFuture, + future: _accessFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting && - _model.accessWrap.isEmpty) { + _accessWrap.isEmpty) { return Center( child: SizedBox( width: 50.0, @@ -215,10 +313,10 @@ class _AccessHistoryScreenState extends State { return ListView.builder( shrinkWrap: true, physics: const BouncingScrollPhysics(), - controller: _model.scrollController, - itemCount: _model.accessWrap.length, + controller: _scrollController, + itemCount: _accessWrap.length, itemBuilder: (context, index) { - final accessHistoryItem = _model.accessWrap[index]; + final accessHistoryItem = _accessWrap[index]; return _accessHistoryCardMoleculeWidget(context, accessHistoryItem); }, ); @@ -297,104 +395,3 @@ class _AccessHistoryScreenState extends State { ); } } - -class AccessHistoryAppBar extends StatelessWidget { - AccessHistoryAppBar(this.model, this.selectedTypeSubject); - final AccessHistoryModel model; - final BehaviorSubject> selectedTypeSubject; - - late final FlutterFlowTheme theme; - - @override - Widget build(BuildContext context) { - theme = FlutterFlowTheme.of(context); - - return AppBar( - backgroundColor: theme.primaryBackground, - automaticallyImplyLeading: false, - leading: _backButton(context, theme), - title: _title(context, theme), - centerTitle: true, - elevation: 0.0, - actions: [_filterButton(context)], - ); - } - - Widget _backButton(BuildContext context, FlutterFlowTheme theme) { - return FlutterFlowIconButton( - borderColor: Colors.transparent, - borderRadius: 30.0, - borderWidth: 1.0, - buttonSize: 60.0, - icon: Icon( - Icons.keyboard_arrow_left, - color: theme.primaryText, - size: 30.0, - ), - onPressed: () => Navigator.of(context).pop(), - ); - } - - Widget _title(BuildContext context, FlutterFlowTheme theme) { - return Text( - FFLocalizations.of(context).getText('ch8qymga'), - style: theme.headlineMedium.override( - fontFamily: theme.headlineMediumFamily, - color: theme.primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - useGoogleFonts: - GoogleFonts.asMap().containsKey(theme.headlineMediumFamily), - ), - ); - } - - Widget _filterButton(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 10, 0), - child: IconButton( - icon: const Icon(Icons.filter_list), - onPressed: () async { - final Map? selectedFilter = - await showModalBottomSheet>( - isScrollControlled: true, - backgroundColor: Colors.transparent, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => Navigator.of(context).pop(), - child: Container( - color: Colors.transparent, - child: GestureDetector( - onTap: () {}, - child: OptModalWidget( - defaultPersonType: - selectedTypeSubject.value['personType'] ?? - '.*', - ), - ), - ), - ); - }); - - if (selectedFilter != null) { - _updateAccessHistoryAction(selectedFilter); - } - }, - ), - ), - ], - ); - } -} - -class AccessHistoryList extends StatelessWidget { - @override - Widget build(BuildContext context) { - // TODO: implement build - throw UnimplementedError(); - } -} diff --git a/lib/pages/pets_page/pets_history_screen.dart b/lib/pages/pets_page/pets_history_screen.dart index 18ff3e77..7ab0c732 100644 --- a/lib/pages/pets_page/pets_history_screen.dart +++ b/lib/pages/pets_page/pets_history_screen.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.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/liberation_history/liberation_history_model.dart'; @@ -263,7 +262,7 @@ class _PetsHistoryScreenState extends State builder: (context) { return Dialog( alignment: Alignment.center, - child: buildPetDetails( + child: widget.model.buildPetDetails( item: uItem, context: context, devUUID: devUUID, diff --git a/lib/pages/pets_page/pets_page_model.dart b/lib/pages/pets_page/pets_page_model.dart index 68d21a7c..06b9806f 100644 --- a/lib/pages/pets_page/pets_page_model.dart +++ b/lib/pages/pets_page/pets_page_model.dart @@ -5,8 +5,12 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_manager.dart'; +import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; +import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; +import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/form_field_controller.dart'; +import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/pages/pets_page/pets_page_widget.dart'; import 'package:hub/shared/helpers/db_helper.dart'; import 'package:hub/shared/utils/dialog_util.dart'; @@ -388,4 +392,181 @@ class PetsPageModel extends FlutterFlowModel { dropDownValueController1 = FormFieldController(null); dropDownValueController2 = FormFieldController(null); } + + Widget buildPetDetails({ + required dynamic item, + required BuildContext context, + required String devUUID, + required String userUUID, + required String cliUUID, + required String cliName, + required PetsPageModel model, + }) { + return DetailsComponentWidget( + buttons: [ + // EDIT ACTION + FFButtonWidget( + text: FFLocalizations.of(context).getVariableText( + ptText: 'Editar', + enText: 'Edit', + ), + icon: const Icon(Icons.edit), + onPressed: () async { + context.pop(); + + model.isEditing = true; + model.item = item; + model.switchTab(0); + model.setEditForm(); + // model.safeSetState!(); + }, + options: FFButtonOptions( + width: 130, + height: 40, + color: FlutterFlowTheme.of(context).primaryBackground, + elevation: 0, + textStyle: TextStyle( + color: FlutterFlowTheme.of(context).primaryText, + ), + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).primaryBackground, + width: 1, + ), + // borderRadius: 12, + ), + ), + + // DELETE ACTION + FFButtonWidget( + text: FFLocalizations.of(context).getVariableText( + ptText: 'Excluir', + enText: 'Delete', + ), + icon: const Icon(Icons.close), + onPressed: () async { + showAlertDialog( + context, + FFLocalizations.of(context).getVariableText( + ptText: 'Excluir Pet', + enText: 'Delete Pet', + ), + FFLocalizations.of(context).getVariableText( + ptText: 'Você tem certeza que deseja excluir esse pet?', + enText: 'Are you sure you want to delete this pet?', + ), () async { + int id = item['id']; + await PhpGroup.deletePet + .call( + petID: id, + ) + .then((value) { + // Navigator.pop(context, value); + context.pop(value); + context.pop(value); + + if (value == false) { + showSnackbar( + context, + FFLocalizations.of(context).getVariableText( + ptText: 'Erro ao excluir pet', + enText: 'Error deleting pet', + ), + true, + ); + } else if (value == true) { + showSnackbar( + context, + FFLocalizations.of(context).getVariableText( + enText: 'Success deleting pet', + ptText: 'Succeso ao excluir pet', + ), + false, + ); + } + }).catchError((err, stack) { + context.pop(); + showSnackbar( + context, + FFLocalizations.of(context).getVariableText( + enText: 'Error deleting pet', + ptText: 'Erro ao excluir pet', + ), + true, + ); + }); + }); + }, + options: FFButtonOptions( + width: 130, + height: 40, + color: FlutterFlowTheme.of(context).primaryBackground, + elevation: 0, + textStyle: TextStyle( + color: FlutterFlowTheme.of(context).primaryText, + ), + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).primaryBackground, + width: 1, + ), + // borderRadius: 12, + ), + ), + ], + // 'MIN', 'PEQ', 'MED', 'GRA', 'GIG' + labelsHashMap: Map.from({ + if (item['species'] != null && item['species'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Espécie", enText: "Species")}:': + item['species'].toString().toUpperCase(), + if (item['breed'] != null && item['breed'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Raça", enText: "Breed")}:': + item['breed'].toString().toUpperCase(), + if (item['color'] != null && item['color'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Cor", enText: "Color")}:': + item['color'].toString().toUpperCase(), + if (item['birthdayDate'] != null && item['birthdayDate'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Data de Nascimento", enText: "Date of Birth")}:': + ValidatorUtil.formatDateTimePicker(item['birthdayDate']), + if (item['gender'] != null && item['gender'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Gênero", enText: "Gender")}:': + item['gender'] == 'MAC' + ? FFLocalizations.of(context) + .getVariableText(ptText: 'MACHO', enText: 'MALE') + : FFLocalizations.of(context) + .getVariableText(enText: 'FEMALE', ptText: 'FÊMEA'), + if (item['size'] != null && item['size'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Porte", enText: "Size")}:': + item['size'] == 'MIN' + ? FFLocalizations.of(context) + .getVariableText(ptText: 'MINI', enText: 'MINI') + : item['size'] == 'PEQ' + ? FFLocalizations.of(context) + .getVariableText(ptText: 'PEQUENO', enText: 'SMALL') + : item['size'] == 'MED' + ? FFLocalizations.of(context).getVariableText( + ptText: 'MÉDIO', enText: 'MEDIUM') + : item['size'] == 'GRD' + ? FFLocalizations.of(context).getVariableText( + ptText: 'GRANDE', enText: 'LARGE') + : item['size'] == 'GIG' + ? FFLocalizations.of(context).getVariableText( + ptText: 'GIGANTE', enText: 'GIANT') + : '', + if (item['notes'] != null && item['notes'] != '') + '${FFLocalizations.of(context).getVariableText(ptText: "Observação", enText: "Notes")}:': + item['notes'] ?? '', + }), + imagePath: + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${devUUID}&userUUID=${userUUID}&cliID=${cliUUID}&atividade=consultaFotoPet&petId=${item['id'] ?? ''}', + statusHashMap: [ + if (item['gender'] == "MAC") + Map.from({ + item['name']: Color(0xFF094CB0), + }), + if (item['gender'] == "FEM") + Map.from({ + item['name']: Color(0xFFE463E7), + }), + ], + ); + } } diff --git a/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart b/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart index 914aee21..dadb8b1b 100644 --- a/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart +++ b/lib/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart @@ -1,25 +1,43 @@ +import 'dart:ffi'; + import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_manager.dart'; +import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; +import 'package:hub/flutter_flow/flutter_flow_theme.dart'; -import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; +import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/form_field_controller.dart'; import 'package:hub/flutter_flow/internationalization.dart'; +import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/request_manager.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/visit_history_page_widget.dart'; import 'package:hub/shared/helpers/db_helper.dart'; +import 'package:hub/shared/mixins/status_mixin.dart'; +import 'package:hub/shared/utils/validator_util.dart'; import 'package:intl/intl.dart'; +import 'package:share_plus/share_plus.dart'; class ScheduleCompleteVisitPageModel - extends FlutterFlowModel { + extends FlutterFlowModel { + late VoidCallback safeSetState; + late Function(Function) updateState; final _visitHistoryManager = FutureRequestManager(); final DatabaseHelper db = DatabaseHelper(); late final String devUUID; late final String cliUUID; late final String userUUID; + late final String? dropdownValue1; + late final String? dropdownValue2; + bool? dropDownValidator1; + bool? dropDownValidator2; + List visitorJsonList = []; + String visitorStrList = '0'; + Future visitHistory({ String? uniqueQueryKey, bool? overrideCache, @@ -34,34 +52,25 @@ class ScheduleCompleteVisitPageModel void clearVisitHistoryCacheKey(String? uniqueKey) => _visitHistoryManager.clearRequest(uniqueKey); - /// Local state fields for this page. - String convertDateFormat(String dateStr) { try { - // Formato original DateFormat originalFormat = DateFormat('dd/MM/yyyy HH: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)) { 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); return formattedDate; } catch (e) { - // Handle the exception by returning an error message or a default value return 'Invalid date format'; } } - List visitorJsonList = []; void addToVisitorJsonList(dynamic item) => visitorJsonList.add(item); void removeFromVisitorJsonList(dynamic item) => visitorJsonList.remove(item); void removeAtIndexFromVisitorJsonList(int index) => @@ -71,10 +80,6 @@ class ScheduleCompleteVisitPageModel void updateVisitorJsonListAtIndex(int index, Function(dynamic) updateFn) => visitorJsonList[index] = updateFn(visitorJsonList[index]); - String visitorStrList = '0'; - bool? dropDownValidator1; - bool? dropDownValidator2; - bool isValid() { if ((textController1!.text != '') && (textController2!.text != '') && @@ -85,15 +90,11 @@ class ScheduleCompleteVisitPageModel return false; } - /// State fields for stateful widgets in this page. - final unfocusNode = FocusNode(); - // State field(s) for TabBar widget. TabController? tabBarController; int get tabBarCurrentIndex => tabBarController != null ? tabBarController!.index : 0; - // State field(s) for TextField widget. FocusNode? textFieldFocusNode1; TextEditingController? textController1; String? Function(BuildContext, String?)? textController1Validator; @@ -131,7 +132,6 @@ class ScheduleCompleteVisitPageModel } DateTime? datePicked1; - // State field(s) for TextField widget. FocusNode? textFieldFocusNode2; TextEditingController? textController2; String? Function(BuildContext, String?)? textController2Validator; @@ -170,26 +170,16 @@ class ScheduleCompleteVisitPageModel } DateTime? datePicked2; - // State field(s) for DropDown widget. String? dropDownValue1; FormFieldController? dropDownValueController1; - // State field(s) for DropDown widget. String? dropDownValue2; FormFieldController? dropDownValueController2; - // State field(s) for Switch widget. bool? switchValue; - // State field(s) for TextField widget. FocusNode? textFieldFocusNode3; TextEditingController? textController3; 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; } @@ -217,8 +207,7 @@ class ScheduleCompleteVisitPageModel textController1 = TextEditingController( text: dateTimeFormat( 'dd/MM/yyyy HH:mm:ss', - DateTime.now().add(const Duration(minutes: 10)), - // locale: FFLocalizations.of(context).languageCode, + DateTime.now().add(const Duration(minutes: 0)), )); textController1Validator = _textController1Validator; @@ -227,13 +216,59 @@ class ScheduleCompleteVisitPageModel text: dateTimeFormat( 'dd/MM/yyyy HH:mm:ss', DateTime.now().add(const Duration(days: 1)), - // locale: FFLocalizations.of(context).languageCode, )); textController2Validator = _textController2Validator; textFieldFocusNode3 = FocusNode(); textController3 = TextEditingController(); textController3Validator = _textController3Validator; + + dropDownValueController1 ??= + FormFieldController(dropDownValue1 ??= ''); + dropDownValueController2 ??= + FormFieldController(dropDownValue2 ??= ''); + } + + // Updated variables for dropdowns + late final List reasonsDropDown1 = []; + late final List labelsDropDown1 = []; + late final List optionsDropdown1 = []; + + late final List lavelsDropDown2 = []; + late final List labelsDropDown2 = []; + late final List optionsDropdown2 = []; + + // Methods to process dropdown values + void processDropDown1(List reasonsJsonList) { + if (dropDownValue1 != null && dropDownValue1!.isNotEmpty) { + String value = dropDownValue1!; + if (!(value.contains('{') && + value.contains('}') && + value.contains(':'))) { + var item = reasonsJsonList.where((reason) => + reason['MOT_DESCRICAO'].toString().contains(dropDownValue1!)); + dropDownValue1 = item.firstOrNull?.toString() ?? ''; + dropDownValueController1?.value = dropDownValue1!; + } + } + reasonsDropDown1.clear(); + reasonsDropDown1.addAll(reasonsJsonList.map((e) => e.toString()).toList()); + } + + void processDropDown2(List lavelList) { + if (dropDownValue2 != null && dropDownValue2!.isNotEmpty) { + String value = dropDownValue2!; + if (!(value.contains('{') && + value.contains('}') && + value.contains(':'))) { + var item = lavelList.where((level) => + level['NAC_DESCRICAO'].toString().contains(dropDownValue2!)); + dropDownValue2 = item.firstOrNull?.toString() ?? ''; + dropDownValueController2?.value = dropDownValue2!; + } + } + lavelsDropDown2.clear(); + lavelsDropDown2.addAll(lavelList.map((e) => e.toString()).toList()); } @override @@ -252,7 +287,55 @@ class ScheduleCompleteVisitPageModel clearVisitHistoryCache(); } - /// Action blocks. + 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; + } + } + Future getVisitorsActionPage( BuildContext context, { List? visitorsJsonList, @@ -270,4 +353,258 @@ class ScheduleCompleteVisitPageModel return false; } + + void switchTab(int index) { + tabBarController?.animateTo(index); + + safeSetState.call(); + } + + void setFormField() { + // if ((visitorStrList != null && visitorStrList != '') && + // ((visitorJsonList != null && (visitorJsonList)!.isNotEmpty) != null)) { + // visitorJsonList = visitorJsonList! + // .where((e) => + // visitorStrList == + // getJsonField( + // e, + // r'''$.VTE_DOCUMENTO''', + // ).toString().toString()) + // .toList() + // .toList() + // .cast(); + // visitorStrList = visitorStrList!; + + // safeSetState.call(); + // } + + // if ((dropdownValue1 != null && dropdownValue1 != '') && + // (dropdownValue2 != null && dropdownValue2 != '')) { + // dropDownValue1 = dropdownValue1!; + // dropDownValue2 = dropdownValue2!; + // safeSetState.call(); + // } + } + + Widget buildVisitDetails({ + required dynamic item, + required BuildContext context, + required Future Function(BuildContext, int, int, String, String) + changeStatusAction, + required String devUUID, + required String userUUID, + required String cliUUID, + required String cliName, + }) { + return DetailsComponentWidget( + buttons: [ + if (Status.getStatus(item['VAW_STATUS']) == + StatusEnum.active) // REJECT ACTION + FFButtonWidget( + text: FFLocalizations.of(context).getVariableText( + ptText: 'Cancelar', + enText: 'Cancel', + ), + icon: const Icon(Icons.close), + onPressed: () async { + showAlertDialog( + context, + FFLocalizations.of(context).getVariableText( + ptText: 'Cancelar Visita', + enText: 'Cancel Visit', + ), + FFLocalizations.of(context).getVariableText( + ptText: 'Você tem certeza que deseja bloquear essa visita?', + enText: 'Are you sure you want to block this visit?', + ), () async { + await changeStatusAction + ?.call( + context, + int.parse(item['VAW_DESTINO']), + int.parse(item['VAW_ID']), + item['VAW_CHAVE'] ?? '', + item['VTE_DOCUMENTO'] ?? '', + ) + .then((value) { + // Navigator.pop(context, value); + context.pop(value); + + if (value == false) { + showSnackbar( + context, + FFLocalizations.of(context).getVariableText( + enText: 'Error blocking visit', + ptText: 'Erro ao bloquear visita', + ), + true, + ); + } else if (value == true) { + showSnackbar( + context, + FFLocalizations.of(context).getVariableText( + enText: 'Success canceling visit', + ptText: 'Succeso ao cancelar visita', + ), + false, + ); + } + }).catchError((err, stack) { + context.pop(); + showSnackbar( + context, + FFLocalizations.of(context).getVariableText( + enText: 'Error blocking visit', + ptText: 'Erro ao bloquear visita', + ), + true, + ); + }); + }); + }, + options: FFButtonOptions( + width: 130, + height: 40, + color: FlutterFlowTheme.of(context).primaryBackground, + elevation: 0, + textStyle: TextStyle( + color: FlutterFlowTheme.of(context).primaryText, + ), + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).primaryBackground, + width: 1, + ), + // borderRadius: 12, + ), + ), + if (Status.getStatus(item['VAW_STATUS']) != + StatusEnum.active) // RECALL ACTION + FFButtonWidget( + text: FFLocalizations.of(context).getVariableText( + ptText: 'Reagendar', + enText: 'Reschedule', + ), + icon: const Icon(Icons.refresh), + onPressed: () async { + context.pop(); + + dropDownValue1 = item['MOT_DESCRICAO']; + dropDownValue2 = item['NAC_DESCRICAO']; + + visitorJsonList = [item]; + visitorStrList = item['VTE_DOCUMENTO']; + + switchTab(0); + }, + options: FFButtonOptions( + width: 130, + height: 40, + color: FlutterFlowTheme.of(context).primaryBackground, + elevation: 0, + textStyle: TextStyle( + color: FlutterFlowTheme.of(context).primaryText, + ), + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).primaryBackground, + width: 1, + ), + // borderRadius: 12, + ), + ), + if (Status.getStatus(item['VAW_STATUS']) == + StatusEnum.active) // SHARE ACTION + FFButtonWidget( + text: FFLocalizations.of(context).getVariableText( + ptText: 'Compartilhar', + enText: 'Share', + ), + icon: const Icon(Icons.share), + onPressed: () async { + Share.share(''' +Olá, \*${item['VTE_NOME']}\*! Você foi convidado para \*${cliName}\*. + +\*Validade do Convite\*: +- Início: ${item['VAW_DTINICIO']} +- Fim: ${item['VAW_DTFIM']} + +URL do Convite: https://visita.freaccess.com.br/${item['VAW_ID']}/${cliUUID}/${item['VAW_CHAVE']} + '''); + }, + options: FFButtonOptions( + width: 130, + height: 40, + color: FlutterFlowTheme.of(context).primaryBackground, + elevation: 0, + textStyle: TextStyle( + color: FlutterFlowTheme.of(context).primaryText, + ), + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).primaryBackground, + width: 1, + ), + // borderRadius: 12, + ), + ), + ], + labelsHashMap: Map.from({ + '${FFLocalizations.of(context).getVariableText(ptText: "Nome", enText: "Name")}:': + item['VTE_NOME'] ?? '', + '${FFLocalizations.of(context).getVariableText(ptText: "Inicio", enText: "Start")}:': + item['VAW_DTINICIO'] != '' && item['VAW_DTINICIO'] != null + ? ValidatorUtil.toLocalDateTime( + 'yyyy-MM-dd HH:mm:ss', item['VAW_DTINICIO']) + : '', + '${FFLocalizations.of(context).getVariableText(ptText: "Fim", enText: "End")}:': + item['VAW_DTFIM'] != '' && item['VAW_DTFIM'] != null + ? ValidatorUtil.toLocalDateTime( + 'yyyy-MM-dd HH:mm:ss', item['VAW_DTFIM']) + : '', + }), + imagePath: + 'https://freaccess.com.br/freaccess/getImage.php?cliID=${cliUUID}&atividade=getFoto&Documento=${item['VTE_DOCUMENTO'] ?? ''}&tipo=E', + statusHashMap: [ + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.active) + Map.from({ + FFLocalizations.of(context).getVariableText( + ptText: 'Ativo', + enText: 'Active', + ): FlutterFlowTheme.of(context).warning, + }), + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.unknown) + Map.from({ + FFLocalizations.of(context).getVariableText( + ptText: 'Pendente', + enText: 'Pending', + ): FlutterFlowTheme.of(context).alternate, + }), + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.canceled) + Map.from({ + FFLocalizations.of(context).getVariableText( + ptText: 'Cancelado', + enText: 'Canceled', + ): FlutterFlowTheme.of(context).error, + }), + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.finished) + Map.from({ + FFLocalizations.of(context).getVariableText( + ptText: 'Finalizado', + enText: 'Finished', + ): FlutterFlowTheme.of(context).success, + }), + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.blocked) + Map.from({ + FFLocalizations.of(context).getVariableText( + ptText: 'Bloqueado', + enText: 'Blocked', + ): FlutterFlowTheme.of(context).error, + }), + if (Status.getStatus(item['VAW_STATUS']) == StatusEnum.inactive) + Map.from({ + FFLocalizations.of(context).getVariableText( + ptText: 'Inativo', + enText: 'Inactive', + ): FlutterFlowTheme.of(context).warning, + }), + ], + ); + } } 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 625efa57..3e792ee8 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 @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:auto_size_text/auto_size_text.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; @@ -18,24 +20,22 @@ 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/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/pages/schedule_complete_visit_page/visit_history_page_widget.dart'; import 'package:hub/shared/utils/dialog_util.dart'; import 'package:hub/shared/utils/share_util.dart'; import 'package:provider/provider.dart'; -class ScheduleCompleteVisitPageWidget extends StatefulWidget { - const ScheduleCompleteVisitPageWidget({ - super.key, - this.dropdownValue1, - this.dropdownValue2, - this.visitorStrList, - this.visitorJsonList, - }); +class ScheduleComplete extends StatefulWidget { + const ScheduleComplete({Key? key}) : super(key: key); - final String? dropdownValue1; - final String? dropdownValue2; - final String? visitorStrList; - final List? visitorJsonList; + @override + State createState() { + throw UnimplementedError(); + } +} + +class ScheduleCompleteVisitPageWidget extends ScheduleComplete { + const ScheduleCompleteVisitPageWidget(); @override State createState() => @@ -57,39 +57,9 @@ class _ScheduleCompleteVisitPageWidgetState void initState() { super.initState(); _model = createModel(context, () => ScheduleCompleteVisitPageModel()); + _model.safeSetState = () => safeSetState(() {}); + _model.updateState = (Function fn) => safeSetState(fn()); - // On page load action. - SchedulerBinding.instance.addPostFrameCallback((_) async { - if ((widget.visitorStrList != null && widget.visitorStrList != '') && - ((widget.visitorJsonList != null && - (widget.visitorJsonList)!.isNotEmpty) != - null)) { - _model.visitorJsonList = widget.visitorJsonList! - .where((e) => - widget.visitorStrList == - getJsonField( - e, - r'''$.VTE_DOCUMENTO''', - ).toString().toString()) - .toList() - .toList() - .cast(); - _model.visitorStrList = widget.visitorStrList!; - - safeSetState(() {}); - } else { - return; - } - - if ((widget.dropdownValue1 != null && widget.dropdownValue1 != '') && - (widget.dropdownValue2 != null && widget.dropdownValue2 != '')) { - _model.dropDownValue1 = widget.dropdownValue1!; - _model.dropDownValue2 = widget.dropdownValue2!; - safeSetState(() {}); - } else { - return; - } - }); _model.tabBarController = TabController( vsync: this, length: 2, @@ -107,21 +77,15 @@ class _ScheduleCompleteVisitPageWidgetState } void _loadMoreVisitHistory() async { - // Simulate fetching data from an API or database Future> fetchVisitHistory(int start, int limit) async { - // Simulate network delay await Future.delayed(const Duration(seconds: 1)); - // Generate a list of visit history items return List.generate(limit, (index) => "Item ${start + index}"); } - // Calculate the start index for the next batch of items to load final int start = _visitHistoryLoadingIdx * _visitHistoryLoadingCount; - // Fetch the next batch of items final List newItems = await fetchVisitHistory(start, _visitHistoryLoadingCount); - // If new items were fetched, add them to the list and update the index if (newItems.isNotEmpty) { _visitHistoryList.addAll(newItems); _visitHistoryLoadingIdx++; @@ -183,7 +147,7 @@ PreferredSizeWidget appBarScheduleCompleteVisit(BuildContext context) { ), title: Text( FFLocalizations.of(context).getText( - '61lcxdgm' /* Agendar Visita */, + '61lcxdgm', ), style: FlutterFlowTheme.of(context).headlineMedium.override( fontFamily: 'Nunito', @@ -223,12 +187,12 @@ Widget bodyScheduleCompleteVisit(BuildContext context, tabs: [ Tab( text: FFLocalizations.of(context).getText( - 'ueth1f4g' /* Cadastrar Visita */, + 'ueth1f4g', ), ), Tab( text: FFLocalizations.of(context).getText( - 'k4uraqam' /* Histórico de Visitas */, + 'k4uraqam', ), ), ], @@ -278,7 +242,7 @@ Widget scheduleVisit(BuildContext context, 20.0, 30.0, 0.0, 24.0), child: Text( FFLocalizations.of(context).getText( - '98evnbbe' /* Qual o período de validade da ... */, + '98evnbbe', ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context).bodyMedium.override( @@ -298,7 +262,6 @@ Widget scheduleVisit(BuildContext context, SizedBox( width: MediaQuery.of(context).size.width, height: 60.0, - // decoration: const BoxDecoration(), child: Stack( children: [ Padding( @@ -328,7 +291,7 @@ Widget scheduleVisit(BuildContext context, .labelMediumFamily), ), hintText: FFLocalizations.of(context).getText( - '53cbwqh9' /* Quando você inicia a visita? */, + '53cbwqh9', ), hintStyle: FlutterFlowTheme.of(context) .labelMedium @@ -549,7 +512,6 @@ Widget scheduleVisit(BuildContext context, SizedBox( width: MediaQuery.of(context).size.width, height: 60.0, - // decoration: const BoxDecoration(), child: Stack( children: [ Padding( @@ -579,7 +541,7 @@ Widget scheduleVisit(BuildContext context, .labelMediumFamily), ), hintText: FFLocalizations.of(context).getText( - 'xpgc5e8d' /* Quando a visita terminá? */, + 'xpgc5e8d', ), hintStyle: FlutterFlowTheme.of(context) .labelMedium @@ -793,9 +755,7 @@ Widget scheduleVisit(BuildContext context, ), ], ), - ] - // .divide(const SizedBox(height: 0.0)), - ), + ]), Column( mainAxisSize: MainAxisSize.max, children: [ @@ -806,7 +766,7 @@ Widget scheduleVisit(BuildContext context, 20.0, 24.0, 0.0, 30.0), child: Text( FFLocalizations.of(context).getText( - 'u0jocx7e' /* Quais visitantes você deseja c... */, + 'u0jocx7e', ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context).bodyMedium.override( @@ -1018,7 +978,7 @@ Widget scheduleVisit(BuildContext context, alignment: const AlignmentDirectional(0.0, 0.0), child: AutoSizeText( FFLocalizations.of(context).getText( - 'r8soavtz' /* Clique para adicionar um visit... */, + 'r8soavtz', ), style: FlutterFlowTheme.of(context) .bodyMedium @@ -1052,7 +1012,7 @@ Widget scheduleVisit(BuildContext context, 20.0, 24.0, 0.0, 24.0), child: Text( FFLocalizations.of(context).getText( - '0meymh6u' /* Quais são os motivos da visita... */, + '0meymh6u', ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context).bodyMedium.override( @@ -1097,54 +1057,23 @@ Widget scheduleVisit(BuildContext context, ); } - final dropDownGetDadosResponse = - snapshot.data!; final reasonsJsonList = PhpGroup.getDadosCall.reasonsJsonList( - dropDownGetDadosResponse.jsonBody); + snapshot.data!.jsonBody); + final reasonsOptionLabels = PhpGroup + .getDadosCall + .reasonsMotDescStrList( + snapshot.data!.jsonBody); - if (_model.dropDownValue1 != '' && - _model.dropDownValue1 != null) { - String value = - _model.dropDownValue1.toString() ?? - ''; - - if (value.contains('{') && - value.contains('}') && - value.contains(':')) { - } else { - if (reasonsJsonList != null && - reasonsJsonList.isNotEmpty) { - var item = reasonsJsonList.where( - (reason) => - reason['MOT_DESCRICAO'] - .toString() - .contains(_model - .dropDownValue1 ?? - '')); - _model.dropDownValue1 = - item.firstOrNull.toString() ?? ''; - } - } - } + _model.processDropDown1(reasonsJsonList!); return FlutterFlowDropDown( fillColor: FlutterFlowTheme.of(context) .primaryBackground, controller: - _model.dropDownValueController1 ??= - FormFieldController( - _model.dropDownValue1 ??= ''), - options: reasonsJsonList != null && - reasonsJsonList != [] - ? reasonsJsonList - .map((e) => e.toString()) - .toList() - : [], - optionLabels: PhpGroup.getDadosCall - .reasonsMotDescStrList( - dropDownGetDadosResponse - .jsonBody), + _model.dropDownValueController1, + options: _model.reasonsDropDown1, + optionLabels: reasonsOptionLabels, onChanged: (val) => safeSetState( () => _model.dropDownValue1 = val), width: double.infinity, @@ -1163,7 +1092,7 @@ Widget scheduleVisit(BuildContext context, ), hintText: FFLocalizations.of(context).getText( - '6p3e0bzr' /* Escolha um motivo aqui */, + '6p3e0bzr', ), icon: Icon( Icons.keyboard_arrow_down_rounded, @@ -1229,7 +1158,6 @@ Widget scheduleVisit(BuildContext context, child: FutureBuilder( future: PhpGroup.getDadosCall.call(), builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. if (!snapshot.hasData) { return Center( child: SizedBox( @@ -1244,53 +1172,19 @@ Widget scheduleVisit(BuildContext context, ); } - final dropDownGetDadosResponse = - snapshot.data!; - final lavelList = PhpGroup.getDadosCall - .levelJsonList( - dropDownGetDadosResponse.jsonBody); - - if (_model.dropDownValue2 != '' && - _model.dropDownValue2 != null) { - String value = - _model.dropDownValue2.toString() ?? - ''; - - if (value.contains('{') && - value.contains('}') && - value.contains(':')) { - // log("Valor e um Objeto | Usuário Escolheu o Nivel ${_model.dropDownValue2}"); - } else { - // log("Valor e uma String | Usuário Escolheu o Nivel ${_model.dropDownValue2}"); - if (lavelList != null && - lavelList.isNotEmpty) { - var item = lavelList.where((level) => - level['NAC_DESCRICAO'] - .toString() - .contains( - _model.dropDownValue2 ?? - '')); - _model.dropDownValue2 = - item.firstOrNull.toString() ?? ''; - } - } - } + final lavelsJsonList = PhpGroup.getDadosCall + .levelJsonList(snapshot.data!.jsonBody); + final lavelsOptionLabels = PhpGroup + .getDadosCall + .levelNACDescricaoStrList( + snapshot.data!.jsonBody); + _model.processDropDown2(lavelsJsonList!); return FlutterFlowDropDown( controller: - _model.dropDownValueController2 ??= - FormFieldController( - _model.dropDownValue2 ??= ''), - options: - lavelList != null && lavelList != [] - ? lavelList - .map((e) => e.toString()) - .toList() - : [], - optionLabels: PhpGroup.getDadosCall - .levelNACDescricaoStrList( - dropDownGetDadosResponse - .jsonBody), + _model.dropDownValueController2, + options: _model.lavelsDropDown2, + optionLabels: lavelsOptionLabels, onChanged: (val) => safeSetState( () => _model.dropDownValue2 = val), width: double.infinity, @@ -1309,7 +1203,7 @@ Widget scheduleVisit(BuildContext context, ), hintText: FFLocalizations.of(context).getText( - '2wun8p6c' /* Escolha um nível de acesso aqu... */, + '2wun8p6c', ), icon: Icon( Icons.keyboard_arrow_down_rounded, @@ -1373,7 +1267,7 @@ Widget scheduleVisit(BuildContext context, 20.0, 24.0, 0.0, 24.0), child: Text( FFLocalizations.of(context).getText( - '8rk26eg1' /* Visita se encerra após o prime... */, + '8rk26eg1', ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context).bodyMedium.override( @@ -1402,7 +1296,7 @@ Widget scheduleVisit(BuildContext context, 0.0, 0.0, 130.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'lgv0q5ht' /* Visita única */, + 'lgv0q5ht', ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -1476,7 +1370,7 @@ Widget scheduleVisit(BuildContext context, 20.0, 0.0, 0.0, 24.0), child: Text( FFLocalizations.of(context).getText( - 'eftcs67c' /* Você tem alguma observação sob... */, + 'eftcs67c', ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context).bodyMedium.override( @@ -1506,7 +1400,7 @@ Widget scheduleVisit(BuildContext context, decoration: InputDecoration( isDense: false, labelText: FFLocalizations.of(context).getText( - 't0q2vuup' /* Observações da Visita */, + 't0q2vuup', ), labelStyle: FlutterFlowTheme.of(context) .labelMedium @@ -1520,7 +1414,7 @@ Widget scheduleVisit(BuildContext context, .labelMediumFamily), ), hintText: FFLocalizations.of(context).getText( - 'w18iztdm' /* Escreva as suas observações aq... */, + 'w18iztdm', ), hintStyle: FlutterFlowTheme.of(context) .labelMedium @@ -1623,7 +1517,6 @@ Widget scheduleVisit(BuildContext context, false) { context.pop(); - //MILESTONE _model.dropDownValue1 = null; _model.dropDownValue2 = null; _model.dropDownValueController1 = @@ -1701,7 +1594,6 @@ Widget scheduleVisit(BuildContext context, .primaryBackground, width: 1, ), - // borderRadius: 12, ), ), ], diff --git a/lib/pages/visit_history_page/visit_history_page_widget.dart b/lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart similarity index 95% rename from lib/pages/visit_history_page/visit_history_page_widget.dart rename to lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart index f7773f11..208d701d 100644 --- a/lib/pages/visit_history_page/visit_history_page_widget.dart +++ b/lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart @@ -1,19 +1,18 @@ import 'package:flutter/material.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/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.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'; -class VisitHistoryWidget extends StatefulWidget { - VisitHistoryWidget({Key? key}) : super(key: key); +class VisitHistoryWidget extends ScheduleComplete { + const VisitHistoryWidget(); @override _VisitHistoryWidgetState createState() => _VisitHistoryWidgetState(); @@ -30,7 +29,7 @@ class _VisitHistoryWidgetState extends State final int _pageSize = 10; bool _hasData = false; bool _loading = false; - late VisitHistoryModel _model; + late ScheduleCompleteVisitPageModel _model; late Future _visitFuture; List _visitWrap = []; @@ -51,7 +50,7 @@ class _VisitHistoryWidgetState extends State void initState() { super.initState(); - _model = createModel(context, () => VisitHistoryModel()); + _model = createModel(context, () => ScheduleCompleteVisitPageModel()); _initVariables(); _visitFuture = _fetchVisits(); @@ -272,7 +271,7 @@ class _VisitHistoryWidgetState extends State builder: (context) { return Dialog( alignment: Alignment.center, - child: buildVisitDetails( + child: _model.buildVisitDetails( item: visitaWrapItem, context: context, changeStatusAction: _model.changeStatusAction, diff --git a/lib/pages/visit_history_page/visit_history_page_model.dart b/lib/pages/visit_history_page/visit_history_page_model.dart deleted file mode 100644 index 574a33e3..00000000 --- a/lib/pages/visit_history_page/visit_history_page_model.dart +++ /dev/null @@ -1,67 +0,0 @@ -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; - } - } -}