Merge branch 'main' into pets/fd-740
This commit is contained in:
commit
f10f9c1f02
|
@ -0,0 +1,2 @@
|
||||||
|
gradle 8.7
|
||||||
|
kotlin 1.7.10
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -62,11 +62,11 @@
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSCameraUsageDescription</key>
|
<key>NSCameraUsageDescription</key>
|
||||||
<string>In order to take a picture or video, this app requires permission to access the camera.</string>
|
<string>FRE ACCESS HUB Uses the camera for taking profile pictures.</string>
|
||||||
<key>NSFaceIDUsageDescription</key>
|
<key>NSFaceIDUsageDescription</key>
|
||||||
<string>Why is my app authenticating using face id?</string>
|
<string>Why is my app authenticating using face id?</string>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
<string>In order to upload data, this app requires permission to access the photo library.</string>
|
<string>FRE ACCESS HUB Uses the library for allowing the user to pick a photo for his profile picture or for a guest.</string>
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
<key>BGTaskSchedulerPermittedIdentifiers</key>
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
NSCameraUsageDescription = "dd/mm/yyyy";
|
NSCameraUsageDescription = "FRE ACCESS HUB Uses the camera for taking profile pictures.";
|
||||||
|
NSPhotoLibraryUsageDescription = "FRE ACCESS HUB Uses the library for allowing the user to pick a photo for his profile picture or for a guest.";
|
|
@ -1 +1,2 @@
|
||||||
|
NSCameraUsageDescription = "FRE ACCESS HUB Usa a câmera para tirar fotos de perfil.";
|
||||||
|
NSPhotoLibraryUsageDescription = "FRE ACCESS HUB Utiliza a biblioteca para permitir que o usuário escolha uma foto para sua foto de perfil ou para um convidado.";
|
|
@ -163,6 +163,10 @@ class AppState extends ChangeNotifier {
|
||||||
await _safeInitAsync(() async {
|
await _safeInitAsync(() async {
|
||||||
_haveLocal = await secureStorage.getBool('ff_have_local') ?? _haveLocal;
|
_haveLocal = await secureStorage.getBool('ff_have_local') ?? _haveLocal;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await _safeInitAsync(() async {
|
||||||
|
_isRequestOSNotification = await secureStorage.getBool('ff_request_os_notification') ?? _isRequestOSNotification;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(VoidCallback callback) {
|
void update(VoidCallback callback) {
|
||||||
|
@ -171,9 +175,20 @@ class AppState extends ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
late FlutterSecureStorage secureStorage;
|
late FlutterSecureStorage secureStorage;
|
||||||
|
bool _isRequestOSNotification = false;
|
||||||
|
bool get isRequestOSNotification => _isRequestOSNotification;
|
||||||
|
set isRequestOSNotification(bool value) {
|
||||||
|
_isRequestOSNotification = value;
|
||||||
|
secureStorage.setBool('ff_request_os_notification', value);
|
||||||
|
}
|
||||||
|
void deleteIsRequestOSNotification() {
|
||||||
|
secureStorage.delete(key: 'ff_request_os_notification');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool _whatsapp = false;
|
bool _whatsapp = false;
|
||||||
bool get whatsapp => _whatsapp;
|
bool get whatsapp => _whatsapp;
|
||||||
|
|
||||||
set whatsapp(bool value) {
|
set whatsapp(bool value) {
|
||||||
_whatsapp = value;
|
_whatsapp = value;
|
||||||
secureStorage.setBool('whatsapp', value);
|
secureStorage.setBool('whatsapp', value);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:awesome_notifications/awesome_notifications.dart';
|
import 'package:awesome_notifications/awesome_notifications.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hub/actions/actions.dart';
|
import 'package:hub/actions/actions.dart';
|
||||||
import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart';
|
import 'package:hub/components/templates_components/access_notification_modal_template_component/access_notification_modal_template_component_widget.dart';
|
||||||
|
@ -37,13 +38,16 @@ class NotificationService {
|
||||||
channelGroupKey: 'basic_channel_group',
|
channelGroupKey: 'basic_channel_group',
|
||||||
channelGroupName: 'group_1')
|
channelGroupName: 'group_1')
|
||||||
],
|
],
|
||||||
debug: true);
|
debug: kDebugMode);
|
||||||
await AwesomeNotifications()
|
|
||||||
.isNotificationAllowed()
|
await AwesomeNotifications().isNotificationAllowed().then((isAllowed) async {
|
||||||
.then((isAllowed) async {
|
if (!AppState().isRequestOSNotification) {
|
||||||
if (!isAllowed) {
|
if (!isAllowed) {
|
||||||
|
AppState().isRequestOSNotification = true;
|
||||||
await AwesomeNotifications().requestPermissionToSendNotifications();
|
await AwesomeNotifications().requestPermissionToSendNotifications();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
|
|
||||||
await AwesomeNotifications().setListeners(
|
await AwesomeNotifications().setListeners(
|
||||||
|
|
|
@ -2,6 +2,9 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
|
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_theme.dart';
|
||||||
|
import 'package:hub/shared/utils/dialog_util.dart';
|
||||||
|
|
||||||
|
import '../../../app_state.dart';
|
||||||
|
|
||||||
class MenuButtonWidget extends MenuEntry {
|
class MenuButtonWidget extends MenuEntry {
|
||||||
const MenuButtonWidget({
|
const MenuButtonWidget({
|
||||||
|
@ -30,7 +33,11 @@ class _MenuButtonWidgetState extends State<MenuButtonWidget> {
|
||||||
hoverColor: Colors.transparent,
|
hoverColor: Colors.transparent,
|
||||||
highlightColor: Colors.transparent,
|
highlightColor: Colors.transparent,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
|
if (AppState().cliUUID.isEmpty) {
|
||||||
|
return DialogUtil.warningDefault(context);
|
||||||
|
} else {
|
||||||
await widget.action?.call();
|
await widget.action?.call();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 0),
|
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 0),
|
||||||
|
|
|
@ -79,6 +79,15 @@ class _BottomArrowLinkedLocalsComponentWidgetState
|
||||||
_loading = false;
|
_loading = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Verifica se há apenas um local e se o status é 'A'
|
||||||
|
if (locals.length == 1 && locals[0]['CLU_STATUS'] == 'A') {
|
||||||
|
final local = locals[0];
|
||||||
|
AppState().cliUUID = local['CLI_ID'];
|
||||||
|
AppState().local = local['CLI_NOME'];
|
||||||
|
AppState().ownerUUID = local['CLU_OWNER_ID'];
|
||||||
|
context.pop();
|
||||||
|
}
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +99,7 @@ class _BottomArrowLinkedLocalsComponentWidgetState
|
||||||
});
|
});
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
} catch (e, s) {
|
} catch (e) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_hasData = false;
|
_hasData = false;
|
||||||
_loading = false;
|
_loading = false;
|
||||||
|
|
|
@ -282,8 +282,8 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
|
||||||
'en': 'Does the visit end after the first access?',
|
'en': 'Does the visit end after the first access?',
|
||||||
},
|
},
|
||||||
'lgv0q5ht': {
|
'lgv0q5ht': {
|
||||||
'pt': 'Visita única',
|
'pt': 'Entrada única',
|
||||||
'en': 'Single visit',
|
'en': 'Single entry',
|
||||||
},
|
},
|
||||||
'eftcs67c': {
|
'eftcs67c': {
|
||||||
'pt': 'Você tem alguma observação sobre esta visita?',
|
'pt': 'Você tem alguma observação sobre esta visita?',
|
||||||
|
|
|
@ -81,7 +81,11 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
|
||||||
FFRoute(
|
FFRoute(
|
||||||
name: 'homePage',
|
name: 'homePage',
|
||||||
path: '/homePage',
|
path: '/homePage',
|
||||||
builder: (context, params) => const HomePageWidget(),
|
builder: (context, params) {
|
||||||
|
return HomePageWidget(
|
||||||
|
key: UniqueKey(),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
FFRoute(
|
FFRoute(
|
||||||
name: 'receptionPage',
|
name: 'receptionPage',
|
||||||
|
|
|
@ -58,8 +58,7 @@ Future<List<SelectedFile>?> selectMediaWithSourceBottomSheet({
|
||||||
bool includeDimensions = false,
|
bool includeDimensions = false,
|
||||||
bool includeBlurHash = false,
|
bool includeBlurHash = false,
|
||||||
}) async {
|
}) async {
|
||||||
createUploadMediaListTile(
|
createUploadMediaListTile(String label, MediaSource mediaSource, IconData icon) =>
|
||||||
String label, MediaSource mediaSource, IconData icon) =>
|
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Row(
|
title: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'dart:developer';
|
import 'dart:developer';
|
||||||
|
|
||||||
|
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
||||||
import 'package:firebase_core/firebase_core.dart';
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
@ -15,7 +16,6 @@ import 'package:hub/flutter_flow/internationalization.dart';
|
||||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:responsive_framework/responsive_framework.dart';
|
import 'package:responsive_framework/responsive_framework.dart';
|
||||||
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
|
||||||
|
|
||||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||||
|
|
||||||
|
@ -24,6 +24,9 @@ Future<void> initializeApp() async {
|
||||||
|
|
||||||
final status = await AppTrackingTransparency.requestTrackingAuthorization();
|
final status = await AppTrackingTransparency.requestTrackingAuthorization();
|
||||||
|
|
||||||
|
final appState = AppState();
|
||||||
|
await appState.initializePersistedState();
|
||||||
|
|
||||||
await Firebase.initializeApp();
|
await Firebase.initializeApp();
|
||||||
await FirebaseMessagingService().initNotifications();
|
await FirebaseMessagingService().initNotifications();
|
||||||
await NotificationService.initialize();
|
await NotificationService.initialize();
|
||||||
|
@ -41,8 +44,6 @@ Future<void> initializeApp() async {
|
||||||
|
|
||||||
await FlutterFlowTheme.initialize();
|
await FlutterFlowTheme.initialize();
|
||||||
await FFLocalizations.initialize();
|
await FFLocalizations.initialize();
|
||||||
final appState = AppState();
|
|
||||||
await appState.initializePersistedState();
|
|
||||||
GoRouter.optionURLReflectsImperativeAPIs = true;
|
GoRouter.optionURLReflectsImperativeAPIs = true;
|
||||||
usePathUrlStrategy();
|
usePathUrlStrategy();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:developer';
|
|
||||||
|
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -16,10 +15,9 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||||
import 'package:hub/pages/home_page/home_page_model.dart';
|
import 'package:hub/pages/home_page/home_page_model.dart';
|
||||||
import 'package:hub/shared/utils/dialog_util.dart';
|
import 'package:hub/shared/utils/dialog_util.dart';
|
||||||
import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart';
|
import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart';
|
||||||
import 'package:rxdart/rxdart.dart';
|
|
||||||
|
|
||||||
class HomePageWidget extends StatefulWidget {
|
class HomePageWidget extends StatefulWidget {
|
||||||
const HomePageWidget({Key? key});
|
const HomePageWidget({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<HomePageWidget> createState() => _HomePageWidgetState();
|
State<HomePageWidget> createState() => _HomePageWidgetState();
|
||||||
|
@ -31,7 +29,8 @@ class _HomePageWidgetState extends State<HomePageWidget> {
|
||||||
late LocalProfileComponentWidget _localProfileComponentWidget;
|
late LocalProfileComponentWidget _localProfileComponentWidget;
|
||||||
|
|
||||||
_HomePageWidgetState() {
|
_HomePageWidgetState() {
|
||||||
_localProfileComponentWidget = LocalProfileComponentWidget(showBottomSheet: showModalSelectLocal);
|
_localProfileComponentWidget =
|
||||||
|
LocalProfileComponentWidget(showBottomSheet: showModalSelectLocal);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> processData() async {
|
Future<void> processData() async {
|
||||||
|
@ -71,7 +70,8 @@ class _HomePageWidgetState extends State<HomePageWidget> {
|
||||||
|
|
||||||
List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
||||||
|
|
||||||
final activeLocals = locals.where((local) => local['CLU_STATUS'] == 'A').toList();
|
final activeLocals =
|
||||||
|
locals.where((local) => local['CLU_STATUS'] == 'A').toList();
|
||||||
|
|
||||||
if (activeLocals.isEmpty || AppState().cliUUID.isEmpty) {
|
if (activeLocals.isEmpty || AppState().cliUUID.isEmpty) {
|
||||||
await showModalSelectLocal();
|
await showModalSelectLocal();
|
||||||
|
@ -96,7 +96,8 @@ class _HomePageWidgetState extends State<HomePageWidget> {
|
||||||
),
|
),
|
||||||
).then((_) async {
|
).then((_) async {
|
||||||
_model.updatePage(() => safeSetState(() {
|
_model.updatePage(() => safeSetState(() {
|
||||||
_localProfileComponentWidget = LocalProfileComponentWidget(showBottomSheet: showModalSelectLocal);
|
_localProfileComponentWidget = LocalProfileComponentWidget(
|
||||||
|
showBottomSheet: showModalSelectLocal);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
await processData();
|
await processData();
|
||||||
|
|
|
@ -316,6 +316,7 @@ class PreferencesPageModel with ChangeNotifier {
|
||||||
AppState().deleteOwnerUUID();
|
AppState().deleteOwnerUUID();
|
||||||
|
|
||||||
context.pop();
|
context.pop();
|
||||||
|
|
||||||
context.go(
|
context.go(
|
||||||
'/homePage',
|
'/homePage',
|
||||||
extra: <String, dynamic>{
|
extra: <String, dynamic>{
|
||||||
|
@ -326,16 +327,6 @@ class PreferencesPageModel with ChangeNotifier {
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
context.replace(
|
|
||||||
'/homePage',
|
|
||||||
extra: <String, dynamic>{
|
|
||||||
kTransitionInfoKey: const TransitionInfo(
|
|
||||||
hasTransition: true,
|
|
||||||
transitionType: PageTransitionType.scale,
|
|
||||||
alignment: Alignment.bottomCenter,
|
|
||||||
),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(
|
SnackBar(
|
||||||
|
|
|
@ -3,7 +3,7 @@ description: A new Flutter project.
|
||||||
|
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
|
|
||||||
version: 1.0.0+6
|
version: 1.0.0+9
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.0.0 <4.0.0"
|
sdk: ">=3.0.0 <4.0.0"
|
||||||
|
|
Loading…
Reference in New Issue