milestone modularização

This commit is contained in:
J. A. Messias 2024-11-27 15:43:50 -03:00
parent 9891165ca9
commit 5cda31ea0d
44 changed files with 1426 additions and 1441 deletions

View File

@ -9,7 +9,6 @@ class MenuButtonWidget extends MenuEntry {
required this.action, required this.action,
required this.title, required this.title,
required this.icon, required this.icon,
required super.safeSetState,
}) : super(action: action, title: title, icon: icon); }) : super(action: action, title: title, icon: icon);
@override @override

View File

@ -9,7 +9,6 @@ class MenuCardItem extends MenuEntry {
required this.action, required this.action,
required this.title, required this.title,
required this.icon, required this.icon,
required super.safeSetState,
}) : super(action: action, title: title, icon: icon); }) : super(action: action, title: title, icon: icon);
@override @override

View File

@ -28,11 +28,9 @@ abstract class MenuEntry extends StatefulWidget {
required this.action, required this.action,
required this.title, required this.title,
required this.icon, required this.icon,
required this.safeSetState,
}); });
final Function() action; final Function() action;
final String title; final String title;
final IconData icon; final IconData icon;
final VoidCallback safeSetState;
} }

View File

@ -0,0 +1,52 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/material.dart';
import 'package:hub/components/organism_components/local_profile_component/local_profile_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
class LocalProfileEvent {}
class LocalProfileState {
final String cliName;
final String cliUUID;
LocalProfileState({this.cliName = '', this.cliUUID = ''});
LocalProfileState copyWith({String? cliName, String? cliUUID}) {
return LocalProfileState(
cliName: cliName ?? this.cliName,
cliUUID: cliUUID ?? this.cliUUID,
);
}
}
class LocalProfileBloc extends Bloc<LocalProfileEvent, LocalProfileState> {
LocalProfileBloc() : super(LocalProfileState()) {
on<LocalProfileEvent>((event, emit) async {
final cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
final cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
emit(state.copyWith(cliName: cliName, cliUUID: cliUUID));
});
}
}
class LocalProfileComponentModel extends FlutterFlowModel<LocalProfileComponentWidget> {
String cliName = '';
String cliUUID = '';
VoidCallback? setStateCallback;
@override
void initState(BuildContext context) {
getData();
}
Future<void> getData() async {
cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
setStateCallback?.call();
}
@override
void dispose() {}
}

View File

@ -1,28 +0,0 @@
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
import '/flutter_flow/flutter_flow_util.dart';
import 'local_profile_component_widget.dart' show LocalProfileComponentWidget;
import 'package:flutter/material.dart';
///
class LocalProfileComponentModel extends FlutterFlowModel<LocalProfileComponentWidget> {
String cliName = '';
String cliUUID = '';
VoidCallback? setStateCallback;
@override
void initState(BuildContext context) {
getData();
}
Future<void> getData() async {
cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
setStateCallback?.call();
}
@override
void dispose() {}
}

View File

@ -1,18 +1,14 @@
import 'dart:developer';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hub/components/organism_components/local_profile_component/local_profile_bloc.dart';
import 'package:hub/flutter_flow/custom_functions.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'package:hub/shared/services/localization/localization_service.dart';
import '/flutter_flow/custom_functions.dart' as functions;
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '../../../shared/services/localization/localization_service.dart';
import 'local_profile_component_model.dart';
export 'local_profile_component_model.dart';
class LocalProfileComponentWidget extends StatefulWidget { class LocalProfileComponentWidget extends StatefulWidget {
const LocalProfileComponentWidget({super.key}); const LocalProfileComponentWidget({super.key});
@ -22,46 +18,12 @@ class LocalProfileComponentWidget extends StatefulWidget {
} }
class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidget> { class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidget> {
late LocalProfileComponentModel _model;
@override
void setState(VoidCallback callback) {
super.setState(callback);
callback();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => LocalProfileComponentModel());
_model.setOnUpdate(onUpdate: () => safeSetState(() {}));
_model.setStateCallback = () => safeSetState(() {});
WidgetsBinding.instance.addPostFrameCallback((_) async {
bool initialized = false;
bool isDevLinked = _model.cliUUID.isNotEmpty;
if (!isDevLinked && !initialized) {
initialized = true;
await LocalizationService.processLocals(context).then((value) => value == true ? onUpdate() : null);
}
});
}
@override
void dispose() {
_model.maybeDispose();
super.dispose();
}
void onUpdate() async {
log('() => onUpdate()');
await _model.getData();
safeSetState(() {});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider<LocalProfileBloc>(
create: (context) => LocalProfileBloc()..add(LocalProfileEvent()),
child: BlocBuilder<LocalProfileBloc, LocalProfileState>(
builder: (context, state) {
final textScaler = MediaQuery.textScalerOf(context); final textScaler = MediaQuery.textScalerOf(context);
final double baseFontSize = 14.0; final double baseFontSize = 14.0;
final double scaledFontSize = baseFontSize * textScaler.scale(1); final double scaledFontSize = baseFontSize * textScaler.scale(1);
@ -97,7 +59,8 @@ class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidge
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
onTap: () async { onTap: () async {
await StorageHelper().s(KeychainStorageKey.clientUUID.value, ''); await StorageHelper().s(KeychainStorageKey.clientUUID.value, '');
await LocalizationService.processLocals(context).whenComplete(() => onUpdate()); await LocalizationService.processLocals(context).whenComplete(
() async => context.read<LocalProfileBloc>().add(LocalProfileEvent()));
}, },
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(200.0), borderRadius: BorderRadius.circular(200.0),
@ -111,7 +74,7 @@ class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidge
), ),
), ),
imageUrl: valueOrDefault( imageUrl: valueOrDefault(
'https://freaccess.com.br/freaccess/Images/Clients/${_model.cliUUID}.png', 'https://freaccess.com.br/freaccess/Images/Clients/${state.cliUUID}.png',
'assets/images/home.png'), 'assets/images/home.png'),
width: 80.0, width: 80.0,
height: 80.0, height: 80.0,
@ -127,7 +90,7 @@ class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidge
Expanded( Expanded(
child: Tooltip( child: Tooltip(
message: valueOrDefault<String>( message: valueOrDefault<String>(
functions.convertToUppercase(_model.cliName), convertToUppercase(state.cliName),
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
ptText: 'SEM LOCAL VINCULADO', ptText: 'SEM LOCAL VINCULADO',
enText: 'NO LINKED LOCAL', enText: 'NO LINKED LOCAL',
@ -135,7 +98,7 @@ class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidge
), ),
child: Text( child: Text(
valueOrDefault<String>( valueOrDefault<String>(
functions.convertToUppercase(_model.cliName), convertToUppercase(state.cliName),
FFLocalizations.of(context).getVariableText( FFLocalizations.of(context).getVariableText(
ptText: 'SEM LOCAL VINCULADO', ptText: 'SEM LOCAL VINCULADO',
enText: 'NO LINKED LOCAL', enText: 'NO LINKED LOCAL',
@ -163,5 +126,8 @@ class _LocalProfileComponentWidgetState extends State<LocalProfileComponentWidge
), ),
), ),
); );
},
),
);
} }
} }

View File

@ -0,0 +1,103 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/atomic_components/menu_button_item/menu_button_item_widget.dart';
import 'package:hub/components/atomic_components/menu_card_item/menu_card_item.dart';
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/shared/extensions/dialog_extensions.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
class MenuEvent {}
class MenuState {
final List<MenuEntry?> menuEntries;
final bool isGrid;
MenuState({this.menuEntries = const [], this.isGrid = false});
MenuState copyWith({List<MenuEntry?>? menuEntries, bool? isGrid}) {
return MenuState(
menuEntries: menuEntries ?? this.menuEntries,
isGrid: isGrid ?? this.isGrid,
);
}
}
class MenuBloc extends Bloc<MenuEvent, MenuState> {
final MenuView style;
final MenuItem item;
final bool expandable;
final List<Module> menuOptions;
MenuBloc({required this.style, required this.item, required this.expandable, required this.menuOptions}) : super(MenuState()) {
on<MenuEvent>((event, emit) async {
final entries = await generateMenuEntries();
emit(state.copyWith(menuEntries: entries));
});
}
Future<List<MenuEntry?>> generateMenuEntries() async {
List<MenuEntry?> entries = [];
Future<MenuEntry?> addMenuEntry(IconData icon, String text, Function() action) async {
entries.add(
item == MenuItem.button
? MenuButtonWidget(icon: icon, action: action, title: text)
: item == MenuItem.card
? MenuCardItem(icon: icon, action: action, title: text)
: item == MenuItem.tile
? MenuCardItem(icon: icon, action: action, title: text)
: null,
);
return null;
}
for (var opt in menuOptions) {
String? v = await LicenseHelper().g(opt.value);
log('Module: ${opt.value} - License: $v');
switch (v) {
case 'VISIVEL':
await addMenuEntry(opt.icon, opt.name, () async {
await nav(opt.route);
});
continue;
case 'DESABILITADO':
await addMenuEntry(opt.icon, opt.name, () async {
await DialogUnavailable.unavailableFeature(key.currentContext!);
});
continue;
case 'INVISIVEL':
continue;
default:
continue;
}
}
return entries;
}
Future nav(String link) async {
log('Opening: $link');
key.currentContext!.push(link, extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: false,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
});
}
Future<void> logout() async {
// Implement logout logic here
}
Future settings() async {
// Implement settings navigation logic here
}
Future about() async {
// Implement about navigation logic here
}
}

View File

@ -1,175 +0,0 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/atomic_components/menu_button_item/menu_button_item_widget.dart';
import 'package:hub/components/atomic_components/menu_card_item/menu_card_item.dart';
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
import 'package:hub/components/molecular_components/option_selection_modal/option_selection_modal_widget.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart';
import 'package:hub/components/organism_components/menu_list_view_component/menu_list_view_component_model.dart';
import 'package:hub/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_model.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/shared/extensions/dialog_extensions.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'package:hub/shared/services/authentication/authentication_service.dart';
import 'package:material_symbols_icons/symbols.dart';
import '/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart';
import 'menu_component_widget.dart' show MenuComponentWidget;
class MenuComponentModel extends FlutterFlowModel<MenuComponentWidget> {
final MenuView style;
final MenuItem item;
final bool expandable;
final List<Module> menuOptions;
MenuComponentModel(
{required this.style,
required this.item,
required this.expandable,
required this.menuOptions});
bool isGrid = false;
late MenuListViewComponentModel menuListViewComponentModel;
late MenuStaggeredViewComponentModel menuStaggeredViewComponentModel;
late VoidCallback safeSetState;
List<MenuEntry?> menuEntries = [];
@override
void initState(BuildContext context) {
menuListViewComponentModel =
createModel(context, () => MenuListViewComponentModel());
menuStaggeredViewComponentModel =
createModel(context, () => MenuStaggeredViewComponentModel());
}
@override
void dispose() {
menuListViewComponentModel.dispose();
menuStaggeredViewComponentModel.dispose();
}
Future<List<MenuEntry?>> generateMenuEntries(
BuildContext context, MenuItem item, List<Module> options) async {
List<MenuEntry?> entries = [];
Future<MenuEntry?> addMenuEntry(
IconData icon, String text, Function() action) async {
entries.add(
item == MenuItem.button
? MenuButtonWidget(
icon: icon,
action: action,
title: text,
safeSetState: safeSetState)
: item == MenuItem.card
? MenuCardItem(
icon: icon,
action: action,
title: text,
safeSetState: safeSetState)
: item == MenuItem.tile
? MenuCardItem(
icon: icon,
action: action,
title: text,
safeSetState: safeSetState)
: null,
);
return null;
}
for (var opt in options) {
String? v = await LicenseHelper().g(opt.value);
log('Module: ${opt.value} - License: $v');
switch (v) {
case 'VISIVEL':
await addMenuEntry(opt.icon, opt.name, () async {
await open(context, opt.route);
});
break;
case 'BLOQUEADO':
await addMenuEntry(opt.icon, opt.name, () async {
await DialogUnavailable.unavailableFeature(context);
});
break;
case 'INVISIVEL':
break;
default:
break;
}
safeSetState();
}
return entries;
}
Future open(BuildContext context, String link) async {
context.push(
link,
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: false,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
}
Future out(BuildContext context) async {
final String title = FFLocalizations.of(context).getVariableText(
ptText: 'Sair',
enText: 'Logout',
);
final String content = FFLocalizations.of(context).getVariableText(
ptText: 'Tem certeza que deseja sair?',
enText: 'Are you sure you want to logout?',
);
showAlertDialog(context, title, content,
() async => await AuthenticationService.signOut(context));
}
Future<void> Logout(BuildContext context) async {
final String title = FFLocalizations.of(context).getVariableText(
ptText: 'Sair',
enText: 'Logout',
);
final String content = FFLocalizations.of(context).getVariableText(
ptText: 'Tem certeza que deseja sair?',
enText: 'Are you sure you want to logout?',
);
showAlertDialog(context, title, content,
() async => await AuthenticationService.signOut(context));
}
Future settings(BuildContext context) async {
context.push(
'/preferencesSettings',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: false,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
}
Future about(BuildContext context) async {
context.push(
'/aboutProperty',
extra: <String, dynamic>{
kTransitionInfoKey: const TransitionInfo(
hasTransition: false,
transitionType: PageTransitionType.scale,
alignment: Alignment.bottomCenter,
),
},
);
}
}

View File

@ -1,79 +1,81 @@
import 'package:hub/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart';
import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hub/backend/schema/enums/enums.dart'; import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_bloc.dart';
import 'package:hub/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
import 'package:hub/shared/services/license/license_service.dart';
import '/components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart'; class MenuComponentWidget extends StatelessWidget {
import '/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart'; final MenuView style;
import '/flutter_flow/flutter_flow_util.dart'; final MenuItem item;
import 'menu_component_model.dart'; final bool expandable;
final List<Module> menuOptions;
export 'menu_component_model.dart'; const MenuComponentWidget({
super.key,
class MenuComponentWidget extends StatefulWidget { required this.style,
final MenuComponentModel model; required this.item,
const MenuComponentWidget({super.key, required this.model}); required this.expandable,
required this.menuOptions,
@override });
State<MenuComponentWidget> createState() => _MenuComponentWidgetState();
}
class _MenuComponentWidgetState extends State<MenuComponentWidget> {
@override
void setState(VoidCallback callback) {
super.setState(callback);
widget.model.onUpdate();
}
@override
void initState() {
super.initState();
widget.model.safeSetState = () => safeSetState(() {});
}
@override
void didChangeDependencies() async {
super.didChangeDependencies();
widget.model.menuEntries = await widget.model.generateMenuEntries(
context, widget.model.item, widget.model.menuOptions);
}
@override
void dispose() {
widget.model.maybeDispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Builder( return StreamBuilder<List<dynamic>>(
builder: (context) { stream: LicenseService().licenseStream,
if (widget.model.style == MenuView.list_grid) builder: (context, snapshot) {
return wrapWithModel( if (snapshot.connectionState == ConnectionState.waiting) {
model: widget.model.menuStaggeredViewComponentModel, return const Center(
updateCallback: () => setState(() {}), child: CircularProgressIndicator(),
updateOnChange: true, );
child: MenuStaggeredViewComponentWidget( } else if (snapshot.hasError) {
options: widget.model.menuEntries, return Center(
expandable: widget.model.expandable, child: Text('Error: ${snapshot.error}'),
item: widget.model.item, );
changeMenuStyle: () async {}, } else if (!snapshot.hasData || snapshot.data!.isEmpty) {
isGrid: widget.model.isGrid, return Center(
child: Padding(
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height / 10),
child: CircularProgressIndicator(
backgroundColor: FlutterFlowTheme.of(key.currentContext!).primaryBackground,
color: FlutterFlowTheme.of(key.currentContext!).primary),
), ),
); );
if (widget.model.style == MenuView.list) }
return wrapWithModel( return BlocProvider(
model: widget.model.menuListViewComponentModel, create: (context) => MenuBloc(
updateCallback: () => setState(() {}), style: style,
updateOnChange: true, item: item,
child: MenuListViewComponentWidget( expandable: expandable,
options: widget.model.menuEntries, menuOptions: menuOptions,
expandable: widget.model.expandable, )..add(MenuEvent()),
item: widget.model.item, child: BlocBuilder<MenuBloc, MenuState>(
builder: (context, state) {
if (style == MenuView.list_grid) {
return MenuStaggeredViewComponentWidget(
options: state.menuEntries,
expandable: expandable,
item: item,
changeMenuStyle: () async {}, changeMenuStyle: () async {},
), isGrid: state.isGrid,
); );
} else if (style == MenuView.list) {
return MenuListViewComponentWidget(
options: state.menuEntries,
expandable: expandable,
item: item,
changeMenuStyle: () async {},
);
}
return const SizedBox(); return const SizedBox();
}, },
),
);
},
); );
} }
} }

