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,
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ },
+ ),
+ ),
+ );
+ }
+}