This commit is contained in:
jantunesmesias 2024-08-07 10:22:48 -03:00
parent 262b8dd63b
commit 2a5acf1016
9 changed files with 356 additions and 316 deletions

View File

@ -344,7 +344,6 @@ Future<bool> visitRequestComponentAction(
if (respondeSolicitacaoCall.statusCode == 200) { if (respondeSolicitacaoCall.statusCode == 200) {
log('jsonBody: ${respondeSolicitacaoCall.jsonBody}; actionValue: $actionValue; refUUID: $refUUID; responseValue: $responseValue; vteUUID: $vteUUID; status: ${respondeSolicitacaoCall.jsonBody['error']}'); log('jsonBody: ${respondeSolicitacaoCall.jsonBody}; actionValue: $actionValue; refUUID: $refUUID; responseValue: $responseValue; vteUUID: $vteUUID; status: ${respondeSolicitacaoCall.jsonBody['error']}');
return !respondeSolicitacaoCall.jsonBody['error']; return !respondeSolicitacaoCall.jsonBody['error'];
} else { } else {
log('headers: ${respondeSolicitacaoCall.headers}'); log('headers: ${respondeSolicitacaoCall.headers}');
@ -485,8 +484,10 @@ Future changeStatusAction(
if (!context.mounted) return; if (!context.mounted) return;
if (blockVisitRequest == true) { if (blockVisitRequest == true) {
log('Bloqueado'); log('Bloqueado');
return true;
} else { } else {
log('Erro ao bloquear'); log('Erro ao bloquear');
return false;
} }
break; break;
default: default:

View File

@ -1370,17 +1370,21 @@ class PostProvVisitSchedulingCall {
} }
class GetVisitsCall { class GetVisitsCall {
Future<ApiCallResponse> call({ Stream<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();
return ApiManager.instance.makeApiCall( Future.microtask(
() 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,
@ -1403,6 +1407,16 @@ 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

@ -5,6 +5,7 @@ import 'package:hub/app_state.dart';
import 'package:hub/components/templates_components/details_component/details_component_widget.dart'; import 'package:hub/components/templates_components/details_component/details_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; import 'package:hub/flutter_flow/flutter_flow_widgets.dart';
import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/internationalization.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
@ -105,13 +106,47 @@ Widget buildDetails(
ptText: 'Sim', ptText: 'Sim',
), ),
onPressed: () async { onPressed: () async {
await changeStatusAction?.call( await changeStatusAction
?.call(
context, context,
'B', 'B',
visitaWrapItem['VAW_REF'] ?? '', visitaWrapItem['VAW_REF'] ?? '',
'Mensagem', 'Mensagem',
visitaWrapItem['VTE_ID'] ?? '', visitaWrapItem['VTE_ID'] ?? '',
)
.then((value) {
Navigator.pop(context);
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) {
debugPrint('Error: $err');
debugPrint('Stack: $stack');
showSnackbar(
context,
FFLocalizations.of(context).getVariableText(
enText: 'Error blocking visit',
ptText: 'Erro ao bloquear visita',
),
true,
);
});
}, },
options: FFButtonOptions( options: FFButtonOptions(
width: 100, width: 100,

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:from_css_color/from_css_color.dart'; import 'package:from_css_color/from_css_color.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'dart:math' show pow, pi, sin; import 'dart:math' show pow, pi, sin;
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:json_path/json_path.dart'; import 'package:json_path/json_path.dart';
@ -505,7 +506,8 @@ void setDarkModeSetting(BuildContext context, ThemeMode themeMode) =>
void showSnackbar( void showSnackbar(
BuildContext context, BuildContext context,
String message, { String message,
bool error, {
bool loading = false, bool loading = false,
int duration = 4, int duration = 4,
}) { }) {
@ -515,20 +517,32 @@ void showSnackbar(
content: Row( content: Row(
children: [ children: [
if (loading) if (loading)
const Padding( Padding(
padding: EdgeInsetsDirectional.only(end: 10.0), padding: const EdgeInsetsDirectional.only(end: 10.0),
child: SizedBox( child: SizedBox(
height: 20, height: 20,
width: 20, width: 20,
child: CircularProgressIndicator( child: CircularProgressIndicator(
color: Colors.white, color: FlutterFlowTheme.of(context).info,
), ),
), ),
), ),
Text(message), Text(
message,
style: TextStyle(
color: FlutterFlowTheme.of(context).info,
),
),
], ],
), ),
duration: Duration(seconds: duration), duration: Duration(seconds: duration),
backgroundColor: error
? FlutterFlowTheme.of(context).error
: FlutterFlowTheme.of(context).success,
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
), ),
); );
} }

View File

@ -282,6 +282,8 @@ class PreferencesPageModel with ChangeNotifier {
tarefa: 'I', tarefa: 'I',
) )
.then((value) { .then((value) {
log(value.jsonBody['error'].toString());
if (value.jsonBody['error'] == false) {
FFAppState().deleteCliUUID(); FFAppState().deleteCliUUID();
FFAppState().deleteLocal(); FFAppState().deleteLocal();
FFAppState().deleteOwnerUUID(); FFAppState().deleteOwnerUUID();
@ -297,9 +299,8 @@ class PreferencesPageModel with ChangeNotifier {
'Dispositivo desvinculado com sucesso', 'Dispositivo desvinculado com sucesso',
), ),
style: TextStyle( style: TextStyle(
color: FlutterFlowTheme.of(context).info, color:
), FlutterFlowTheme.of(context).info)),
),
backgroundColor: backgroundColor:
FlutterFlowTheme.of(context).success, FlutterFlowTheme.of(context).success,
duration: const Duration(seconds: 3), duration: const Duration(seconds: 3),
@ -309,7 +310,10 @@ class PreferencesPageModel with ChangeNotifier {
), ),
), ),
); );
}).catchError((err, stack) { }
})
// ignore: body_might_complete_normally_catch_error
.catchError((err, stack) {
log(err.toString()); log(err.toString());
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
@ -319,31 +323,8 @@ class PreferencesPageModel with ChangeNotifier {
ptText: 'Erro ao desvincular dispositivo', ptText: 'Erro ao desvincular dispositivo',
), ),
style: TextStyle( style: TextStyle(
color: FlutterFlowTheme.of(context).info, color:
), FlutterFlowTheme.of(context).info)),
),
backgroundColor:
FlutterFlowTheme.of(context).error,
duration: const Duration(seconds: 3),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
);
}).catchError((err, stack) {
log(err.toString());
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
FFLocalizations.of(context).getVariableText(
enText: 'Error unlinking device',
ptText: 'Erro ao desvincular dispositivo',
),
style: TextStyle(
color: FlutterFlowTheme.of(context).info,
),
),
backgroundColor: backgroundColor:
FlutterFlowTheme.of(context).error, FlutterFlowTheme.of(context).error,
duration: const Duration(seconds: 3), duration: const Duration(seconds: 3),
@ -454,6 +435,7 @@ class PreferencesPageModel with ChangeNotifier {
userUUID: FFAppState().userUUID, userUUID: FFAppState().userUUID,
) )
.then((value) { .then((value) {
if (value.jsonBody['error'] == false) {
FFAppState().deleteAll(); FFAppState().deleteAll();
FFAppState().isLogged = false; FFAppState().isLogged = false;
context.goNamed( context.goNamed(
@ -466,6 +448,7 @@ class PreferencesPageModel with ChangeNotifier {
), ),
}, },
); );
}
}).catchError((err) { }).catchError((err) {
log(err.toString()); log(err.toString());
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(

View File

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

View File

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -1694,39 +1696,41 @@ Widget visitHistory(
decoration: BoxDecoration( decoration: BoxDecoration(
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
), ),
child: SingleChildScrollView( child: StreamBuilder<ApiCallResponse>(
child: FutureBuilder<ApiCallResponse>( stream: _model.visitHistory(
future: _model.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,
pageNumber: 1,
), ),
), ),
builder: (context, snapshot) { builder: (context, snapshot) {
// Customize what your widget looks like when it's loading. if (snapshot.connectionState == ConnectionState.waiting) {
if (!snapshot.hasData) {
return Center( return Center(
child: SizedBox( child: CircularProgressIndicator(
width: 50.0, valueColor: AlwaysStoppedAnimation<Color>(
height: 50.0, FlutterFlowTheme.of(context).primary,
child: SpinKitCircle(
color: FlutterFlowTheme.of(context).primary,
size: 50.0,
), ),
), ));
); } else if (snapshot.hasError) {
log('Error: ${snapshot.error}');
return Center(child: Text('Error: ${snapshot.error}'));
} else if (!snapshot.hasData || snapshot.data!.jsonBody == null) {
log('No data or jsonBody is null');
return const Center(child: Text('No visits found'));
} }
final wrapGetVisitsResponse = snapshot.data!; final wrapGetVisitsResponse = snapshot.data!;
return Builder( log('Response: ${wrapGetVisitsResponse.jsonBody}');
builder: (context) {
final visitaWrap = PhpGroup.getVisitsCall final visitaWrap = PhpGroup.getVisitsCall
.visitasList( .visitasList(wrapGetVisitsResponse.jsonBody)
wrapGetVisitsResponse.jsonBody,
)
?.toList() ?? ?.toList() ??
[]; [];
log('visitaWrap: $visitaWrap');
return ListView.builder( return ListView.builder(
itemCount: visitaWrap.length, itemCount: visitaWrap.length,
shrinkWrap: true, shrinkWrap: true,
@ -1738,8 +1742,6 @@ Widget visitHistory(
addSemanticIndexes: true, addSemanticIndexes: true,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final visitaWrapItem = visitaWrap[index]; final visitaWrapItem = visitaWrap[index];
// visitaWrap.length, (visitaWrapIndex) {
return CardItemTemplateComponentWidget( return CardItemTemplateComponentWidget(
imageHashMap: Map<String, String>.from({ imageHashMap: Map<String, String>.from({
'key': visitaWrapItem['VTE_DOCUMENTO'] ?? '', 'key': visitaWrapItem['VTE_DOCUMENTO'] ?? '',
@ -1889,9 +1891,6 @@ Widget visitHistory(
}); });
}); });
}, },
);
},
),
), ),
); );
} }

