diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 00000000..6659dd53 Binary files /dev/null and b/assets/images/logo.png differ diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 5e1adc54..c49f4258 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -379,4 +379,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 3bb356a4513d56583f2f2461d3d8eefb4cd4c3a4 -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.2 diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart index bff8a1f3..e9e8b45f 100644 --- a/lib/actions/actions.dart +++ b/lib/actions/actions.dart @@ -390,12 +390,10 @@ Future checkLocals({ required BuildContext context, required FlutterFlowModel model, }) async { - // A chamada para a API permanece a mesma, assumindo que é necessária sempre. - final response = await PhpGroup.getLocalsCall.call( - devUUID: AppState().devUUID, - userUUID: AppState().userUUID, - ); + bool itemFound = false; + var modalResult; +<<<<<<< HEAD // Verificação rápida de erro para evitar processamento desnecessário. if (response.jsonBody['error']) { return false; @@ -425,6 +423,53 @@ Future checkLocals({ } else { return false; } +======= + do { + // A chamada para a API permanece a mesma, assumindo que é necessária sempre. + final response = await PhpGroup.getLocalsCall.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + ); + + // Verificação rápida de erro para evitar processamento desnecessário. + if (response.jsonBody['error']) { + return false; + } + + // Uso eficiente de coleções para verificar a condição desejada. + final String uuid = cliUUID ?? AppState().cliUUID; + itemFound = response.jsonBody['locais'].any( + (local) => local['CLI_ID'] == uuid && local['CLU_STATUS'] == "A", + ); + + // Log e retorno condicional baseado no resultado da busca. + if (itemFound) { + return true; + } else { + // A chamada para showModalBottomSheet permanece, mas a atualização da UI é otimizada. + modalResult = await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + isDismissible: false, + context: context, + builder: (context) => GestureDetector( + onTap: () => model.unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const BottomArrowLinkedLocalsComponentWidget(), + ), + ), + ); + safeSetState( + () {}); // Chamada otimizada fora do then para evitar encadeamentos desnecessários. + } + } while (modalResult != true); + + return false; +>>>>>>> main } Future answersRequest(BuildContext context, String? ref, String? task, diff --git a/lib/app_state.dart b/lib/app_state.dart index 71aa445c..5db6acee 100644 --- a/lib/app_state.dart +++ b/lib/app_state.dart @@ -153,6 +153,12 @@ class AppState extends ChangeNotifier { await _safeInitAsync(() async { _context = await secureStorage.getObject('ff_context') ?? _context; }); + await _safeInitAsync(() async { + _provisional = await secureStorage.getBool('provisional') ?? _provisional; + }); + await _safeInitAsync(() async { + _whatsapp = await secureStorage.getBool('whatsapp') ?? _whatsapp; + }); } void update(VoidCallback callback) { @@ -162,6 +168,28 @@ class AppState extends ChangeNotifier { late FlutterSecureStorage secureStorage; + bool _whatsapp = false; + bool get whatsapp => _whatsapp; + set whatsapp(bool value) { + _whatsapp = value; + secureStorage.setBool('whatsapp', value); + } + + void deleteWhatsapp() { + secureStorage.delete(key: 'whatsapp'); + } + + bool _provisional = false; + bool get provisional => _provisional; + set provisional(bool value) { + _provisional = value; + secureStorage.setBool('provisional', value); + } + + void deleteProvisional() { + secureStorage.delete(key: 'provisional'); + } + BuildContext? _context; BuildContext? get context => _context; set context(BuildContext? value) { @@ -458,7 +486,35 @@ class AppState extends ChangeNotifier { } void deleteAll() { + AppState().deleteAccessPass(); + AppState().deleteCliUUID(); + AppState().deleteCreatedAt(); + AppState().deleteDevUUID(); + AppState().deleteDevice(); + AppState().deleteEmail(); + AppState().deleteFingerprint(); + AppState().deleteFingerprintPass(); + AppState().deleteIsLogged(); + AppState().deleteLocal(); + AppState().deleteName(); + AppState().deleteOwnerUUID(); + AppState().deletePass(); + AppState().deletePasswd(); + AppState().deletePerson(); + AppState().deletePanic(); + AppState().deletePanicPass(); + AppState().deleteProvisional(); + AppState().deleteStatus(); + AppState().deleteToken(); + AppState().deleteTokenAPNS(); + AppState().deleteUpdatedAt(); + AppState().deleteUserUUID(); + AppState().deleteWhatsapp(); + AppState().deleteContext(); + AppState().deleteRemoteId(); + AppState().deleteSerialNumber(); secureStorage.deleteAll(); + AppState().isLogged = false; } } diff --git a/lib/backend/api_requests/api_manager.dart b/lib/backend/api_requests/api_manager.dart index 14124b70..b2c1a248 100644 --- a/lib/backend/api_requests/api_manager.dart +++ b/lib/backend/api_requests/api_manager.dart @@ -510,8 +510,6 @@ class ApiManager { result = ApiCallResponse(null, {}, -1, exception: e); } - log('Params: $params'); - log('JsonBody: ${result.jsonBody}'); return result; } } diff --git a/lib/backend/schema/enums/enums.dart b/lib/backend/schema/enums/enums.dart index 64351084..029e9293 100644 --- a/lib/backend/schema/enums/enums.dart +++ b/lib/backend/schema/enums/enums.dart @@ -13,7 +13,8 @@ enum MenuView { enum MenuItem { button, - card + card, + tile, } extension FFEnumExtensions on T { @@ -32,4 +33,4 @@ T? deserializeEnum(String? value) { default: return null; } -} \ No newline at end of file +} diff --git a/lib/components/atomic_components/menu_button_item/menu_button_item_widget.dart b/lib/components/atomic_components/menu_button_item/menu_button_item_widget.dart index fd0df4ca..f3f8edf7 100644 --- a/lib/components/atomic_components/menu_button_item/menu_button_item_widget.dart +++ b/lib/components/atomic_components/menu_button_item/menu_button_item_widget.dart @@ -4,9 +4,6 @@ import 'package:hub/components/molecular_components/menu_item/menu_item.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; - - - class MenuButtonWidget extends MenuEntry { const MenuButtonWidget({ Key? key, @@ -21,7 +18,6 @@ class MenuButtonWidget extends MenuEntry { @override _MenuButtonWidgetState createState() => _MenuButtonWidgetState(); - } class _MenuButtonWidgetState extends State { @@ -30,119 +26,103 @@ class _MenuButtonWidgetState extends State { @override Widget build(BuildContext context) { return InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget.action?.call(); - }, - child: Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context).primaryBackground, - boxShadow: [ - BoxShadow( - blurRadius: 4.0, - color: - FlutterFlowTheme.of(context).customColor5, - offset: const Offset( - 0.0, - 2.0, - ), - ) - ], - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).alternate, - width: 0.5, + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.action?.call(); + }, + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: const AlignmentDirectional( - -1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB(8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - widget.icon, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Text( - widget.title ?? '', - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ].divide(const SizedBox(height: 0.0)), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Icon( + widget.icon, + color: FlutterFlowTheme.of(context).accent1, + size: 24.0, ), ), ), - ); + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + widget.title ?? '', + style: FlutterFlowTheme.of(context).titleLarge.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + ); } -} \ No newline at end of file +} diff --git a/lib/components/atomic_components/menu_card_item/menu_card_item.dart b/lib/components/atomic_components/menu_card_item/menu_card_item.dart index ac553c46..3e62f316 100644 --- a/lib/components/atomic_components/menu_card_item/menu_card_item.dart +++ b/lib/components/atomic_components/menu_card_item/menu_card_item.dart @@ -4,9 +4,6 @@ import 'package:hub/components/molecular_components/menu_item/menu_item.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; - - - class MenuCardItem extends MenuEntry { const MenuCardItem({ Key? key, @@ -21,7 +18,6 @@ class MenuCardItem extends MenuEntry { @override _MenuCardItemState createState() => _MenuCardItemState(); - } class _MenuCardItemState extends State { @@ -30,81 +26,66 @@ class _MenuCardItemState extends State { @override Widget build(BuildContext context) { return InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await widget.action?.call(); - }, - child: Card( - elevation: 0, - color: FlutterFlowTheme.of(context).primaryBackground, - child: Padding( - padding: const EdgeInsets.all(4.0), - child: - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Align( - alignment: const AlignmentDirectional( - -1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB(8.0, 0.0, 10.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - widget.icon, - fill: null, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - Align( - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Text( - widget.title ?? '', - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ), + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.action?.call(); + }, + child: Card( + elevation: 0, + color: FlutterFlowTheme.of(context).primaryBackground, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Align( + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 10.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Icon( + widget.icon, + fill: null, + color: FlutterFlowTheme.of(context).accent1, + size: 24.0, + ), + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + widget.title ?? '', + style: FlutterFlowTheme.of(context).titleLarge.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Nunito'), ), - ); + ), + ), + ], + ), + ), + ), + ), + ); } -} \ No newline at end of file +} diff --git a/lib/components/molecular_components/menu_item/menu_item.dart b/lib/components/molecular_components/menu_item/menu_item.dart index 042a9353..395c21ce 100644 --- a/lib/components/molecular_components/menu_item/menu_item.dart +++ b/lib/components/molecular_components/menu_item/menu_item.dart @@ -1,5 +1,3 @@ - - import 'package:flutter/material.dart'; abstract class MenuEntry extends StatefulWidget { @@ -13,7 +11,4 @@ abstract class MenuEntry extends StatefulWidget { final Function()? action; final String? title; final IconData? icon; - - - -} \ No newline at end of file +} diff --git a/lib/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart b/lib/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart deleted file mode 100644 index ebbcaea4..00000000 --- a/lib/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:hub/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart'; - -import '../../../flutter_flow/flutter_flow_model.dart'; - -import 'package:flutter/material.dart'; - -class ArrowLinkedLocalsComponentModel - extends FlutterFlowModel { - @override - void initState(BuildContext context) {} - - @override - void dispose() {} -} \ No newline at end of file diff --git a/lib/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart b/lib/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart deleted file mode 100644 index d0a00a4f..00000000 --- a/lib/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:hub/components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart'; -import 'package:hub/flutter_flow/flutter_flow_model.dart'; - - -class ArrowLinkedLocalsComponentWidget extends StatefulWidget { - const ArrowLinkedLocalsComponentWidget({super.key}); - - @override - State createState() => - _ArrowLinkedLocalsComponentWidgetState(); -} - -class _ArrowLinkedLocalsComponentWidgetState - extends State { - late ArrowLinkedLocalsComponentModel _model; - - @override - void setState(VoidCallback callback) { - super.setState(callback); - _model.onUpdate(); - } - - @override - void initState() { - super.initState(); - _model = createModel(context, () => ArrowLinkedLocalsComponentModel()); - } - - @override - void dispose() { - _model.maybeDispose(); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Container(); - } -} \ No newline at end of file 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 c5c6a353..58db3341 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 @@ -1,8 +1,14 @@ +import 'dart:developer'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_model.dart'; +import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; +import 'package:hub/shared/utils/dialog_util.dart'; +import 'package:hub/shared/utils/log_util.dart'; import 'package:provider/provider.dart'; import '/backend/api_requests/api_calls.dart'; @@ -13,14 +19,20 @@ class BottomArrowLinkedLocalsComponentWidget extends StatefulWidget { const BottomArrowLinkedLocalsComponentWidget({super.key}); @override - State createState() => - _BottomArrowLinkedLocalsComponentWidgetState(); + State createState() => _BottomArrowLinkedLocalsComponentWidgetState(); } -class _BottomArrowLinkedLocalsComponentWidgetState - extends State { +class _BottomArrowLinkedLocalsComponentWidgetState extends State { late BottomArrowLinkedLocalsComponentModel _model; + + bool _loading = false; + bool _hasData = false; + + late Future _localsFuture; + List _localsWrap = []; + + @override void setState(VoidCallback callback) { super.setState(callback); @@ -30,8 +42,8 @@ class _BottomArrowLinkedLocalsComponentWidgetState @override void initState() { super.initState(); - _model = - createModel(context, () => BottomArrowLinkedLocalsComponentModel()); + _model = createModel(context, () => BottomArrowLinkedLocalsComponentModel()); + _localsFuture = _fetchLocals(); } @override @@ -41,247 +53,224 @@ class _BottomArrowLinkedLocalsComponentWidgetState super.dispose(); } + 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, + ), + ); + } + + Future _fetchLocals() async { + try { + setState(() => _loading = true); + var response = await PhpGroup.getLocalsCall.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + ); + + final List locals = response.jsonBody['locais'] ?? []; + + if (locals != null && locals.isNotEmpty) { + setState(() { + _localsWrap.addAll(locals); + _hasData = true; + _loading = false; + }); + + return response; + } + + _showNoMoreDataSnackBar(context); + + setState(() { + _hasData = false; + _loading = false; + }); + + return null; + } catch (e, s) { + setState(() { + _hasData = false; + _loading = false; + }); + } + + } + + Future _fetchResponseLink(String status, String cliID) async { + try { + var response = await PhpGroup.resopndeVinculo.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + cliID: cliID, + tarefa: status + ); + + if (response.jsonBody['error'] == false) { + return {'error': false, 'error_msg': FFLocalizations.of(context).getVariableText(ptText: "Vinculo Ativado com Sucesso", enText: "Link Activated Successfully") }; + } else { + return response.jsonBody; + } + + } catch (e, s) { + DialogUtil.errorDefault(context); + LogUtil.requestAPIFailed('responderVinculo.php', '', 'Responder Vinculo', e, s); + return {'error': true, 'error_msg': FFLocalizations.of(context).getVariableText( + ptText: "Falha ao efetuar operação, Tente Novamente mais tarde.", + enText: "Failed to perform operation, please try again later." + )}; + } + } + + String _imagePath(dynamic local) { + return 'https://freaccess.com.br/freaccess/Images/Clients/${local['CLI_ID']}.png'; + } + + Map _labelsHashMap(dynamic local) { + return Map.from({ + '${local['CLI_PREFIXO']}:': local['CLI_NOME'], + '${FFLocalizations.of(context).getVariableText(ptText: 'Propriedade', enText: 'Property')}:': local['CLU_OWNER_DSC'] + }); + } + + Map _statusHashMap(dynamic local) { + return Map.from({ + if (local['CLU_STATUS'] == 'A') + FFLocalizations.of(context).getVariableText(ptText: 'Ativo', enText: 'Active'): FlutterFlowTheme.of(context).success + else if (local['CLU_STATUS'] == 'B') + FFLocalizations.of(context).getVariableText(ptText: 'Bloqueado', enText: 'Blocked'): FlutterFlowTheme.of(context).error + else + FFLocalizations.of(context).getVariableText(ptText: 'Pendente', enText: 'Pending'): FlutterFlowTheme.of(context).warning + }); + } + + Widget _item(BuildContext context, dynamic local) { + return CardItemTemplateComponentWidget( + imagePath: _imagePath(local), + labelsHashMap: _labelsHashMap(local), + statusHashMap: [_statusHashMap(local)], + onTapCardItemAction: () async { + + if (local['CLU_STATUS'] == 'A') { + AppState().cliUUID = local['CLI_ID']; + AppState().local = local['CLI_NOME']; + AppState().ownerUUID = local['CLU_OWNER_ID']; + Navigator.pop(context); + } else if (local['CLU_STATUS'] == 'B') { + String message = FFLocalizations.of(context).getVariableText( + ptText: 'Local Bloqueado para Acesso, Entre em Contato com Administração', + enText: 'Location Blocked for Access, Contact Administration' + ); + + if (local['CLU_BLK_MESSAGE'] != null && local['CLU_BLK_MESSAGE'] != '') { + message = local['CLU_BLK_MESSAGE']; + } + + DialogUtil.warning(context, message); + _localsWrap = []; + _localsFuture = _fetchLocals(); + } else { + String localName = local['CLI_NOME']; + showAlertDialog( + context, + FFLocalizations.of(context).getVariableText(ptText: 'Ativar VInculo', enText: 'Activate Link'), + FFLocalizations.of(context).getVariableText(ptText: 'Deseja Aceitar o Vinculo a $localName?', enText: 'Do you wish to accept the link to $localName?'), + () 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(); + } + } + ); + } + + }, + ); + } + + Widget _listItems(BuildContext context) { + return Container( + width: double.infinity, + height: double.infinity, + decoration: const BoxDecoration(), + padding: const EdgeInsets.only(top: 15), + child: FutureBuilder( + future: _localsFuture, + builder: (context, snapshot) { + return ListView.builder( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + itemCount: _localsWrap.length, + itemBuilder: (BuildContext context, int index) { + final item = _localsWrap[index]; + return _item(context, item); + }, + ); + }, + ) + ); + } + @override Widget build(BuildContext context) { context.watch(); + double height = MediaQuery.sizeOf(context).height; + return Align( - alignment: const AlignmentDirectional(0.0, 1.0), + alignment: const AlignmentDirectional(0, 1), child: Container( width: double.infinity, - height: 150.0, + height: height - (height * 0.5), decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(25.0), - topRight: Radius.circular(25.0), - ), + topLeft: Radius.circular(25), + topRight: Radius.circular(25) + ) ), child: Column( mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - height: 150.0, - decoration: const BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(0.0), - topRight: Radius.circular(0.0), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.max, - children: [ - Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .secondaryBackground, - ), - child: FlutterFlowIconButton( - borderRadius: 20.0, - borderWidth: 1.0, - buttonSize: 40.0, - fillColor: FlutterFlowTheme.of(context).accent1, - icon: Icon( - Icons.add, - color: FlutterFlowTheme.of(context).primary, - size: 24.0, - ), - onPressed: () {}, - ), - ), - Expanded( - child: FutureBuilder( - future: PhpGroup.getLocalsCall.call( - devUUID: AppState().devUUID, - userUUID: AppState().userUUID, - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: - FlutterFlowTheme.of(context).primary, - size: 50.0, - ), - ), - ); - } - final gridViewGetLocalsResponse = snapshot.data!; - - return Builder( - builder: (context) { - final eachLocals = PhpGroup.getLocalsCall - .locais( - gridViewGetLocalsResponse.jsonBody, - ) - ?.map((e) => e) - .toList() - .toList() ?? - []; - - return GridView.builder( - padding: EdgeInsets.zero, - gridDelegate: - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 1, - crossAxisSpacing: 10.0, - mainAxisSpacing: 0.0, - childAspectRatio: 1.0, - ), - scrollDirection: Axis.horizontal, - itemCount: eachLocals.length, - itemBuilder: (context, eachLocalsIndex) { - final eachLocalsItem = - eachLocals[eachLocalsIndex]; - return InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - AppState().cliUUID = getJsonField( - eachLocalsItem, - r'''$.CLI_ID''', - ).toString(); - setState(() {}); - AppState().local = getJsonField( - eachLocalsItem, - r'''$.CLI_NOME''', - ).toString(); - setState(() {}); - AppState().ownerUUID = getJsonField( - eachLocalsItem, - r'''$.CLU_OWNER_ID''', - ).toString(); - setState(() {}); - Navigator.pop(context); - }, - child: Container( - width: 50.0, - height: double.infinity, - decoration: const BoxDecoration(), - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of( - context) - .primaryText, - borderRadius: - const BorderRadius.only( - bottomLeft: - Radius.circular(25.0), - bottomRight: - Radius.circular(25.0), - topLeft: - Radius.circular(25.0), - topRight: - Radius.circular(25.0), - ), - border: Border.all( - color: FlutterFlowTheme.of( - context) - .secondaryText, - width: 3.0, - ), - ), - child: ClipRRect( - borderRadius: - const BorderRadius.only( - bottomLeft: - Radius.circular(25.0), - bottomRight: - Radius.circular(25.0), - topLeft: - Radius.circular(25.0), - topRight: - Radius.circular(25.0), - ), - child: Image.network( - 'https://freaccess.com.br/freaccess/Images/Clients/${getJsonField( - eachLocalsItem, - r'''$.CLI_ID''', - ).toString()}.png', - width: double.infinity, - height: double.infinity, - fit: BoxFit.fill, - alignment: const Alignment( - 0.0, 0.0), - ), - ), - ), - Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, 10.0, 0.0, 0.0), - child: Text( - getJsonField( - eachLocalsItem, - r'''$.CLI_NOME''', - ).toString(), - style: FlutterFlowTheme.of( - context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ], - ), - ), - ); - }, - ); - }, - ); - }, - ), - ), - ].addToStart(const SizedBox(width: 20.0)), + if (_hasData == false && _loading == false && _localsWrap.isEmpty) + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Center( + child: Text(FFLocalizations.of(context).getVariableText( + ptText: "Nenhum Local Encontrado.", + enText: "No local found")), + ) + ], + ), + ) + else if (_hasData == true && _loading == false && _localsWrap.isNotEmpty) + Expanded(child: _listItems(context)), + if (_loading == true) + Container( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + FlutterFlowTheme.of(context).primary, ), ), - ], - ), - ), + ), + ) ], ), ), 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 6af7383c..a871fb25 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 @@ -1,11 +1,14 @@ -import '/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; -import '/flutter_flow/custom_functions.dart' as functions; +import 'package:cached_network_image/cached_network_image.dart'; 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'; import 'local_profile_component_model.dart'; + export 'local_profile_component_model.dart'; //// @@ -78,6 +81,8 @@ class _LocalProfileComponentWidgetState isScrollControlled: true, backgroundColor: const Color(0x00FFFFFF), context: context, + enableDrag: false, + isDismissible: false, builder: (context) { return Padding( padding: MediaQuery.viewInsetsOf(context), @@ -91,46 +96,38 @@ class _LocalProfileComponentWidgetState }, child: ClipRRect( borderRadius: BorderRadius.circular(200.0), - child: Image.network( - 'https://freaccess.com.br/freaccess/Images/Clients/${AppState().cliUUID}.png', + child: CachedNetworkImage( + imageUrl: valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${AppState().cliUUID}.png', + 'assets/images/error_image.svg'), width: 80.0, height: 80.0, fit: BoxFit.cover, alignment: const Alignment(0.0, 0.0), - errorBuilder: (context, error, stackTrace) => - Image.network( - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - width: 80.0, - height: 80.0, - fit: BoxFit.cover, - alignment: const Alignment(0.0, 0.0), - errorBuilder: (context, error, stackTrace) => - Image.asset('assets/images/error_image.svg'), - ), - )), - ), + placeholder: (context, url) => + Image.asset('assets/images/error_image.svg'), + errorListener: (_) => + Image.asset('assets/images/error_image.svg'), + errorWidget: (_, __, ___) => + Image.asset('assets/images/error_image.svg'), + ), + )), ), ), - Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - valueOrDefault( - functions.convertToUppercase(AppState().local), - 'NOME DO LOCAL', + Text( + valueOrDefault( + functions.convertToUppercase(AppState().local), + 'NOME DO LOCAL', + ), + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).info, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Nunito'), ), - style: FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).info, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap().containsKey('Nunito'), - ), - ), - ], ), ] .divide(const SizedBox(width: 20.0)) diff --git a/lib/components/organism_components/menu_component/menu_component_model.dart b/lib/components/organism_components/menu_component/menu_component_model.dart index b2842e56..1dd63013 100644 --- a/lib/components/organism_components/menu_component/menu_component_model.dart +++ b/lib/components/organism_components/menu_component/menu_component_model.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:hub/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; @@ -7,8 +9,6 @@ import '/components/organism_components/menu_list_view_component/menu_list_view_ import '/flutter_flow/flutter_flow_util.dart'; import 'menu_component_widget.dart' show MenuComponentWidget; - - class MenuComponentModel extends FlutterFlowModel { /// Local state fields for this component. @@ -42,36 +42,46 @@ class MenuComponentModel extends FlutterFlowModel { } Future scheduleVisitOptAction(BuildContext context) async { + final isWpp = AppState().whatsapp; + final isProvisional = AppState().provisional; + log("isWpp ${isWpp ? 1 : 0}"); + + final routesListStr = [ + 'scheduleCompleteVisitPage', + if (isProvisional) 'scheduleProvisionalVisitPage', + if (isWpp) 'fastPassPage', + ]; + final iconsListIcon = [ + Icons.date_range_rounded, + if (isProvisional) Icons.date_range_rounded, + if (isWpp) Icons.date_range_rounded, + ]; + final nameListStr = [ + FFLocalizations.of(context).getVariableText( + ptText: 'Visita\nCompleta', + enText: 'Complete\nSchedule', + ), + if (isProvisional) + FFLocalizations.of(context).getVariableText( + ptText: 'Visita\nProvisória', + enText: 'Provisional\nSchedule', + ), + if (isWpp) + FFLocalizations.of(context).getVariableText( + ptText: 'Visita\nRápida', + enText: 'Fast\nSchedule', + ), + ]; + await showAdaptiveDialog( context: context, builder: (context) { return Padding( padding: MediaQuery.viewInsetsOf(context), child: OptionSelectionModalWidget( - routesListStr: [ - 'scheduleCompleteVisitPage', - 'scheduleProvisionalVisitPage', - 'fastPassPage', - ], - iconsListIcon: [ - Icons.date_range_rounded, - Icons.date_range_rounded, - Icons.date_range_rounded, - ], - nameListStr: [ - FFLocalizations.of(context).getVariableText( - ptText: 'Visita\nCompleta', - enText: 'Complete\nSchedule', - ), - FFLocalizations.of(context).getVariableText( - ptText: 'Visita\nProvisória', - enText: 'Provisional\nSchedule', - ), - FFLocalizations.of(context).getVariableText( - ptText: 'Visita\nRápida', - enText: 'Fast\nSchedule', - ), - ], + routesListStr: routesListStr, + iconsListIcon: iconsListIcon, + nameListStr: nameListStr, ), ); }, @@ -103,6 +113,30 @@ class MenuComponentModel extends FlutterFlowModel { ); } + Future signOut(BuildContext context) async { + showAlertDialog( + context, + 'Logout', + FFLocalizations.of(context).getVariableText( + enText: 'Are you sure you want to logout?', + ptText: 'Tem certeza', + ), () async { + AppState().deleteAll(); + // setState(() {}); + + context.goNamed( + 'welcomePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.scale, + alignment: Alignment.bottomCenter, + ), + }, + ); + }); + } + Future preferencesSettings(BuildContext context) async { context.pushNamed( 'preferencesSettings', @@ -113,7 +147,7 @@ class MenuComponentModel extends FlutterFlowModel { alignment: Alignment.bottomCenter, ), }, - ); + ).then((value) => true); } Future liberationHistoryOptAction(BuildContext context) async { @@ -175,7 +209,7 @@ class MenuComponentModel extends FlutterFlowModel { ); } - Future messageHistoryAction(BuildContext context) async { + Future messageHistoryAction(BuildContext context) async { context.pushNamed( 'messageHistoryPage', extra: { @@ -187,6 +221,4 @@ class MenuComponentModel extends FlutterFlowModel { }, ); } - - -} \ No newline at end of file +} diff --git a/lib/components/organism_components/menu_component/menu_component_widget.dart b/lib/components/organism_components/menu_component/menu_component_widget.dart index 91b722e8..c3870251 100644 --- a/lib/components/organism_components/menu_component/menu_component_widget.dart +++ b/lib/components/organism_components/menu_component/menu_component_widget.dart @@ -1,5 +1,4 @@ -import 'dart:developer'; - +import 'package:flutter/material.dart'; import 'package:hub/backend/schema/enums/enums.dart'; import 'package:hub/components/atomic_components/menu_button_item/menu_button_item_widget.dart'; import 'package:hub/components/atomic_components/menu_card_item/menu_card_item.dart'; @@ -9,8 +8,8 @@ import 'package:hub/flutter_flow/nav/nav.dart'; import '/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart'; import '/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import 'package:flutter/material.dart'; import 'menu_component_model.dart'; + export 'menu_component_model.dart'; class MenuComponentWidget extends StatefulWidget { @@ -49,161 +48,234 @@ class _MenuComponentWidgetState extends State { super.dispose(); } + // MenuButtonWidget(icon: FFIcons.kvector2, action: () async {setState(() {});}, title: FFLocalizations.of(context).getVariableText(enText:'Link\nCondominum' , ptText:'' ,),), + // MenuButtonWidget(icon: FFIcons.kpets, action: () async {setState(() {});}, title: FFLocalizations.of(context).getVariableText(enText:'Register\Pet' , ptText:'' ,),), + @override Widget build(BuildContext context) { - final options = widget.item == MenuItem.button - ? [ - MenuButtonWidget( - icon: FFIcons.kvector1, - action: () async { - await _model.scheduleVisitOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Schedule\nVisit', - ptText: 'Agendar\nVisita', - ), + final options = () { + if (widget.item == MenuItem.button) { + return [ + MenuButtonWidget( + icon: FFIcons.kvector1, + action: () async { + await _model.scheduleVisitOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Schedule\nVisit', + ptText: 'Agendar\nVisita', ), - - MenuButtonWidget( - icon: FFIcons.khome, - action: () async { - await _model.registerVisitorOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Register\nVisitor', - ptText: 'Cadastro\nde Visitante', - ), + ), + MenuButtonWidget( + icon: FFIcons.khome, + action: () async { + await _model.registerVisitorOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Register\nVisitor', + ptText: 'Cadastro\nde Visitante', ), - - // MenuButtonWidget(icon: FFIcons.kvector2, action: () async {setState(() {});}, title: FFLocalizations.of(context).getVariableText(enText:'Link\nCondominum' , ptText:'' ,),), - // MenuButtonWidget(icon: FFIcons.kpets, action: () async {setState(() {});}, title: FFLocalizations.of(context).getVariableText(enText:'Register\Pet' , ptText:'' ,),), - - MenuButtonWidget( - icon: Icons.qr_code, - action: () async { - await _model.accessQRCodeOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'QRCode\nAccess', - ptText: 'QRCode\nde Acesso', - ), + ), + MenuButtonWidget( + icon: Icons.qr_code, + action: () async { + await _model.accessQRCodeOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'QRCode\nAccess', + ptText: 'QRCode\nde Acesso', ), - - MenuButtonWidget( - icon: Icons.people, - action: () async { - await _model.peopleOnThePropertyAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Poeple on\nthe Property', - ptText: 'Pessoas na\nPropriedade', - ), + ), + MenuButtonWidget( + icon: Icons.people, + action: () async { + await _model.peopleOnThePropertyAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Poeple on\nthe Property', + ptText: 'Pessoas na\nPropriedade', ), - - MenuButtonWidget( - icon: Icons.history_sharp, - action: () async { - await _model.liberationHistoryOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Consult\nHistories', - ptText: 'Consultar\nHistóricos', - ), + ), + MenuButtonWidget( + icon: Icons.history_sharp, + action: () async { + await _model.liberationHistoryOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Consult\nHistories', + ptText: 'Consultar\nHistóricos', ), - - MenuButtonWidget( - icon: Icons.settings, - action: () async { - await _model.preferencesSettings(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Preferences\nSettings', - ptText: 'Preferências \nde Configurações', - ), + ), + MenuButtonWidget( + icon: Icons.settings, + action: () async { + await _model.preferencesSettings(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Preferences\nSettings', + ptText: 'Preferências \nde Configurações', ), - ] - : [ - MenuCardItem( - icon: FFIcons.kvector1, - action: () async { - await _model.scheduleVisitOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Schedule\nVisit', - ptText: 'Agendar\nVisita', - ), + ), + ]; + } + if (widget.item == MenuItem.card) { + return [ + MenuCardItem( + icon: FFIcons.kvector1, + action: () async { + await _model.scheduleVisitOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Schedule\nVisit', + ptText: 'Agendar\nVisita', ), - - MenuCardItem( - icon: FFIcons.khome, - action: () async { - await _model.registerVisitorOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Register\nVisitor', - ptText: 'Cadastro\nde Visitante', - ), + ), + MenuCardItem( + icon: FFIcons.khome, + action: () async { + await _model.registerVisitorOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Register\nVisitor', + ptText: 'Cadastro\nde Visitante', ), - - // MenuCardItem(icon: FFIcons.kvector2, action: () async {setState(() {});}, title: FFLocalizations.of(context).getVariableText(enText:'Link Condominum' , ptText:'' ,),), - // MenuCardItem(icon: FFIcons.kpets, action: () async {setState(() {});}, title: FFLocalizations.of(context).getVariableText(enText:'Register\Pet' , ptText:'' ,),), - - MenuCardItem( - icon: Icons.qr_code, - action: () async { - await _model.accessQRCodeOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'QRCode\nAccess', - ptText: 'QRCode\nde Acesso', - ), + ), + MenuCardItem( + icon: Icons.qr_code, + action: () async { + await _model.accessQRCodeOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'QRCode\nAccess', + ptText: 'QRCode\nde Acesso', ), - - MenuCardItem( - icon: Icons.people, - action: () async { - await _model.peopleOnThePropertyAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Poeple on\nthe Property', - ptText: 'Pessoas\nna Propriedade', - ), + ), + MenuCardItem( + icon: Icons.people, + action: () async { + await _model.peopleOnThePropertyAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Poeple on\nthe Property', + ptText: 'Pessoas\nna Propriedade', ), - - MenuCardItem( - icon: Icons.history_sharp, - action: () async { - await _model.liberationHistoryOptAction(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Consult\nHistories', - ptText: 'Consultar\nHistoricos', - ), + ), + MenuCardItem( + icon: Icons.history_sharp, + action: () async { + await _model.liberationHistoryOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Consult\nHistories', + ptText: 'Consultar\nHistoricos', ), - - MenuCardItem( - icon: Icons.settings, - action: () async { - await _model.preferencesSettings(context); - setState(() {}); - }, - title: FFLocalizations.of(context).getVariableText( - enText: 'Preferences\nSettings', - ptText: 'Preferências\nde Configuração', - ), + ), + MenuCardItem( + icon: Icons.settings, + action: () async { + await _model.preferencesSettings(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Preferences\nSettings', + ptText: 'Preferências\nde Configuração', ), - ]; + ), + ]; + } + // if (MenuItem.tile) + return [ + MenuCardItem( + icon: FFIcons.kvector1, + action: () async { + await _model.scheduleVisitOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Schedule Visit', + ptText: 'Agendar Visita', + ), + ), + MenuCardItem( + icon: FFIcons.khome, + action: () async { + await _model.registerVisitorOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Register Visitor', + ptText: 'Cadastro de Visitante', + ), + ), + MenuCardItem( + icon: Icons.qr_code, + action: () async { + await _model.accessQRCodeOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'QRCode Access', + ptText: 'QRCode de Acesso', + ), + ), + MenuCardItem( + icon: Icons.people, + action: () async { + await _model.peopleOnThePropertyAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Poeple on the Property', + ptText: 'Pessoas na Propriedade', + ), + ), + MenuCardItem( + icon: Icons.history_sharp, + action: () async { + await _model.liberationHistoryOptAction(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Consult Histories', + ptText: 'Consultar Historicos', + ), + ), + MenuCardItem( + icon: Icons.logout, + action: () async { + await _model.signOut(context); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Logout Account', + ptText: 'Sair da Conta', + ), + ), + MenuCardItem( + icon: Icons.settings, + action: () async { + await _model.preferencesSettings(context).then((value) => value); + setState(() {}); + }, + title: FFLocalizations.of(context).getVariableText( + enText: 'Preferences Settings', + ptText: 'Preferências de Configuração', + ), + ), + ]; + }(); + return Padding( padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0), child: Builder( @@ -245,7 +317,7 @@ class _MenuComponentWidgetState extends State { } if (widget.style == MenuView.list && widget.expandable == false && - widget.item == MenuItem.card) { + widget.item == MenuItem.tile) { return wrapWithModel( model: _model.menuListViewComponentModel, updateCallback: () => setState(() {}), diff --git a/lib/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart b/lib/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart index 1a2cac35..8c042c9a 100644 --- a/lib/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart +++ b/lib/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:hub/backend/schema/enums/enums.dart'; -import 'package:hub/components/atomic_components/menu_button_item/menu_button_item_widget.dart'; import 'package:hub/components/molecular_components/menu_item/menu_item.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; @@ -12,12 +11,10 @@ export 'menu_list_view_component_model.dart'; /// - class MenuListViewComponentWidget extends StatefulWidget { const MenuListViewComponentWidget({ super.key, required this.changeMenuStyle, - required this.expandable, required this.item, required this.options, @@ -70,99 +67,115 @@ class _MenuListViewComponentWidgetState clipBehavior: Clip.none, children: [ buildMenuItem(context), - if (widget.expandable) - buildExpandableButton(context), + if (widget.expandable) buildExpandableButton(context), ], ); } Widget buildMenuItem(BuildContext context) { - switch(widget.item) { + switch (widget.item) { case MenuItem.button: return SizedBox( height: 100, width: double.infinity, - child: ListView.builder( - addAutomaticKeepAlives: true, - padding: const EdgeInsets.symmetric(horizontal: 15), - shrinkWrap: true, - physics: const AlwaysScrollableScrollPhysics(), - scrollDirection: Axis.horizontal, - itemCount: widget.options.length, - itemBuilder: (context, index) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - height: 115, - width: 115, - child: widget.options[index]), - ); - }, - ), + child: ListView.builder( + addAutomaticKeepAlives: true, + padding: const EdgeInsets.symmetric(horizontal: 15), + shrinkWrap: true, + physics: const AlwaysScrollableScrollPhysics(), + scrollDirection: Axis.horizontal, + itemCount: widget.options.length, + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: 115, width: 115, child: widget.options[index]), + ); + }, + ), ); case MenuItem.card: return SizedBox( width: double.infinity, height: MediaQuery.sizeOf(context).height * 0.8, - child: ListView.builder( - addAutomaticKeepAlives: true, - padding: const EdgeInsets.symmetric(horizontal: 15), - shrinkWrap: true, - physics: const AlwaysScrollableScrollPhysics(), - scrollDirection: Axis.vertical, - itemCount: widget.options.length, - itemBuilder: (context, index) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: SizedBox( - height: 115, - width: 115, - child: widget.options[index]), - ); - }, - ), + child: ListView.builder( + addAutomaticKeepAlives: true, + padding: const EdgeInsets.symmetric(horizontal: 15), + shrinkWrap: true, + physics: const AlwaysScrollableScrollPhysics(), + scrollDirection: Axis.vertical, + itemCount: widget.options.length, + itemBuilder: (context, index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: 115, width: 115, child: widget.options[index]), + ); + }, + ), ); + case MenuItem.tile: + return SizedBox( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.7, + child: ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 15), + shrinkWrap: true, + physics: const AlwaysScrollableScrollPhysics(), + scrollDirection: Axis.vertical, + itemCount: widget.options.length, + itemBuilder: (context, index) { + return SizedBox( + height: MediaQuery.of(context).size.height * 0.08, + width: MediaQuery.of(context).size.width * 0.08, + child: widget.options[index], + ); + }, + separatorBuilder: (context, index) { + return const Divider(thickness: 0.2); + }, + ), + ); + } } -} Row buildExpandableButton(BuildContext context) { return Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - FFLocalizations.of(context).getVariableText( - enText: 'Expand', - ptText: 'Expandir', - ), - style: FlutterFlowTheme.of(context).title1.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 12.0, - fontWeight: FontWeight.w600, - fontStyle: FontStyle.normal, - ), + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + FFLocalizations.of(context).getVariableText( + enText: 'Expand', + ptText: 'Expandir', ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: FlutterFlowIconButton( - borderColor: Colors.transparent, - borderRadius: 20.0, - borderWidth: 0.0, - buttonSize: 50.0, - fillColor: const Color(0x00FFFFFF), - icon: Icon( - Icons.keyboard_arrow_down_outlined, - color: FlutterFlowTheme.of(context).primary, + style: FlutterFlowTheme.of(context).title1.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 12.0, + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, ), - onPressed: () async { - await widget.changeMenuStyle?.call(); - }, + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 20.0, + borderWidth: 0.0, + buttonSize: 50.0, + fillColor: const Color(0x00FFFFFF), + icon: Icon( + Icons.keyboard_arrow_down_outlined, + color: FlutterFlowTheme.of(context).primary, ), + onPressed: () async { + await widget.changeMenuStyle?.call(); + }, ), - ], - ); + ), + ], + ); } } - diff --git a/lib/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart b/lib/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart index 0b4f3c6b..e367e0b5 100644 --- a/lib/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart +++ b/lib/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart @@ -13,7 +13,6 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/internationalization.dart'; - class MenuStaggeredViewComponentWidget extends StatefulWidget { const MenuStaggeredViewComponentWidget({ super.key, @@ -93,9 +92,7 @@ class _MenuStaggeredViewComponentWidgetState shrinkWrap: true, itemBuilder: (context, index) { return SizedBox( - height: 100, - width: 100, - child: widget.options[index]); + height: 100, width: 100, child: widget.options[index]); }, ), ), @@ -123,12 +120,12 @@ class _MenuStaggeredViewComponentWidgetState ptText: 'Minimizar', ), style: FlutterFlowTheme.of(context).title1.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 12.0, - fontWeight: FontWeight.w600, - fontStyle: FontStyle.normal, - ), + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 12.0, + fontWeight: FontWeight.w600, + fontStyle: FontStyle.normal, + ), ), Align( alignment: const AlignmentDirectional(0.0, 0.0), @@ -154,4 +151,4 @@ class _MenuStaggeredViewComponentWidgetState ], ); } -} \ No newline at end of file +} diff --git a/lib/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart b/lib/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart index b50111a1..898e309c 100644 --- a/lib/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart +++ b/lib/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_widget.dart @@ -1,13 +1,11 @@ -import 'package:hub/backend/api_requests/api_calls.dart'; -import 'package:hub/backend/api_requests/api_manager.dart'; - -import 'package:hub/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_model.dart'; -import 'package:hub/flutter_flow/flutter_flow_theme.dart'; -import 'package:hub/flutter_flow/flutter_flow_util.dart'; - +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/components/organism_components/up_arrow_linked_locals_component/up_arrow_linked_locals_component_model.dart'; +import 'package:hub/flutter_flow/flutter_flow_theme.dart'; +import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:provider/provider.dart'; class UpArrowLinkedLocalsComponentWidget extends StatefulWidget { @@ -185,11 +183,12 @@ class _UpArrowLinkedLocalsComponentWidgetState topLeft: Radius.circular(25.0), topRight: Radius.circular(25.0), ), - child: Image.network( - 'https://freaccess.com.br/freaccess/Images/Clients/${getJsonField( + child: CachedNetworkImage( + imageUrl: + "https://freaccess.com.br/freaccess/Images/Clients/${getJsonField( eachLocalsItem, r'''$.CLI_ID''', - ).toString()}.png', + ).toString()}.png", width: double.infinity, height: double.infinity, fit: BoxFit.fill, diff --git a/lib/components/templates_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart b/lib/components/templates_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart index 307ba81b..4d37a149 100644 --- a/lib/components/templates_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart +++ b/lib/components/templates_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart @@ -1,8 +1,11 @@ -import '/flutter_flow/flutter_flow_theme.dart'; -import '/flutter_flow/flutter_flow_util.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; + +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; import 'visitor_details_modal_template_component_model.dart'; + export 'visitor_details_modal_template_component_model.dart'; class VisitorDetailsModalTemplateComponentWidget extends StatefulWidget { @@ -125,8 +128,8 @@ class _VisitorDetailsModalTemplateComponentWidgetState decoration: const BoxDecoration( shape: BoxShape.circle, ), - child: Image.network( - widget.visitorImageURL!, + child: CachedNetworkImage( + imageUrl: widget.visitorImageURL!, fit: BoxFit.cover, ), ), diff --git a/lib/flutter_flow/flutter_flow_drop_down.dart b/lib/flutter_flow/flutter_flow_drop_down.dart index ab6bdf5e..c82ebb61 100644 --- a/lib/flutter_flow/flutter_flow_drop_down.dart +++ b/lib/flutter_flow/flutter_flow_drop_down.dart @@ -1,9 +1,7 @@ import 'package:dropdown_button2/dropdown_button2.dart'; - -import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; import 'form_field_controller.dart'; -import 'package:flutter/material.dart'; class FlutterFlowDropDown extends StatefulWidget { const FlutterFlowDropDown({ @@ -368,4 +366,4 @@ class _FlutterFlowDropDownState extends State> { : null, ); } -} \ No newline at end of file +} diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index a54d3f73..53dd29fa 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -4,15 +4,17 @@ import 'package:flutter/material.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/pages/fast_pass_page/fast_pass_page_widget.dart'; import 'package:hub/pages/message_history_page/message_history_page_widget.dart'; +<<<<<<< HEAD import 'package:hub/pages/preferences_settings_page/preferences_settings_widget.dart'; import 'package:hub/pages/reception_page/reception_page_widget.dart'; +======= +import 'package:hub/pages/no_connection_page/no_connection_page.dart'; +>>>>>>> main import 'package:provider/provider.dart'; -import '../../main.dart'; import '/backend/schema/structs/index.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/index.dart'; -import '../../pages/visit_history_page/visit_history_page_widget.dart'; export 'package:go_router/go_router.dart'; @@ -83,9 +85,21 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( params.isEmpty ? const HomePageWidget() : const HomePageWidget(), ), FFRoute( +<<<<<<< HEAD name: 'receptionPage', path: '/receptionPage', builder: (context, params) => const ReceptionPageWidget()), +======= + name: 'no-connection', + path: '/no-connection', + builder: (context, params) => const NoConnectionScreen(), + ), + // FFRoute( + // name: 'visitHistoryPage', + // path: '/visitHistoryPage', + // builder: (context, params) => const VisitHistoryPageWidget(), + // ), +>>>>>>> main FFRoute( name: 'messageHistoryPage', path: '/messageHistoryPage', diff --git a/lib/main.dart b/lib/main.dart index 33484406..a0de4a05 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; -import 'package:hub/app_state.dart'; import 'package:hub/backend/notifications/firebase_messaging_service.dart'; import 'package:hub/backend/notifications/notification_service.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; diff --git a/lib/pages/home_page/home_page_widget.dart b/lib/pages/home_page/home_page_widget.dart index 849ae66b..ae78222d 100644 --- a/lib/pages/home_page/home_page_widget.dart +++ b/lib/pages/home_page/home_page_widget.dart @@ -1,8 +1,8 @@ -import 'dart:developer'; - +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:hub/actions/actions.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/notifications/firebase_messaging_service.dart'; import 'package:hub/backend/schema/enums/enums.dart'; import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; @@ -12,9 +12,8 @@ import 'package:hub/flutter_flow/custom_functions.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_util.dart'; -import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; -import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/pages/home_page/home_page_model.dart'; +import 'package:hub/shared/utils/dialog_util.dart'; import 'package:provider/provider.dart'; class HomePageWidget extends StatefulWidget { @@ -29,6 +28,7 @@ class _HomePageWidgetState extends State { bool localStatus = false; final scaffoldKey = GlobalKey(); +<<<<<<< HEAD Future checkLocalStatus() async { localStatus = await checkLocals( context: context, @@ -36,6 +36,8 @@ class _HomePageWidgetState extends State { ); } +======= +>>>>>>> main @override void initState() { super.initState(); @@ -46,31 +48,52 @@ class _HomePageWidgetState extends State { () async { await FirebaseMessagingService().updateDeviceToken(); }(); + void fetchData() async { + bool success = false; + while (!success) { + final response = await PhpGroup.getDadosCall.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + cliUUID: AppState().cliUUID, + atividade: 'getDados', + ); + + switch (response.statusCode) { + case 200: + if (response.jsonBody['error'] == false) { + success = true; + AppState().whatsapp = response.jsonBody['whatsapp']; + AppState().provisional = response.jsonBody['provisional']; + } + break; + default: + await DialogUtil.warningDefault(context); + safeSetState(() {}); + break; + } + } + } + + fetchData(); WidgetsBinding.instance.addPostFrameCallback((_) async { - @override - void initState() { - super.initState(); - checkLocalStatus(); - } + localStatus = await checkLocals( + context: context, + model: _model, + safeSetState: safeSetState, + ); - // Rest of your code... - if (AppState().cliUUID == null || AppState().cliUUID.isEmpty) { + if (AppState().cliUUID.isEmpty) { showModalBottomSheet( - isScrollControlled: false, + isScrollControlled: true, backgroundColor: Colors.transparent, enableDrag: false, isDismissible: false, context: context, builder: (context) { - return GestureDetector( - onTap: () => _model.unfocusNode.canRequestFocus - ? FocusScope.of(context).requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const BottomArrowLinkedLocalsComponentWidget(), - ), + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const BottomArrowLinkedLocalsComponentWidget(), ); }, ).then((value) => safeSetState(() {})); @@ -180,7 +203,7 @@ class _HomePageWidgetState extends State { Widget createLocal(bool localStatus) { return wrapWithModel( model: _model.localComponentModel, - updateCallback: () => setState(() {}), + updateCallback: () => safeSetState(() {}), child: LocalProfileComponentWidget( localStatus: localStatus, ), @@ -240,8 +263,8 @@ class _HomePageWidgetState extends State { 60.0, 15.0, 0.0, 0.0), child: ClipRRect( borderRadius: BorderRadius.circular(8.0), - child: Image.network( - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/8r2vsbd9i03k/logo.png', + child: Image.asset( + 'assets/images/logo.png', width: 50.0, height: 200.0, fit: BoxFit.none, @@ -255,9 +278,7 @@ class _HomePageWidgetState extends State { padding: const EdgeInsetsDirectional.fromSTEB( 0.0, 15.0, 0.0, 0.0), child: Text( - FFLocalizations.of(context).getText( - 'rg9pzkpz' /* FRE ACCESS */, - ), + 'FRE ACCESS', style: FlutterFlowTheme.of(context) .bodyMedium .override( @@ -278,28 +299,28 @@ class _HomePageWidgetState extends State { ), ), ), - Align( - alignment: const AlignmentDirectional(0.0, 1.0), - child: Container( - width: 100.0, - height: 50.0, - decoration: const BoxDecoration(), - child: Align( - alignment: const AlignmentDirectional(1.0, 1.0), - child: FlutterFlowIconButton( - borderRadius: 20.0, - borderWidth: 1.0, - buttonSize: 40.0, - icon: Icon( - Icons.notifications_sharp, - color: FlutterFlowTheme.of(context).info, - size: 24.0, - ), - onPressed: () {}, - ), - ), - ), - ), + // Align( + // alignment: const AlignmentDirectional(0.0, 1.0), + // child: Container( + // width: 100.0, + // height: 50.0, + // decoration: const BoxDecoration(), + // child: Align( + // alignment: const AlignmentDirectional(1.0, 1.0), + // child: FlutterFlowIconButton( + // borderRadius: 20.0, + // borderWidth: 1.0, + // buttonSize: 40.0, + // icon: Icon( + // Icons.notifications_sharp, + // color: FlutterFlowTheme.of(context).info, + // size: 24.0, + // ), + // onPressed: () {}, + // ), + // ), + // ), + // ), ], ), ), @@ -310,7 +331,7 @@ class _HomePageWidgetState extends State { SizedBox buildDrawer(BuildContext context) { return SizedBox( - width: 750.0, + width: MediaQuery.of(context).size.width * 0.8, child: Drawer( elevation: 16.0, child: Container( @@ -358,12 +379,21 @@ class _HomePageWidgetState extends State { decoration: const BoxDecoration( shape: BoxShape.circle, ), - child: Image.network( - valueOrDefault( - 'https://freaccess.com.br/freaccess/Images/Clients/${AppState().cliUUID}.png', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), + child: CachedNetworkImage( + imageUrl: valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${AppState().cliUUID}.png', + 'assets/images/error_image.svg'), + width: 80.0, + height: 80.0, fit: BoxFit.cover, + alignment: const Alignment(0.0, 0.0), + placeholder: (context, url) => + Image.asset( + 'assets/images/error_image.svg'), + errorListener: (_) => Image.asset( + 'assets/images/error_image.svg'), + errorWidget: (_, __, ___) => Image.asset( + 'assets/images/error_image.svg'), ), ), Container( @@ -391,40 +421,6 @@ class _HomePageWidgetState extends State { ), ), ), - Container( - width: 50.0, - child: Container( - height: 30.0, - decoration: const BoxDecoration(), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Flexible( - child: FlutterFlowIconButton( - borderRadius: 100.0, - borderWidth: 1.0, - buttonSize: 40.0, - icon: Icon( - Icons.close_sharp, - color: FlutterFlowTheme.of(context) - .primary, - size: 20.0, - ), - onPressed: () async { - if (scaffoldKey - .currentState!.isDrawerOpen || - scaffoldKey.currentState! - .isEndDrawerOpen) { - Navigator.pop(context); - } - }, - ), - ), - ], - ), - ), - ), ] .divide(const SizedBox(width: 0.0)) .around(const SizedBox(width: 0.0)), @@ -528,59 +524,19 @@ class _HomePageWidgetState extends State { ), ), Expanded( - child: wrapWithModel( - model: _model.menuComponentModel, - updateCallback: () => setState(() {}), - child: MenuComponentWidget( - expandable: false, - style: MenuView.list, - item: MenuItem.card, + child: SingleChildScrollView( + child: wrapWithModel( + model: _model.menuComponentModel, + updateCallback: () => setState(() {}), + child: const MenuComponentWidget( + expandable: false, + style: MenuView.list, + item: MenuItem.tile, + ), ), ), ), - FFButtonWidget( - onPressed: () async { - AppState().deleteAll(); - setState(() {}); - - context.goNamed( - 'welcomePage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.scale, - alignment: Alignment.bottomCenter, - ), - }, - ); - }, - text: FFLocalizations.of(context).getText( - 'xx0db4wi' /* Sair */, - ), - options: FFButtonOptions( - height: 40.0, - padding: - const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), - color: const Color(0x00D70000), - textStyle: FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Plus Jakarta Sans', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Plus Jakarta Sans'), - ), - elevation: 0.0, - borderSide: const BorderSide( - width: 0.0, - ), - borderRadius: BorderRadius.circular(50.0), - ), - ), - ].addToEnd(const SizedBox(height: 64.0)), + ], ), ), ), diff --git a/lib/pages/liberation_history/liberation_history_widget.dart b/lib/pages/liberation_history/liberation_history_widget.dart index 8dfcc0f8..875400ef 100644 --- a/lib/pages/liberation_history/liberation_history_widget.dart +++ b/lib/pages/liberation_history/liberation_history_widget.dart @@ -148,7 +148,7 @@ class _LiberationHistoryWidgetState extends State { Center( child: Text(FFLocalizations.of(context).getVariableText( ptText: "Nenhuma solicitação encontrada!", - enText: "No visit found")), + enText: "No requests found")), ) ], ), diff --git a/lib/pages/no_connection_page/no_connection_page.dart b/lib/pages/no_connection_page/no_connection_page.dart new file mode 100644 index 00000000..5428e2d7 --- /dev/null +++ b/lib/pages/no_connection_page/no_connection_page.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class NoConnectionScreen extends StatelessWidget { + const NoConnectionScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Sem Conexão'), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.signal_wifi_off, size: 80), + const SizedBox(height: 20), + const Text( + 'Você está offline. Verifique sua conexão com a internet.'), + const SizedBox(height: 20), + ElevatedButton( + onPressed: () { + // Tente reconectar + }, + child: const Text('Tentar Novamente'), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/preferences_settings_page/preferences_settings_model.dart b/lib/pages/preferences_settings_page/preferences_settings_model.dart index 30645a2d..07912126 100644 --- a/lib/pages/preferences_settings_page/preferences_settings_model.dart +++ b/lib/pages/preferences_settings_page/preferences_settings_model.dart @@ -1,11 +1,8 @@ import 'dart:developer'; -import 'package:hub/app_state.dart'; -import 'package:hub/backend/api_requests/api_calls.dart'; - import 'package:flutter/material.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/components/templates_components/change_passs_qr_code_pass_key_template_component/change_pass_widget.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_util.dart'; import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; @@ -316,8 +313,18 @@ class PreferencesPageModel with ChangeNotifier { AppState().deleteCliUUID(); AppState().deleteLocal(); AppState().deleteOwnerUUID(); - Navigator.pop(context); - Navigator.pop(context); + // Navigator.pop(context); + // Navigator.pop(context, true); + context.goNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.scale, + alignment: Alignment.bottomCenter, + ), + }, + ); ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -734,6 +741,30 @@ class PreferencesPageModel with ChangeNotifier { ); } + void logout(BuildContext context) async { + showAlertDialog( + context, + 'Logout', + FFLocalizations.of(context).getVariableText( + enText: 'Are you sure you want to logout?', + ptText: 'Tem certeza', + ), () async { + AppState().deleteAll(); + // setState(() {}); + + context.goNamed( + 'welcomePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.scale, + alignment: Alignment.bottomCenter, + ), + }, + ); + }); + } + @override void dispose() { unfocusNode.dispose(); diff --git a/lib/pages/preferences_settings_page/preferences_settings_widget.dart b/lib/pages/preferences_settings_page/preferences_settings_widget.dart index 76ca0a99..c9f228c4 100644 --- a/lib/pages/preferences_settings_page/preferences_settings_widget.dart +++ b/lib/pages/preferences_settings_page/preferences_settings_widget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:hub/app_state.dart'; import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; @@ -66,7 +65,18 @@ class PreferencesPageWidget extends StatelessWidget { Expanded( flex: 2, child: ListView.builder( +<<<<<<< HEAD itemCount: 7, // Assuming 4 items for simplicity +======= + // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + // crossAxisCount: 3, + // crossAxisSpacing: 12.0, + // mainAxisSpacing: 12.0, + // childAspectRatio: 1.0, + // mainAxisExtent: 100.0, + // ), + itemCount: 8, // Assuming 4 items for simplicity +>>>>>>> main padding: const EdgeInsets.symmetric(horizontal: 20.0), physics: const AlwaysScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { @@ -140,7 +150,7 @@ class PreferencesPageWidget extends StatelessWidget { case 5: icon = Icons.landscape; onPressed = () => model.localUnlink(context); - isEnabled = true; + isEnabled = false; content = FFLocalizations.of(context).getVariableText( ptText: 'Desative para se desvincular do local selecionado', enText: 'Enable to unlink from the selected location', @@ -149,13 +159,23 @@ class PreferencesPageWidget extends StatelessWidget { case 6: icon = Icons.delete; onPressed = () => model.deleteAccount(context); - isEnabled = true; + isEnabled = false; content = FFLocalizations.of(context).getVariableText( ptText: 'Delete sua conta e todos os dados associados permanentemente.', enText: 'Delete your account and all associated data permanently.', ); break; + case 7: + icon = Icons.logout; + onPressed = () => model.logout(context); + isEnabled = false; + content = FFLocalizations.of(context).getVariableText( + ptText: 'Sair da conta atual e voltar para a tela de login.', + enText: + 'Log out of the current account and return to the login screen.', + ); + break; default: throw Exception('Invalid index: $index'); } 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 775160ef..7b50d328 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 @@ -1114,9 +1114,7 @@ Widget scheduleVisit(BuildContext context, if (value.contains('{') && value.contains('}') && value.contains(':')) { - // log("Valor e um Objeto | Usuário Escolheu o Motivo ${_model.dropDownValue1}"); } else { - // log("Valor e uma String | Usuário Escolheu o Motivo ${_model.dropDownValue1}"); if (reasonsJsonList != null && reasonsJsonList.isNotEmpty) { var item = reasonsJsonList.where( diff --git a/lib/shared/utils/dialog_util.dart b/lib/shared/utils/dialog_util.dart index 6db1ed89..6804443a 100644 --- a/lib/shared/utils/dialog_util.dart +++ b/lib/shared/utils/dialog_util.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; @@ -8,24 +7,34 @@ class DialogUtil { static const double _height = 350; static Future errorDefault(BuildContext context) { - return error(context, FFLocalizations.of(context).getVariableText( - ptText: "Falha ao efetuar operação, Tente Novamente mais tarde.", - enText: "Failed to perform operation, please try again later." - )); + return error( + context, + FFLocalizations.of(context).getVariableText( + ptText: "Falha ao efetuar operação, Tente Novamente mais tarde.", + enText: "Failed to perform operation, please try again later.")); + } + + static Future warningDefault(BuildContext context) { + return warning( + context, + FFLocalizations.of(context).getVariableText( + ptText: "Atenção, algo deu errado. Tente novamente mais tarde.", + enText: "Warning, something went wrong. Try again later.")) + .then((value) => value); } static Future error(BuildContext context, String message) async { return await showDialog( - context: context, - builder: (context) { - return Dialog( - child: SizedBox( - height: _height, - child: Padding(padding: MediaQuery.viewInsetsOf(context), child: ThrowExceptionWidget(msg: message, type: EnumThrowException.error)) - ) - ); - } - ); + context: context, + builder: (context) { + return Dialog( + child: SizedBox( + height: _height, + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ThrowExceptionWidget( + msg: message, type: EnumThrowException.error)))); + }); } static Future warning(BuildContext context, String message) async { @@ -35,11 +44,11 @@ class DialogUtil { return Dialog( child: SizedBox( height: _height, - child: Padding(padding: MediaQuery.viewInsetsOf(context), child: ThrowExceptionWidget(msg: message, type: EnumThrowException.warning)) - ) - ); - } - ); + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ThrowExceptionWidget( + msg: message, type: EnumThrowException.warning)))); + }); } static Future success(BuildContext context, String message) async { @@ -49,11 +58,10 @@ class DialogUtil { return Dialog( child: SizedBox( height: _height, - child: Padding(padding: MediaQuery.viewInsetsOf(context), child: ThrowExceptionWidget(msg: message, type: EnumThrowException.success)) - ) - ); - } - ); + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ThrowExceptionWidget( + msg: message, type: EnumThrowException.success)))); + }); } - -} \ No newline at end of file +} diff --git a/pubspec.lock b/pubspec.lock index 49fbc8b6..ab70e828 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -66,7 +66,7 @@ packages: source: hosted version: "2.0.3" bloc: - dependency: transitive + dependency: "direct main" description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e"