fix visitorRegister and visitHIstory

This commit is contained in:
jantunesmesias 2024-08-09 09:38:33 -03:00
parent 016be1df54
commit bc1c684d72
7 changed files with 350 additions and 356 deletions

View File

@ -1417,21 +1417,17 @@ class PostProvVisitSchedulingCall {
} }
class GetVisitsCall { class GetVisitsCall {
Stream<ApiCallResponse> call({ Future<ApiCallResponse> call({
String? devUUID = '', String? devUUID = '',
String? userUUID = '', String? userUUID = '',
String? cliID = '', String? cliID = '',
String? atividade = '', String? atividade = '',
int? pageSize, int? pageSize,
int? pageNumber, int? pageNumber,
}) { }) async {
final baseUrl = PhpGroup.getBaseUrl(); final baseUrl = PhpGroup.getBaseUrl();
final StreamController<ApiCallResponse> controller = StreamController();
Future.microtask( return ApiManager.instance.makeApiCall(
() async {
try {
final response = await ApiManager.instance.makeApiCall(
callName: 'getVisits', callName: 'getVisits',
apiUrl: '$baseUrl/processRequest.php', apiUrl: '$baseUrl/processRequest.php',
callType: ApiCallType.POST, callType: ApiCallType.POST,
@ -1454,16 +1450,6 @@ class GetVisitsCall {
isStreamingApi: false, isStreamingApi: false,
alwaysAllowBody: false, alwaysAllowBody: false,
); );
controller.add(response);
controller.close();
} catch (e) {
controller.addError(e);
controller.close();
}
},
);
return controller.stream;
} }
bool? error(dynamic response) => castToType<bool>(getJsonField( bool? error(dynamic response) => castToType<bool>(getJsonField(

View File

@ -44,7 +44,7 @@ Widget buildDetails(
visitaWrapItem['VTE_DOCUMENTO'] ?? '', visitaWrapItem['VTE_DOCUMENTO'] ?? '',
) )
.then((value) { .then((value) {
Navigator.pop(context); Navigator.pop(context, value);
if (value == false) { if (value == false) {
showSnackbar( showSnackbar(
context, context,

View File

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart'; import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart';
@ -14,12 +15,20 @@ import 'regisiter_vistor_template_component_widget.dart';
class RegisiterVistorTemplateComponentModel class RegisiterVistorTemplateComponentModel
extends FlutterFlowModel<RegisiterVistorTemplateComponentWidget> { extends FlutterFlowModel<RegisiterVistorTemplateComponentWidget> {
/// State fields for stateful widgets in this page. /// State fields for stateful widgets in this page.
Timer? _debounceTimer;
final unfocusNode = FocusNode(); final unfocusNode = FocusNode();
bool isDataUploading = false; bool isDataUploading = false;
FFUploadedFile uploadedLocalFile = FFUploadedFile uploadedLocalFile =
FFUploadedFile(bytes: Uint8List.fromList([])); FFUploadedFile(bytes: Uint8List.fromList([]));
void debounce(Function() fn, Duration time) {
if (_debounceTimer != null) {
_debounceTimer!.cancel();
}
_debounceTimer = Timer(time, fn);
}
// State field(s) for TextField widget. // State field(s) for TextField widget.
FocusNode? textFieldFocusNode1; FocusNode? textFieldFocusNode1;
TextEditingController? textController1; TextEditingController? textController1;
@ -35,7 +44,7 @@ class RegisiterVistorTemplateComponentModel
return null; return null;
} }
Future<bool?> getVisitanteByDocument( Future<bool> getVisitanteByDocument(
String document, BuildContext context) async { String document, BuildContext context) async {
final response = await PhpGroup.getVisitorByDocCall.call( final response = await PhpGroup.getVisitorByDocCall.call(
devUUID: FFAppState().devUUID, devUUID: FFAppState().devUUID,
@ -49,7 +58,7 @@ class RegisiterVistorTemplateComponentModel
response.jsonBody['error'] != 'false') { response.jsonBody['error'] != 'false') {
return true; return true;
} }
return null; return false;
} }
// State field(s) for TextField widget. // State field(s) for TextField widget.

View File

@ -39,10 +39,14 @@ class _RegisiterVistorTemplateComponentWidgetState
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
bool _isVisitorRegistered = false; bool _isVisitorRegistered = false;
BehaviorSubject<bool> visitorAlreadyRegistered = BehaviorSubject<bool>();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
visitorAlreadyRegistered = BehaviorSubject<bool>.seeded(false);
_model = _model =
createModel(context, () => RegisiterVistorTemplateComponentModel()); createModel(context, () => RegisiterVistorTemplateComponentModel());
@ -93,16 +97,15 @@ class _RegisiterVistorTemplateComponentWidgetState
return false; return false;
} }
// if (_isVisitorRegistered) { if (_isVisitorRegistered) {
// return false; return false;
// } }
return true; return true;
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
BehaviorSubject<bool> visitorAlreadyRegistered = BehaviorSubject<bool>();
context.watch<FFAppState>(); context.watch<FFAppState>();
return Align( return Align(
alignment: const AlignmentDirectional(0.0, 1.0), alignment: const AlignmentDirectional(0.0, 1.0),
@ -226,34 +229,27 @@ class _RegisiterVistorTemplateComponentWidgetState
useGoogleFonts: GoogleFonts.asMap().containsKey( useGoogleFonts: GoogleFonts.asMap().containsKey(
FlutterFlowTheme.of(context).bodyMediumFamily), FlutterFlowTheme.of(context).bodyMediumFamily),
), ),
onChanged: (value) {
_model.debounce(() async {
log('data');
var data = await _model.getVisitanteByDocument(
value, context);
log('data: $data');
setState(() {
_isVisitorRegistered = data;
});
}, const Duration(milliseconds: 500));
},
validator: validator:
_model.textController2Validator.asValidator(context), _model.textController2Validator.asValidator(context),
inputFormatters: [ inputFormatters: [
FilteringTextInputFormatter.allow(RegExp('[0-9]')), FilteringTextInputFormatter.allow(RegExp('[0-9]')),
], ],
), ),
FutureBuilder( _model.textController2.text.isEmpty
future: _model.textController2.text.isNotEmpty
? _model.getVisitanteByDocument(
_model.textController2.text, context)
: null,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState ==
ConnectionState.waiting) {
return const SizedBox();
} else if (snapshot.hasError ||
snapshot.data == null ||
snapshot.data == '') {
// safeSetState(() => _isVisitorRegistered = false);
_isVisitorRegistered = false;
visitorAlreadyRegistered.add(true);
return const SizedBox();
} else {
_isVisitorRegistered = true;
visitorAlreadyRegistered.add(false);
return _model.textController2.text.isEmpty
? const SizedBox() ? const SizedBox()
: Row( : _isVisitorRegistered == true
? Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
@ -263,8 +259,7 @@ class _RegisiterVistorTemplateComponentWidgetState
child: Text( child: Text(
FFLocalizations.of(context) FFLocalizations.of(context)
.getVariableText( .getVariableText(
enText: enText: 'Visitor already registered',
'Visitor already registered',
ptText: 'Visitante já cadastrado', ptText: 'Visitante já cadastrado',
), ),
style: FlutterFlowTheme.of(context) style: FlutterFlowTheme.of(context)
@ -287,10 +282,8 @@ class _RegisiterVistorTemplateComponentWidgetState
)), )),
), ),
], ],
); )
} : const SizedBox()
},
),
]), ]),
), ),
Padding( Padding(
@ -805,7 +798,6 @@ class _RegisiterVistorTemplateComponentWidgetState
child: FFButtonWidget( child: FFButtonWidget(
onPressed: _isFormValid(context) onPressed: _isFormValid(context)
? () async { ? () async {
if (visitorAlreadyRegistered.value == true) {
_model.imgBase64 = _model.imgBase64 =
await actions.convertImageFileToBase64( await actions.convertImageFileToBase64(
_model.uploadedLocalFile, _model.uploadedLocalFile,
@ -834,8 +826,7 @@ class _RegisiterVistorTemplateComponentWidgetState
return GestureDetector( return GestureDetector(
onTap: () => Navigator.pop(context), onTap: () => Navigator.pop(context),
child: Padding( child: Padding(
padding: padding: MediaQuery.viewInsetsOf(context),
MediaQuery.viewInsetsOf(context),
child: Dialog( child: Dialog(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
child: ThrowExceptionWidget( child: ThrowExceptionWidget(
@ -863,6 +854,8 @@ class _RegisiterVistorTemplateComponentWidgetState
_model.textController3?.clear(); _model.textController3?.clear();
_model.textController4?.clear(); _model.textController4?.clear();
_model.dropDownValueController?.reset(); _model.dropDownValueController?.reset();
_model.uploadedLocalFile = FFUploadedFile(
bytes: Uint8List.fromList([]));
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
@ -872,8 +865,7 @@ class _RegisiterVistorTemplateComponentWidgetState
enText: enText:
'Visitor successfully registered.'), 'Visitor successfully registered.'),
style: TextStyle( style: TextStyle(
color: color: FlutterFlowTheme.of(context)
FlutterFlowTheme.of(context)
.info)), .info)),
backgroundColor: backgroundColor:
FlutterFlowTheme.of(context).primary, FlutterFlowTheme.of(context).primary,
@ -896,21 +888,21 @@ class _RegisiterVistorTemplateComponentWidgetState
} else { } else {
return DialogUtil.error( return DialogUtil.error(
context, context,
PhpGroup.postScheduleVisitorCall PhpGroup.postScheduleVisitorCall.errorMsg(
_model
.scheduleVisitor?.jsonBody) ==
null
? FFLocalizations.of(context)
.getVariableText(
ptText:
'Erro ao se conectar com o servidor',
enText: 'Error connecting to server',
)
: PhpGroup.postScheduleVisitorCall
.errorMsg( .errorMsg(
_model.scheduleVisitor?.jsonBody) _model.scheduleVisitor?.jsonBody)
.toString()); .toString());
} }
} else {
DialogUtil.error(
context,
FFLocalizations.of(context).getVariableText(
ptText:
'Visitante já cadastrado. Verifique se o documento foi preenchido corretamente.',
enText:
'Visitor already registered. Check if the document was filled in correctly.',
));
}
} }
: null, : null,
text: FFLocalizations.of(context).getText( text: FFLocalizations.of(context).getText(

View File

@ -13,11 +13,11 @@ import 'package:intl/intl.dart';
class ScheduleCompleteVisitPageModel class ScheduleCompleteVisitPageModel
extends FlutterFlowModel<ScheduleCompleteVisitPageWidget> { extends FlutterFlowModel<ScheduleCompleteVisitPageWidget> {
final _visitHistoryManager = StreamRequestManager<ApiCallResponse>(); final _visitHistoryManager = FutureRequestManager<ApiCallResponse>();
Stream<ApiCallResponse> visitHistory({ Future<ApiCallResponse> visitHistory({
String? uniqueQueryKey, String? uniqueQueryKey,
bool? overrideCache, bool? overrideCache,
required Stream<ApiCallResponse> Function() requestFn, required Future<ApiCallResponse> Function() requestFn,
}) => }) =>
_visitHistoryManager.performRequest( _visitHistoryManager.performRequest(
uniqueQueryKey: uniqueQueryKey, uniqueQueryKey: uniqueQueryKey,

View File

@ -10,6 +10,7 @@ import 'package:hub/actions/actions.dart';
import 'package:hub/backend/api_requests/api_calls.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/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/components/templates_components/details_component/details_component_action.dart';
import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
import 'package:hub/components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart'; import 'package:hub/components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart';
import 'package:hub/components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart'; import 'package:hub/components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart';
import 'package:hub/flutter_flow/custom_functions.dart'; import 'package:hub/flutter_flow/custom_functions.dart';
@ -1580,18 +1581,25 @@ Widget scheduleVisit(
child: SizedBox( child: SizedBox(
// width: MediaQuery.of(context).size.width, // width: MediaQuery.of(context).size.width,
// height: MediaQuery.of(context).size.height * 0.7, // height: MediaQuery.of(context).size.height * 0.7,
child: VisitDetailsModalTemplateComponentWidget( // child: VisitDetailsModalTemplateComponentWidget(
visitStartDateStr: _model.textController1.text, // visitStartDateStr: _model.textController1.text,
visitEndDateStr: _model.textController2.text, // visitEndDateStr: _model.textController2.text,
visitReasonStr: _model.dropDownValue1, // visitReasonStr: _model.dropDownValue1,
visitLevelStr: _model.dropDownValue2, // visitLevelStr: _model.dropDownValue2,
visitTempStr: // visitTempStr:
_model.switchValue == true ? 'Sim' : 'Não', // _model.switchValue == true ? 'Sim' : 'Não',
visitObsStr: _model.textController3.text, // visitObsStr: _model.textController3.text,
visitorStrList: _model.visitorStrList, // visitorStrList: _model.visitorStrList,
visitorJsonList: _model.visitorJsonList, // visitorJsonList: _model.visitorJsonList,
updateToggleIdx: () async {}, // updateToggleIdx: () async {},
repeatVisitSchedule: () async {}, // repeatVisitSchedule: () async {},
// ),
child: VisitRequestTemplateComponentWidget(
buttons: [],
imageHashMap: {},
labelsHashMap: {},
statusHashMap: [],
onTapCardItemAction: () async {},
), ),
), ),
), ),

View File

@ -11,7 +11,6 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart'; import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart';
import 'package:provider/provider.dart';
class VisitHistoryWidget extends StatefulWidget { class VisitHistoryWidget extends StatefulWidget {
VisitHistoryWidget({ VisitHistoryWidget({
@ -23,27 +22,45 @@ class VisitHistoryWidget extends StatefulWidget {
} }
class _VisitHistoryWidgetState extends State<VisitHistoryWidget> { class _VisitHistoryWidgetState extends State<VisitHistoryWidget> {
late Future<ApiCallResponse> visitFuture;
var pageNumber = 1;
@override @override
Widget build(BuildContext context) { void initState() {
var response = ScheduleCompleteVisitPageModel().visitHistory( super.initState();
// Inicialização inicial
visitFuture = ScheduleCompleteVisitPageModel().visitHistory(
requestFn: () => PhpGroup.getVisitsCall.call( requestFn: () => PhpGroup.getVisitsCall.call(
devUUID: FFAppState().devUUID, devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID, userUUID: FFAppState().userUUID,
cliID: FFAppState().cliUUID, cliID: FFAppState().cliUUID,
atividade: 'getVisitas', atividade: 'getVisitas',
pageSize: 100, pageSize: 100,
pageNumber: 1, pageNumber: pageNumber,
), ),
); );
return Container( }
width: double.infinity,
height: 900.0, void updateVisitFuture() {
decoration: BoxDecoration( // Atualização do valor da variável late
color: FlutterFlowTheme.of(context).primaryBackground, setState(() {
visitFuture = ScheduleCompleteVisitPageModel().visitHistory(
requestFn: () => PhpGroup.getVisitsCall.call(
devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID,
cliID: FFAppState().cliUUID,
atividade: 'getVisitas',
pageSize: 100,
pageNumber: pageNumber,
), ),
// child: Consumer<ScheduleCompleteVisitPageModel>( );
child: StreamBuilder<dynamic>( });
stream: response, }
@override
Widget build(BuildContext context) {
return FutureBuilder<dynamic>(
future: visitFuture,
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return Center( return Center(
@ -56,13 +73,19 @@ class _VisitHistoryWidgetState extends State<VisitHistoryWidget> {
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}')); return Center(child: Text('Error: ${snapshot.error}'));
} else if (!snapshot.hasData || snapshot.data!.jsonBody == null) { } else if (!snapshot.hasData || snapshot.data!.jsonBody == null) {
return const Center(child: Text('No visits found')); return Center(
child: Text(FFLocalizations.of(context).getVariableText(
ptText: 'Nenhum visitante foi encontrado',
enText: 'No visitors found',
)));
} }
var wrapGetVisitsResponse = snapshot.data!; var wrapGetVisitsResponse = snapshot.data!;
var visitaWrap = PhpGroup.getVisitsCall var visitaWrap = PhpGroup.getVisitsCall
.visitasList(wrapGetVisitsResponse.jsonBody) .visitasList(wrapGetVisitsResponse.jsonBody)
?.toList() ?? ?.toList() ??
[]; [];
return ListView.builder( return ListView.builder(
itemCount: visitaWrap.length, itemCount: visitaWrap.length,
shrinkWrap: true, shrinkWrap: true,
@ -87,8 +110,7 @@ class _VisitHistoryWidgetState extends State<VisitHistoryWidget> {
enText: 'Active', enText: 'Active',
): FlutterFlowTheme.of(context).warning, ): FlutterFlowTheme.of(context).warning,
}, },
if (getStatus(visitaWrapItem['VAW_STATUS']) == if (getStatus(visitaWrapItem['VAW_STATUS']) == status.finished)
status.finished)
{ {
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
ptText: 'Finalizado', ptText: 'Finalizado',
@ -102,8 +124,7 @@ class _VisitHistoryWidgetState extends State<VisitHistoryWidget> {
enText: 'Unknown', enText: 'Unknown',
): FlutterFlowTheme.of(context).alternate, ): FlutterFlowTheme.of(context).alternate,
}, },
if (getStatus(visitaWrapItem['VAW_STATUS']) == if (getStatus(visitaWrapItem['VAW_STATUS']) == status.canceled)
status.canceled)
{ {
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
ptText: 'Cancelado', ptText: 'Cancelado',
@ -117,23 +138,18 @@ class _VisitHistoryWidgetState extends State<VisitHistoryWidget> {
enText: 'Blocked', enText: 'Blocked',
): FlutterFlowTheme.of(context).error, ): FlutterFlowTheme.of(context).error,
}, },
if (getStatus(visitaWrapItem['VAW_STATUS']) == if (getStatus(visitaWrapItem['VAW_STATUS']) == status.inactive)
status.inactive)
{ {
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
ptText: 'Inactive', ptText: 'Inativo',
enText: 'Inactive', enText: 'Inactive',
): FlutterFlowTheme.of(context).error, ): FlutterFlowTheme.of(context).error,
}, },
], ],
onTapCardItemAction: () async { onTapCardItemAction: () async {
await showDialog( await showDialog(
// isScrollControlled: true,
// isDismissible: true,
// backgroundColor: Colors.transparent,
useSafeArea: true, useSafeArea: true,
context: context, context: context,
builder: (context) { builder: (context) {
return Dialog( return Dialog(
alignment: Alignment.center, alignment: Alignment.center,
@ -144,32 +160,15 @@ class _VisitHistoryWidgetState extends State<VisitHistoryWidget> {
), ),
); );
}, },
).whenComplete(() async { ).whenComplete(() {
final newResponseStream = log('Dialog closed');
ScheduleCompleteVisitPageModel().visitHistory( updateVisitFuture();
requestFn: () => PhpGroup.getVisitsCall.call(
devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID,
cliID: FFAppState().cliUUID,
atividade: 'getVisitas',
pageSize: 100,
pageNumber: 1,
),
);
newResponseStream.listen((newResponse) {
if (mounted) {
safeSetState(() {
response = newResponse.jsonBody;
});
} else {}
}).onError((err) {});
}).catchError((err, stack) {}); }).catchError((err, stack) {});
}, },
); );
}, },
); );
}, },
),
); );
} }
} }