View File

@ -4,7 +4,6 @@ import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
class UpArrowLinkedLocalsComponentModel extends FlutterFlowModel<UpArrowLinkedLocalsComponentWidget> { class UpArrowLinkedLocalsComponentModel extends FlutterFlowModel<UpArrowLinkedLocalsComponentWidget> {
late final String devUUID; late final String devUUID;
late final String userUUID; late final String userUUID;

View File

@ -3,7 +3,6 @@ import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import 'access_notification_modal_template_component_widget.dart' show AccessNotificationModalTemplateComponentWidget; import 'access_notification_modal_template_component_widget.dart' show AccessNotificationModalTemplateComponentWidget;

View File

@ -6,7 +6,6 @@ import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import '/flutter_flow/flutter_flow_widgets.dart'; import '/flutter_flow/flutter_flow_widgets.dart';

View File

@ -7,7 +7,6 @@ import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
class ScheduleProvisionalVisitPageModel extends FlutterFlowModel<ScheduleProvisionalVisitPageWidget> { class ScheduleProvisionalVisitPageModel extends FlutterFlowModel<ScheduleProvisionalVisitPageWidget> {
String cliUUID = ''; String cliUUID = '';
String devUUID = ''; String devUUID = '';

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
import '/backend/api_requests/api_calls.dart'; import '/backend/api_requests/api_calls.dart';
import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_util.dart';
import 'view_visit_detail_widget.dart' show ViewVisitDetailWidget; import 'view_visit_detail_widget.dart' show ViewVisitDetailWidget;

View File

@ -5,7 +5,6 @@ import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
class VisitorSearchModalTemplateComponentModel extends FlutterFlowModel<VisitorSearchModalTemplateComponentWidget> { class VisitorSearchModalTemplateComponentModel extends FlutterFlowModel<VisitorSearchModalTemplateComponentWidget> {
late final String devUUID; late final String devUUID;
late final String userUUID; late final String userUUID;

View File

@ -11,7 +11,7 @@ import 'package:hub/pages/acess_history_page/acess_history_page_widget.dart';
import 'package:hub/pages/delivery_schedule_page/delivery_schedule_widget.dart'; import 'package:hub/pages/delivery_schedule_page/delivery_schedule_widget.dart';
import 'package:hub/pages/fast_pass_page/fast_pass_page_widget.dart'; import 'package:hub/pages/fast_pass_page/fast_pass_page_widget.dart';
import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart'; import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart';
import 'package:hub/pages/home_page/home_page_widget.dart'; import 'package:hub/pages/home_page/home_page.dart';
import 'package:hub/pages/liberation_history/liberation_history_widget.dart'; import 'package:hub/pages/liberation_history/liberation_history_widget.dart';
import 'package:hub/pages/message_history_page/message_history_page_widget.dart'; import 'package:hub/pages/message_history_page/message_history_page_widget.dart';
import 'package:hub/pages/package_order_page/package_order_page.dart'; import 'package:hub/pages/package_order_page/package_order_page.dart';
@ -24,6 +24,7 @@ import 'package:hub/pages/qr_code_page/qr_code_page_widget.dart';
import 'package:hub/pages/reception_page/reception_page_widget.dart'; import 'package:hub/pages/reception_page/reception_page_widget.dart';
import 'package:hub/pages/register_visitor_page/register_visitor_page_widget.dart'; import 'package:hub/pages/register_visitor_page/register_visitor_page_widget.dart';
import 'package:hub/pages/reservation_page/reservation_page_widget.dart'; import 'package:hub/pages/reservation_page/reservation_page_widget.dart';
import 'package:hub/pages/residents_on_the_property/residents_on_the_property_screen.dart';
import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart'; import 'package:hub/pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart';
import 'package:hub/pages/sign_in_page/sign_in_page_widget.dart'; import 'package:hub/pages/sign_in_page/sign_in_page_widget.dart';
import 'package:hub/pages/sign_up_page/sign_up_page_widget.dart'; import 'package:hub/pages/sign_up_page/sign_up_page_widget.dart';
@ -84,25 +85,13 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
builder: (context, _) { builder: (context, _) {
return FutureBuilder<Widget>( return FutureBuilder<Widget>(
future: () async { future: () async {
final bool isLogged = final bool isLogged = await StorageHelper().g(SecureStorageKey.isLogged.value) == 'true';
await StorageHelper().g(SecureStorageKey.isLogged.value) == final bool haveLocal = await StorageHelper().g(SecureStorageKey.haveLocal.value) == 'true';
'true'; final bool haveUserUUID = (await StorageHelper().g(KeychainStorageKey.userUUID.value))?.isNotEmpty ?? false;
final bool haveLocal = final bool haveDevUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value))?.isNotEmpty ?? false;
await StorageHelper().g(SecureStorageKey.haveLocal.value) ==
'true';
final bool haveUserUUID =
(await StorageHelper().g(KeychainStorageKey.userUUID.value))
?.isNotEmpty ??
false;
final bool haveDevUUID =
(await StorageHelper().g(KeychainStorageKey.devUUID.value))
?.isNotEmpty ??
false;
if (isLogged && haveDevUUID && haveUserUUID) { if (isLogged && haveDevUUID && haveUserUUID) {
return haveLocal return haveLocal ? const HomePageWidget() : const ReceptionPageWidget();
? const HomePageWidget()
: const ReceptionPageWidget();
} else { } else {
return const WelcomePageWidget(); return const WelcomePageWidget();
} }
@ -124,10 +113,8 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
name: 'forgotPassword', name: 'forgotPassword',
path: '/forgotPassword', path: '/forgotPassword',
builder: (context, params) { builder: (context, params) {
late final String email = late final String email = params.getParam('email', ParamType.String);
params.getParam('email', ParamType.String); late final String token = params.getParam('token', ParamType.String);
late final String token =
params.getParam('token', ParamType.String);
return ForgotPasswordScreen( return ForgotPasswordScreen(
key: UniqueKey(), key: UniqueKey(),
@ -135,100 +122,32 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
token: token, token: token,
); );
}), }),
FFRoute( FFRoute(name: 'homePage', path: '/homePage', builder: (context, params) => HomePageWidget(key: UniqueKey())),
name: 'homePage', FFRoute(name: 'petsOnThePropertyPage', path: '/petsOnThePropertyPage', builder: (context, params) => Scaffold(body: const PetsHistoryScreen(isApp: true))),
path: '/homePage', FFRoute(name: 'vehiclesOnThePropertyPage', path: '/vehiclesOnThePropertyPage', builder: (context, params) => const VehicleOnTheProperty()),
builder: (context, params) => HomePageWidget(key: UniqueKey())), FFRoute(name: 'receptionPage', path: '/receptionPage', builder: (context, params) => const ReceptionPageWidget()),
FFRoute( FFRoute(name: 'messageHistoryPage', path: '/messageHistoryPage', builder: (context, params) => const MessageHistoryPageWidget()),
name: 'petsOnThePropertyPage', FFRoute(name: 'registerVisitorPage', path: '/registerVisitorPage', builder: (context, params) => const RegisterVisitorPageWidget()),
path: '/petsOnThePropertyPage', FFRoute(name: 'scheduleCompleteVisitPage', path: '/scheduleCompleteVisitPage', builder: (context, params) => const ScheduleCompleteVisitPageWidget()),
builder: (context, params) => FFRoute(name: 'deliverySchedule', path: '/deliverySchedule', builder: (context, params) => const DeliverySchedule()),
Scaffold(body: const PetsHistoryScreen(isApp: true))), FFRoute(name: 'provisionalSchedule', path: '/provisionalSchedule', builder: (context, params) => const ProvisionalSchedule()),
FFRoute( FFRoute(name: 'fastPassPage', path: '/fastPassPage', builder: (context, params) => /*const*/ FastPassPageWidget()),
name: 'vehiclesOnThePropertyPage', FFRoute(name: 'preferencesSettings', path: '/preferencesSettings', builder: (context, params) => PreferencesPageWidget()),
path: '/vehiclesOnThePropertyPage', FFRoute(name: 'aboutProperty', path: '/aboutProperty', builder: (context, params) => AboutPropertyPage()),
builder: (context, params) => const VehicleOnTheProperty()), FFRoute(name: 'residentsOnThePropertyPage', path: '/residentsOnThePropertyPage', builder: (context, params) => ResidentsOnTheProperty()),
FFRoute( FFRoute(name: 'peopleOnThePropertyPage', path: '/peopleOnThePropertyPage', builder: (context, params) => PeopleOnThePropertyPage()),
name: 'receptionPage',
path: '/receptionPage',
builder: (context, params) => const ReceptionPageWidget()),
FFRoute(
name: 'messageHistoryPage',
path: '/messageHistoryPage',
builder: (context, params) => const MessageHistoryPageWidget()),
FFRoute(
name: 'registerVisitorPage',
path: '/registerVisitorPage',
builder: (context, params) => const RegisterVisitorPageWidget()),
FFRoute(
name: 'scheduleCompleteVisitPage',
path: '/scheduleCompleteVisitPage',
builder: (context, params) =>
const ScheduleCompleteVisitPageWidget()),
FFRoute(
name: 'deliverySchedule',
path: '/deliverySchedule',
builder: (context, params) => const DeliverySchedule()),
FFRoute(
name: 'provisionalSchedule',
path: '/provisionalSchedule',
builder: (context, params) => const ProvisionalSchedule()),
FFRoute(
name: 'fastPassPage',
path: '/fastPassPage',
builder: (context, params) => /*const*/ FastPassPageWidget()),
FFRoute(
name: 'preferencesSettings',
path: '/preferencesSettings',
builder: (context, params) => PreferencesPageWidget()),
FFRoute(
name: 'aboutProperty',
path: '/aboutProperty',
builder: (context, params) => AboutPropertyPage()),
FFRoute(
name: 'peopleOnThePropertyPage',
path: '/peopleOnThePropertyPage',
builder: (context, params) => PeopleOnThePropertyPage()),
FFRoute( FFRoute(
name: 'acessHistoryPage', name: 'acessHistoryPage',
path: '/acessHistoryPage', path: '/acessHistoryPage',
builder: (context, params) => AccessHistoryScreen(opt: const { builder: (context, params) => AccessHistoryScreen(opt: const {'personType': '.*', 'accessType': '.*', 'search': '.*'})),
'personType': '.*', FFRoute(name: 'liberationHistory', path: '/liberationHistory', builder: (context, params) => const LiberationHistoryWidget()),
'accessType': '.*', FFRoute(name: 'signInPage', path: '/signInPage', builder: (context, params) => const SignInPageWidget()),
'search': '.*' FFRoute(name: 'signUpPage', path: '/signUpPage', builder: (context, params) => const SignUpPageWidget()),
})), FFRoute(name: 'welcomePage', path: '/welcomePage', builder: (context, params) => const WelcomePageWidget()),
FFRoute( FFRoute(name: 'qrCodePage', path: '/qrCodePage', builder: (context, params) => const QrCodePageWidget()),
name: 'liberationHistory', FFRoute(name: 'preferencesPage', path: '/preferencesPage', builder: (context, params) => PreferencesPageWidget()),
path: '/liberationHistory', FFRoute(name: 'packageOrder', path: '/packageOrder', builder: (context, params) => const PackageOrderPage()),
builder: (context, params) => const LiberationHistoryWidget()), FFRoute(name: 'reservation', path: '/reservation', builder: (context, params) => ReservationPageWidget()),
FFRoute(
name: 'signInPage',
path: '/signInPage',
builder: (context, params) => const SignInPageWidget()),
FFRoute(
name: 'signUpPage',
path: '/signUpPage',
builder: (context, params) => const SignUpPageWidget()),
FFRoute(
name: 'welcomePage',
path: '/welcomePage',
builder: (context, params) => const WelcomePageWidget()),
FFRoute(
name: 'qrCodePage',
path: '/qrCodePage',
builder: (context, params) => const QrCodePageWidget()),
FFRoute(
name: 'preferencesPage',
path: '/preferencesPage',
builder: (context, params) => PreferencesPageWidget()),
FFRoute(
name: 'packageOrder',
path: '/packageOrder',
builder: (context, params) => const PackageOrderPage()),
FFRoute(
name: 'reservation',
path: '/reservation',
builder: (context, params) => ReservationPageWidget()),
FFRoute( FFRoute(
name: 'petsPage', name: 'petsPage',
path: '/petsPage', path: '/petsPage',
@ -244,9 +163,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
extension NavParamExtensions on Map<String, String?> { extension NavParamExtensions on Map<String, String?> {
Map<String, String> get withoutNulls => Map.fromEntries( Map<String, String> get withoutNulls => Map.fromEntries(
entries entries.where((e) => e.value != null).map((e) => MapEntry(e.key, e.value!)),
.where((e) => e.value != null)
.map((e) => MapEntry(e.key, e.value!)),
); );
} }
@ -260,23 +177,18 @@ extension NavigationExtensions on BuildContext {
} }
extension _GoRouterStateExtensions on GoRouterState { extension _GoRouterStateExtensions on GoRouterState {
Map<String, dynamic> get extraMap => Map<String, dynamic> get extraMap => extra != null ? extra as Map<String, dynamic> : {};
extra != null ? extra as Map<String, dynamic> : {};
Map<String, dynamic> get allParams => <String, dynamic>{} Map<String, dynamic> get allParams => <String, dynamic>{}
..addAll(pathParameters) ..addAll(pathParameters)
..addAll(uri.queryParameters) ..addAll(uri.queryParameters)
..addAll(extraMap); ..addAll(extraMap);
TransitionInfo get transitionInfo => extraMap.containsKey(kTransitionInfoKey) TransitionInfo get transitionInfo => extraMap.containsKey(kTransitionInfoKey) ? extraMap[kTransitionInfoKey] as TransitionInfo : TransitionInfo.appDefault();
? extraMap[kTransitionInfoKey] as TransitionInfo
: TransitionInfo.appDefault();
} }
extension GoRouterLocationExtension on GoRouter { extension GoRouterLocationExtension on GoRouter {
String getCurrentLocation() { String getCurrentLocation() {
final RouteMatch lastMatch = routerDelegate.currentConfiguration.last; final RouteMatch lastMatch = routerDelegate.currentConfiguration.last;
final RouteMatchList matchList = lastMatch is ImperativeRouteMatch final RouteMatchList matchList = lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration;
? lastMatch.matches
: routerDelegate.currentConfiguration;
return matchList.uri.toString(); return matchList.uri.toString();
} }
} }
@ -288,18 +200,13 @@ class FFParameters {
final Map<String, Future<dynamic> Function(String)> asyncParams; final Map<String, Future<dynamic> Function(String)> asyncParams;
Map<String, dynamic> futureParamValues = {}; Map<String, dynamic> futureParamValues = {};
bool get isEmpty => bool get isEmpty => state.allParams.isEmpty || (state.allParams.length == 1 && state.extraMap.containsKey(kTransitionInfoKey));
state.allParams.isEmpty || bool isAsyncParam(MapEntry<String, dynamic> param) => asyncParams.containsKey(param.key) && param.value is String;
(state.allParams.length == 1 &&
state.extraMap.containsKey(kTransitionInfoKey));
bool isAsyncParam(MapEntry<String, dynamic> param) =>
asyncParams.containsKey(param.key) && param.value is String;
bool get hasFutures => state.allParams.entries.any(isAsyncParam); bool get hasFutures => state.allParams.entries.any(isAsyncParam);
Future<bool> completeFutures() => Future.wait( Future<bool> completeFutures() => Future.wait(
state.allParams.entries.where(isAsyncParam).map( state.allParams.entries.where(isAsyncParam).map(
(param) async { (param) async {
final doc = await asyncParams[param.key]!(param.value) final doc = await asyncParams[param.key]!(param.value).onError((_, __) => null);
.onError((_, __) => null);
if (doc != null) { if (doc != null) {
futureParamValues[param.key] = doc; futureParamValues[param.key] = doc;
return true; return true;
@ -309,15 +216,12 @@ class FFParameters {
), ),
).onError((_, __) => [false]).then((v) => v.every((e) => e)); ).onError((_, __) => [false]).then((v) => v.every((e) => e));
dynamic getParam<T>(String paramName, ParamType type, dynamic getParam<T>(String paramName, ParamType type, {bool isList = false, StructBuilder<T>? structBuilder}) {
{bool isList = false, StructBuilder<T>? structBuilder}) { if (futureParamValues.containsKey(paramName)) return futureParamValues[paramName];
if (futureParamValues.containsKey(paramName))
return futureParamValues[paramName];
if (!state.allParams.containsKey(paramName)) return null; if (!state.allParams.containsKey(paramName)) return null;
final param = state.allParams[paramName]; final param = state.allParams[paramName];
if (param is! String) return param; if (param is! String) return param;
return deserializeParam<T>(param, type, isList, return deserializeParam<T>(param, type, isList, structBuilder: structBuilder);
structBuilder: structBuilder);
} }
} }
@ -357,16 +261,13 @@ class FFRoute {
key: state.pageKey, key: state.pageKey,
child: child, child: child,
transitionDuration: transitionInfo.duration, transitionDuration: transitionInfo.duration,
transitionsBuilder: transitionsBuilder: (context, animation, secondaryAnimation, child) => PageTransition(
(context, animation, secondaryAnimation, child) =>
PageTransition(
type: transitionInfo.transitionType, type: transitionInfo.transitionType,
duration: transitionInfo.duration, duration: transitionInfo.duration,
reverseDuration: transitionInfo.duration, reverseDuration: transitionInfo.duration,
alignment: transitionInfo.alignment, alignment: transitionInfo.alignment,
child: child, child: child,
).buildTransitions( ).buildTransitions(context, animation, secondaryAnimation, child),
context, animation, secondaryAnimation, child),
) )
: MaterialPage(key: state.pageKey, child: child); : MaterialPage(key: state.pageKey, child: child);
}, },
@ -387,8 +288,7 @@ class TransitionInfo {
final Duration duration; final Duration duration;
final Alignment? alignment; final Alignment? alignment;
static TransitionInfo appDefault() => static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false);
const TransitionInfo(hasTransition: false);
} }
class RootPageContext { class RootPageContext {
@ -400,11 +300,8 @@ class RootPageContext {
final rootPageContext = context.read<RootPageContext?>(); final rootPageContext = context.read<RootPageContext?>();
final isRootPage = rootPageContext?.isRootPage ?? false; final isRootPage = rootPageContext?.isRootPage ?? false;
final location = GoRouterState.of(context).uri.toString(); final location = GoRouterState.of(context).uri.toString();
return isRootPage && return isRootPage && location != '/' && location != rootPageContext?.errorRoute;
location != '/' &&
location != rootPageContext?.errorRoute;
} }
static Widget wrap(Widget child, {String? errorRoute}) => static Widget wrap(Widget child, {String? errorRoute}) => Provider.value(value: RootPageContext(true, errorRoute), child: child);
Provider.value(value: RootPageContext(true, errorRoute), child: child);
} }

View File

@ -1,12 +1,11 @@
export 'pages/acess_history_page/acess_history_page_widget.dart' show AccessHistoryScreen; export 'pages/acess_history_page/acess_history_page_widget.dart' show AccessHistoryScreen;
export 'pages/home_page/home_page_widget.dart' show HomePageWidget; export 'pages/home_page/home_page.dart' show HomePageWidget;
export 'pages/liberation_history/liberation_history_widget.dart' show LiberationHistoryWidget; export 'pages/liberation_history/liberation_history_widget.dart' show LiberationHistoryWidget;
export 'pages/people_on_the_property_page/people_on_the_property_page_widget.dart' show PeopleOnThePropertyPageWidget; export 'pages/people_on_the_property_page/people_on_the_property_page_widget.dart' show PeopleOnThePropertyPage;
export 'pages/preferences_settings_page/preferences_settings_widget.dart' show PreferencesPageWidget; export 'pages/preferences_settings_page/preferences_settings_widget.dart' show PreferencesPageWidget;
export 'pages/qr_code_page/qr_code_page_widget.dart' show QrCodePageWidget; export 'pages/qr_code_page/qr_code_page_widget.dart' show QrCodePageWidget;
export 'pages/register_visitor_page/register_visitor_page_widget.dart' show RegisterVisitorPageWidget; export 'pages/register_visitor_page/register_visitor_page_widget.dart' show RegisterVisitorPageWidget;
export 'pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart' export 'pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart' show ScheduleCompleteVisitPageWidget;
show ScheduleCompleteVisitPageWidget;
export 'pages/sign_in_page/sign_in_page_widget.dart' show SignInPageWidget; export 'pages/sign_in_page/sign_in_page_widget.dart' show SignInPageWidget;
export 'pages/sign_up_page/sign_up_page_widget.dart' show SignUpPageWidget; export 'pages/sign_up_page/sign_up_page_widget.dart' show SignUpPageWidget;
export 'pages/welcome_page/welcome_page_widget.dart' show WelcomePageWidget; export 'pages/welcome_page/welcome_page_widget.dart' show WelcomePageWidget;

View File

@ -62,8 +62,7 @@ class App extends StatefulWidget {
@override @override
State<App> createState() => _AppState(); State<App> createState() => _AppState();
static _AppState of(BuildContext context) => static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!;
context.findAncestorStateOfType<_AppState>()!;
} }
class _AppState extends State<App> with WidgetsBindingObserver { class _AppState extends State<App> with WidgetsBindingObserver {
@ -105,8 +104,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
}), }),
), ),
); );
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = const [
const [
FFLocalizationsDelegate(), FFLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
@ -148,8 +146,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
await StorageHelper().s(SecureStorageKey.haveLocal.value, true); await StorageHelper().s(SecureStorageKey.haveLocal.value, true);
log('onMessageOpenedApp'); log('onMessageOpenedApp');
} else { } else {
onMessageReceived(message.data, message.notification!.body, onMessageReceived(message.data, message.notification!.body, message.data['click_action']);
message.data['click_action']);
} }
}); });
FirebaseMessaging.instance.getInitialMessage().then((message) async { FirebaseMessaging.instance.getInitialMessage().then((message) async {

View File

@ -1,40 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_model.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/pages/about_property_page/about_property_screen.dart'; import 'package:hub/pages/about_property_page/about_property_screen.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
class AboutPropertyModel extends FlutterFlowModel<AboutPropertyPage> { class AboutPropertyModel extends FlutterFlowModel<AboutPropertyPage> {
dynamic item; dynamic item;
VoidCallback? safeSetState; VoidCallback? safeSetState;
late MenuComponentModel menuComponentModel;
Future<void> initAsync() async { Future<void> initAsync() async {
safeSetState?.call(); safeSetState?.call();
} }
@override @override
void initState(BuildContext context) { void initState(BuildContext context) {
menuComponentModel = createModel(
context,
() => MenuComponentModel(
expandable: true,
style: MenuView.list_grid,
item: MenuItem.button,
menuOptions: [
Module.pets,
Module.residents,
Module.openedVisits,
Module.vehicles,
Module.orders,
]));
initAsync(); initAsync();
} }

View File

@ -1,5 +1,6 @@
// ignore: must_be_immutable // ignore: must_be_immutable
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/atomic_components/shared_components_atoms/appbar.dart'; import 'package:hub/components/atomic_components/shared_components_atoms/appbar.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart'; import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
@ -7,6 +8,31 @@ 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_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart'; import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/about_property_page/about_property_model.dart'; import 'package:hub/pages/about_property_page/about_property_model.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
enum AboutPropertyModules {
residents,
vehicles,
openedVisits,
petsHistory,
}
extension AboutPropertyModulesExtension on AboutPropertyModules {
String get value {
switch (this) {
case AboutPropertyModules.openedVisits:
return 'FRE-HUB-OPENED-VISITS';
case AboutPropertyModules.vehicles:
return 'FRE-HUB-VEHICLES';
case AboutPropertyModules.residents:
return 'FRE-HUB-RESIDENTS';
case AboutPropertyModules.petsHistory:
return 'FRE-HUB-PETS-HISTORY';
default:
return '';
}
}
}
// ignore: must_be_immutable // ignore: must_be_immutable
class AboutPropertyPage extends StatefulWidget { class AboutPropertyPage extends StatefulWidget {
@ -43,15 +69,11 @@ class _AboutPropertyPageState extends State<AboutPropertyPage> with SingleTicker
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(appBar: _buildAppBar(context), backgroundColor: FlutterFlowTheme.of(context).primaryBackground, body: _buildBody(context));
appBar: _buildAppBar(context),
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
body: _buildBody(context));
} }
PreferredSizeWidget _buildAppBar(BuildContext context) { PreferredSizeWidget _buildAppBar(BuildContext context) {
final String title = final String title = FFLocalizations.of(context).getVariableText(ptText: "Sobre a Propriedade", enText: "About the Property");
FFLocalizations.of(context).getVariableText(ptText: "Sobre a Propriedade", enText: "About the Property");
return AppBarUtil( return AppBarUtil(
title: title, title: title,
onBackButtonPressed: () => context.pop(), onBackButtonPressed: () => context.pop(),
@ -62,14 +84,13 @@ class _AboutPropertyPageState extends State<AboutPropertyPage> with SingleTicker
return SingleChildScrollView( return SingleChildScrollView(
child: Container( child: Container(
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
child: wrapWithModel( child: MenuComponentWidget(expandable: true, style: MenuView.list_grid, item: MenuItem.button, menuOptions: [
model: _model.menuComponentModel, Module.pets,
updateCallback: () => setState(() {}), Module.residents,
child: Padding( Module.openedVisits,
padding: EdgeInsets.only(bottom: 40), Module.vehicles,
child: MenuComponentWidget(model: _model.menuComponentModel), Module.orders,
), ]),
),
), ),
); );
} }

View File

@ -7,7 +7,6 @@ import 'package:hub/pages/acess_history_page/acess_history_page_widget.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
class AcessHistoryPageModel extends FlutterFlowModel<AccessHistoryScreen> { class AcessHistoryPageModel extends FlutterFlowModel<AccessHistoryScreen> {
late final String devUUID; late final String devUUID;
late final String userUUID; late final String userUUID;

View File

@ -0,0 +1,25 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'index.dart';
class HomeBloc extends Bloc<HomeEvent, HomeState> {
HomeBloc() : super(HomeState()) {
on<HomeEvent>((event, emit) async {
final devUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value)) ?? '';
final userUUID = (await StorageHelper().g(KeychainStorageKey.userUUID.value)) ?? '';
final cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
final userName = (await StorageHelper().g(KeychainStorageKey.userName.value)) ?? '';
final userEmail = (await StorageHelper().g(SecureStorageKey.email.value)) ?? '';
emit(state.copyWith(
devUUID: devUUID,
userUUID: userUUID,
cliUUID: cliUUID,
userName: userName,
userEmail: userEmail,
));
});
}
}

View File

@ -0,0 +1 @@
class HomeEvent {}

View File

@ -1,15 +1,18 @@
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/organism_components/local_profile_component/local_profile_component_widget.dart'; import 'package:hub/components/organism_components/local_profile_component/local_profile_component_widget.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart'; import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.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_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/pages/home_page/home_page_model.dart'; import 'package:hub/shared/helpers/license/license_helper.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart'; import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart';
import 'index.dart';
class HomePageWidget extends StatefulWidget { class HomePageWidget extends StatefulWidget {
const HomePageWidget({super.key}); const HomePageWidget({super.key});
@ -18,43 +21,21 @@ class HomePageWidget extends StatefulWidget {
} }
class _HomePageWidgetState extends State<HomePageWidget> { class _HomePageWidgetState extends State<HomePageWidget> {
late HomePageModel _model;
final scaffoldKey = GlobalKey<ScaffoldState>(); final scaffoldKey = GlobalKey<ScaffoldState>();
late LocalProfileComponentWidget _localProfileComponentWidget;
_HomePageWidgetState() {
_localProfileComponentWidget = LocalProfileComponentWidget();
}
@override
void dispose() {
super.dispose();
_model.dispose();
}
@override
void initState() {
super.initState();
_model = createModel(context, () => HomePageModel(safeSetState: () => safeSetState(() {})));
_model.textController ??= TextEditingController();
_model.textFieldFocusNode ??= FocusNode();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
StorageHelper().context = context; return BlocProvider(
return Scaffold( create: (context) => HomeBloc()..add(HomeEvent()),
child: Scaffold(
key: scaffoldKey, key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
// drawer: buildDrawer(context),
drawerEnableOpenDragGesture: true, drawerEnableOpenDragGesture: true,
drawerDragStartBehavior: DragStartBehavior.start, drawerDragStartBehavior: DragStartBehavior.start,
drawer: CustomDrawer(model: _model), drawer: CustomDrawer(),
appBar: buildAppBar(context), appBar: buildAppBar(context),
body: buildPage(context), body: buildPage(context),
),
); );
} }
@ -139,25 +120,19 @@ class _HomePageWidgetState extends State<HomePageWidget> {
Widget buildBody() { Widget buildBody() {
return Container( return Container(
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
child: wrapWithModel(
model: _model.homeMenuComponentModel,
updateOnChange: true,
updateCallback: () => setState(() {}),
child: Padding( child: Padding(
padding: const EdgeInsets.only(bottom: 40), padding: const EdgeInsets.only(bottom: 40),
child: MenuComponentWidget( child: MenuComponentWidget(
model: _model.homeMenuComponentModel, expandable: true,
), style: MenuView.list_grid,
item: MenuItem.button,
menuOptions: Module.values.where((e) => e != Module.logout).toList(),
), ),
), ),
); );
} }
Widget buildLocal() { Widget buildLocal() {
return wrapWithModel( return LocalProfileComponentWidget();
model: _model.localComponentModel,
updateCallback: () => safeSetState(() {}),
child: _localProfileComponentWidget,
);
} }
} }

View File

@ -1,105 +0,0 @@
import 'package:flutter/material.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/molecular_components/menu_item/menu_item.dart';
import 'package:hub/components/organism_components/local_profile_component/local_profile_component_model.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_model.dart';
import 'package:hub/components/organism_components/message_well_component/message_well_component_model.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/pages/home_page/home_page_widget.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
class HomePageModel extends FlutterFlowModel<HomePageWidget> {
HomePageModel({required this.safeSetState});
late final VoidCallback safeSetState;
bool isGrid = false;
late final String devUUID;
late final String cliUUID;
late final String userUUID;
late final String userName;
late final String userEmail;
final unfocusNode = FocusNode();
FocusNode? textFieldFocusNode;
TextEditingController? textController;
String? Function(BuildContext, String?)? textControllerValidator;
late LocalProfileComponentModel localComponentModel;
late MenuComponentModel homeMenuComponentModel;
late MenuComponentModel drawerMenuComponentModel;
late MessageWellComponentModel messageWellComponentModel;
Future<void> _initVariable() async {
devUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value)) ?? '';
userUUID =
(await StorageHelper().g(KeychainStorageKey.userUUID.value)) ?? '';
cliUUID =
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
userName =
(await StorageHelper().g(KeychainStorageKey.userName.value)) ?? '';
userEmail = (await StorageHelper().g(SecureStorageKey.email.value)) ?? '';
}
@override
void initState(BuildContext context) {
_initVariable();
localComponentModel =
createModel(context, () => LocalProfileComponentModel());
homeMenuComponentModel = createModel(
context,
() => MenuComponentModel(
expandable: true,
style: MenuView.list_grid,
item: MenuItem.button,
menuOptions: [
Module.messages,
Module.access,
Module.pets,
Module.openedVisits,
Module.reservations,
Module.orders,
Module.providerSchedule,
Module.deliverySchedule,
Module.completeSchedule,
Module.fastPass,
Module.liberations,
Module.qrCode,
Module.settings,
]));
drawerMenuComponentModel = createModel(
context,
() => MenuComponentModel(
expandable: false,
style: MenuView.list,
item: MenuItem.tile,
menuOptions: [
Module.messages,
Module.access,
Module.pets,
Module.openedVisits,
Module.reservations,
Module.orders,
Module.providerSchedule,
Module.deliverySchedule,
Module.completeSchedule,
Module.fastPass,
Module.liberations,
Module.qrCode,
Module.logout,
]));
messageWellComponentModel =
createModel(context, () => MessageWellComponentModel());
}
@override
void dispose() {
unfocusNode.dispose();
textFieldFocusNode?.dispose();
textController?.dispose();
localComponentModel.dispose();
homeMenuComponentModel.dispose();
messageWellComponentModel.dispose();
}
}

View File

@ -0,0 +1,35 @@
class HomeState {
final bool isGrid;
final String devUUID;
final String cliUUID;
final String userUUID;
final String userName;
final String userEmail;
HomeState({
this.isGrid = false,
this.devUUID = '',
this.cliUUID = '',
this.userUUID = '',
this.userName = '',
this.userEmail = '',
});
HomeState copyWith({
bool? isGrid,
String? devUUID,
String? cliUUID,
String? userUUID,
String? userName,
String? userEmail,
}) {
return HomeState(
isGrid: isGrid ?? this.isGrid,
devUUID: devUUID ?? this.devUUID,
cliUUID: cliUUID ?? this.cliUUID,
userUUID: userUUID ?? this.userUUID,
userName: userName ?? this.userName,
userEmail: userEmail ?? this.userEmail,
);
}
}

View File

@ -0,0 +1,3 @@
export 'home_bloc.dart';
export 'home_events.dart';
export 'home_state.dart';

View File

@ -6,7 +6,6 @@ import 'package:hub/pages/liberation_history/liberation_history_widget.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
class LiberationHistoryModel extends FlutterFlowModel<LiberationHistoryWidget> { class LiberationHistoryModel extends FlutterFlowModel<LiberationHistoryWidget> {
late final String devUUID; late final String devUUID;
late final String userUUID; late final String userUUID;

View File

@ -1,28 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart'; import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/pages/people_on_the_property_page/people_on_the_property_page_widget.dart'; import 'package:hub/pages/people_on_the_property_page/people_on_the_property_page_widget.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
class PeopleOnThePropertyPageModel extends FlutterFlowModel<PeopleOnThePropertyPage> { class PeopleOnThePropertyPageModel extends FlutterFlowModel<PeopleOnThePropertyPage> {
PeopleOnThePropertyPageModel({this.onRefresh}); /// State fields for stateful widgets in this page.
late final VoidCallback? onRefresh;
final unfocusNode = FocusNode(); final unfocusNode = FocusNode();
late final String devUUID;
late final String cliUUID;
@override @override
void initState(BuildContext context) { void initState(BuildContext context) {}
initVariables();
}
void initVariables() async {
devUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value)) ?? '';
cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
onRefresh?.call();
}
@override @override
void dispose() { void dispose() {

View File

@ -1,135 +1,68 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_icon_button.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_theme.dart';
import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart';
import 'package:hub/flutter_flow/nav/nav.dart';
import 'package:hub/pages/people_on_the_property_page/people_on_the_property_page_model.dart'; import 'package:hub/pages/people_on_the_property_page/people_on_the_property_page_model.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:hub/shared/utils/limited_text_size.dart'; import '../../shared/utils/log_util.dart';
import 'package:hub/shared/utils/log_util.dart';
class PeopleOnThePropertyPage extends StatefulWidget { class PeopleOnThePropertyPage extends StatefulWidget {
const PeopleOnThePropertyPage({super.key}); const PeopleOnThePropertyPage({super.key});
@override @override
_PeopleOnThePropertyPageState createState() => _PeopleOnThePropertyPageState(); State<PeopleOnThePropertyPage> createState() => _PeopleOnThePropertyPageState();
} }
class _PeopleOnThePropertyPageState extends State<PeopleOnThePropertyPage> with TickerProviderStateMixin { class _PeopleOnThePropertyPageState extends State<PeopleOnThePropertyPage> {
late ScrollController _scrollController; late PeopleOnThePropertyPageModel _model;
int _pageNumber = 1; final scaffoldKey = GlobalKey<ScaffoldState>();
bool _hasData = false;
bool _loading = false;
int count = 0;
late final PeopleOnThePropertyPageModel model;
late Future<void> _future;
List<dynamic> _wrap = [];
@override @override
void initState() { void initState() {
super.initState(); super.initState();
model = createModel(context, () => PeopleOnThePropertyPageModel(onRefresh: () => safeSetState(() {}))); _model = createModel(context, () => PeopleOnThePropertyPageModel());
_future = _fetchVisits();
_scrollController = ScrollController()
..addListener(() {
if (_scrollController.position.atEdge && _scrollController.position.pixels != 0) {
_loadMore();
}
});
} }
@override @override
void dispose() { void dispose() {
_scrollController.dispose(); _model.dispose();
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
late final limitedHeaderTextSize = LimitedFontSizeUtil.getHeaderFontSize(context);
return Scaffold( return Scaffold(
appBar: _appBar(context), key: scaffoldKey,
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
body: Column( appBar: AppBar(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (_hasData == false && _pageNumber <= 1 && _loading == false)
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
Center(
child: Text(
FFLocalizations.of(context).getVariableText(
ptText: "Nenhum morador encontrado!",
enText: "No residents found!",
),
style: TextStyle(
fontFamily: 'Nunito',
fontSize: limitedHeaderTextSize,
),
),
)
],
),
)
else if (_hasData == true || _pageNumber >= 1)
Expanded(
child: FutureBuilder<void>(
future: _future,
builder: (context, snapshot) {
return ListView.builder(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
controller: _scrollController,
itemCount: _wrap.length + 1,
itemBuilder: (context, index) {
if (index == 0) {
// Add your item here
return Padding(
padding: const EdgeInsets.only(right: 30, top: 10),
child: Text(
'',
textAlign: TextAlign.right,
),
);
} else {
final item = _wrap[index - 1];
return _item(context, item);
}
});
},
)),
if (_hasData == true && _loading == true)
Container(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
FlutterFlowTheme.of(context).primary,
),
),
),
)
].addToStart(const SizedBox(height: 0)),
),
);
}
PreferredSizeWidget _appBar(BuildContext context) {
return AppBar(
backgroundColor: FlutterFlowTheme.of(context).primaryBackground, backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
title: Text(FFLocalizations.of(context).getVariableText(ptText: 'Moradores', enText: 'Residents'), forceMaterialTransparency: true,
leading: FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30.0,
borderWidth: 1.0,
buttonSize: 60.0,
icon: Icon(
Icons.keyboard_arrow_left,
color: FlutterFlowTheme.of(context).primaryText,
size: 30.0,
),
onPressed: () async {
context.pop();
},
),
title: Text(
FFLocalizations.of(context).getText(
'nsu13r5d' /* Pessoas na Propriedade */,
),
style: FlutterFlowTheme.of(context).headlineMedium.override( style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: 'Nunito', fontFamily: 'Nunito',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
@ -137,114 +70,103 @@ class _PeopleOnThePropertyPageState extends State<PeopleOnThePropertyPage> with
letterSpacing: 0.0, letterSpacing: 0.0,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'),
)), ),
leading: _backButton(context, FlutterFlowTheme.of(context)), ),
actions: const [],
centerTitle: true, centerTitle: true,
elevation: 0.0, elevation: 0.0,
actions: [],
);
}
Widget _backButton(BuildContext context, FlutterFlowTheme theme) {
return FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30.0,
borderWidth: 1.0,
buttonSize: 60.0,
icon: Icon(
Icons.keyboard_arrow_left,
color: theme.primaryText,
size: 30.0,
), ),
onPressed: () => Navigator.of(context).pop(), body: SafeArea(
); top: true,
} child: FutureBuilder<ApiCallResponse>(
future: PhpGroup.getPessoasLocalCall.call(),
Future<ApiCallResponse?> _fetchVisits() async { builder: (context, snapshot) {
try { // Customize what your widget looks like when it's loading.
setState(() => _loading = true); if (!snapshot.hasData) {
return Center(
var response = await PhpGroup.getResidentsByProperty.call(_pageNumber.toString()); child: SizedBox(
width: 50.0,
final List<dynamic> residents = response.jsonBody['residents'] ?? []; height: 50.0,
safeSetState(() => count = response.jsonBody['total_rows'] ?? 0); child: SpinKitCircle(
color: FlutterFlowTheme.of(context).primary,
if (residents.isNotEmpty) { size: 50.0,
setState(() {
_wrap.addAll(residents);
_hasData = true;
_loading = false;
});
return response;
}
_showNoMoreDataSnackBar(context);
setState(() {
_hasData = false;
_loading = false;
});
return null;
} catch (e, s) {
DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed("proccessRequest.php", "", "Consulta de moradores", e, s);
setState(() {
_hasData = false;
_loading = false;
});
}
return null;
}
void _loadMore() {
if (_hasData == true) {
_pageNumber++;
_future = _fetchVisits();
}
}
void _showNoMoreDataSnackBar(BuildContext context) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
FFLocalizations.of(context).getVariableText(
ptText: "Não há mais dados.",
enText: "No more data.",
), ),
style: TextStyle(
color: Colors.white,
fontSize: LimitedFontSizeUtil.getBodyFontSize(context),
),
),
duration: const Duration(seconds: 3),
backgroundColor: FlutterFlowTheme.of(context).primary,
), ),
); );
} }
Widget _item(BuildContext context, dynamic uItem) { if (snapshot.hasError || snapshot.data?.exception != null) {
return CardItemTemplateComponentWidget( if (snapshot.error != null && snapshot.stackTrace != null) {
imagePath: LogUtil.requestAPIFailed('getPessoasLocal.php', "", 'Busca Pessoas no Local', snapshot.error, snapshot.stackTrace!);
'https://freaccess.com.br/freaccess/getImage.php?devUUID=${model.devUUID}&cliID=${model.cliUUID}&atividade=getFoto&Documento=${uItem['documento']}&tipo=Z', }
labelsHashMap: {
'${FFLocalizations.of(context).getVariableText(ptText: "Nome", enText: "Name")}:': uItem['nome'] ?? '', return Center(
//statusweb child: SizedBox(
'${FFLocalizations.of(context).getVariableText(ptText: "Possui App", enText: "Has App")}:': width: double.infinity,
uItem['statusweb'] == "A" height: 100,
? FFLocalizations.of(context).getVariableText( child: Text(
ptText: 'Sim', FFLocalizations.of(context).getVariableText(ptText: "Pessoas não encontradas", enText: "Persons not found"),
enText: 'Yes', textAlign: TextAlign.center,
),
),
);
}
final columnGetPessoasLocalResponse = snapshot.data!;
final getPoepleProperty = PhpGroup.getPessoasLocalCall
.pessoas(
columnGetPessoasLocalResponse.jsonBody,
) )
: FFLocalizations.of(context).getVariableText( ?.toList() ??
ptText: 'Não', [];
enText: 'No',
return ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: getPoepleProperty.length,
itemBuilder: (context, index) {
final getPoeplePropertyItem = getPoepleProperty[index];
return Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(4.0),
child: Container(
width: 50.0,
height: 50.0,
clipBehavior: Clip.antiAlias,
decoration: const BoxDecoration(
shape: BoxShape.circle,
), ),
child: CachedNetworkImage(
fadeInDuration: const Duration(milliseconds: 500),
fadeOutDuration: const Duration(milliseconds: 500),
imageUrl:
'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg',
fit: BoxFit.cover,
),
),
),
Text(
getJsonField(
getPoeplePropertyItem,
r'''$.USU_NOME''',
).toString(),
style: FlutterFlowTheme.of(context).bodyMedium.override(
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
fontSize: 14.0,
letterSpacing: 0.0,
useGoogleFonts: GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily),
),
),
].divide(const SizedBox(width: 20.0)).addToStart(const SizedBox(width: 40.0)),
);
}, },
statusHashMap: [], );
onTapCardItemAction: () async {}, },
),
),
); );
} }
} }

View File

@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
import 'package:hub/flutter_flow/flutter_flow_model.dart';
import 'package:hub/pages/residents_on_the_property/residents_on_the_property_screen.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
class ResidentsOnThePropertyModel extends FlutterFlowModel<ResidentsOnTheProperty> {
ResidentsOnThePropertyModel({this.onRefresh});
late final VoidCallback? onRefresh;
final unfocusNode = FocusNode();
late final String devUUID;
late final String cliUUID;
@override
void initState(BuildContext context) {
initVariables();
}
void initVariables() async {
devUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value)) ?? '';
cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
onRefresh?.call();
}
@override
void dispose() {
unfocusNode.dispose();
}
}

View File

@ -0,0 +1,248 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_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/pages/residents_on_the_property/residents_on_the_property_model.dart';
import 'package:hub/shared/utils/dialog_util.dart';
import 'package:hub/shared/utils/limited_text_size.dart';
import 'package:hub/shared/utils/log_util.dart';
class ResidentsOnTheProperty extends StatefulWidget {
const ResidentsOnTheProperty({super.key});
@override
_ResidentsOnThePropertyState createState() => _ResidentsOnThePropertyState();
}
class _ResidentsOnThePropertyState extends State<ResidentsOnTheProperty> with TickerProviderStateMixin {
late ScrollController _scrollController;
int _pageNumber = 1;
bool _hasData = false;
bool _loading = false;
int count = 0;
late final ResidentsOnThePropertyModel model;
late Future<void> _future;
List<dynamic> _wrap = [];
@override
void initState() {
super.initState();
model = createModel(context, () => ResidentsOnThePropertyModel(onRefresh: () => safeSetState(() {})));
_future = _fetchVisits();
_scrollController = ScrollController()
..addListener(() {
if (_scrollController.position.atEdge && _scrollController.position.pixels != 0) {
_loadMore();
}
});
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
late final limitedHeaderTextSize = LimitedFontSizeUtil.getHeaderFontSize(context);
return Scaffold(
appBar: _appBar(context),
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
body: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: [
if (_hasData == false && _pageNumber <= 1 && _loading == false)
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
Center(
child: Text(
FFLocalizations.of(context).getVariableText(
ptText: "Nenhum morador encontrado!",
enText: "No residents found!",
),
style: TextStyle(
fontFamily: 'Nunito',
fontSize: limitedHeaderTextSize,
),
),
)
],
),
)
else if (_hasData == true || _pageNumber >= 1)
Expanded(
child: FutureBuilder<void>(
future: _future,
builder: (context, snapshot) {
return ListView.builder(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
controller: _scrollController,
itemCount: _wrap.length + 1,
itemBuilder: (context, index) {
if (index == 0) {
// Add your item here
return Padding(
padding: const EdgeInsets.only(right: 30, top: 10),
child: Text(
'',
textAlign: TextAlign.right,
),
);
} else {
final item = _wrap[index - 1];
return _item(context, item);
}
});
},
)),
if (_hasData == true && _loading == true)
Container(
padding: const EdgeInsets.only(top: 15, bottom: 15),
child: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
FlutterFlowTheme.of(context).primary,
),
),
),
)
].addToStart(const SizedBox(height: 0)),
),
);
}
PreferredSizeWidget _appBar(BuildContext context) {
return AppBar(
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
automaticallyImplyLeading: false,
title: Text(FFLocalizations.of(context).getVariableText(ptText: 'Moradores', enText: 'Residents'),
style: FlutterFlowTheme.of(context).headlineMedium.override(
fontFamily: 'Nunito',
color: FlutterFlowTheme.of(context).primaryText,
fontSize: 15.0,
letterSpacing: 0.0,
fontWeight: FontWeight.bold,
useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'),
)),
leading: _backButton(context, FlutterFlowTheme.of(context)),
centerTitle: true,
elevation: 0.0,
actions: [],
);
}
Widget _backButton(BuildContext context, FlutterFlowTheme theme) {
return FlutterFlowIconButton(
borderColor: Colors.transparent,
borderRadius: 30.0,
borderWidth: 1.0,
buttonSize: 60.0,
icon: Icon(
Icons.keyboard_arrow_left,
color: theme.primaryText,
size: 30.0,
),
onPressed: () => Navigator.of(context).pop(),
);
}
Future<ApiCallResponse?> _fetchVisits() async {
try {
setState(() => _loading = true);
var response = await PhpGroup.getResidentsByProperty.call(_pageNumber.toString());
final List<dynamic> residents = response.jsonBody['residents'] ?? [];
safeSetState(() => count = response.jsonBody['total_rows'] ?? 0);
if (residents.isNotEmpty) {
setState(() {
_wrap.addAll(residents);
_hasData = true;
_loading = false;
});
return response;
}
_showNoMoreDataSnackBar(context);
setState(() {
_hasData = false;
_loading = false;
});
return null;
} catch (e, s) {
DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed("proccessRequest.php", "", "Consulta de moradores", e, s);
setState(() {
_hasData = false;
_loading = false;
});
}
return null;
}
void _loadMore() {
if (_hasData == true) {
_pageNumber++;
_future = _fetchVisits();
}
}
void _showNoMoreDataSnackBar(BuildContext context) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
FFLocalizations.of(context).getVariableText(
ptText: "Não há mais dados.",
enText: "No more data.",
),
style: TextStyle(
color: Colors.white,
fontSize: LimitedFontSizeUtil.getBodyFontSize(context),
),
),
duration: const Duration(seconds: 3),
backgroundColor: FlutterFlowTheme.of(context).primary,
),
);
}
Widget _item(BuildContext context, dynamic uItem) {
return CardItemTemplateComponentWidget(
imagePath: 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${model.devUUID}&cliID=${model.cliUUID}&atividade=getFoto&Documento=${uItem['documento']}&tipo=Z',
labelsHashMap: {
'${FFLocalizations.of(context).getVariableText(ptText: "Nome", enText: "Name")}:': uItem['nome'] ?? '',
//statusweb
'${FFLocalizations.of(context).getVariableText(ptText: "Possui App", enText: "Has App")}:': uItem['statusweb'] == "A"
? FFLocalizations.of(context).getVariableText(
ptText: 'Sim',
enText: 'Yes',
)
: FFLocalizations.of(context).getVariableText(
ptText: 'Não',
enText: 'No',
),
},
statusHashMap: [],
onTapCardItemAction: () async {},
);
}
}

