From a7ef2a6d4509ad0c1c96099396bfb9939351e20e Mon Sep 17 00:00:00 2001 From: jantunesmesias Date: Thu, 29 Aug 2024 11:30:35 -0300 Subject: [PATCH] WIP --- ..._arrow_linked_locals_component_widget.dart | 7 +- .../local_profile_component_widget.dart | 24 +-- lib/pages/home_page/home_page_bloc.dart | 94 +++++++++++ lib/pages/home_page/home_page_event.dart | 13 ++ lib/pages/home_page/home_page_model.dart | 5 +- lib/pages/home_page/home_page_state.dart | 29 ++++ lib/pages/home_page/home_page_widget.dart | 147 +++++++++++++----- 7 files changed, 253 insertions(+), 66 deletions(-) create mode 100644 lib/pages/home_page/home_page_bloc.dart create mode 100644 lib/pages/home_page/home_page_event.dart create mode 100644 lib/pages/home_page/home_page_state.dart diff --git a/lib/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart b/lib/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart index c1f544bc..5d899cab 100644 --- a/lib/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart +++ b/lib/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart @@ -194,12 +194,15 @@ class _BottomArrowLinkedLocalsComponentWidgetState () async { var response = await _fetchResponseLink('A', local['CLI_ID']); Navigator.pop(context); + if (response['error'] == true) { DialogUtil.error(context, response['error_msg']); } else { DialogUtil.success(context, response['error_msg']); - _localsWrap = []; - _localsFuture = _fetchLocals(); + setState(() { + _localsWrap = []; + _localsFuture = _fetchLocals(); + }); } }); } diff --git a/lib/components/organism_components/local_profile_component/local_profile_component_widget.dart b/lib/components/organism_components/local_profile_component/local_profile_component_widget.dart index 0b9e4aaf..f2003b6f 100644 --- a/lib/components/organism_components/local_profile_component/local_profile_component_widget.dart +++ b/lib/components/organism_components/local_profile_component/local_profile_component_widget.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; -import '/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; import '/flutter_flow/custom_functions.dart' as functions; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; @@ -14,7 +13,10 @@ export 'local_profile_component_model.dart'; //// class LocalProfileComponentWidget extends StatefulWidget { - const LocalProfileComponentWidget({super.key}); + LocalProfileComponentWidget({Key? key, required this.showBottomSheet}) + : super(key: key); + + VoidCallback showBottomSheet; @override State createState() => @@ -77,23 +79,7 @@ class _LocalProfileComponentWidgetState hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { - showModalBottomSheet( - isScrollControlled: true, - backgroundColor: const Color(0x00FFFFFF), - context: context, - enableDrag: false, - isDismissible: false, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const SizedBox( - height: double.infinity, - child: - BottomArrowLinkedLocalsComponentWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); + widget.showBottomSheet(); }, child: ClipRRect( borderRadius: BorderRadius.circular(200.0), diff --git a/lib/pages/home_page/home_page_bloc.dart b/lib/pages/home_page/home_page_bloc.dart new file mode 100644 index 00000000..3fa71a85 --- /dev/null +++ b/lib/pages/home_page/home_page_bloc.dart @@ -0,0 +1,94 @@ +// home_page_bloc.dart +import 'package:bloc/bloc.dart'; +import 'package:flutter/material.dart'; +import 'package:hub/app_state.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; +import 'package:hub/shared/utils/dialog_util.dart'; + +import 'home_page_event.dart'; +import 'home_page_state.dart'; + +class HomePageBloc extends Bloc { + HomePageBloc() : super(HomePageInitial()) { + on(_onLoadData); + on(_onToggleGrid); + } + + Future _onLoadData(LoadData event, Emitter emit) async { + emit(HomePageLoading()); + try { + final response = await PhpGroup.getDadosCall.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + cliUUID: AppState().cliUUID, + atividade: 'getDados', + ); + + if (response.statusCode == 200) { + final error = response.jsonBody['error']; + final errorMsg = response.jsonBody['error_msg']; + + if (error == false) { + AppState().whatsapp = response.jsonBody['whatsapp']; + AppState().provisional = response.jsonBody['provisional']; + AppState().name = response.jsonBody['visitado']['VDO_NOME']; + emit(HomePageLoaded()); + } else { + await DialogUtil.warningDefault(AppState().context!) + .whenComplete(() => _checkLocal()); + } + } else { + await DialogUtil.warningDefault(AppState().context!) + .whenComplete(() => _checkLocal()); + } + } catch (e) { + emit(HomePageError(message: 'Error in checkData: $e')); + } + } + + Future _onToggleGrid( + ToggleGrid event, Emitter emit) async { + if (state is HomePageLoaded) { + final currentState = state as HomePageLoaded; + emit(const HomePageLoaded()); + } + } + + Future _checkLocal() async { + try { + final response = await PhpGroup.getLocalsCall.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + ); + + List locals = response.jsonBody['locais'] ?? []; + final activeLocals = + locals.where((local) => local['CLU_STATUS'] == 'A').toList(); + + if (activeLocals.isEmpty || AppState().cliUUID.isEmpty) { + await _showBottomSheet(); + } else { + add(LoadData()); + } + } catch (e) { + await _showBottomSheet(); + } + } + + Future _showBottomSheet() async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + isDismissible: false, + context: AppState().context!, + builder: (context) => Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const BottomArrowLinkedLocalsComponentWidget(), + ), + ).then((_) async { + add(LoadData()); + }); + } +} diff --git a/lib/pages/home_page/home_page_event.dart b/lib/pages/home_page/home_page_event.dart new file mode 100644 index 00000000..b50159fd --- /dev/null +++ b/lib/pages/home_page/home_page_event.dart @@ -0,0 +1,13 @@ +// home_page_event.dart +import 'package:equatable/equatable.dart'; + +abstract class HomePageEvent extends Equatable { + const HomePageEvent(); + + @override + List get props => []; +} + +class LoadData extends HomePageEvent {} + +class ToggleGrid extends HomePageEvent {} diff --git a/lib/pages/home_page/home_page_model.dart b/lib/pages/home_page/home_page_model.dart index 7c227e9c..5a4933ab 100644 --- a/lib/pages/home_page/home_page_model.dart +++ b/lib/pages/home_page/home_page_model.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:hub/components/organism_components/local_profile_component/local_profile_component_model.dart'; import 'package:hub/components/organism_components/menu_component/menu_component_model.dart'; @@ -44,6 +43,4 @@ class HomePageModel extends FlutterFlowModel { menuComponentModel.dispose(); messageWellComponentModel.dispose(); } - - -} \ No newline at end of file +} diff --git a/lib/pages/home_page/home_page_state.dart b/lib/pages/home_page/home_page_state.dart new file mode 100644 index 00000000..c6e94f87 --- /dev/null +++ b/lib/pages/home_page/home_page_state.dart @@ -0,0 +1,29 @@ +// home_page_state.dart +import 'package:equatable/equatable.dart'; + +abstract class HomePageState extends Equatable { + const HomePageState(); + + @override + List get props => []; +} + +class HomePageInitial extends HomePageState {} + +class HomePageLoading extends HomePageState {} + +class HomePageLoaded extends HomePageState { + const HomePageLoaded(); + + @override + List get props => []; +} + +class HomePageError extends HomePageState { + final String message; + + const HomePageError({required this.message}); + + @override + List get props => [message]; +} diff --git a/lib/pages/home_page/home_page_widget.dart b/lib/pages/home_page/home_page_widget.dart index 346e3f35..f7fc329a 100644 --- a/lib/pages/home_page/home_page_widget.dart +++ b/lib/pages/home_page/home_page_widget.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:developer'; import 'package:flutter/gestures.dart'; @@ -15,6 +16,7 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/pages/home_page/home_page_model.dart'; import 'package:hub/shared/utils/dialog_util.dart'; import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart'; +import 'package:rxdart/rxdart.dart'; class HomePageWidget extends StatefulWidget { const HomePageWidget({Key? key}); @@ -26,46 +28,70 @@ class HomePageWidget extends StatefulWidget { class _HomePageWidgetState extends State { late HomePageModel _model; final scaffoldKey = GlobalKey(); - LocalProfileComponentWidget _localProfileComponentWidget = - const LocalProfileComponentWidget(); + late LocalProfileComponentWidget _localProfileComponentWidget; _HomePageWidgetState() { log('HomePageWidget'); + _localProfileComponentWidget = + LocalProfileComponentWidget(showBottomSheet: showBottomSheet); } + final _dataSubject = BehaviorSubject(); + bool isShowModalLocal = false; + bool isShowingBottomSheet = false; + Future checkData() async { try { - final response = await PhpGroup.getDadosCall.call( + PhpGroup.getDadosCall + .call( devUUID: AppState().devUUID, userUUID: AppState().userUUID, cliUUID: AppState().cliUUID, atividade: 'getDados', - ); - - if (response.statusCode == 200) { - if (response.jsonBody['error'] == false) { - AppState().whatsapp = response.jsonBody['whatsapp']; - AppState().provisional = response.jsonBody['provisional']; - AppState().name = response.jsonBody['visitado']['VDO_NOME']; - safeSetState(() {}); - } else { + ) + .then((response) { + log('Response getDadosCall: ${response.jsonBody}'); + if (response.statusCode == 200) { + final error = response.jsonBody['error']; final errorMsg = response.jsonBody['error_msg']; - if (errorMsg != + + if (error == false) { + AppState().whatsapp = response.jsonBody['whatsapp'] ?? false; + AppState().provisional = response.jsonBody['provisional'] ?? false; + AppState().name = response.jsonBody['visitado']['VDO_NOME']; + safeSetState(() {}); + } else if (errorMsg == r'''Usuario nao possui vĂ­nculo ativo com esse condominio''') { log(errorMsg); - await DialogUtil.warningDefault(context) - .whenComplete(() => checkData()); - safeSetState(() {}); + return DialogUtil.warningDefault(context) + .whenComplete(() => checkLocal()) + .then((_) => safeSetState(() {})); + } else { + return DialogUtil.warningDefault(context) + .whenComplete(() => checkLocal()) + .then((_) => safeSetState(() {})); } + } else { + return DialogUtil.warningDefault(context) + .whenComplete(() => checkLocal()) + .then((_) => safeSetState(() {})); } - } else { - await DialogUtil.warningDefault(context) - .whenComplete(() => checkData()); + }).catchError((e) { + log('Error in getDadosCall: $e'); + return DialogUtil.warningDefault(context) + .whenComplete(() => checkLocal()) + .then((_) => safeSetState(() {})); + }).onError((error, stackTrace) { + log('Error in getDadosCall: $error\n\n$stackTrace'); + return DialogUtil.warningDefault(context) + .whenComplete(() => checkLocal()) + .then((_) => safeSetState(() {})); + }).whenComplete(() { safeSetState(() {}); - } - } catch (e) { - log('Error in checkData: $e'); - await DialogUtil.warningDefault(context).whenComplete(() => checkData()); + }); + } catch (e, s) { + log('Error in checkData: \n\n$e\n\n$s'); + await DialogUtil.warningDefault(context).whenComplete(() => checkLocal()); } } @@ -80,17 +106,28 @@ class _HomePageWidgetState extends State { List locals = response.jsonBody['locais'] ?? []; final activeLocals = locals.where((local) => local['CLU_STATUS'] == 'A').toList(); + log('ActiveLocals: $activeLocals'); if (activeLocals.isEmpty || AppState().cliUUID.isEmpty) { - await showBottomSheet().then((_) => checkData()); + log('2ShowBottomSheet: $isShowModalLocal'); + if (isShowModalLocal || isShowingBottomSheet) return; + isShowModalLocal = true; + await showBottomSheet(); + } else { + await checkData(); } } catch (e) { log('Error in checkLocal: $e'); - await showBottomSheet().then((_) => checkData()); + if (isShowModalLocal || isShowingBottomSheet) return; + await showBottomSheet(); } } Future showBottomSheet() async { + if (isShowingBottomSheet) return; + isShowingBottomSheet = true; + + log('ShowBottomSheet: $isShowModalLocal'); await showModalBottomSheet( isScrollControlled: true, backgroundColor: Colors.transparent, @@ -101,9 +138,36 @@ class _HomePageWidgetState extends State { padding: MediaQuery.viewInsetsOf(context), child: const BottomArrowLinkedLocalsComponentWidget(), ), - ).then((_) => safeSetState(() { - _localProfileComponentWidget = const LocalProfileComponentWidget(); - })); + ).then((_) async { + _model.updatePage(() => safeSetState(() { + // isShowModalLocal = false; + _localProfileComponentWidget = + LocalProfileComponentWidget(showBottomSheet: showBottomSheet); + })); + await checkData(); + }).whenComplete(() { + isShowingBottomSheet = false; + }); + } + + @override + void dispose() { + _model.dispose(); + + // Close the data subject + _dataSubject.close(); + + super.dispose(); + } + + // Call this method to trigger the checkData() function + void triggerCheckData() { + _dataSubject.add(true); + } + + // Call this method to trigger the checkLocal() function + void triggerCheckLocal() { + _dataSubject.add(false); } @override @@ -113,30 +177,31 @@ class _HomePageWidgetState extends State { _model = createModel(context, () => HomePageModel()); _model.updateOnChange = true; - AppState().context = context; - - WidgetsBinding.instance.addPostFrameCallback((_) async { - await checkLocal(); - }); () async { await FirebaseMessagingService().updateDeviceToken(); + checkLocal(); }(); + _dataSubject.stream.listen((data) { + if (data) { + checkData(); + } else { + checkLocal(); + } + }); + + // WidgetsBinding.instance.addPostFrameCallback((_) async { + // }); + _model.textController ??= TextEditingController(); _model.textFieldFocusNode ??= FocusNode(); - } - @override - void dispose() { - _model.dispose(); - - super.dispose(); + // Subscribe to the data subject } @override Widget build(BuildContext context) { - // context.watch(); - + AppState().context = context; return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode)