diff --git a/lib/app_state.dart b/lib/app_state.dart index 80712466..ac3c4f66 100644 --- a/lib/app_state.dart +++ b/lib/app_state.dart @@ -480,6 +480,7 @@ class AppState extends ChangeNotifier { void deleteAll() { secureStorage.deleteAll(); + AppState().isLogged = false; } } 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/blocs/connectivity_bloc/connectivity_bloc.dart b/lib/blocs/connectivity_bloc/connectivity_bloc.dart new file mode 100644 index 00000000..64c73c0e --- /dev/null +++ b/lib/blocs/connectivity_bloc/connectivity_bloc.dart @@ -0,0 +1,37 @@ +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:equatable/equatable.dart'; + +part 'connectivity_event.dart'; +part 'connectivity_state.dart'; + +class ConnectivityBloc extends Bloc { + final Connectivity _connectivity; + late StreamSubscription> _connectivitySubscription; + + ConnectivityBloc(this._connectivity) : super(ConnectivityInitial()) { + on(_onConnectivityChanged); + _connectivitySubscription = _connectivity.onConnectivityChanged.listen( + (List result) { + add(ConnectivityChanged(result.first)); + }, + ); + } + + void _onConnectivityChanged( + ConnectivityChanged event, Emitter emit) { + if (event.result == ConnectivityResult.none) { + emit(ConnectivityFailure()); + } else { + emit(ConnectivitySuccess()); + } + } + + @override + Future close() { + _connectivitySubscription.cancel(); + return super.close(); + } +} diff --git a/lib/blocs/connectivity_bloc/connectivity_event.dart b/lib/blocs/connectivity_bloc/connectivity_event.dart new file mode 100644 index 00000000..d069c479 --- /dev/null +++ b/lib/blocs/connectivity_bloc/connectivity_event.dart @@ -0,0 +1,17 @@ +part of 'connectivity_bloc.dart'; + +abstract class ConnectivityEvent extends Equatable { + const ConnectivityEvent(); + + @override + List get props => []; +} + +class ConnectivityChanged extends ConnectivityEvent { + final ConnectivityResult result; + + const ConnectivityChanged(this.result); + + @override + List get props => [result]; +} diff --git a/lib/blocs/connectivity_bloc/connectivity_state.dart b/lib/blocs/connectivity_bloc/connectivity_state.dart new file mode 100644 index 00000000..d109a152 --- /dev/null +++ b/lib/blocs/connectivity_bloc/connectivity_state.dart @@ -0,0 +1,14 @@ +part of 'connectivity_bloc.dart'; + +abstract class ConnectivityState extends Equatable { + const ConnectivityState(); + + @override + List get props => []; +} + +class ConnectivityInitial extends ConnectivityState {} + +class ConnectivitySuccess extends ConnectivityState {} + +class ConnectivityFailure extends ConnectivityState {} 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/menu_component/menu_component_widget.dart b/lib/components/organism_components/menu_component/menu_component_widget.dart index a1d916f0..da7f6d64 100644 --- a/lib/components/organism_components/menu_component/menu_component_widget.dart +++ b/lib/components/organism_components/menu_component/menu_component_widget.dart @@ -53,143 +53,218 @@ class _MenuComponentWidgetState extends State { @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: 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: 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\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: 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.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', + ), + ), + ]; + }(); + return Padding( padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 0.0), child: Builder( @@ -231,7 +306,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..f07fcd21 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.1, + width: MediaQuery.of(context).size.width * 0.1, + 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/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 a023abb9..53a62a9a 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -4,14 +4,12 @@ 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'; -import 'package:hub/pages/preferences_settings_page/preferences_settings_widget.dart'; +import 'package:hub/pages/no_connection_page/no_connection_page.dart'; 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'; @@ -79,6 +77,11 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( builder: (context, params) => params.isEmpty ? const HomePageWidget() : const HomePageWidget(), ), + FFRoute( + name: 'no-connection', + path: '/no-connection', + builder: (context, params) => const NoConnectionScreen(), + ), // FFRoute( // name: 'visitHistoryPage', // path: '/visitHistoryPage', diff --git a/lib/main.dart b/lib/main.dart index 33484406..51fd3518 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,19 +1,22 @@ import 'dart:developer'; +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.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/blocs/connectivity_bloc/connectivity_bloc.dart'; 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'; import 'package:hub/flutter_flow/nav/nav.dart'; +import 'package:hub/pages/no_connection_page/no_connection_page.dart'; import 'package:provider/provider.dart'; import 'package:responsive_framework/responsive_framework.dart'; @@ -47,7 +50,17 @@ Future initializeApp() async { void main() async { await initializeApp(); - runApp(const App()); + runApp( + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => AppState()), + BlocProvider( + create: (context) => ConnectivityBloc(Connectivity()), + ), + ], + child: const App(), + ), + ); } class App extends StatefulWidget { @@ -91,10 +104,15 @@ class _AppState extends State { @override Widget build(BuildContext context) { - return MultiProvider( - providers: [ - ChangeNotifierProvider(create: (_) => AppState()), - ], + return BlocListener( + listener: (context, state) { + if (state is ConnectivityFailure) { + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const NoConnectionScreen()), + ); + } + }, child: MaterialApp.router( title: 'FREHub', builder: (context, widget) => ResponsiveBreakpoints.builder( diff --git a/lib/pages/home_page/home_page_widget.dart b/lib/pages/home_page/home_page_widget.dart index 9c48da63..983be7e1 100644 --- a/lib/pages/home_page/home_page_widget.dart +++ b/lib/pages/home_page/home_page_widget.dart @@ -11,9 +11,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 { @@ -28,14 +27,6 @@ class _HomePageWidgetState extends State { bool localStatus = false; final scaffoldKey = GlobalKey(); - Future checkLocalStatus() async { - localStatus = await checkLocals( - context: context, - model: _model, - safeSetState: safeSetState, - ); - } - @override void initState() { super.initState(); @@ -55,27 +46,23 @@ class _HomePageWidgetState extends State { atividade: 'getDados') .then((value) async { // value = await value; - AppState().whatsapp = value.jsonBody['whatsapp']; - AppState().provisional = value.jsonBody['provisional']; + if (value.statusCode == 200 && value.jsonBody['error'] == false) { + AppState().whatsapp = value.jsonBody['whatsapp']; + AppState().provisional = value.jsonBody['provisional']; + } else { + DialogUtil.errorDefault(context); + } }); }(); WidgetsBinding.instance.addPostFrameCallback((_) async { - @override - void initState() { - // PhpGroup.getLocalsCall - // .call( - // devUUID: AppState().devUUID, - // userUUID: AppState().userUUID, - // ) - // .then((value) => log('getLocalsCall: $value')); + localStatus = await checkLocals( + context: context, + model: _model, + safeSetState: safeSetState, + ); - super.initState(); - checkLocalStatus(); - } - - // Rest of your code... - if (AppState().cliUUID == null || AppState().cliUUID.isEmpty) { + if (AppState().cliUUID.isEmpty) { showModalBottomSheet( isScrollControlled: false, backgroundColor: Colors.transparent, @@ -177,6 +164,7 @@ class _HomePageWidgetState extends State { item: MenuItem.button, ), ), + // Align( // alignment: const AlignmentDirectional(0.0, 0.0), // child: Provider( @@ -189,6 +177,7 @@ class _HomePageWidgetState extends State { // ), // ), //footer + const SizedBox( height: 100, width: double.infinity, @@ -551,55 +540,13 @@ class _HomePageWidgetState extends State { child: wrapWithModel( model: _model.menuComponentModel, updateCallback: () => setState(() {}), - child: MenuComponentWidget( + child: const MenuComponentWidget( expandable: false, style: MenuView.list, - item: MenuItem.card, + 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/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..158ca1fb 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'; @@ -734,6 +731,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 8f0d6fd1..8b755d58 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'; @@ -73,7 +72,7 @@ class PreferencesPageWidget extends StatelessWidget { // childAspectRatio: 1.0, // mainAxisExtent: 100.0, // ), - itemCount: 7, // Assuming 4 items for simplicity + itemCount: 8, // Assuming 4 items for simplicity padding: const EdgeInsets.symmetric(horizontal: 20.0), physics: const AlwaysScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { @@ -147,7 +146,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', @@ -156,13 +155,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/pubspec.lock b/pubspec.lock index 5c474b93..056e6ffc 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" diff --git a/pubspec.yaml b/pubspec.yaml index 1f3c6a80..8fa32471 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -79,6 +79,7 @@ dependencies: timeago: 3.6.1 url_launcher: 6.3.0 url_launcher_android: 6.3.3 + bloc: ^8.1.4 url_launcher_ios: 6.3.0 url_launcher_platform_interface: 2.3.2 video_player: 2.8.7