diff --git a/android/.tool-versions b/android/.tool-versions deleted file mode 100644 index d673a119..00000000 --- a/android/.tool-versions +++ /dev/null @@ -1,4 +0,0 @@ -gradle 7.6.3 -flutter 3.24.0-stable -java openjdk-19 -kotlin 2.0.10 diff --git a/assets/images/dark/reception.svg b/assets/images/dark/reception.svg new file mode 100644 index 00000000..f5b8fe42 --- /dev/null +++ b/assets/images/dark/reception.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/light/reception.svg b/assets/images/light/reception.svg new file mode 100644 index 00000000..bb6d64de --- /dev/null +++ b/assets/images/light/reception.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart index a2b47feb..37f9ae4e 100644 --- a/lib/actions/actions.dart +++ b/lib/actions/actions.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; // import 'package:hub/components/organisms/bottom_arrow_linked_locals/bottom_arrow_linked_locals_component_widget.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; @@ -96,7 +98,8 @@ Future manageStatusColorAction( } Future singInLoginAction( - BuildContext context, { + BuildContext context, + FlutterFlowModel model, { String? emailAdress, String? password, }) async { @@ -157,8 +160,8 @@ Future singInLoginAction( AppState().serialNumber = await getSerialNumber() ?? ''; AppState().isLogged = true; - - await toggleHomePage(context); + AppState().haveLocal = + await checkLocals(context: context, model: model); } else { if (PhpGroup.loginCall.msg((loginCall?.jsonBody ?? '')) == null) { DialogUtil.errorDefault(context); @@ -302,16 +305,27 @@ Future toggleSignUpPage(BuildContext context) async { ); } -Future toggleHomePage(BuildContext context) async { - context.goNamed( - 'homePage', - extra: { - kTransitionInfoKey: const TransitionInfo( - hasTransition: true, - transitionType: PageTransitionType.fade, - ), - }, - ); +Future toggleApp(BuildContext context, bool haveLocal) async { + if (haveLocal == true) + context.goNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + else if (haveLocal == false) + context.goNamed( + 'receptionPage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ) + }, + ); } Future visitCancelAction(BuildContext context, @@ -370,57 +384,40 @@ Future snackbar(BuildContext context, {required bool opt}) async { Future checkLocals({ String? cliUUID, required BuildContext context, - required HomePageModel model, - required void Function(void Function()) safeSetState, + required FlutterFlowModel model, }) async { - bool itemFound = false; - var modalResult; + final response = await PhpGroup.getLocalsCall.call( + devUUID: AppState().devUUID, + userUUID: AppState().userUUID, + ); + log(response.jsonBody.toString()); - 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; + // Verificação rápida de erro para evitar processamento desnecessário. + if (response.jsonBody['error']) { + DialogUtil.errorDefault(context); + return false; + } + List locals = response.jsonBody['locais'] ?? []; + if (locals != null && locals.isEmpty) { + await toggleApp(context, false); + return false; + } else { + // else if (locals.where((local) => local['CLU_STATUS'] != 'A').isNotEmpty) { + // await showModalBottomSheet( + // isScrollControlled: true, + // backgroundColor: Colors.transparent, + // enableDrag: false, + // isDismissible: false, + // context: context, + // builder: (context) => Padding( + // padding: MediaQuery.viewInsetsOf(context), + // child: const BottomArrowLinkedLocalsComponentWidget(), + // ), + // ); + // } + await toggleApp(context, true); + return true; + } } Future answersRequest(BuildContext context, String? ref, String? task, diff --git a/lib/app_state.dart b/lib/app_state.dart index cf61477d..3c6f0587 100644 --- a/lib/app_state.dart +++ b/lib/app_state.dart @@ -159,6 +159,9 @@ class AppState extends ChangeNotifier { await _safeInitAsync(() async { _whatsapp = await secureStorage.getBool('whatsapp') ?? _whatsapp; }); + await _safeInitAsync(() async { + _haveLocal = await secureStorage.getBool('ff_have_local') ?? _haveLocal; + }); } void update(VoidCallback callback) { @@ -408,6 +411,13 @@ class AppState extends ChangeNotifier { secureStorage.setBool('ff_isLogged', value); } + bool _haveLocal = false; + bool get haveLocal => _haveLocal; + set haveLocal(bool value) { + _haveLocal = value; + secureStorage.setBool('ff_have_local', value); + } + void deleteIsLogged() { secureStorage.delete(key: 'ff_isLogged'); } diff --git a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart index e1010ec7..165de263 100644 --- a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart +++ b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_model.dart @@ -1,3 +1,5 @@ +import 'package:hub/pages/home_page/home_page_model.dart'; + import '/flutter_flow/flutter_flow_util.dart'; import 'sign_in_template_component_widget.dart' show SignInTemplateComponentWidget; @@ -13,6 +15,8 @@ class SignInTemplateComponentModel FocusNode? emailAddressFocusNode; TextEditingController? emailAddressTextController; String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + + SignInTemplateComponentModel(); String? _emailAddressTextControllerValidator( BuildContext context, String? val) { if (val == null || val.isEmpty) { diff --git a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart index 37658f1b..419b80f9 100644 --- a/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart +++ b/lib/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart @@ -548,6 +548,7 @@ class _SignInTemplateComponentWidgetState await action_blocks .singInLoginAction( context, + _model, emailAdress: _model .emailAddressTextController .text, @@ -707,6 +708,7 @@ class _SignInTemplateComponentWidgetState await action_blocks .singInLoginAction( context, + _model, emailAdress: _model .emailAddressTextController .text, diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index 3c88ce9c..4b5ad183 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -7,6 +7,8 @@ import 'package:hub/pages/message_history_page/message_history_page_widget.dart' import 'package:hub/pages/no_connection_page/no_connection_page.dart'; import 'package:hub/pages/package_order_page/package_order_page.dart'; import 'package:hub/pages/reservation_page/reservation_page_widget.dart'; +import 'package:hub/pages/preferences_settings_page/preferences_settings_widget.dart'; +import 'package:hub/pages/reception_page/reception_page_widget.dart'; import 'package:provider/provider.dart'; import '/backend/schema/structs/index.dart'; @@ -70,7 +72,9 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( name: '_initialize', path: '/', builder: (context, _) => AppState().isLogged - ? const HomePageWidget() + ? AppState().haveLocal + ? const HomePageWidget() + : const ReceptionPageWidget() : const WelcomePageWidget(), ), FFRoute( @@ -80,15 +84,9 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( params.isEmpty ? const HomePageWidget() : const HomePageWidget(), ), FFRoute( - name: 'no-connection', - path: '/no-connection', - builder: (context, params) => const NoConnectionScreen(), - ), - // FFRoute( - // name: 'visitHistoryPage', - // path: '/visitHistoryPage', - // builder: (context, params) => const VisitHistoryPageWidget(), - // ), + name: 'receptionPage', + path: '/receptionPage', + builder: (context, params) => const ReceptionPageWidget()), FFRoute( name: 'messageHistoryPage', path: '/messageHistoryPage', @@ -138,7 +136,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( FFRoute( name: 'acessHistoryPage', path: '/acessHistoryPage', - builder: (context, params) => AcessHistoryPageWidget(opt: { + builder: (context, params) => AcessHistoryPageWidget(opt: const { 'personType': '.*', 'accessType': '.*', 'search': '.*', diff --git a/lib/pages/home_page/home_page_widget.dart b/lib/pages/home_page/home_page_widget.dart index 9c0d2108..fa31da21 100644 --- a/lib/pages/home_page/home_page_widget.dart +++ b/lib/pages/home_page/home_page_widget.dart @@ -28,6 +28,13 @@ class _HomePageWidgetState extends State { bool localStatus = false; final scaffoldKey = GlobalKey(); + Future checkLocalStatus() async { + localStatus = await checkLocals( + context: context, + model: _model, + ); + } + @override void initState() { super.initState(); @@ -70,7 +77,6 @@ class _HomePageWidgetState extends State { localStatus = await checkLocals( context: context, model: _model, - safeSetState: safeSetState, ); if (AppState().cliUUID.isEmpty) { diff --git a/lib/pages/preferences_settings_page/preferences_settings_widget.dart b/lib/pages/preferences_settings_page/preferences_settings_widget.dart index 8b755d58..180c1cc2 100644 --- a/lib/pages/preferences_settings_page/preferences_settings_widget.dart +++ b/lib/pages/preferences_settings_page/preferences_settings_widget.dart @@ -65,14 +65,7 @@ class PreferencesPageWidget extends StatelessWidget { Expanded( flex: 2, child: ListView.builder( - // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - // crossAxisCount: 3, - // crossAxisSpacing: 12.0, - // mainAxisSpacing: 12.0, - // childAspectRatio: 1.0, - // mainAxisExtent: 100.0, - // ), - itemCount: 8, // Assuming 4 items for simplicity + itemCount: 7, // Assuming 4 items for simplicity padding: const EdgeInsets.symmetric(horizontal: 20.0), physics: const AlwaysScrollableScrollPhysics(), itemBuilder: (BuildContext context, int index) { diff --git a/lib/pages/reception_page/reception_page_model.dart b/lib/pages/reception_page/reception_page_model.dart new file mode 100644 index 00000000..47dc15a9 --- /dev/null +++ b/lib/pages/reception_page/reception_page_model.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:hub/app_state.dart'; +import 'package:hub/flutter_flow/internationalization.dart'; +import 'package:share_plus/share_plus.dart'; + +class ReceptionPageModel with ChangeNotifier { + void getIdenfifier(BuildContext context) { + notifyListeners(); + Share.share( + FFLocalizations.of(context).getVariableText( + ptText: + 'Este é o meu identificador de acesso: ${AppState().userDevUUID}', + enText: 'This is my access identifier: ${AppState().userDevUUID}', + ), + ); + } +} diff --git a/lib/pages/reception_page/reception_page_widget.dart b/lib/pages/reception_page/reception_page_widget.dart new file mode 100644 index 00000000..82fe4d3f --- /dev/null +++ b/lib/pages/reception_page/reception_page_widget.dart @@ -0,0 +1,206 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:hub/app_state.dart'; +import 'package:hub/components/atomic_components/shared_components_atoms/atom_image_svg_theme.dart'; +import 'package:hub/flutter_flow/flutter_flow_theme.dart'; +import 'package:hub/flutter_flow/flutter_flow_util.dart'; +import 'package:hub/flutter_flow/flutter_flow_widgets.dart'; +import 'package:hub/flutter_flow/internationalization.dart'; +import 'package:hub/flutter_flow/nav/nav.dart'; +import 'package:hub/pages/reception_page/reception_page_model.dart'; +import 'package:provider/provider.dart'; + +class ReceptionPageWidget extends StatefulWidget { + const ReceptionPageWidget({super.key}); + + @override + State createState() => _ReceptionPageWidgetState(); +} + +class _ReceptionPageWidgetState extends State { + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => ReceptionPageModel(), + child: Scaffold( + body: Consumer( + builder: (context, ReceptionPageModel model, child) { + return SafeArea( + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(45, 0, 45, 15.0), + child: Text( + FFLocalizations.of(context).getVariableText( + ptText: + 'Falta pouco para você utilizar o FRE Access Hub...', + enText: + 'You are close to using the FRE Access Hub...'), + textAlign: TextAlign.center, + style: FlutterFlowTheme.of(context) + .displayLarge + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).accent1, + fontSize: 20.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w700, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + const AtomImageSvgTheme( + filename: 'reception', width: 180, height: 180), + Padding( + padding: const EdgeInsets.fromLTRB(70, 30, 70.0, 60), + child: Text( + FFLocalizations.of(context).getVariableText( + ptText: + 'Envie seu identificador para seu condomínio para vincularem sua conta aos nossos sistemas.', + enText: + 'Send your identifier to your condominium to link your account to our systems.'), + textAlign: TextAlign.center, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Nunito Sans', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(60, 0, 60, 10), + child: Tooltip( + message: FFLocalizations.of(context).getVariableText( + ptText: + 'Seu identificador é utilizado para efetuar\no vinculo do seu APP com o condominio.', + enText: 'My Identifier'), + textStyle: FlutterFlowTheme.of(context) + .labelSmall + .override( + fontFamily: 'Nunito Sans', + color: FlutterFlowTheme.of(context) + .secondaryText, + fontSize: 10.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + child: FFButtonWidget( + onPressed: () => model.getIdenfifier(context), + text: FFLocalizations.of(context) + .getVariableText( + ptText: 'Meu Identificador', + enText: 'My Identifier'), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: FlutterFlowTheme.of(context).primary, + textStyle: FlutterFlowTheme.of(context) + .titleSmall + .override( + fontFamily: 'Nunito Sans', + color: FlutterFlowTheme.of(context) + .primaryBackground, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(60, 0, 60, 0), + child: 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).getVariableText( + ptText: 'Sair da Conta', enText: 'Logout'), + options: FFButtonOptions( + width: double.infinity, + height: 44.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: + FlutterFlowTheme.of(context).customColor1, + textStyle: FlutterFlowTheme.of(context) + .titleSmall + .override( + fontFamily: 'Nunito Sans', + color: FlutterFlowTheme.of(context) + .primaryBackground, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ], + ), + ], + ), + ), + ), + ); + }, + ), + ), + ); + } +}