milestone modularização
This commit is contained in:
parent
9891165ca9
commit
5cda31ea0d
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {}
|
||||||
|
}
|
|
@ -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() {}
|
|
||||||
}
|
|
|
@ -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
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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,
|
|
||||||
),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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();
|
||||||
},
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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';
|
||||||
|
|
|
@ -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 = '';
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
),
|
]),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
class HomeEvent {}
|
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
export 'home_bloc.dart';
|
||||||
|
export 'home_events.dart';
|
||||||
|
export 'home_state.dart';
|
|
@ -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;
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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 {},
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 {},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
extension StringNullableExtensions on String? {
|
||||||
|
bool toBoolean() {
|
||||||
|
return this!.toLowerCase() == 'true';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension StringExtensions on String {
|
||||||
|
bool toBoolean() {
|
||||||
|
return this.toLowerCase() == 'true';
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 {}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -144,4 +144,3 @@ extension KeychainStorageKeyExtension on KeychainStorageKey {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
await _testWelcome();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
group('Terms of Use', () {});
|
|
||||||
});
|
|
||||||
group('Authentication', () {
|
|
||||||
group('Sign in', () {
|
|
||||||
setUpAll(() async =>
|
|
||||||
await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
|
|
||||||
testWidgets('Test Sign In', (WidgetTester tester) async {
|
|
||||||
widget = tester;
|
|
||||||
await _testSignIn();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
group('Sign up', () {
|
|
||||||
setUpAll(() async =>
|
|
||||||
await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
|
|
||||||
testWidgets('Test Sign Up', (WidgetTester tester) async {
|
|
||||||
widget = tester;
|
|
||||||
await _testSignUp();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
group('Sign Out', () {
|
|
||||||
// Add tests for Sign Out here
|
|
||||||
});
|
|
||||||
group('Forgot Password', () {
|
|
||||||
// setUpAll(() async => await initializeApp().then((_) => StorageUtil().isLogged = false));
|
|
||||||
// testWidgets('Test Forgot Password', (WidgetTester tester) async {
|
|
||||||
// widget = tester;
|
// widget = tester;
|
||||||
// await _testForgotPassword();
|
// await _testWelcome();
|
||||||
|
// });
|
||||||
// });
|
// });
|
||||||
});
|
|
||||||
});
|
|
||||||
group('Localization', () {
|
|
||||||
// Add tests for Localization here
|
|
||||||
});
|
|
||||||
group('Networking', () {
|
|
||||||
// Add tests for Networking here
|
|
||||||
});
|
|
||||||
group('Functionality', () {
|
|
||||||
// Add tests for Functionality here
|
|
||||||
});
|
|
||||||
group('Usability', () {
|
|
||||||
// Add tests for Usability here
|
|
||||||
});
|
|
||||||
group('Performance', () {
|
|
||||||
// Add tests for Performance here
|
|
||||||
});
|
|
||||||
group('Security', () {
|
|
||||||
// Add tests for Security here
|
|
||||||
});
|
|
||||||
group('Accessibility', () {
|
|
||||||
// Add tests for Accessibility here
|
|
||||||
});
|
|
||||||
group('Compatibility', () {
|
|
||||||
// Add tests for Compatibility here
|
|
||||||
});
|
|
||||||
group('Internationalization', () {
|
|
||||||
// Add tests for Internationalization here
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _testWelcome() async {
|
// group('Terms of Use', () {});
|
||||||
await widget.pumpWidget(const App());
|
// });
|
||||||
await widget.pumpAndSettle();
|
// group('Authentication', () {
|
||||||
await _navigateToSignIn();
|
// group('Sign in', () {
|
||||||
await _navigateToSignUp();
|
// setUpAll(() async =>
|
||||||
await widget.pumpAndSettle();
|
// await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
|
||||||
await widget.pumpWidget(const App());
|
// testWidgets('Test Sign In', (WidgetTester tester) async {
|
||||||
await widget.pumpAndSettle();
|
// widget = tester;
|
||||||
await _navigateToSignUp();
|
// await _testSignIn();
|
||||||
await _navigateToSignIn();
|
// });
|
||||||
await widget.pumpAndSettle();
|
// });
|
||||||
}
|
// group('Sign up', () {
|
||||||
|
// setUpAll(() async =>
|
||||||
|
// await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
|
||||||
|
// testWidgets('Test Sign Up', (WidgetTester tester) async {
|
||||||
|
// widget = tester;
|
||||||
|
// await _testSignUp();
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// group('Sign Out', () {
|
||||||
|
// // Add tests for Sign Out here
|
||||||
|
// });
|
||||||
|
// group('Forgot Password', () {
|
||||||
|
// // setUpAll(() async => await initializeApp().then((_) => StorageUtil().isLogged = false));
|
||||||
|
// // testWidgets('Test Forgot Password', (WidgetTester tester) async {
|
||||||
|
// // widget = tester;
|
||||||
|
// // await _testForgotPassword();
|
||||||
|
// // });
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// group('Localization', () {
|
||||||
|
// // Add tests for Localization here
|
||||||
|
// });
|
||||||
|
// group('Networking', () {
|
||||||
|
// // Add tests for Networking here
|
||||||
|
// });
|
||||||
|
// group('Functionality', () {
|
||||||
|
// // Add tests for Functionality here
|
||||||
|
// });
|
||||||
|
// group('Usability', () {
|
||||||
|
// // Add tests for Usability here
|
||||||
|
// });
|
||||||
|
// group('Performance', () {
|
||||||
|
// // Add tests for Performance here
|
||||||
|
// });
|
||||||
|
// group('Security', () {
|
||||||
|
// // Add tests for Security here
|
||||||
|
// });
|
||||||
|
// group('Accessibility', () {
|
||||||
|
// // Add tests for Accessibility here
|
||||||
|
// });
|
||||||
|
// group('Compatibility', () {
|
||||||
|
// // Add tests for Compatibility here
|
||||||
|
// });
|
||||||
|
// group('Internationalization', () {
|
||||||
|
// // Add tests for Internationalization here
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
Future<void> _testSignIn() async {
|
// Future<void> _testWelcome() async {
|
||||||
await widget.pumpWidget(const App());
|
// await widget.pumpWidget(const App());
|
||||||
await _navigateToSignIn();
|
// await widget.pumpAndSettle();
|
||||||
await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'});
|
// await _navigateToSignIn();
|
||||||
await _auth({'emailTextFormField': 'email_app@exemplo.com', 'passwordTextFormField': '12345678'});
|
// await _navigateToSignUp();
|
||||||
}
|
// await widget.pumpAndSettle();
|
||||||
|
// await widget.pumpWidget(const App());
|
||||||
|
// await widget.pumpAndSettle();
|
||||||
|
// await _navigateToSignUp();
|
||||||
|
// await _navigateToSignIn();
|
||||||
|
// await widget.pumpAndSettle();
|
||||||
|
// }
|
||||||
|
|
||||||
Future<void> _testSignUp() async {
|
// Future<void> _testSignIn() async {
|
||||||
await widget.pumpWidget(const App());
|
// await widget.pumpWidget(const App());
|
||||||
await _navigateToSignUp();
|
// await _navigateToSignIn();
|
||||||
|
// await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||||
|
// await _auth({'emailTextFormField': 'email_app@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||||
|
// }
|
||||||
|
|
||||||
var credentials = {
|
// Future<void> _testSignUp() async {
|
||||||
'nameTextFormField': 'app',
|
// await widget.pumpWidget(const App());
|
||||||
'emailTextFormField': 'email_app@exemplo.com',
|
// await _navigateToSignUp();
|
||||||
'passwordTextFormField': '12345678'
|
|
||||||
};
|
|
||||||
await _auth(credentials);
|
|
||||||
|
|
||||||
var name = randomString(7, 7, true, true, true);
|
// var credentials = {
|
||||||
var email = '$name@example.com';
|
// 'nameTextFormField': 'app',
|
||||||
var password = '12345678';
|
// 'emailTextFormField': 'email_app@exemplo.com',
|
||||||
credentials = {'nameTextFormField': name, 'emailTextFormField': email, 'passwordTextFormField': password};
|
// 'passwordTextFormField': '12345678'
|
||||||
await _navigateToSignUp();
|
// };
|
||||||
await _auth(credentials);
|
// await _auth(credentials);
|
||||||
credentials = {'emailTextFormField': email, 'passwordTextFormField': password};
|
|
||||||
await _auth(credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _testForgotPassword() async {
|
// var name = randomString(7, 7, true, true, true);
|
||||||
await widget.pumpWidget(const App());
|
// var email = '$name@example.com';
|
||||||
await _navigateToSignIn();
|
// var password = '12345678';
|
||||||
await _recoveryPassword();
|
// credentials = {'nameTextFormField': name, 'emailTextFormField': email, 'passwordTextFormField': password};
|
||||||
|
// await _navigateToSignUp();
|
||||||
|
// await _auth(credentials);
|
||||||
|
// credentials = {'emailTextFormField': email, 'passwordTextFormField': password};
|
||||||
|
// await _auth(credentials);
|
||||||
|
// }
|
||||||
|
|
||||||
var addr = randomString(5, 5, true, true, true);
|
// Future<void> _testForgotPassword() async {
|
||||||
var credentials = {'recoveryTextFormField': '$addr@exemple.com'};
|
// await widget.pumpWidget(const App());
|
||||||
await _send(credentials);
|
// await _navigateToSignIn();
|
||||||
|
// await _recoveryPassword();
|
||||||
|
|
||||||
await Future.delayed(const Duration(seconds: 2));
|
// var addr = randomString(5, 5, true, true, true);
|
||||||
|
// var credentials = {'recoveryTextFormField': '$addr@exemple.com'};
|
||||||
|
// await _send(credentials);
|
||||||
|
|
||||||
await _recoveryPassword();
|
// await Future.delayed(const Duration(seconds: 2));
|
||||||
credentials = {'recoveryTextFormField': 'email_app@exemple.com'};
|
|
||||||
await _send(credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _recoveryPassword() async {
|
// await _recoveryPassword();
|
||||||
await widget.pumpAndSettle();
|
// credentials = {'recoveryTextFormField': 'email_app@exemple.com'};
|
||||||
final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword'));
|
// await _send(credentials);
|
||||||
if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword);
|
// }
|
||||||
await widget.ensureVisible(forgotPassword);
|
|
||||||
await widget.pumpAndSettle();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _navigateBackUsingSystemGesture() async =>
|
// Future<void> _recoveryPassword() async {
|
||||||
IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
|
// await widget.pumpAndSettle();
|
||||||
Future<void> _navigateToSignUp() async {
|
// final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword'));
|
||||||
await widget.pumpAndSettle();
|
// if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword);
|
||||||
final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage'));
|
// await widget.ensureVisible(forgotPassword);
|
||||||
if (navToSignUp.evaluate().isNotEmpty) {
|
// await widget.pumpAndSettle();
|
||||||
await widget.tap(navToSignUp);
|
// }
|
||||||
await widget.pumpAndSettle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _navigateToSignIn() async {
|
// Future<void> _navigateBackUsingSystemGesture() async =>
|
||||||
await widget.pumpAndSettle();
|
// IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
|
||||||
final Finder navToSignIn = find.byKey(const ValueKey<String>('toggleSignInPage'));
|
// Future<void> _navigateToSignUp() async {
|
||||||
expect(navToSignIn, findsOneWidget);
|
// await widget.pumpAndSettle();
|
||||||
if (navToSignIn.evaluate().isNotEmpty) {
|
// final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage'));
|
||||||
await widget.tap(navToSignIn);
|
// if (navToSignUp.evaluate().isNotEmpty) {
|
||||||
await widget.pumpAndSettle();
|
// await widget.tap(navToSignUp);
|
||||||
}
|
// await widget.pumpAndSettle();
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
Future<void> _auth(Map<String, dynamic> credentials) async {
|
// Future<void> _navigateToSignIn() async {
|
||||||
await _enterCredentials(credentials);
|
// await widget.pumpAndSettle();
|
||||||
await _submit('SubmitButtonWidget');
|
// final Finder navToSignIn = find.byKey(const ValueKey<String>('toggleSignInPage'));
|
||||||
}
|
// expect(navToSignIn, findsOneWidget);
|
||||||
|
// if (navToSignIn.evaluate().isNotEmpty) {
|
||||||
|
// await widget.tap(navToSignIn);
|
||||||
|
// await widget.pumpAndSettle();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
Future<void> _send(Map<String, dynamic> credentials) async {
|
// Future<void> _auth(Map<String, dynamic> credentials) async {
|
||||||
await _enterCredentials(credentials);
|
// await _enterCredentials(credentials);
|
||||||
await _submit('SendButtonWidget');
|
// await _submit('SubmitButtonWidget');
|
||||||
}
|
// }
|
||||||
|
|
||||||
Future<void> _enterCredentials(Map<String, dynamic> credentials) async {
|
// Future<void> _send(Map<String, dynamic> credentials) async {
|
||||||
await widget.pumpAndSettle();
|
// await _enterCredentials(credentials);
|
||||||
for (var entry in credentials.entries) {
|
// await _submit('SendButtonWidget');
|
||||||
final Finder field = find.byKey(ValueKey<String>(entry.key));
|
// }
|
||||||
await widget.pumpAndSettle();
|
|
||||||
expect(field, findsOneWidget);
|
|
||||||
await widget.enterText(field, entry.value);
|
|
||||||
await widget.pumpAndSettle();
|
|
||||||
}
|
|
||||||
await widget.pumpAndSettle();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _submit(String key) async {
|
// Future<void> _enterCredentials(Map<String, dynamic> credentials) async {
|
||||||
await widget.pumpAndSettle();
|
// await widget.pumpAndSettle();
|
||||||
final Finder submitButton = find.byKey(ValueKey<String>(key));
|
// for (var entry in credentials.entries) {
|
||||||
await widget.pumpAndSettle();
|
// final Finder field = find.byKey(ValueKey<String>(entry.key));
|
||||||
if (submitButton.evaluate().isNotEmpty) {
|
// await widget.pumpAndSettle();
|
||||||
await widget.tap(submitButton);
|
// expect(field, findsOneWidget);
|
||||||
await widget.pumpAndSettle();
|
// await widget.enterText(field, entry.value);
|
||||||
}
|
// await widget.pumpAndSettle();
|
||||||
|
// }
|
||||||
|
// await widget.pumpAndSettle();
|
||||||
|
// }
|
||||||
|
|
||||||
final Finder throwExceptionWidget = find.byKey(const ValueKey<String>('ThrowExceptionWidget'));
|
// Future<void> _submit(String key) async {
|
||||||
await widget.pumpAndSettle();
|
// await widget.pumpAndSettle();
|
||||||
if (throwExceptionWidget.evaluate().isNotEmpty) {
|
// final Finder submitButton = find.byKey(ValueKey<String>(key));
|
||||||
await widget.ensureVisible(throwExceptionWidget);
|
// await widget.pumpAndSettle();
|
||||||
await widget.tap(throwExceptionWidget);
|
// if (submitButton.evaluate().isNotEmpty) {
|
||||||
await widget.pumpAndSettle();
|
// await widget.tap(submitButton);
|
||||||
} else {
|
// await widget.pumpAndSettle();
|
||||||
await _navigateBackUsingSystemGesture();
|
// }
|
||||||
}
|
|
||||||
}
|
// final Finder throwExceptionWidget = find.byKey(const ValueKey<String>('ThrowExceptionWidget'));
|
||||||
|
// await widget.pumpAndSettle();
|
||||||
|
// if (throwExceptionWidget.evaluate().isNotEmpty) {
|
||||||
|
// await widget.ensureVisible(throwExceptionWidget);
|
||||||
|
// await widget.tap(throwExceptionWidget);
|
||||||
|
// await widget.pumpAndSettle();
|
||||||
|
// } else {
|
||||||
|
// await _navigateBackUsingSystemGesture();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
Loading…
Reference in New Issue