View File

@ -0,0 +1,11 @@
extension StringNullableExtensions on String? {
bool toBoolean() {
return this!.toLowerCase() == 'true';
}
}
extension StringExtensions on String {
bool toBoolean() {
return this.toLowerCase() == 'true';
}
}

View File

@ -32,7 +32,7 @@ class DatabaseStorage {
onUpgrade: _onUpgrade, onUpgrade: _onUpgrade,
onDowngrade: _onDowngrade, onDowngrade: _onDowngrade,
); );
await LicenseService.setupLicense(database); await LicenseService().setupLicense(database);
isInitialized = true; isInitialized = true;
} }
@ -42,14 +42,12 @@ class DatabaseStorage {
await database.execute(LicenseHelper.createTableQuery); await database.execute(LicenseHelper.createTableQuery);
} }
Future<void> _onUpgrade( Future<void> _onUpgrade(Database database, int oldVersion, int newVersion) async {
Database database, int oldVersion, int newVersion) async {
log('Upgrading database from version $oldVersion to $newVersion...'); log('Upgrading database from version $oldVersion to $newVersion...');
if (oldVersion < 2) { if (oldVersion < 2) {
await database.execute(LicenseHelper.createTableQuery); await database.execute(LicenseHelper.createTableQuery);
} }
} }
Future<void> _onDowngrade( Future<void> _onDowngrade(Database database, int oldVersion, int newVersion) async {}
Database database, int oldVersion, int newVersion) async {}
} }