View File

@ -1,5 +1,3 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_manager.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
@ -8,11 +6,11 @@ import 'package:hub/flutter_flow/request_manager.dart';
import 'package:hub/pages/visit_history_page/visit_history_page_widget.dart'; import 'package:hub/pages/visit_history_page/visit_history_page_widget.dart';
class VisitHistoryPageModel extends FlutterFlowModel<VisitHistoryPageWidget> { class VisitHistoryPageModel extends FlutterFlowModel<VisitHistoryPageWidget> {
final _visitHistoryManager = FutureRequestManager<ApiCallResponse>(); final _visitHistoryManager = StreamRequestManager<ApiCallResponse>();
Future<ApiCallResponse> visitHistory({ Stream<ApiCallResponse> visitHistory({
String? uniqueQueryKey, String? uniqueQueryKey,
bool? overrideCache, bool? overrideCache,
required Future<ApiCallResponse> Function() requestFn, required Stream<ApiCallResponse> Function() requestFn,
}) => }) =>
_visitHistoryManager.performRequest( _visitHistoryManager.performRequest(
uniqueQueryKey: uniqueQueryKey, uniqueQueryKey: uniqueQueryKey,

View File

@ -17,7 +17,6 @@ import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/visit_history_page/visit_history_page_model.dart'; import 'package:hub/pages/visit_history_page/visit_history_page_model.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class VisitHistoryPageWidget extends StatefulWidget { class VisitHistoryPageWidget extends StatefulWidget {
const VisitHistoryPageWidget({ const VisitHistoryPageWidget({
super.key, super.key,
@ -233,8 +232,8 @@ Widget visitHistory(
), ),
], ],
), ),
FutureBuilder<ApiCallResponse>( StreamBuilder<ApiCallResponse>(
future: _model.visitHistory( stream: _model.visitHistory(
requestFn: () => PhpGroup.getVisitsCall.call( requestFn: () => PhpGroup.getVisitsCall.call(
devUUID: FFAppState().devUUID, devUUID: FFAppState().devUUID,
userUUID: FFAppState().userUUID, userUUID: FFAppState().userUUID,
@ -586,8 +585,7 @@ Widget visitHistory(
return FlutterFlowTheme return FlutterFlowTheme
.of(context) .of(context)
.success; .success;
} else if (( } else if ((jsonToStr(
jsonToStr(
getJsonField( getJsonField(
visitaWrapItem, visitaWrapItem,
r'''$.VAW_STATUS''', r'''$.VAW_STATUS''',
@ -614,8 +612,7 @@ Widget visitHistory(
return FlutterFlowTheme return FlutterFlowTheme
.of(context) .of(context)
.error; .error;
} else if ( } else if (jsonToStr(
jsonToStr(
getJsonField( getJsonField(
visitaWrapItem, visitaWrapItem,
r'''$.VAW_STATUS''', r'''$.VAW_STATUS''',
@ -655,8 +652,7 @@ Widget visitHistory(
ptText: 'Ativo', ptText: 'Ativo',
enText: 'Active', enText: 'Active',
); );
} else if (( } else if ((jsonToStr(
jsonToStr(
getJsonField( getJsonField(
visitaWrapItem, visitaWrapItem,
r'''$.VAW_STATUS''', r'''$.VAW_STATUS''',