View File

@ -10,6 +10,39 @@ enum InactiveModuleKey {
residents, residents,
vehicles, vehicles,
openedVisits, openedVisits,
petsHistory,
}
extension InactiveModuleKeyExtension on InactiveModuleKey {
String get value {
switch (this) {
case InactiveModuleKey.openedVisits:
return 'FRE-HUB-OPENED-VISITS';
case InactiveModuleKey.vehicles:
return 'FRE-HUB-VEHICLES';
case InactiveModuleKey.residents:
return 'FRE-HUB-RESIDENTS';
case InactiveModuleKey.petsHistory:
return 'FRE-HUB-PETS-HISTORY';
default:
return '';
}
}
}
enum DisabledModuleKey {
fastPass,
}
extension DisabledModuleKeyExtension on DisabledModuleKey {
String get value {
switch (this) {
case DisabledModuleKey.fastPass:
return 'FRE-HUB-FASTPASS';
default:
return '';
}
}
} }
enum ActiveModuleKey { enum ActiveModuleKey {
@ -17,27 +50,16 @@ enum ActiveModuleKey {
liberations, liberations,
reservations, reservations,
access, access,
pets,
orders, orders,
completeSchedule, completeSchedule,
providerSchedule, providerSchedule,
deliverySchedule, deliverySchedule,
fastPass,
qrCode, qrCode,
} visitors,
peopleOnTheProperty,
extension InactiveModuleKeyExtension on InactiveModuleKey { settings,
String get value { logout,
switch (this) {
case InactiveModuleKey.residents:
return 'FRE-HUB-RESIDENTS';
case InactiveModuleKey.vehicles:
return 'FRE-HUB-VEHICLES';
case InactiveModuleKey.openedVisits:
return 'FRE-HUB-OPENED-VISITS';
default:
return '';
}
}
} }
extension ActiveModuleKeyExtension on ActiveModuleKey { extension ActiveModuleKeyExtension on ActiveModuleKey {
@ -51,6 +73,8 @@ extension ActiveModuleKeyExtension on ActiveModuleKey {
return 'FRE-HUB-RESERVATIONS'; return 'FRE-HUB-RESERVATIONS';
case ActiveModuleKey.access: case ActiveModuleKey.access:
return 'FRE-HUB-ACCESS'; return 'FRE-HUB-ACCESS';
case ActiveModuleKey.pets:
return 'FRE-HUB-PETS';
case ActiveModuleKey.orders: case ActiveModuleKey.orders:
return 'FRE-HUB-ORDERS'; return 'FRE-HUB-ORDERS';
case ActiveModuleKey.completeSchedule: case ActiveModuleKey.completeSchedule:
@ -59,10 +83,12 @@ extension ActiveModuleKeyExtension on ActiveModuleKey {
return 'FRE-HUB-AGE-PROV-PRESTADOR'; return 'FRE-HUB-AGE-PROV-PRESTADOR';
case ActiveModuleKey.deliverySchedule: case ActiveModuleKey.deliverySchedule:
return 'FRE-HUB-AGE-PROV-DELIVERY'; return 'FRE-HUB-AGE-PROV-DELIVERY';
case ActiveModuleKey.fastPass: case ActiveModuleKey.visitors:
return 'FRE-HUB-FASTPASS'; return 'FRE-HUB-VISITORS';
case ActiveModuleKey.qrCode: case ActiveModuleKey.qrCode:
return 'FRE-HUB-QRCODE'; return 'FRE-HUB-QRCODE';
case ActiveModuleKey.peopleOnTheProperty:
return 'FRE-HUB-PEOPLE';
default: default:
return ''; return '';
} }
@ -70,20 +96,24 @@ extension ActiveModuleKeyExtension on ActiveModuleKey {
} }
enum Module { enum Module {
messages,
liberations,
reservations,
access,
openedVisits,
vehicles,
residents,
pets,
orders,
completeSchedule,
providerSchedule, providerSchedule,
deliverySchedule, deliverySchedule,
fastPass, fastPass,
completeSchedule,
orders,
reservations,
visitors,
vehicles,
residents,
openedVisits,
qrCode, qrCode,
pets,
access,
liberations,
messages,
aboutProperty,
petsHistory,
peopleOnTheProperty,
settings, settings,
logout, logout,
} }
@ -115,10 +145,18 @@ extension LicenseKeyExtension on Module {
return 'FRE-HUB-AGE-PROV-PRESTADOR'; return 'FRE-HUB-AGE-PROV-PRESTADOR';
case Module.deliverySchedule: case Module.deliverySchedule:
return 'FRE-HUB-AGE-PROV-DELIVERY'; return 'FRE-HUB-AGE-PROV-DELIVERY';
case Module.aboutProperty:
return 'FRE-HUB-PROPERTY';
case Module.fastPass: case Module.fastPass:
return 'FRE-HUB-FASTPASS'; return 'FRE-HUB-FASTPASS';
case Module.visitors:
return 'FRE-HUB-VISITORS';
case Module.qrCode: case Module.qrCode:
return 'FRE-HUB-QRCODE'; return 'FRE-HUB-QRCODE';
case Module.peopleOnTheProperty:
return 'FRE-HUB-PEOPLE';
case Module.petsHistory:
return 'FRE-HUB-PETS-HISTORY';
default: default:
return ''; return '';
} }
@ -128,13 +166,13 @@ extension LicenseKeyExtension on Module {
switch (this) { switch (this) {
case Module.messages: case Module.messages:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Mensagens', ptText: 'Consultar Mensagens',
enText: 'Messages', enText: 'Messages History',
); );
case Module.liberations: case Module.liberations:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Liberar', ptText: 'Consultar Liberações',
enText: 'Liberations', enText: 'Liberations History',
); );
case Module.reservations: case Module.reservations:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
@ -143,12 +181,12 @@ extension LicenseKeyExtension on Module {
); );
case Module.access: case Module.access:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Acessos', ptText: 'Consultar Acessos',
enText: 'Access', enText: 'Access History',
); );
case Module.openedVisits: case Module.openedVisits:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Visitas Abertas', ptText: 'Visitas em Aberto',
enText: 'Opened Visits', enText: 'Opened Visits',
); );
case Module.vehicles: case Module.vehicles:
@ -166,10 +204,20 @@ extension LicenseKeyExtension on Module {
ptText: 'Pets', ptText: 'Pets',
enText: 'Pets', enText: 'Pets',
); );
case Module.petsHistory:
return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Pets',
enText: 'Pets',
);
case Module.peopleOnTheProperty:
return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Pessoas na Propriedade',
enText: 'People on the Property',
);
case Module.orders: case Module.orders:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Encomendas', ptText: 'Minhas Encomendas',
enText: 'Orders', enText: 'My Orders',
); );
case Module.completeSchedule: case Module.completeSchedule:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
@ -193,8 +241,18 @@ extension LicenseKeyExtension on Module {
); );
case Module.qrCode: case Module.qrCode:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'QR Code', ptText: 'QRCode de Acesso',
enText: 'QR Code', enText: 'Access QRCode',
);
case Module.visitors:
return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Cadastrar Visitantes',
enText: 'Register Visitors',
);
case Module.aboutProperty:
return FFLocalizations.of(key.currentContext!).getVariableText(
ptText: 'Sobre a Propriedade',
enText: 'About the Property',
); );
case Module.settings: case Module.settings:
return FFLocalizations.of(key.currentContext!).getVariableText( return FFLocalizations.of(key.currentContext!).getVariableText(
@ -212,33 +270,41 @@ extension LicenseKeyExtension on Module {
IconData get icon { IconData get icon {
switch (this) { switch (this) {
case Module.messages: case Module.messages:
return Icons.message; return Icons.chat_outlined;
case Module.liberations: case Module.liberations:
return Icons.lock_open; return Icons.how_to_reg_outlined;
case Module.reservations: case Module.reservations:
return Icons.calendar_today; return Icons.event_available;
case Module.access: case Module.access:
return Icons.access_time; return Icons.transfer_within_a_station_outlined;
case Module.openedVisits: case Module.openedVisits:
return Icons.people; return Icons.perm_contact_calendar;
case Module.vehicles: case Module.vehicles:
return Icons.directions_car; return Icons.directions_car;
case Module.residents: case Module.residents:
return Icons.person; return Icons.groups;
case Module.pets: case Module.pets:
return Icons.pets; return Icons.pets;
case Module.petsHistory:
return Icons.pets;
case Module.peopleOnTheProperty:
return Icons.groups;
case Module.orders: case Module.orders:
return Icons.shopping_cart; return Icons.inventory_2_outlined;
case Module.completeSchedule: case Module.completeSchedule:
return Icons.schedule; return Icons.event;
case Module.providerSchedule: case Module.providerSchedule:
return Icons.engineering_outlined; return Icons.engineering_outlined;
case Module.deliverySchedule: case Module.deliverySchedule:
return Icons.delivery_dining; return Icons.sports_motorsports_outlined;
case Module.fastPass: case Module.fastPass:
return Icons.fastfood; return Icons.attach_email_outlined;
case Module.qrCode: case Module.qrCode:
return Icons.qr_code; return Icons.qr_code;
case Module.visitors:
return Icons.person_add_alt_1_outlined;
case Module.aboutProperty:
return Icons.home;
case Module.settings: case Module.settings:
return Icons.settings; return Icons.settings;
case Module.logout: case Module.logout:
@ -257,23 +323,37 @@ extension LicenseKeyExtension on Module {
case Module.access: case Module.access:
return '/acessHistoryPage'; return '/acessHistoryPage';
case Module.openedVisits: case Module.openedVisits:
return '/visitsOnTheProperty'; return '/visitsOnThePropertyPage';
case Module.vehicles: case Module.vehicles:
return '/vehiclesOnThePropertyPage'; return '/vehiclesOnThePropertyPage';
case Module.residents: case Module.residents:
return '/peopleOnThePropertyPage'; return '/residentsOnThePropertyPage';
case Module.pets: case Module.pets:
return '/petsPage'; return '/petsPage';
case Module.petsHistory:
return '/petsHistoryPage';
case Module.peopleOnTheProperty:
return '/peopleOnThePropertyPage';
case Module.orders: case Module.orders:
return '/packageOrder'; return '/packageOrder';
case Module.completeSchedule: case Module.completeSchedule:
return '/scheduleCompleteVisitPage'; return '/scheduleCompleteVisitPage';
case Module.providerSchedule: case Module.providerSchedule:
return '/provisionalSchedule'; return '/provisionalSchedule';
case Module.aboutProperty:
return '/aboutProperty';
case Module.deliverySchedule: case Module.deliverySchedule:
return '/deliverySchedule'; return '/deliverySchedule';
case Module.fastPass: case Module.fastPass:
return '/fastPassPage'; return '/fastPassPage';
case Module.qrCode:
return '/qrCodePage';
case Module.visitors:
return '/registerVisitorPage';
case Module.settings:
return '/preferencesSettings';
case Module.logout:
return '/WelcomePage';
default: default:
return ''; return '';
} }
@ -303,27 +383,19 @@ class LicenseHelper {
await DatabaseStorage.instance.init(); await DatabaseStorage.instance.init();
} }
static Future<void> insertLicenseFoo( Future<void> setByKey(final List<String> key, final String display) async {
final List<String> key, final String display) async {
for (var element in key) { for (var element in key) {
log('insertLicenseFoo($element, $display)'); await s(element, {
DatabaseStorage.database.insert(
tableLicense,
{
'key': element,
'display': display, 'display': display,
'expirationDate': '', 'expirationDate': '',
'startDate': '', 'startDate': '',
'quantity': '', 'quantity': '',
}, });
conflictAlgorithm: ConflictAlgorithm.ignore,
);
} }
} }
Future<String?> g(String key) async { Future<String?> g(String key) async {
var response = await DatabaseStorage.database.query(tableLicense, var response = await DatabaseStorage.database.query(tableLicense, where: 'key = ?', whereArgs: [key], columns: ['display']);
where: 'key = ?', whereArgs: [key], columns: ['display']);
if (response.isEmpty) { if (response.isEmpty) {
return null; return null;
} }
@ -347,8 +419,7 @@ class LicenseHelper {
} }
Future<void> d(String key) async { Future<void> d(String key) async {
await DatabaseStorage.database await DatabaseStorage.database.delete(tableLicense, where: 'key = ?', whereArgs: [key]);
.delete(tableLicense, where: 'key = ?', whereArgs: [key]);
} }
Future<void> c() async { Future<void> c() async {

View File

@ -144,4 +144,3 @@ extension KeychainStorageKeyExtension on KeychainStorageKey {
} }
} }
} }

View File

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:hub/shared/helpers/database/database_helper.dart'; import 'package:hub/shared/helpers/database/database_helper.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
@ -30,8 +32,8 @@ class KeychainHelper implements BaseStorage {
@override @override
Future<String?> get(String key) async { Future<String?> get(String key) async {
var response = await DatabaseStorage.database log('KeychainHelper.get: $key');
.query(tableKeychain, where: 'key = ?', whereArgs: [key]); var response = await DatabaseStorage.database.query(tableKeychain, where: 'key = ?', whereArgs: [key]);
if (response.isEmpty) { if (response.isEmpty) {
return null; return null;
} }
@ -56,8 +58,7 @@ class KeychainHelper implements BaseStorage {
@override @override
Future<void> delete(String key) async { Future<void> delete(String key) async {
await DatabaseStorage.database await DatabaseStorage.database.delete(tableKeychain, where: 'key = ?', whereArgs: [key]);
.delete(tableKeychain, where: 'key = ?', whereArgs: [key]);
} }
@override @override

View File

@ -22,12 +22,10 @@ class StorageHelper {
await SharedPreferencesStorage.instance.init(); await SharedPreferencesStorage.instance.init();
await KeychainHelper.instance.init(); await KeychainHelper.instance.init();
String? isFirstRun = await SharedPreferencesStorage.instance String? isFirstRun = await SharedPreferencesStorage.instance.get(SharedPreferencesKey.isFirstRun.value);
.get(SharedPreferencesKey.isFirstRun.value);
if (isFirstRun != 'false') { if (isFirstRun != 'false') {
await SharedPreferencesStorage.instance await SharedPreferencesStorage.instance.set(SharedPreferencesKey.isFirstRun.value, false);
.set(SharedPreferencesKey.isFirstRun.value, false);
await SecureStorage.instance.set(SecureStorageKey.isLogged.value, false); await SecureStorage.instance.set(SecureStorageKey.isLogged.value, false);
} }
} }
@ -46,10 +44,7 @@ class StorageHelper {
static BaseStorage getInstanceByKey(String key) { static BaseStorage getInstanceByKey(String key) {
if (SecureStorageKey.values.map((e) => e.value).toList().contains(key)) { if (SecureStorageKey.values.map((e) => e.value).toList().contains(key)) {
return SecureStorage.instance; return SecureStorage.instance;
} else if (SharedPreferencesKey.values } else if (SharedPreferencesKey.values.map((e) => e.value).toList().contains(key)) {
.map((e) => e.value)
.toList()
.contains(key)) {
return SharedPreferencesStorage.instance; return SharedPreferencesStorage.instance;
} else { } else {
return KeychainHelper.instance; return KeychainHelper.instance;

View File

@ -63,8 +63,7 @@ class DeepLinkService {
child: ForgotPasswordScreen(email: email, token: token), child: ForgotPasswordScreen(email: email, token: token),
), ),
isScrollControlled: true, isScrollControlled: true,
backgroundColor: backgroundColor: FlutterFlowTheme.of(key.currentContext!).primaryBackground,
FlutterFlowTheme.of(key.currentContext!).primaryBackground,
showDragHandle: true, showDragHandle: true,
useSafeArea: true, useSafeArea: true,
enableDrag: true, enableDrag: true,

View File

@ -1,5 +1,3 @@
class KeychainService { class KeychainService {
static final KeychainService _instance = KeychainService._internal(); static final KeychainService _instance = KeychainService._internal();
factory KeychainService() => _instance; factory KeychainService() => _instance;

View File

@ -3,12 +3,11 @@
import 'dart:developer'; import 'dart:developer';
import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/pages/about_property_page/about_property_model.dart';
import 'package:hub/pages/about_property_page/about_property_screen.dart';
import 'package:hub/shared/helpers/database/database_helper.dart'; import 'package:hub/shared/helpers/database/database_helper.dart';
import 'package:hub/shared/helpers/license/license_helper.dart'; import 'package:hub/shared/helpers/license/license_helper.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:rxdart/rxdart.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
class LicenseService { class LicenseService {
@ -16,32 +15,23 @@ class LicenseService {
factory LicenseService() => _instance; factory LicenseService() => _instance;
LicenseService._internal(); LicenseService._internal();
static Future<void> setupLicense(Database database) async { final _licenseSubject = BehaviorSubject<List<dynamic>>();
await LicenseHelper.insertLicenseFoo(
InactiveModuleKey.values.map((e) => e.value).toList(), 'INVISIVEL'); Stream<List<dynamic>> get licenseStream => _licenseSubject.stream;
await LicenseHelper.insertLicenseFoo(
ActiveModuleKey.values.map((e) => e.value).toList(), 'VISIVEL'); Future<void> cleanLicense() async {
_licenseSubject.add([]);
} }
static Future<void> initLicenseService() async { Future<void> setupLicense(Database database) async {
// for (var element in LicenseStorageKey.values.map((e) => e.value)) { final List<String> inactiveModuleKey = InactiveModuleKey.values.map((e) => e.value).toList();
// await SQLiteStorage.database.insert( final List<String> activeModuleKey = ActiveModuleKey.values.map((e) => e.value).toList();
// SQLiteStorage.tableLicense, await LicenseHelper().setByKey(inactiveModuleKey, 'INVISIVEL');
// { await LicenseHelper().setByKey(activeModuleKey, 'VISIVEL');
// 'key': element, _licenseSubject.add([...activeModuleKey]);
// 'display': 'VISIVEL',
// 'expirationDate': '',
// 'startDate': '',
// 'quantity': '',
// },
// conflictAlgorithm: ConflictAlgorithm.ignore,
// );
// }
} }
static Future<void> processLicense() async {} Future<bool> fetchLicenses() async {
static Future<bool> fetchLicenses() async {
try { try {
log('Obtendo licenças...'); log('Obtendo licenças...');
final response = await PhpGroup.getLicense(); final response = await PhpGroup.getLicense();
@ -60,7 +50,8 @@ class LicenseService {
if (responseBody == []) { if (responseBody == []) {
await setupLicense(DatabaseStorage.database); await setupLicense(DatabaseStorage.database);
return true; _licenseSubject.add([]);
return false;
} }
for (var element in responseBody) { for (var element in responseBody) {
@ -68,11 +59,12 @@ class LicenseService {
_saveModule(element); _saveModule(element);
} }
} }
_licenseSubject.add(responseBody);
return true; return true;
} catch (e) { } catch (e) {
log('Erro ao obter licenças: $e'); log('Erro ao obter licenças: $e');
await setupLicense(DatabaseStorage.database); await setupLicense(DatabaseStorage.database);
return true; return false;
} }
} }
@ -81,15 +73,16 @@ class LicenseService {
} }
static Future<void> _saveModule(final dynamic body) async { static Future<void> _saveModule(final dynamic body) async {
if (body is Map<String, dynamic>) if (body is Map<String, dynamic>) {
log('Salvando módulo: ${body.toString()}'); log('Salvando módulo: ${body.toString()}');
// if (body is Map<String, dynamic>) await StorageHelper().s(body['key'], '');
if (body is Map<String, dynamic>)
await LicenseHelper().s(body['key'], body); await LicenseHelper().s(body['key'], body);
// StorageHelper.getInstance(Storage.SQLiteStorage).set(key, value); log('body[key]: ${body['key']}');
if (body['key'] == Module.pets.value) if (body['display'] == 'VISIVEL') {
await LicenseHelper().s(Module.petsHistory.value, body);
}
if (AboutPropertyModules.values.any((e) => e.value == body['key']) && body['display'] == 'VISIVEL') {
await LicenseHelper().s(Module.aboutProperty.value, body);
}
}
} }
static Future<void> updateLicense(final dynamic body) async {}
static Future<dynamic> catchLicense() async {}
} }

View File

@ -3,20 +3,21 @@
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/api_requests/api_calls.dart';
import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.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/flutter_flow/nav/nav.dart';
import 'package:hub/shared/helpers/database/database_helper.dart'; import 'package:hub/shared/helpers/database/database_helper.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'package:hub/shared/services/authentication/authentication_service.dart';
import 'package:hub/shared/services/license/license_service.dart'; import 'package:hub/shared/services/license/license_service.dart';
import 'package:hub/shared/utils/dialog_util.dart'; import 'package:hub/shared/utils/dialog_util.dart';
import 'package:hub/shared/utils/log_util.dart';
import '../../../backend/api_requests/api_calls.dart'; import 'package:hub/shared/utils/snackbar_util.dart';
import '../../../components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; import 'package:hub/shared/extensions/string_extensions.dart';
import '../../../flutter_flow/flutter_flow_util.dart';
import '../../utils/log_util.dart';
import '../../utils/snackbar_util.dart';
import '../authentication/authentication_service.dart';
class LocalizationService { class LocalizationService {
static Future<void> checkLocals(BuildContext context) async { static Future<void> checkLocals(BuildContext context) async {
@ -34,15 +35,13 @@ class LocalizationService {
enText: 'Verify your connection', enText: 'Verify your connection',
ptText: 'Verifique sua conexão', ptText: 'Verifique sua conexão',
); );
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
.whenComplete(() => selectLocal(context, response));
return; return;
} }
final List<dynamic> locals = response.jsonBody['locais'] ?? []; final List<dynamic> locals = response.jsonBody['locais'] ?? [];
final bool isEmpty = locals.isEmpty; final bool isEmpty = locals.isEmpty;
final bool isActive = final bool isActive = locals.where((local) => local['CLU_STATUS'] != 'B').isNotEmpty;
locals.where((local) => local['CLU_STATUS'] != 'B').isNotEmpty;
final bool isEnable = !isEmpty && isActive; final bool isEnable = !isEmpty && isActive;
if (isEnable) { if (isEnable) {
@ -60,6 +59,7 @@ class LocalizationService {
static Future<bool> processLocals(BuildContext context) async { static Future<bool> processLocals(BuildContext context) async {
try { try {
await LicenseService().cleanLicense();
final GetLocalsCall callback = PhpGroup.getLocalsCall; final GetLocalsCall callback = PhpGroup.getLocalsCall;
final ApiCallResponse response = await callback.call(); final ApiCallResponse response = await callback.call();
final bool? isError = response.jsonBody['error']; final bool? isError = response.jsonBody['error'];
@ -74,8 +74,7 @@ class LocalizationService {
enText: 'Verify your connection', enText: 'Verify your connection',
ptText: 'Verifique sua conexão', ptText: 'Verifique sua conexão',
); );
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
.whenComplete(() => selectLocal(context, response));
return false; return false;
} }
@ -86,8 +85,7 @@ class LocalizationService {
final bool isInactived = await _isInactived(locals); final bool isInactived = await _isInactived(locals);
final bool isPending = _isPending(locals); final bool isPending = _isPending(locals);
final bool isUnique = locals.length == 1; final bool isUnique = locals.length == 1;
final bool isBlocked = final bool isBlocked = locals.where((local) => local['CLU_STATUS'] == 'B').isNotEmpty;
locals.where((local) => local['CLU_STATUS'] == 'B').isNotEmpty;
final bool isEnabled = isUnique && isActive; final bool isEnabled = isUnique && isActive;
final bool isDisabled = isUnique && isBlocked; final bool isDisabled = isUnique && isBlocked;
final bool isUnselected = await _isUnselected(); final bool isUnselected = await _isUnselected();
@ -127,8 +125,7 @@ class LocalizationService {
enText: 'Error getting locals, verify your connection', enText: 'Error getting locals, verify your connection',
ptText: 'Erro ao obter locais, verifique sua conexão', ptText: 'Erro ao obter locais, verifique sua conexão',
); );
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, null));
.whenComplete(() => selectLocal(context, null));
return false; return false;
} }
} }
@ -143,8 +140,7 @@ class LocalizationService {
final GetLocalsCall callback = PhpGroup.getLocalsCall; final GetLocalsCall callback = PhpGroup.getLocalsCall;
response = await callback.call(); response = await callback.call();
final String errorMsg = response.jsonBody['error_msg']; final String errorMsg = response.jsonBody['error_msg'];
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
.whenComplete(() => selectLocal(context, response));
return false; return false;
} else if (response.jsonBody == null) { } else if (response.jsonBody == null) {
final GetLocalsCall callback = PhpGroup.getLocalsCall; final GetLocalsCall callback = PhpGroup.getLocalsCall;
@ -153,16 +149,18 @@ class LocalizationService {
enText: 'Verify your connection', enText: 'Verify your connection',
ptText: 'Verifique sua conexão', ptText: 'Verifique sua conexão',
); );
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
.whenComplete(() => selectLocal(context, response));
return false; return false;
} else { } else {
// final bool isNewVersion = await _updateStorageUtil(response.jsonBody); final bool isNewVersion = await _updateStorageUtil(response.jsonBody);
// if (!isNewVersion) { if (isNewVersion) {
await LicenseService.setupLicense(DatabaseStorage.database); return await LicenseService().fetchLicenses();
} else {
await LicenseService().setupLicense(DatabaseStorage.database);
}
log('() => isNewVersion: $isNewVersion');
return false; return false;
// }
// return await LicenseService.fetchLicenses();
} }
} catch (e, s) { } catch (e, s) {
log('() => stack processData: $s'); log('() => stack processData: $s');
@ -171,14 +169,12 @@ class LocalizationService {
enText: 'Error getting data, verify your connection', enText: 'Error getting data, verify your connection',
ptText: 'Erro ao obter dados, verifique sua conexão', ptText: 'Erro ao obter dados, verifique sua conexão',
); );
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, null));
.whenComplete(() => selectLocal(context, null));
return false; return false;
} }
} }
static Future<bool> selectLocal( static Future<bool> selectLocal(BuildContext context, ApiCallResponse? response) async {
BuildContext context, ApiCallResponse? response) async {
return await showModalBottomSheet( return await showModalBottomSheet(
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@ -242,13 +238,10 @@ class LocalizationService {
} }
static void _handleError(BuildContext context, String errorMsg) async { static void _handleError(BuildContext context, String errorMsg) async {
final String devUUID = final String devUUID = await StorageHelper().g(KeychainStorageKey.devUUID.value) ?? '';
await StorageHelper().g(KeychainStorageKey.devUUID.value) ?? ''; final String userUUID = await StorageHelper().g(KeychainStorageKey.userUUID.value) ?? '';
final String userUUID =
await StorageHelper().g(KeychainStorageKey.userUUID.value) ?? '';
final bool isAuthenticated = userUUID.isNotEmpty && devUUID.isNotEmpty; final bool isAuthenticated = userUUID.isNotEmpty && devUUID.isNotEmpty;
final bool isDevLinked = final bool isDevLinked = !errorMsg.contains('Esse dispositivo nao pertence a esse usuario');
!errorMsg.contains('Esse dispositivo nao pertence a esse usuario');
log('() => isLinked: $errorMsg'); log('() => isLinked: $errorMsg');
log('() => isLinked: $errorMsg'); log('() => isLinked: $errorMsg');
if (!isAuthenticated) { if (!isAuthenticated) {
@ -268,20 +261,15 @@ class LocalizationService {
await DialogUtil.warning(context, errorMsg); await DialogUtil.warning(context, errorMsg);
return; return;
} }
await DialogUtil.error(context, errorMsg) await DialogUtil.error(context, errorMsg).whenComplete(() async => await selectLocal(context, null));
.whenComplete(() async => await selectLocal(context, null));
} }
static Future<bool> _handleUnavailable( static Future<bool> _handleUnavailable(BuildContext context, List<dynamic> locals) async {
BuildContext context, List<dynamic> locals) async {
log('() => isUnavailable'); log('() => isUnavailable');
try { try {
await StorageHelper() await StorageHelper().s(KeychainStorageKey.clientUUID.value, locals[0]['CLI_ID']);
.s(KeychainStorageKey.clientUUID.value, locals[0]['CLI_ID']); await StorageHelper().s(KeychainStorageKey.ownerUUID.value, locals[0]['CLU_OWNER_ID']);
await StorageHelper() await StorageHelper().s(KeychainStorageKey.clientName.value, locals[0]['CLI_NOME']);
.s(KeychainStorageKey.ownerUUID.value, locals[0]['CLU_OWNER_ID']);
await StorageHelper()
.s(KeychainStorageKey.clientName.value, locals[0]['CLI_NOME']);
var response = await PhpGroup.resopndeVinculo.call(tarefa: 'A'); var response = await PhpGroup.resopndeVinculo.call(tarefa: 'A');
if (response.jsonBody['error'] == true) { if (response.jsonBody['error'] == true) {
await StorageHelper().s(KeychainStorageKey.clientUUID.value, ''); await StorageHelper().s(KeychainStorageKey.clientUUID.value, '');
@ -289,28 +277,21 @@ class LocalizationService {
await StorageHelper().s(KeychainStorageKey.clientName.value, ''); await StorageHelper().s(KeychainStorageKey.clientName.value, '');
return false; return false;
} }
if (response.jsonBody['error'] == false) if (response.jsonBody['error'] == false) return await processData(context).then((value) => value);
return await processData(context).then((value) => value);
} catch (e, s) { } catch (e, s) {
await DialogUtil.errorDefault(context); await DialogUtil.errorDefault(context);
LogUtil.requestAPIFailed( LogUtil.requestAPIFailed('responderVinculo.php', '', 'Responder Vínculo', e, s);
'responderVinculo.php', '', 'Responder Vínculo', e, s);
return false; return false;
} }
return false; return false;
} }
static Future<bool> _handleEnabled( static Future<bool> _handleEnabled(BuildContext context, dynamic local) async {
BuildContext context, dynamic local) async {
log('() => isEnabled'); log('() => isEnabled');
await StorageHelper() await StorageHelper().s(KeychainStorageKey.clientUUID.value, local['CLI_ID']);
.s(KeychainStorageKey.clientUUID.value, local['CLI_ID']); await StorageHelper().s(KeychainStorageKey.ownerUUID.value, local['CLU_OWNER_ID']);
await StorageHelper() await StorageHelper().s(KeychainStorageKey.clientName.value, local['CLI_NOME']);
.s(KeychainStorageKey.ownerUUID.value, local['CLU_OWNER_ID']); await StorageHelper().s(KeychainStorageKey.userName.value, local['USU_NOME']);
await StorageHelper()
.s(KeychainStorageKey.clientName.value, local['CLI_NOME']);
await StorageHelper()
.s(KeychainStorageKey.userName.value, local['USU_NOME']);
return await processData(context); return await processData(context);
} }
@ -322,24 +303,21 @@ class LocalizationService {
} }
static Future<bool> _updateStorageUtil(Map<String, dynamic> jsonBody) async { static Future<bool> _updateStorageUtil(Map<String, dynamic> jsonBody) async {
await StorageHelper().s(KeychainStorageKey.whatsapp.value, await StorageHelper().s(KeychainStorageKey.whatsapp.value, jsonBody['whatsapp'] != null && jsonBody['whatsapp']);
jsonBody['whatsapp'] != null && jsonBody['whatsapp']); await StorageHelper().s(KeychainStorageKey.provisional.value, jsonBody['provisional'] != null && jsonBody['provisional']);
await StorageHelper().s(KeychainStorageKey.provisional.value, await StorageHelper().s(KeychainStorageKey.pets.value, jsonBody['pet'] != null && jsonBody['pet']);
jsonBody['provisional'] != null && jsonBody['provisional']); await StorageHelper().s(KeychainStorageKey.petAmount.value,
await StorageHelper().s(KeychainStorageKey.pets.value, jsonBody['petAmountRegister'] != null && jsonBody['petAmountRegister'].toString().isEmpty ? '0' : jsonBody['petAmountRegister'].toString());
jsonBody['pet'] != null && jsonBody['pet']); await StorageHelper().s(KeychainStorageKey.userName.value, jsonBody['visitado']['VDO_NOME']);
await StorageHelper().s(
KeychainStorageKey.petAmount.value, late final bool isNewVersion;
jsonBody['petAmountRegister'] != null && if (jsonBody['newVersion'] != null)
jsonBody['petAmountRegister'].toString().isEmpty isNewVersion = jsonBody['newVersion'];
? '0' else
: jsonBody['petAmountRegister'].toString()); isNewVersion = false;
await StorageHelper()
.s(KeychainStorageKey.userName.value, jsonBody['visitado']['VDO_NOME']);
await StorageHelper().s(KeychainStorageKey.isNewVersion.value,
jsonBody['newVersion'] != null && jsonBody['newVersion']);
log('() => isNewVersion: ${jsonBody['newVersion']}'); log('() => isNewVersion: ${jsonBody['newVersion']}');
return jsonBody['newVersion'] == true; await StorageHelper().s(KeychainStorageKey.isNewVersion.value, isNewVersion);
return isNewVersion;
} }
static bool _isActive(List<dynamic> locals) { static bool _isActive(List<dynamic> locals) {
@ -347,44 +325,30 @@ class LocalizationService {
} }
static Future<bool> _isInactived(List<dynamic> locals) async { static Future<bool> _isInactived(List<dynamic> locals) async {
String cliUUID = String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? ''; return locals.where((local) => local['CLI_ID'] != cliUUID && local['CLU_STATUS'] == 'A').isNotEmpty;
return locals
.where(
(local) => local['CLI_ID'] != cliUUID && local['CLU_STATUS'] == 'A')
.isNotEmpty;
} }
static bool _isPending(List<dynamic> locals) { static bool _isPending(List<dynamic> locals) {
return locals return locals.where((local) => local['CLU_STATUS'] != 'B' && local['CLU_STATUS'] != 'A').isNotEmpty;
.where(
(local) => local['CLU_STATUS'] != 'B' && local['CLU_STATUS'] != 'A')
.isNotEmpty;
} }
static Future<bool> _isUnselected() async { static Future<bool> _isUnselected() async {
String cliUUID = String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? ''; String cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
String cliName = String ownerUUID = (await StorageHelper().g(KeychainStorageKey.ownerUUID.value)) ?? '';
(await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
String ownerUUID =
(await StorageHelper().g(KeychainStorageKey.ownerUUID.value)) ?? '';
return cliUUID.isEmpty && cliName.isEmpty && ownerUUID.isEmpty; return cliUUID.isEmpty && cliName.isEmpty && ownerUUID.isEmpty;
} }
static Future<bool> _isSelected(bool isInactived) async { static Future<bool> _isSelected(bool isInactived) async {
String cliUUID = String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? ''; String cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
String cliName =
(await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
return cliUUID.isNotEmpty && cliName.isNotEmpty && isInactived; return cliUUID.isNotEmpty && cliName.isNotEmpty && isInactived;
} }
static Future<bool> _isAvailable() async { static Future<bool> _isAvailable() async {
String cliUUID = String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? ''; String cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
String cliName =
(await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
return cliUUID.isNotEmpty && cliName.isNotEmpty; return cliUUID.isNotEmpty && cliName.isNotEmpty;
} }
} }

View File

@ -1,16 +1,45 @@
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hub/backend/schema/enums/enums.dart';
import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart'; import 'package:hub/components/organism_components/menu_component/menu_component_widget.dart';
import 'package:hub/flutter_flow/flutter_flow_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_util.dart';
import 'package:hub/pages/home_page/home_page_model.dart'; import 'package:hub/pages/home_page/home_bloc.dart';
import 'package:hub/pages/home_page/home_state.dart';
import 'package:hub/shared/helpers/license/license_helper.dart';
import 'package:hub/shared/services/license/license_service.dart';
class CustomDrawer extends StatelessWidget { class CustomDrawer extends StatelessWidget {
const CustomDrawer({super.key, required this.model}); const CustomDrawer({super.key});
final HomePageModel model;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<List<dynamic>>(
stream: LicenseService().licenseStream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (snapshot.hasError) {
return Center(
child: Text('Error: ${snapshot.error}'),
);
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return Center(
child: Padding(
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height / 10),
child: CircularProgressIndicator(
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
color: FlutterFlowTheme.of(context).primary,
),
),
);
}
return BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
return SafeArea( return SafeArea(
child: SizedBox( child: SizedBox(
width: MediaQuery.of(context).size.width * 0.8, width: MediaQuery.of(context).size.width * 0.8,
@ -20,18 +49,22 @@ class CustomDrawer extends StatelessWidget {
color: FlutterFlowTheme.of(context).primaryBackground, color: FlutterFlowTheme.of(context).primaryBackground,
child: Column( child: Column(
children: [ children: [
_buildDrawerHeader(context), _buildDrawerHeader(context, state),
// _buildSearchBar(context), // _buildSearchBar(context, state),
_buildDrawerBody(), _buildDrawerBody(context),
].addToStart(const SizedBox(height: 20)), ].addToStart(const SizedBox(height: 20)),
), ),
), ),
), ),
), ),
); );
},
);
},
);
} }
Container _buildDrawerHeader(BuildContext context) { Container _buildDrawerHeader(BuildContext context, HomeState state) {
return Container( return Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
@ -56,7 +89,7 @@ class CustomDrawer extends StatelessWidget {
child: CachedNetworkImage( child: CachedNetworkImage(
imageUrl: valueOrDefault( imageUrl: valueOrDefault(
'assets/images/person.jpg', 'assets/images/person.jpg',
'https://freaccess.com.br/freaccess/Images/Clients/${model.cliUUID}.png', 'https://freaccess.com.br/freaccess/Images/Clients/${state.cliUUID}.png',
), ),
width: 80.0, width: 80.0,
height: 80.0, height: 80.0,
@ -75,7 +108,7 @@ class CustomDrawer extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
model.userName, state.userName,
style: FlutterFlowTheme.of(context).bodyLarge.override( style: FlutterFlowTheme.of(context).bodyLarge.override(
fontFamily: 'Nunito Sans', fontFamily: 'Nunito Sans',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
@ -85,7 +118,7 @@ class CustomDrawer extends StatelessWidget {
), ),
), ),
Text( Text(
model.userEmail, state.userEmail,
style: FlutterFlowTheme.of(context).bodySmall.override( style: FlutterFlowTheme.of(context).bodySmall.override(
fontFamily: 'Nunito Sans', fontFamily: 'Nunito Sans',
color: FlutterFlowTheme.of(context).primaryText, color: FlutterFlowTheme.of(context).primaryText,
@ -102,7 +135,7 @@ class CustomDrawer extends StatelessWidget {
); );
} }
Padding _buildSearchBar(BuildContext context) { Padding _buildSearchBar(BuildContext context, HomeState state) {
final theme = FlutterFlowTheme.of(context); final theme = FlutterFlowTheme.of(context);
final errorColor = theme.error; final errorColor = theme.error;
final primaryColor = theme.primary; final primaryColor = theme.primary;
@ -111,8 +144,8 @@ class CustomDrawer extends StatelessWidget {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0), padding: const EdgeInsets.symmetric(vertical: 10.0),
child: TextFormField( child: TextFormField(
controller: model.textController, controller: TextEditingController(), // Replace with appropriate controller
focusNode: model.textFieldFocusNode, focusNode: FocusNode(), // Replace with appropriate focus node
autofocus: false, autofocus: false,
obscureText: false, obscureText: false,
decoration: InputDecoration( decoration: InputDecoration(
@ -153,16 +186,17 @@ class CustomDrawer extends StatelessWidget {
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily, fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
letterSpacing: 0.0, letterSpacing: 0.0,
), ),
validator: model.textControllerValidator.asValidator(context), // validator: model.textControllerValidator.asValidator(context),
), ),
); );
} }
Widget _buildDrawerBody() { Widget _buildDrawerBody(BuildContext context) {
return wrapWithModel( return MenuComponentWidget(
model: model.drawerMenuComponentModel, style: MenuView.list,
updateCallback: () {}, item: MenuItem.tile,
child: MenuComponentWidget(model: model.drawerMenuComponentModel), expandable: false,
menuOptions: Module.values.where((e) => e != Module.settings).toList(),
); );
} }
} }

View File

@ -1,210 +1,210 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; // import 'package:flutter_test/flutter_test.dart';
import 'package:hub/flutter_flow/random_data_util.dart'; // import 'package:hub/flutter_flow/random_data_util.dart';
import 'package:hub/main.dart'; // import 'package:hub/main.dart';
import 'package:hub/shared/helpers/storage/base_storage.dart'; // import 'package:hub/shared/helpers/storage/base_storage.dart';
import 'package:hub/shared/helpers/storage/storage_helper.dart'; // import 'package:hub/shared/helpers/storage/storage_helper.dart';
import 'package:integration_test/integration_test.dart'; // import 'package:integration_test/integration_test.dart';
late WidgetTester widget; // late WidgetTester widget;
void main() { // void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized(); // IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('Initialization', () { // group('Initialization', () {
group('Navigation', () { // group('Navigation', () {
setUpAll(() async => // setUpAll(() async =>
await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false'))); // await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
testWidgets('Test Welcome', (WidgetTester tester) async { // testWidgets('Test Welcome', (WidgetTester tester) async {
widget = tester; // widget = tester;
await _testWelcome(); // await _testWelcome();
}); // });
}); // });
group('Terms of Use', () {}); // group('Terms of Use', () {});
}); // });
group('Authentication', () { // group('Authentication', () {
group('Sign in', () { // group('Sign in', () {
setUpAll(() async => // setUpAll(() async =>
await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false'))); // await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
testWidgets('Test Sign In', (WidgetTester tester) async { // testWidgets('Test Sign In', (WidgetTester tester) async {
widget = tester; // widget = tester;
await _testSignIn(); // await _testSignIn();
}); // });
}); // });
group('Sign up', () { // group('Sign up', () {
setUpAll(() async => // setUpAll(() async =>
await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false'))); // await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
testWidgets('Test Sign Up', (WidgetTester tester) async { // testWidgets('Test Sign Up', (WidgetTester tester) async {
widget = tester; // widget = tester;
await _testSignUp(); // await _testSignUp();
}); // });
}); // });
group('Sign Out', () { // group('Sign Out', () {
// Add tests for Sign Out here // // Add tests for Sign Out here
}); // });
group('Forgot Password', () { // group('Forgot Password', () {
// setUpAll(() async => await initializeApp().then((_) => StorageUtil().isLogged = false)); // // setUpAll(() async => await initializeApp().then((_) => StorageUtil().isLogged = false));
// testWidgets('Test Forgot Password', (WidgetTester tester) async { // // testWidgets('Test Forgot Password', (WidgetTester tester) async {
// widget = tester; // // widget = tester;
// await _testForgotPassword(); // // await _testForgotPassword();
// }); // // });
}); // });
}); // });
group('Localization', () { // group('Localization', () {
// Add tests for Localization here // // Add tests for Localization here
}); // });
group('Networking', () { // group('Networking', () {
// Add tests for Networking here // // Add tests for Networking here
}); // });
group('Functionality', () { // group('Functionality', () {
// Add tests for Functionality here // // Add tests for Functionality here
}); // });
group('Usability', () { // group('Usability', () {
// Add tests for Usability here // // Add tests for Usability here
}); // });
group('Performance', () { // group('Performance', () {
// Add tests for Performance here // // Add tests for Performance here
}); // });
group('Security', () { // group('Security', () {
// Add tests for Security here // // Add tests for Security here
}); // });
group('Accessibility', () { // group('Accessibility', () {
// Add tests for Accessibility here // // Add tests for Accessibility here
}); // });
group('Compatibility', () { // group('Compatibility', () {
// Add tests for Compatibility here // // Add tests for Compatibility here
}); // });
group('Internationalization', () { // group('Internationalization', () {
// Add tests for Internationalization here // // Add tests for Internationalization here
}); // });
} // }
Future<void> _testWelcome() async { // Future<void> _testWelcome() async {
await widget.pumpWidget(const App()); // await widget.pumpWidget(const App());
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
await _navigateToSignIn(); // await _navigateToSignIn();
await _navigateToSignUp(); // await _navigateToSignUp();
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
await widget.pumpWidget(const App()); // await widget.pumpWidget(const App());
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
await _navigateToSignUp(); // await _navigateToSignUp();
await _navigateToSignIn(); // await _navigateToSignIn();
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
Future<void> _testSignIn() async { // Future<void> _testSignIn() async {
await widget.pumpWidget(const App()); // await widget.pumpWidget(const App());
await _navigateToSignIn(); // await _navigateToSignIn();
await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'}); // await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'});
await _auth({'emailTextFormField': 'email_app@exemplo.com', 'passwordTextFormField': '12345678'}); // await _auth({'emailTextFormField': 'email_app@exemplo.com', 'passwordTextFormField': '12345678'});
} // }
Future<void> _testSignUp() async { // Future<void> _testSignUp() async {
await widget.pumpWidget(const App()); // await widget.pumpWidget(const App());
await _navigateToSignUp(); // await _navigateToSignUp();
var credentials = { // var credentials = {
'nameTextFormField': 'app', // 'nameTextFormField': 'app',
'emailTextFormField': 'email_app@exemplo.com', // 'emailTextFormField': 'email_app@exemplo.com',
'passwordTextFormField': '12345678' // 'passwordTextFormField': '12345678'
}; // };
await _auth(credentials); // await _auth(credentials);
var name = randomString(7, 7, true, true, true); // var name = randomString(7, 7, true, true, true);
var email = '$name@example.com'; // var email = '$name@example.com';
var password = '12345678'; // var password = '12345678';
credentials = {'nameTextFormField': name, 'emailTextFormField': email, 'passwordTextFormField': password}; // credentials = {'nameTextFormField': name, 'emailTextFormField': email, 'passwordTextFormField': password};
await _navigateToSignUp(); // await _navigateToSignUp();
await _auth(credentials); // await _auth(credentials);
credentials = {'emailTextFormField': email, 'passwordTextFormField': password}; // credentials = {'emailTextFormField': email, 'passwordTextFormField': password};
await _auth(credentials); // await _auth(credentials);
} // }
Future<void> _testForgotPassword() async { // Future<void> _testForgotPassword() async {
await widget.pumpWidget(const App()); // await widget.pumpWidget(const App());
await _navigateToSignIn(); // await _navigateToSignIn();
await _recoveryPassword(); // await _recoveryPassword();
var addr = randomString(5, 5, true, true, true); // var addr = randomString(5, 5, true, true, true);
var credentials = {'recoveryTextFormField': '$addr@exemple.com'}; // var credentials = {'recoveryTextFormField': '$addr@exemple.com'};
await _send(credentials); // await _send(credentials);
await Future.delayed(const Duration(seconds: 2)); // await Future.delayed(const Duration(seconds: 2));
await _recoveryPassword(); // await _recoveryPassword();
credentials = {'recoveryTextFormField': 'email_app@exemple.com'}; // credentials = {'recoveryTextFormField': 'email_app@exemple.com'};
await _send(credentials); // await _send(credentials);
} // }
Future<void> _recoveryPassword() async { // Future<void> _recoveryPassword() async {
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword')); // final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword'));
if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword); // if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword);
await widget.ensureVisible(forgotPassword); // await widget.ensureVisible(forgotPassword);
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
Future<void> _navigateBackUsingSystemGesture() async => // Future<void> _navigateBackUsingSystemGesture() async =>
IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape); // IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
Future<void> _navigateToSignUp() async { // Future<void> _navigateToSignUp() async {
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage')); // final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage'));
if (navToSignUp.evaluate().isNotEmpty) { // if (navToSignUp.evaluate().isNotEmpty) {
await widget.tap(navToSignUp); // await widget.tap(navToSignUp);
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
} // }
Future<void> _navigateToSignIn() async { // Future<void> _navigateToSignIn() async {
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
final Finder navToSignIn = find.byKey(const ValueKey<String>('toggleSignInPage')); // final Finder navToSignIn = find.byKey(const ValueKey<String>('toggleSignInPage'));
expect(navToSignIn, findsOneWidget); // expect(navToSignIn, findsOneWidget);
if (navToSignIn.evaluate().isNotEmpty) { // if (navToSignIn.evaluate().isNotEmpty) {
await widget.tap(navToSignIn); // await widget.tap(navToSignIn);
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
} // }
Future<void> _auth(Map<String, dynamic> credentials) async { // Future<void> _auth(Map<String, dynamic> credentials) async {
await _enterCredentials(credentials); // await _enterCredentials(credentials);
await _submit('SubmitButtonWidget'); // await _submit('SubmitButtonWidget');
} // }
Future<void> _send(Map<String, dynamic> credentials) async { // Future<void> _send(Map<String, dynamic> credentials) async {
await _enterCredentials(credentials); // await _enterCredentials(credentials);
await _submit('SendButtonWidget'); // await _submit('SendButtonWidget');
} // }
Future<void> _enterCredentials(Map<String, dynamic> credentials) async { // Future<void> _enterCredentials(Map<String, dynamic> credentials) async {
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
for (var entry in credentials.entries) { // for (var entry in credentials.entries) {
final Finder field = find.byKey(ValueKey<String>(entry.key)); // final Finder field = find.byKey(ValueKey<String>(entry.key));
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
expect(field, findsOneWidget); // expect(field, findsOneWidget);
await widget.enterText(field, entry.value); // await widget.enterText(field, entry.value);
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
Future<void> _submit(String key) async { // Future<void> _submit(String key) async {
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
final Finder submitButton = find.byKey(ValueKey<String>(key)); // final Finder submitButton = find.byKey(ValueKey<String>(key));
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
if (submitButton.evaluate().isNotEmpty) { // if (submitButton.evaluate().isNotEmpty) {
await widget.tap(submitButton); // await widget.tap(submitButton);
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} // }
final Finder throwExceptionWidget = find.byKey(const ValueKey<String>('ThrowExceptionWidget')); // final Finder throwExceptionWidget = find.byKey(const ValueKey<String>('ThrowExceptionWidget'));
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
if (throwExceptionWidget.evaluate().isNotEmpty) { // if (throwExceptionWidget.evaluate().isNotEmpty) {
await widget.ensureVisible(throwExceptionWidget); // await widget.ensureVisible(throwExceptionWidget);
await widget.tap(throwExceptionWidget); // await widget.tap(throwExceptionWidget);
await widget.pumpAndSettle(); // await widget.pumpAndSettle();
} else { // } else {
await _navigateBackUsingSystemGesture(); // await _navigateBackUsingSystemGesture();
} // }
} // }