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.title,
|
||||
required this.icon,
|
||||
required super.safeSetState,
|
||||
}) : super(action: action, title: title, icon: icon);
|
||||
|
||||
@override
|
||||
|
|
|
@ -9,7 +9,6 @@ class MenuCardItem extends MenuEntry {
|
|||
required this.action,
|
||||
required this.title,
|
||||
required this.icon,
|
||||
required super.safeSetState,
|
||||
}) : super(action: action, title: title, icon: icon);
|
||||
|
||||
@override
|
||||
|
|
|
@ -28,11 +28,9 @@ abstract class MenuEntry extends StatefulWidget {
|
|||
required this.action,
|
||||
required this.title,
|
||||
required this.icon,
|
||||
required this.safeSetState,
|
||||
});
|
||||
|
||||
final Function() action;
|
||||
final String title;
|
||||
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:flutter/material.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/storage_helper.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';
|
||||
import 'package:hub/shared/services/localization/localization_service.dart';
|
||||
|
||||
class LocalProfileComponentWidget extends StatefulWidget {
|
||||
const LocalProfileComponentWidget({super.key});
|
||||
|
@ -22,145 +18,115 @@ class LocalProfileComponentWidget extends StatefulWidget {
|
|||
}
|
||||
|
||||
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
|
||||
Widget build(BuildContext context) {
|
||||
final textScaler = MediaQuery.textScalerOf(context);
|
||||
final double baseFontSize = 14.0;
|
||||
final double scaledFontSize = baseFontSize * textScaler.scale(1);
|
||||
final double limitedFontSize = scaledFontSize > 20 ? 12 : scaledFontSize;
|
||||
return BlocProvider<LocalProfileBloc>(
|
||||
create: (context) => LocalProfileBloc()..add(LocalProfileEvent()),
|
||||
child: BlocBuilder<LocalProfileBloc, LocalProfileState>(
|
||||
builder: (context, state) {
|
||||
final textScaler = MediaQuery.textScalerOf(context);
|
||||
final double baseFontSize = 14.0;
|
||||
final double scaledFontSize = baseFontSize * textScaler.scale(1);
|
||||
final double limitedFontSize = scaledFontSize > 20 ? 12 : scaledFontSize;
|
||||
|
||||
return Container(
|
||||
decoration: const BoxDecoration(),
|
||||
child: Align(
|
||||
alignment: const AlignmentDirectional(0.0, -1.0),
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
elevation: 0.0,
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
height: 119.0,
|
||||
decoration: BoxDecoration(
|
||||
color: FlutterFlowTheme.of(context).primary,
|
||||
border: Border.all(
|
||||
color: FlutterFlowTheme.of(context).primary,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
Align(
|
||||
alignment: const AlignmentDirectional(-1.0, 0.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(2.0),
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
onTap: () async {
|
||||
await StorageHelper().s(KeychainStorageKey.clientUUID.value, '');
|
||||
await LocalizationService.processLocals(context).whenComplete(() => onUpdate());
|
||||
},
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(200.0),
|
||||
child: CachedNetworkImage(
|
||||
imageBuilder: (context, imageProvider) => Container(
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: imageProvider,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
),
|
||||
imageUrl: valueOrDefault(
|
||||
'https://freaccess.com.br/freaccess/Images/Clients/${_model.cliUUID}.png',
|
||||
'assets/images/home.png'),
|
||||
width: 80.0,
|
||||
height: 80.0,
|
||||
fit: BoxFit.cover,
|
||||
alignment: const Alignment(0.0, 0.0),
|
||||
placeholder: (context, url) => Image.asset('assets/images/home.png'),
|
||||
errorListener: (_) => Image.asset('assets/images/home.png'),
|
||||
errorWidget: (_, __, ___) => Image.asset('assets/images/home.png'),
|
||||
),
|
||||
)),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Tooltip(
|
||||
message: valueOrDefault<String>(
|
||||
functions.convertToUppercase(_model.cliName),
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'SEM LOCAL VINCULADO',
|
||||
enText: 'NO LINKED LOCAL',
|
||||
),
|
||||
return Container(
|
||||
decoration: const BoxDecoration(),
|
||||
child: Align(
|
||||
alignment: const AlignmentDirectional(0.0, -1.0),
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
elevation: 0.0,
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
height: 119.0,
|
||||
decoration: BoxDecoration(
|
||||
color: FlutterFlowTheme.of(context).primary,
|
||||
border: Border.all(
|
||||
color: FlutterFlowTheme.of(context).primary,
|
||||
),
|
||||
child: Text(
|
||||
valueOrDefault<String>(
|
||||
functions.convertToUppercase(_model.cliName),
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'SEM LOCAL VINCULADO',
|
||||
enText: 'NO LINKED LOCAL',
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: [
|
||||
Align(
|
||||
alignment: const AlignmentDirectional(-1.0, 0.0),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(2.0),
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
focusColor: Colors.transparent,
|
||||
hoverColor: Colors.transparent,
|
||||
highlightColor: Colors.transparent,
|
||||
onTap: () async {
|
||||
await StorageHelper().s(KeychainStorageKey.clientUUID.value, '');
|
||||
await LocalizationService.processLocals(context).whenComplete(
|
||||
() async => context.read<LocalProfileBloc>().add(LocalProfileEvent()));
|
||||
},
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(200.0),
|
||||
child: CachedNetworkImage(
|
||||
imageBuilder: (context, imageProvider) => Container(
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: imageProvider,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
),
|
||||
imageUrl: valueOrDefault(
|
||||
'https://freaccess.com.br/freaccess/Images/Clients/${state.cliUUID}.png',
|
||||
'assets/images/home.png'),
|
||||
width: 80.0,
|
||||
height: 80.0,
|
||||
fit: BoxFit.cover,
|
||||
alignment: const Alignment(0.0, 0.0),
|
||||
placeholder: (context, url) => Image.asset('assets/images/home.png'),
|
||||
errorListener: (_) => Image.asset('assets/images/home.png'),
|
||||
errorWidget: (_, __, ___) => Image.asset('assets/images/home.png'),
|
||||
),
|
||||
)),
|
||||
),
|
||||
),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 1,
|
||||
style: FlutterFlowTheme.of(context).labelMedium.override(
|
||||
fontFamily: 'Nunito',
|
||||
color: FlutterFlowTheme.of(context).info,
|
||||
fontSize: limitedFontSize,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'),
|
||||
Expanded(
|
||||
child: Tooltip(
|
||||
message: valueOrDefault<String>(
|
||||
convertToUppercase(state.cliName),
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'SEM LOCAL VINCULADO',
|
||||
enText: 'NO LINKED LOCAL',
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
valueOrDefault<String>(
|
||||
convertToUppercase(state.cliName),
|
||||
FFLocalizations.of(context).getVariableText(
|
||||
ptText: 'SEM LOCAL VINCULADO',
|
||||
enText: 'NO LINKED LOCAL',
|
||||
),
|
||||
),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 1,
|
||||
style: FlutterFlowTheme.of(context).labelMedium.override(
|
||||
fontFamily: 'Nunito',
|
||||
color: FlutterFlowTheme.of(context).info,
|
||||
fontSize: limitedFontSize,
|
||||
letterSpacing: 0.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
]
|
||||
.divide(const SizedBox(width: 20.0))
|
||||
.addToStart(const SizedBox(width: 20.0))
|
||||
.addToEnd(const SizedBox(width: 20.0)),
|
||||
),
|
||||
),
|
||||
]
|
||||
.divide(const SizedBox(width: 20.0))
|
||||
.addToStart(const SizedBox(width: 20.0))
|
||||
.addToEnd(const SizedBox(width: 20.0)),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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,78 +1,80 @@
|
|||
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_bloc/flutter_bloc.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';
|
||||
import '/components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
import 'menu_component_model.dart';
|
||||
class MenuComponentWidget extends StatelessWidget {
|
||||
final MenuView style;
|
||||
final MenuItem item;
|
||||
final bool expandable;
|
||||
final List<Module> menuOptions;
|
||||
|
||||
export 'menu_component_model.dart';
|
||||
|
||||
class MenuComponentWidget extends StatefulWidget {
|
||||
final MenuComponentModel model;
|
||||
const MenuComponentWidget({super.key, required this.model});
|
||||
|
||||
@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();
|
||||
}
|
||||
const MenuComponentWidget({
|
||||
super.key,
|
||||
required this.style,
|
||||
required this.item,
|
||||
required this.expandable,
|
||||
required this.menuOptions,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Builder(
|
||||
builder: (context) {
|
||||
if (widget.model.style == MenuView.list_grid)
|
||||
return wrapWithModel(
|
||||
model: widget.model.menuStaggeredViewComponentModel,
|
||||
updateCallback: () => setState(() {}),
|
||||
updateOnChange: true,
|
||||
child: MenuStaggeredViewComponentWidget(
|
||||
options: widget.model.menuEntries,
|
||||
expandable: widget.model.expandable,
|
||||
item: widget.model.item,
|
||||
changeMenuStyle: () async {},
|
||||
isGrid: widget.model.isGrid,
|
||||
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(key.currentContext!).primaryBackground,
|
||||
color: FlutterFlowTheme.of(key.currentContext!).primary),
|
||||
),
|
||||
);
|
||||
if (widget.model.style == MenuView.list)
|
||||
return wrapWithModel(
|
||||
model: widget.model.menuListViewComponentModel,
|
||||
updateCallback: () => setState(() {}),
|
||||
updateOnChange: true,
|
||||
child: MenuListViewComponentWidget(
|
||||
options: widget.model.menuEntries,
|
||||
expandable: widget.model.expandable,
|
||||
item: widget.model.item,
|
||||
changeMenuStyle: () async {},
|
||||
),
|
||||
);
|
||||
|
||||
return const SizedBox();
|
||||
}
|
||||
return BlocProvider(
|
||||
create: (context) => MenuBloc(
|
||||
style: style,
|
||||
item: item,
|
||||
expandable: expandable,
|
||||
menuOptions: menuOptions,
|
||||
)..add(MenuEvent()),
|
||||
child: BlocBuilder<MenuBloc, MenuState>(
|
||||
builder: (context, state) {
|
||||
if (style == MenuView.list_grid) {
|
||||
return MenuStaggeredViewComponentWidget(
|
||||
options: state.menuEntries,
|
||||
expandable: expandable,
|
||||
item: item,
|
||||
changeMenuStyle: () async {},
|
||||
isGrid: state.isGrid,
|
||||
);
|
||||
} else if (style == MenuView.list) {
|
||||
return MenuListViewComponentWidget(
|
||||
options: state.menuEntries,
|
||||
expandable: expandable,
|
||||
item: item,
|
||||
changeMenuStyle: () async {},
|
||||
);
|
||||
}
|
||||
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/storage_helper.dart';
|
||||
|
||||
|
||||
class UpArrowLinkedLocalsComponentModel extends FlutterFlowModel<UpArrowLinkedLocalsComponentWidget> {
|
||||
late final String devUUID;
|
||||
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/storage_helper.dart';
|
||||
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
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/storage_helper.dart';
|
||||
|
||||
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
import '/flutter_flow/flutter_flow_util.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/storage_helper.dart';
|
||||
|
||||
|
||||
class ScheduleProvisionalVisitPageModel extends FlutterFlowModel<ScheduleProvisionalVisitPageWidget> {
|
||||
String cliUUID = '';
|
||||
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/storage_helper.dart';
|
||||
|
||||
|
||||
import '/backend/api_requests/api_calls.dart';
|
||||
import '/flutter_flow/flutter_flow_util.dart';
|
||||
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/storage_helper.dart';
|
||||
|
||||
|
||||
class VisitorSearchModalTemplateComponentModel extends FlutterFlowModel<VisitorSearchModalTemplateComponentWidget> {
|
||||
late final String devUUID;
|
||||
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/fast_pass_page/fast_pass_page_widget.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/message_history_page/message_history_page_widget.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/register_visitor_page/register_visitor_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/sign_in_page/sign_in_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, _) {
|
||||
return FutureBuilder<Widget>(
|
||||
future: () async {
|
||||
final bool isLogged =
|
||||
await StorageHelper().g(SecureStorageKey.isLogged.value) ==
|
||||
'true';
|
||||
final bool haveLocal =
|
||||
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;
|
||||
final bool isLogged = await StorageHelper().g(SecureStorageKey.isLogged.value) == 'true';
|
||||
final bool haveLocal = 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) {
|
||||
return haveLocal
|
||||
? const HomePageWidget()
|
||||
: const ReceptionPageWidget();
|
||||
return haveLocal ? const HomePageWidget() : const ReceptionPageWidget();
|
||||
} else {
|
||||
return const WelcomePageWidget();
|
||||
}
|
||||
|
@ -124,10 +113,8 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
name: 'forgotPassword',
|
||||
path: '/forgotPassword',
|
||||
builder: (context, params) {
|
||||
late final String email =
|
||||
params.getParam('email', ParamType.String);
|
||||
late final String token =
|
||||
params.getParam('token', ParamType.String);
|
||||
late final String email = params.getParam('email', ParamType.String);
|
||||
late final String token = params.getParam('token', ParamType.String);
|
||||
|
||||
return ForgotPasswordScreen(
|
||||
key: UniqueKey(),
|
||||
|
@ -135,100 +122,32 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
token: token,
|
||||
);
|
||||
}),
|
||||
FFRoute(
|
||||
name: 'homePage',
|
||||
path: '/homePage',
|
||||
builder: (context, params) => HomePageWidget(key: UniqueKey())),
|
||||
FFRoute(
|
||||
name: 'petsOnThePropertyPage',
|
||||
path: '/petsOnThePropertyPage',
|
||||
builder: (context, params) =>
|
||||
Scaffold(body: const PetsHistoryScreen(isApp: true))),
|
||||
FFRoute(
|
||||
name: 'vehiclesOnThePropertyPage',
|
||||
path: '/vehiclesOnThePropertyPage',
|
||||
builder: (context, params) => const VehicleOnTheProperty()),
|
||||
FFRoute(
|
||||
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(name: 'homePage', path: '/homePage', builder: (context, params) => HomePageWidget(key: UniqueKey())),
|
||||
FFRoute(name: 'petsOnThePropertyPage', path: '/petsOnThePropertyPage', builder: (context, params) => Scaffold(body: const PetsHistoryScreen(isApp: true))),
|
||||
FFRoute(name: 'vehiclesOnThePropertyPage', path: '/vehiclesOnThePropertyPage', builder: (context, params) => const VehicleOnTheProperty()),
|
||||
FFRoute(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: 'residentsOnThePropertyPage', path: '/residentsOnThePropertyPage', builder: (context, params) => ResidentsOnTheProperty()),
|
||||
FFRoute(name: 'peopleOnThePropertyPage', path: '/peopleOnThePropertyPage', builder: (context, params) => PeopleOnThePropertyPage()),
|
||||
FFRoute(
|
||||
name: 'acessHistoryPage',
|
||||
path: '/acessHistoryPage',
|
||||
builder: (context, params) => AccessHistoryScreen(opt: const {
|
||||
'personType': '.*',
|
||||
'accessType': '.*',
|
||||
'search': '.*'
|
||||
})),
|
||||
FFRoute(
|
||||
name: 'liberationHistory',
|
||||
path: '/liberationHistory',
|
||||
builder: (context, params) => const LiberationHistoryWidget()),
|
||||
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()),
|
||||
builder: (context, params) => AccessHistoryScreen(opt: const {'personType': '.*', 'accessType': '.*', 'search': '.*'})),
|
||||
FFRoute(name: 'liberationHistory', path: '/liberationHistory', builder: (context, params) => const LiberationHistoryWidget()),
|
||||
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(
|
||||
name: 'petsPage',
|
||||
path: '/petsPage',
|
||||
|
@ -244,9 +163,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
|
||||
extension NavParamExtensions on Map<String, String?> {
|
||||
Map<String, String> get withoutNulls => Map.fromEntries(
|
||||
entries
|
||||
.where((e) => e.value != null)
|
||||
.map((e) => MapEntry(e.key, e.value!)),
|
||||
entries.where((e) => e.value != null).map((e) => MapEntry(e.key, e.value!)),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -260,23 +177,18 @@ extension NavigationExtensions on BuildContext {
|
|||
}
|
||||
|
||||
extension _GoRouterStateExtensions on GoRouterState {
|
||||
Map<String, dynamic> get extraMap =>
|
||||
extra != null ? extra as Map<String, dynamic> : {};
|
||||
Map<String, dynamic> get extraMap => extra != null ? extra as Map<String, dynamic> : {};
|
||||
Map<String, dynamic> get allParams => <String, dynamic>{}
|
||||
..addAll(pathParameters)
|
||||
..addAll(uri.queryParameters)
|
||||
..addAll(extraMap);
|
||||
TransitionInfo get transitionInfo => extraMap.containsKey(kTransitionInfoKey)
|
||||
? extraMap[kTransitionInfoKey] as TransitionInfo
|
||||
: TransitionInfo.appDefault();
|
||||
TransitionInfo get transitionInfo => extraMap.containsKey(kTransitionInfoKey) ? extraMap[kTransitionInfoKey] as TransitionInfo : TransitionInfo.appDefault();
|
||||
}
|
||||
|
||||
extension GoRouterLocationExtension on GoRouter {
|
||||
String getCurrentLocation() {
|
||||
final RouteMatch lastMatch = routerDelegate.currentConfiguration.last;
|
||||
final RouteMatchList matchList = lastMatch is ImperativeRouteMatch
|
||||
? lastMatch.matches
|
||||
: routerDelegate.currentConfiguration;
|
||||
final RouteMatchList matchList = lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration;
|
||||
return matchList.uri.toString();
|
||||
}
|
||||
}
|
||||
|
@ -288,18 +200,13 @@ class FFParameters {
|
|||
final Map<String, Future<dynamic> Function(String)> asyncParams;
|
||||
Map<String, dynamic> futureParamValues = {};
|
||||
|
||||
bool get isEmpty =>
|
||||
state.allParams.isEmpty ||
|
||||
(state.allParams.length == 1 &&
|
||||
state.extraMap.containsKey(kTransitionInfoKey));
|
||||
bool isAsyncParam(MapEntry<String, dynamic> param) =>
|
||||
asyncParams.containsKey(param.key) && param.value is String;
|
||||
bool get isEmpty => state.allParams.isEmpty || (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);
|
||||
Future<bool> completeFutures() => Future.wait(
|
||||
state.allParams.entries.where(isAsyncParam).map(
|
||||
(param) async {
|
||||
final doc = await asyncParams[param.key]!(param.value)
|
||||
.onError((_, __) => null);
|
||||
final doc = await asyncParams[param.key]!(param.value).onError((_, __) => null);
|
||||
if (doc != null) {
|
||||
futureParamValues[param.key] = doc;
|
||||
return true;
|
||||
|
@ -309,15 +216,12 @@ class FFParameters {
|
|||
),
|
||||
).onError((_, __) => [false]).then((v) => v.every((e) => e));
|
||||
|
||||
dynamic getParam<T>(String paramName, ParamType type,
|
||||
{bool isList = false, StructBuilder<T>? structBuilder}) {
|
||||
if (futureParamValues.containsKey(paramName))
|
||||
return futureParamValues[paramName];
|
||||
dynamic getParam<T>(String paramName, ParamType type, {bool isList = false, StructBuilder<T>? structBuilder}) {
|
||||
if (futureParamValues.containsKey(paramName)) return futureParamValues[paramName];
|
||||
if (!state.allParams.containsKey(paramName)) return null;
|
||||
final param = state.allParams[paramName];
|
||||
if (param is! String) return param;
|
||||
return deserializeParam<T>(param, type, isList,
|
||||
structBuilder: structBuilder);
|
||||
return deserializeParam<T>(param, type, isList, structBuilder: structBuilder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,16 +261,13 @@ class FFRoute {
|
|||
key: state.pageKey,
|
||||
child: child,
|
||||
transitionDuration: transitionInfo.duration,
|
||||
transitionsBuilder:
|
||||
(context, animation, secondaryAnimation, child) =>
|
||||
PageTransition(
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) => PageTransition(
|
||||
type: transitionInfo.transitionType,
|
||||
duration: transitionInfo.duration,
|
||||
reverseDuration: transitionInfo.duration,
|
||||
alignment: transitionInfo.alignment,
|
||||
child: child,
|
||||
).buildTransitions(
|
||||
context, animation, secondaryAnimation, child),
|
||||
).buildTransitions(context, animation, secondaryAnimation, child),
|
||||
)
|
||||
: MaterialPage(key: state.pageKey, child: child);
|
||||
},
|
||||
|
@ -387,8 +288,7 @@ class TransitionInfo {
|
|||
final Duration duration;
|
||||
final Alignment? alignment;
|
||||
|
||||
static TransitionInfo appDefault() =>
|
||||
const TransitionInfo(hasTransition: false);
|
||||
static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false);
|
||||
}
|
||||
|
||||
class RootPageContext {
|
||||
|
@ -400,11 +300,8 @@ class RootPageContext {
|
|||
final rootPageContext = context.read<RootPageContext?>();
|
||||
final isRootPage = rootPageContext?.isRootPage ?? false;
|
||||
final location = GoRouterState.of(context).uri.toString();
|
||||
return isRootPage &&
|
||||
location != '/' &&
|
||||
location != rootPageContext?.errorRoute;
|
||||
return isRootPage && location != '/' && location != rootPageContext?.errorRoute;
|
||||
}
|
||||
|
||||
static Widget wrap(Widget child, {String? errorRoute}) =>
|
||||
Provider.value(value: RootPageContext(true, errorRoute), child: child);
|
||||
static Widget wrap(Widget child, {String? errorRoute}) => 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/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/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/qr_code_page/qr_code_page_widget.dart' show QrCodePageWidget;
|
||||
export 'pages/register_visitor_page/register_visitor_page_widget.dart' show RegisterVisitorPageWidget;
|
||||
export 'pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart'
|
||||
show ScheduleCompleteVisitPageWidget;
|
||||
export 'pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart' show ScheduleCompleteVisitPageWidget;
|
||||
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/welcome_page/welcome_page_widget.dart' show WelcomePageWidget;
|
||||
|
|
|
@ -62,8 +62,7 @@ class App extends StatefulWidget {
|
|||
@override
|
||||
State<App> createState() => _AppState();
|
||||
|
||||
static _AppState of(BuildContext context) =>
|
||||
context.findAncestorStateOfType<_AppState>()!;
|
||||
static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!;
|
||||
}
|
||||
|
||||
class _AppState extends State<App> with WidgetsBindingObserver {
|
||||
|
@ -105,8 +104,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
}),
|
||||
),
|
||||
);
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates =
|
||||
const [
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = const [
|
||||
FFLocalizationsDelegate(),
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
|
@ -148,8 +146,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
await StorageHelper().s(SecureStorageKey.haveLocal.value, true);
|
||||
log('onMessageOpenedApp');
|
||||
} else {
|
||||
onMessageReceived(message.data, message.notification!.body,
|
||||
message.data['click_action']);
|
||||
onMessageReceived(message.data, message.notification!.body, message.data['click_action']);
|
||||
}
|
||||
});
|
||||
FirebaseMessaging.instance.getInitialMessage().then((message) async {
|
||||
|
|
|
@ -1,40 +1,20 @@
|
|||
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/pages/about_property_page/about_property_screen.dart';
|
||||
import 'package:hub/shared/helpers/license/license_helper.dart';
|
||||
|
||||
class AboutPropertyModel extends FlutterFlowModel<AboutPropertyPage> {
|
||||
dynamic item;
|
||||
|
||||
VoidCallback? safeSetState;
|
||||
|
||||
late MenuComponentModel menuComponentModel;
|
||||
|
||||
Future<void> initAsync() async {
|
||||
safeSetState?.call();
|
||||
}
|
||||
|
||||
@override
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
// ignore: must_be_immutable
|
||||
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/organism_components/menu_component/menu_component_widget.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/nav/nav.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
|
||||
class AboutPropertyPage extends StatefulWidget {
|
||||
|
@ -43,15 +69,11 @@ class _AboutPropertyPageState extends State<AboutPropertyPage> with SingleTicker
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: _buildAppBar(context),
|
||||
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||
body: _buildBody(context));
|
||||
return Scaffold(appBar: _buildAppBar(context), backgroundColor: FlutterFlowTheme.of(context).primaryBackground, body: _buildBody(context));
|
||||
}
|
||||
|
||||
PreferredSizeWidget _buildAppBar(BuildContext context) {
|
||||
final String title =
|
||||
FFLocalizations.of(context).getVariableText(ptText: "Sobre a Propriedade", enText: "About the Property");
|
||||
final String title = FFLocalizations.of(context).getVariableText(ptText: "Sobre a Propriedade", enText: "About the Property");
|
||||
return AppBarUtil(
|
||||
title: title,
|
||||
onBackButtonPressed: () => context.pop(),
|
||||
|
@ -62,14 +84,13 @@ class _AboutPropertyPageState extends State<AboutPropertyPage> with SingleTicker
|
|||
return SingleChildScrollView(
|
||||
child: Container(
|
||||
color: FlutterFlowTheme.of(context).primaryBackground,
|
||||
child: wrapWithModel(
|
||||
model: _model.menuComponentModel,
|
||||
updateCallback: () => setState(() {}),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(bottom: 40),
|
||||
child: MenuComponentWidget(model: _model.menuComponentModel),
|
||||
),
|
||||
),
|
||||
child: MenuComponentWidget(expandable: true, style: MenuView.list_grid, item: MenuItem.button, menuOptions: [
|
||||
Module.pets,
|
||||
Module.residents,
|
||||
Module.openedVisits,
|
||||
Module.vehicles,
|
||||
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/storage_helper.dart';
|
||||
|
||||
|
||||
class AcessHistoryPageModel extends FlutterFlowModel<AccessHistoryScreen> {
|
||||
late final String devUUID;
|
||||
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/material.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/menu_component/menu_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/home_page/home_page_model.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
import 'package:hub/shared/helpers/license/license_helper.dart';
|
||||
import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart';
|
||||
|
||||
import 'index.dart';
|
||||
|
||||
class HomePageWidget extends StatefulWidget {
|
||||
const HomePageWidget({super.key});
|
||||
|
||||
|
@ -18,43 +21,21 @@ class HomePageWidget extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _HomePageWidgetState extends State<HomePageWidget> {
|
||||
late HomePageModel _model;
|
||||
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
|
||||
Widget build(BuildContext context) {
|
||||
StorageHelper().context = context;
|
||||
return Scaffold(
|
||||
key: scaffoldKey,
|
||||
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||
// drawer: buildDrawer(context),
|
||||
drawerEnableOpenDragGesture: true,
|
||||
drawerDragStartBehavior: DragStartBehavior.start,
|
||||
drawer: CustomDrawer(model: _model),
|
||||
appBar: buildAppBar(context),
|
||||
body: buildPage(context),
|
||||
return BlocProvider(
|
||||
create: (context) => HomeBloc()..add(HomeEvent()),
|
||||
child: Scaffold(
|
||||
key: scaffoldKey,
|
||||
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||
drawerEnableOpenDragGesture: true,
|
||||
drawerDragStartBehavior: DragStartBehavior.start,
|
||||
drawer: CustomDrawer(),
|
||||
appBar: buildAppBar(context),
|
||||
body: buildPage(context),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -139,25 +120,19 @@ class _HomePageWidgetState extends State<HomePageWidget> {
|
|||
Widget buildBody() {
|
||||
return Container(
|
||||
color: FlutterFlowTheme.of(context).primaryBackground,
|
||||
child: wrapWithModel(
|
||||
model: _model.homeMenuComponentModel,
|
||||
updateOnChange: true,
|
||||
updateCallback: () => setState(() {}),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 40),
|
||||
child: MenuComponentWidget(
|
||||
model: _model.homeMenuComponentModel,
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 40),
|
||||
child: MenuComponentWidget(
|
||||
expandable: true,
|
||||
style: MenuView.list_grid,
|
||||
item: MenuItem.button,
|
||||
menuOptions: Module.values.where((e) => e != Module.logout).toList(),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildLocal() {
|
||||
return wrapWithModel(
|
||||
model: _model.localComponentModel,
|
||||
updateCallback: () => safeSetState(() {}),
|
||||
child: _localProfileComponentWidget,
|
||||
);
|
||||
return 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/storage_helper.dart';
|
||||
|
||||
|
||||
class LiberationHistoryModel extends FlutterFlowModel<LiberationHistoryWidget> {
|
||||
late final String devUUID;
|
||||
late final String userUUID;
|
||||
|
|
|
@ -1,28 +1,14 @@
|
|||
import 'package:flutter/material.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/shared/helpers/storage/base_storage.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
|
||||
|
||||
class PeopleOnThePropertyPageModel extends FlutterFlowModel<PeopleOnThePropertyPage> {
|
||||
PeopleOnThePropertyPageModel({this.onRefresh});
|
||||
late final VoidCallback? onRefresh;
|
||||
/// State fields for stateful widgets in this page.
|
||||
|
||||
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();
|
||||
}
|
||||
void initState(BuildContext context) {}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
|
|
|
@ -1,135 +1,68 @@
|
|||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.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/flutter_flow/nav/nav.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 'package:hub/shared/utils/log_util.dart';
|
||||
|
||||
import '../../shared/utils/log_util.dart';
|
||||
|
||||
class PeopleOnThePropertyPage extends StatefulWidget {
|
||||
const PeopleOnThePropertyPage({super.key});
|
||||
|
||||
@override
|
||||
_PeopleOnThePropertyPageState createState() => _PeopleOnThePropertyPageState();
|
||||
State<PeopleOnThePropertyPage> createState() => _PeopleOnThePropertyPageState();
|
||||
}
|
||||
|
||||
class _PeopleOnThePropertyPageState extends State<PeopleOnThePropertyPage> with TickerProviderStateMixin {
|
||||
late ScrollController _scrollController;
|
||||
class _PeopleOnThePropertyPageState extends State<PeopleOnThePropertyPage> {
|
||||
late PeopleOnThePropertyPageModel _model;
|
||||
|
||||
int _pageNumber = 1;
|
||||
bool _hasData = false;
|
||||
bool _loading = false;
|
||||
int count = 0;
|
||||
|
||||
late final PeopleOnThePropertyPageModel model;
|
||||
|
||||
late Future<void> _future;
|
||||
List<dynamic> _wrap = [];
|
||||
final scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
model = createModel(context, () => PeopleOnThePropertyPageModel(onRefresh: () => safeSetState(() {})));
|
||||
_future = _fetchVisits();
|
||||
|
||||
_scrollController = ScrollController()
|
||||
..addListener(() {
|
||||
if (_scrollController.position.atEdge && _scrollController.position.pixels != 0) {
|
||||
_loadMore();
|
||||
}
|
||||
});
|
||||
_model = createModel(context, () => PeopleOnThePropertyPageModel());
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.dispose();
|
||||
_model.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
late final limitedHeaderTextSize = LimitedFontSizeUtil.getHeaderFontSize(context);
|
||||
|
||||
return Scaffold(
|
||||
appBar: _appBar(context),
|
||||
key: scaffoldKey,
|
||||
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'),
|
||||
appBar: AppBar(
|
||||
backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
|
||||
automaticallyImplyLeading: false,
|
||||
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(
|
||||
fontFamily: 'Nunito',
|
||||
color: FlutterFlowTheme.of(context).primaryText,
|
||||
|
@ -137,114 +70,103 @@ class _PeopleOnThePropertyPageState extends State<PeopleOnThePropertyPage> with
|
|||
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,
|
||||
actions: const [],
|
||||
centerTitle: true,
|
||||
elevation: 0.0,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
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',
|
||||
body: SafeArea(
|
||||
top: true,
|
||||
child: FutureBuilder<ApiCallResponse>(
|
||||
future: PhpGroup.getPessoasLocalCall.call(),
|
||||
builder: (context, snapshot) {
|
||||
// Customize what your widget looks like when it's loading.
|
||||
if (!snapshot.hasData) {
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
width: 50.0,
|
||||
height: 50.0,
|
||||
child: SpinKitCircle(
|
||||
color: FlutterFlowTheme.of(context).primary,
|
||||
size: 50.0,
|
||||
),
|
||||
},
|
||||
statusHashMap: [],
|
||||
onTapCardItemAction: () async {},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (snapshot.hasError || snapshot.data?.exception != null) {
|
||||
if (snapshot.error != null && snapshot.stackTrace != null) {
|
||||
LogUtil.requestAPIFailed('getPessoasLocal.php', "", 'Busca Pessoas no Local', snapshot.error, snapshot.stackTrace!);
|
||||
}
|
||||
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
height: 100,
|
||||
child: Text(
|
||||
FFLocalizations.of(context).getVariableText(ptText: "Pessoas não encontradas", enText: "Persons not found"),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final columnGetPessoasLocalResponse = snapshot.data!;
|
||||
final getPoepleProperty = PhpGroup.getPessoasLocalCall
|
||||
.pessoas(
|
||||
columnGetPessoasLocalResponse.jsonBody,
|
||||
)
|
||||
?.toList() ??
|
||||
[];
|
||||
|
||||
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)),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
onDowngrade: _onDowngrade,
|
||||
);
|
||||
await LicenseService.setupLicense(database);
|
||||
await LicenseService().setupLicense(database);
|
||||
isInitialized = true;
|
||||
}
|
||||
|
||||
|
@ -42,14 +42,12 @@ class DatabaseStorage {
|
|||
await database.execute(LicenseHelper.createTableQuery);
|
||||
}
|
||||
|
||||
Future<void> _onUpgrade(
|
||||
Database database, int oldVersion, int newVersion) async {
|
||||
Future<void> _onUpgrade(Database database, int oldVersion, int newVersion) async {
|
||||
log('Upgrading database from version $oldVersion to $newVersion...');
|
||||
if (oldVersion < 2) {
|
||||
await database.execute(LicenseHelper.createTableQuery);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onDowngrade(
|
||||
Database database, int oldVersion, int newVersion) async {}
|
||||
Future<void> _onDowngrade(Database database, int oldVersion, int newVersion) async {}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,39 @@ enum InactiveModuleKey {
|
|||
residents,
|
||||
vehicles,
|
||||
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 {
|
||||
|
@ -17,27 +50,16 @@ enum ActiveModuleKey {
|
|||
liberations,
|
||||
reservations,
|
||||
access,
|
||||
pets,
|
||||
orders,
|
||||
completeSchedule,
|
||||
providerSchedule,
|
||||
deliverySchedule,
|
||||
fastPass,
|
||||
qrCode,
|
||||
}
|
||||
|
||||
extension InactiveModuleKeyExtension on InactiveModuleKey {
|
||||
String get value {
|
||||
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 '';
|
||||
}
|
||||
}
|
||||
visitors,
|
||||
peopleOnTheProperty,
|
||||
settings,
|
||||
logout,
|
||||
}
|
||||
|
||||
extension ActiveModuleKeyExtension on ActiveModuleKey {
|
||||
|
@ -51,6 +73,8 @@ extension ActiveModuleKeyExtension on ActiveModuleKey {
|
|||
return 'FRE-HUB-RESERVATIONS';
|
||||
case ActiveModuleKey.access:
|
||||
return 'FRE-HUB-ACCESS';
|
||||
case ActiveModuleKey.pets:
|
||||
return 'FRE-HUB-PETS';
|
||||
case ActiveModuleKey.orders:
|
||||
return 'FRE-HUB-ORDERS';
|
||||
case ActiveModuleKey.completeSchedule:
|
||||
|
@ -59,10 +83,12 @@ extension ActiveModuleKeyExtension on ActiveModuleKey {
|
|||
return 'FRE-HUB-AGE-PROV-PRESTADOR';
|
||||
case ActiveModuleKey.deliverySchedule:
|
||||
return 'FRE-HUB-AGE-PROV-DELIVERY';
|
||||
case ActiveModuleKey.fastPass:
|
||||
return 'FRE-HUB-FASTPASS';
|
||||
case ActiveModuleKey.visitors:
|
||||
return 'FRE-HUB-VISITORS';
|
||||
case ActiveModuleKey.qrCode:
|
||||
return 'FRE-HUB-QRCODE';
|
||||
case ActiveModuleKey.peopleOnTheProperty:
|
||||
return 'FRE-HUB-PEOPLE';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
|
@ -70,20 +96,24 @@ extension ActiveModuleKeyExtension on ActiveModuleKey {
|
|||
}
|
||||
|
||||
enum Module {
|
||||
messages,
|
||||
liberations,
|
||||
reservations,
|
||||
access,
|
||||
openedVisits,
|
||||
vehicles,
|
||||
residents,
|
||||
pets,
|
||||
orders,
|
||||
completeSchedule,
|
||||
providerSchedule,
|
||||
deliverySchedule,
|
||||
fastPass,
|
||||
completeSchedule,
|
||||
orders,
|
||||
reservations,
|
||||
visitors,
|
||||
vehicles,
|
||||
residents,
|
||||
openedVisits,
|
||||
qrCode,
|
||||
pets,
|
||||
access,
|
||||
liberations,
|
||||
messages,
|
||||
aboutProperty,
|
||||
petsHistory,
|
||||
peopleOnTheProperty,
|
||||
settings,
|
||||
logout,
|
||||
}
|
||||
|
@ -115,10 +145,18 @@ extension LicenseKeyExtension on Module {
|
|||
return 'FRE-HUB-AGE-PROV-PRESTADOR';
|
||||
case Module.deliverySchedule:
|
||||
return 'FRE-HUB-AGE-PROV-DELIVERY';
|
||||
case Module.aboutProperty:
|
||||
return 'FRE-HUB-PROPERTY';
|
||||
case Module.fastPass:
|
||||
return 'FRE-HUB-FASTPASS';
|
||||
case Module.visitors:
|
||||
return 'FRE-HUB-VISITORS';
|
||||
case Module.qrCode:
|
||||
return 'FRE-HUB-QRCODE';
|
||||
case Module.peopleOnTheProperty:
|
||||
return 'FRE-HUB-PEOPLE';
|
||||
case Module.petsHistory:
|
||||
return 'FRE-HUB-PETS-HISTORY';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
|
@ -128,13 +166,13 @@ extension LicenseKeyExtension on Module {
|
|||
switch (this) {
|
||||
case Module.messages:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
ptText: 'Mensagens',
|
||||
enText: 'Messages',
|
||||
ptText: 'Consultar Mensagens',
|
||||
enText: 'Messages History',
|
||||
);
|
||||
case Module.liberations:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
ptText: 'Liberar',
|
||||
enText: 'Liberations',
|
||||
ptText: 'Consultar Liberações',
|
||||
enText: 'Liberations History',
|
||||
);
|
||||
case Module.reservations:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
|
@ -143,12 +181,12 @@ extension LicenseKeyExtension on Module {
|
|||
);
|
||||
case Module.access:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
ptText: 'Acessos',
|
||||
enText: 'Access',
|
||||
ptText: 'Consultar Acessos',
|
||||
enText: 'Access History',
|
||||
);
|
||||
case Module.openedVisits:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
ptText: 'Visitas Abertas',
|
||||
ptText: 'Visitas em Aberto',
|
||||
enText: 'Opened Visits',
|
||||
);
|
||||
case Module.vehicles:
|
||||
|
@ -166,10 +204,20 @@ extension LicenseKeyExtension on Module {
|
|||
ptText: '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:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
ptText: 'Encomendas',
|
||||
enText: 'Orders',
|
||||
ptText: 'Minhas Encomendas',
|
||||
enText: 'My Orders',
|
||||
);
|
||||
case Module.completeSchedule:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
|
@ -193,8 +241,18 @@ extension LicenseKeyExtension on Module {
|
|||
);
|
||||
case Module.qrCode:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
ptText: 'QR Code',
|
||||
enText: 'QR Code',
|
||||
ptText: 'QRCode de Acesso',
|
||||
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:
|
||||
return FFLocalizations.of(key.currentContext!).getVariableText(
|
||||
|
@ -212,33 +270,41 @@ extension LicenseKeyExtension on Module {
|
|||
IconData get icon {
|
||||
switch (this) {
|
||||
case Module.messages:
|
||||
return Icons.message;
|
||||
return Icons.chat_outlined;
|
||||
case Module.liberations:
|
||||
return Icons.lock_open;
|
||||
return Icons.how_to_reg_outlined;
|
||||
case Module.reservations:
|
||||
return Icons.calendar_today;
|
||||
return Icons.event_available;
|
||||
case Module.access:
|
||||
return Icons.access_time;
|
||||
return Icons.transfer_within_a_station_outlined;
|
||||
case Module.openedVisits:
|
||||
return Icons.people;
|
||||
return Icons.perm_contact_calendar;
|
||||
case Module.vehicles:
|
||||
return Icons.directions_car;
|
||||
case Module.residents:
|
||||
return Icons.person;
|
||||
return Icons.groups;
|
||||
case Module.pets:
|
||||
return Icons.pets;
|
||||
case Module.petsHistory:
|
||||
return Icons.pets;
|
||||
case Module.peopleOnTheProperty:
|
||||
return Icons.groups;
|
||||
case Module.orders:
|
||||
return Icons.shopping_cart;
|
||||
return Icons.inventory_2_outlined;
|
||||
case Module.completeSchedule:
|
||||
return Icons.schedule;
|
||||
return Icons.event;
|
||||
case Module.providerSchedule:
|
||||
return Icons.engineering_outlined;
|
||||
case Module.deliverySchedule:
|
||||
return Icons.delivery_dining;
|
||||
return Icons.sports_motorsports_outlined;
|
||||
case Module.fastPass:
|
||||
return Icons.fastfood;
|
||||
return Icons.attach_email_outlined;
|
||||
case Module.qrCode:
|
||||
return Icons.qr_code;
|
||||
case Module.visitors:
|
||||
return Icons.person_add_alt_1_outlined;
|
||||
case Module.aboutProperty:
|
||||
return Icons.home;
|
||||
case Module.settings:
|
||||
return Icons.settings;
|
||||
case Module.logout:
|
||||
|
@ -257,23 +323,37 @@ extension LicenseKeyExtension on Module {
|
|||
case Module.access:
|
||||
return '/acessHistoryPage';
|
||||
case Module.openedVisits:
|
||||
return '/visitsOnTheProperty';
|
||||
return '/visitsOnThePropertyPage';
|
||||
case Module.vehicles:
|
||||
return '/vehiclesOnThePropertyPage';
|
||||
case Module.residents:
|
||||
return '/peopleOnThePropertyPage';
|
||||
return '/residentsOnThePropertyPage';
|
||||
case Module.pets:
|
||||
return '/petsPage';
|
||||
case Module.petsHistory:
|
||||
return '/petsHistoryPage';
|
||||
case Module.peopleOnTheProperty:
|
||||
return '/peopleOnThePropertyPage';
|
||||
case Module.orders:
|
||||
return '/packageOrder';
|
||||
case Module.completeSchedule:
|
||||
return '/scheduleCompleteVisitPage';
|
||||
case Module.providerSchedule:
|
||||
return '/provisionalSchedule';
|
||||
case Module.aboutProperty:
|
||||
return '/aboutProperty';
|
||||
case Module.deliverySchedule:
|
||||
return '/deliverySchedule';
|
||||
case Module.fastPass:
|
||||
return '/fastPassPage';
|
||||
case Module.qrCode:
|
||||
return '/qrCodePage';
|
||||
case Module.visitors:
|
||||
return '/registerVisitorPage';
|
||||
case Module.settings:
|
||||
return '/preferencesSettings';
|
||||
case Module.logout:
|
||||
return '/WelcomePage';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
|
@ -303,27 +383,19 @@ class LicenseHelper {
|
|||
await DatabaseStorage.instance.init();
|
||||
}
|
||||
|
||||
static Future<void> insertLicenseFoo(
|
||||
final List<String> key, final String display) async {
|
||||
Future<void> setByKey(final List<String> key, final String display) async {
|
||||
for (var element in key) {
|
||||
log('insertLicenseFoo($element, $display)');
|
||||
DatabaseStorage.database.insert(
|
||||
tableLicense,
|
||||
{
|
||||
'key': element,
|
||||
'display': display,
|
||||
'expirationDate': '',
|
||||
'startDate': '',
|
||||
'quantity': '',
|
||||
},
|
||||
conflictAlgorithm: ConflictAlgorithm.ignore,
|
||||
);
|
||||
await s(element, {
|
||||
'display': display,
|
||||
'expirationDate': '',
|
||||
'startDate': '',
|
||||
'quantity': '',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<String?> g(String key) async {
|
||||
var response = await DatabaseStorage.database.query(tableLicense,
|
||||
where: 'key = ?', whereArgs: [key], columns: ['display']);
|
||||
var response = await DatabaseStorage.database.query(tableLicense, where: 'key = ?', whereArgs: [key], columns: ['display']);
|
||||
if (response.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
|
@ -347,8 +419,7 @@ class LicenseHelper {
|
|||
}
|
||||
|
||||
Future<void> d(String key) async {
|
||||
await DatabaseStorage.database
|
||||
.delete(tableLicense, where: 'key = ?', whereArgs: [key]);
|
||||
await DatabaseStorage.database.delete(tableLicense, where: 'key = ?', whereArgs: [key]);
|
||||
}
|
||||
|
||||
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/storage/base_storage.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
|
@ -30,8 +32,8 @@ class KeychainHelper implements BaseStorage {
|
|||
|
||||
@override
|
||||
Future<String?> get(String key) async {
|
||||
var response = await DatabaseStorage.database
|
||||
.query(tableKeychain, where: 'key = ?', whereArgs: [key]);
|
||||
log('KeychainHelper.get: $key');
|
||||
var response = await DatabaseStorage.database.query(tableKeychain, where: 'key = ?', whereArgs: [key]);
|
||||
if (response.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
|
@ -56,8 +58,7 @@ class KeychainHelper implements BaseStorage {
|
|||
|
||||
@override
|
||||
Future<void> delete(String key) async {
|
||||
await DatabaseStorage.database
|
||||
.delete(tableKeychain, where: 'key = ?', whereArgs: [key]);
|
||||
await DatabaseStorage.database.delete(tableKeychain, where: 'key = ?', whereArgs: [key]);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -22,12 +22,10 @@ class StorageHelper {
|
|||
await SharedPreferencesStorage.instance.init();
|
||||
await KeychainHelper.instance.init();
|
||||
|
||||
String? isFirstRun = await SharedPreferencesStorage.instance
|
||||
.get(SharedPreferencesKey.isFirstRun.value);
|
||||
String? isFirstRun = await SharedPreferencesStorage.instance.get(SharedPreferencesKey.isFirstRun.value);
|
||||
|
||||
if (isFirstRun != 'false') {
|
||||
await SharedPreferencesStorage.instance
|
||||
.set(SharedPreferencesKey.isFirstRun.value, false);
|
||||
await SharedPreferencesStorage.instance.set(SharedPreferencesKey.isFirstRun.value, false);
|
||||
await SecureStorage.instance.set(SecureStorageKey.isLogged.value, false);
|
||||
}
|
||||
}
|
||||
|
@ -46,10 +44,7 @@ class StorageHelper {
|
|||
static BaseStorage getInstanceByKey(String key) {
|
||||
if (SecureStorageKey.values.map((e) => e.value).toList().contains(key)) {
|
||||
return SecureStorage.instance;
|
||||
} else if (SharedPreferencesKey.values
|
||||
.map((e) => e.value)
|
||||
.toList()
|
||||
.contains(key)) {
|
||||
} else if (SharedPreferencesKey.values.map((e) => e.value).toList().contains(key)) {
|
||||
return SharedPreferencesStorage.instance;
|
||||
} else {
|
||||
return KeychainHelper.instance;
|
||||
|
|
|
@ -63,8 +63,7 @@ class DeepLinkService {
|
|||
child: ForgotPasswordScreen(email: email, token: token),
|
||||
),
|
||||
isScrollControlled: true,
|
||||
backgroundColor:
|
||||
FlutterFlowTheme.of(key.currentContext!).primaryBackground,
|
||||
backgroundColor: FlutterFlowTheme.of(key.currentContext!).primaryBackground,
|
||||
showDragHandle: true,
|
||||
useSafeArea: true,
|
||||
enableDrag: true,
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
class KeychainService {
|
||||
static final KeychainService _instance = KeychainService._internal();
|
||||
factory KeychainService() => _instance;
|
||||
|
|
|
@ -3,12 +3,11 @@
|
|||
import 'dart:developer';
|
||||
|
||||
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/license/license_helper.dart';
|
||||
import 'package:hub/shared/helpers/storage/base_storage.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
|
||||
import 'package:rxdart/rxdart.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
|
||||
class LicenseService {
|
||||
|
@ -16,32 +15,23 @@ class LicenseService {
|
|||
factory LicenseService() => _instance;
|
||||
LicenseService._internal();
|
||||
|
||||
static Future<void> setupLicense(Database database) async {
|
||||
await LicenseHelper.insertLicenseFoo(
|
||||
InactiveModuleKey.values.map((e) => e.value).toList(), 'INVISIVEL');
|
||||
await LicenseHelper.insertLicenseFoo(
|
||||
ActiveModuleKey.values.map((e) => e.value).toList(), 'VISIVEL');
|
||||
final _licenseSubject = BehaviorSubject<List<dynamic>>();
|
||||
|
||||
Stream<List<dynamic>> get licenseStream => _licenseSubject.stream;
|
||||
|
||||
Future<void> cleanLicense() async {
|
||||
_licenseSubject.add([]);
|
||||
}
|
||||
|
||||
static Future<void> initLicenseService() async {
|
||||
// for (var element in LicenseStorageKey.values.map((e) => e.value)) {
|
||||
// await SQLiteStorage.database.insert(
|
||||
// SQLiteStorage.tableLicense,
|
||||
// {
|
||||
// 'key': element,
|
||||
// 'display': 'VISIVEL',
|
||||
// 'expirationDate': '',
|
||||
// 'startDate': '',
|
||||
// 'quantity': '',
|
||||
// },
|
||||
// conflictAlgorithm: ConflictAlgorithm.ignore,
|
||||
// );
|
||||
// }
|
||||
Future<void> setupLicense(Database database) async {
|
||||
final List<String> inactiveModuleKey = InactiveModuleKey.values.map((e) => e.value).toList();
|
||||
final List<String> activeModuleKey = ActiveModuleKey.values.map((e) => e.value).toList();
|
||||
await LicenseHelper().setByKey(inactiveModuleKey, 'INVISIVEL');
|
||||
await LicenseHelper().setByKey(activeModuleKey, 'VISIVEL');
|
||||
_licenseSubject.add([...activeModuleKey]);
|
||||
}
|
||||
|
||||
static Future<void> processLicense() async {}
|
||||
|
||||
static Future<bool> fetchLicenses() async {
|
||||
Future<bool> fetchLicenses() async {
|
||||
try {
|
||||
log('Obtendo licenças...');
|
||||
final response = await PhpGroup.getLicense();
|
||||
|
@ -60,7 +50,8 @@ class LicenseService {
|
|||
|
||||
if (responseBody == []) {
|
||||
await setupLicense(DatabaseStorage.database);
|
||||
return true;
|
||||
_licenseSubject.add([]);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (var element in responseBody) {
|
||||
|
@ -68,11 +59,12 @@ class LicenseService {
|
|||
_saveModule(element);
|
||||
}
|
||||
}
|
||||
_licenseSubject.add(responseBody);
|
||||
return true;
|
||||
} catch (e) {
|
||||
log('Erro ao obter licenças: $e');
|
||||
await setupLicense(DatabaseStorage.database);
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,15 +73,16 @@ class LicenseService {
|
|||
}
|
||||
|
||||
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()}');
|
||||
// if (body is Map<String, dynamic>) await StorageHelper().s(body['key'], '');
|
||||
if (body is Map<String, dynamic>)
|
||||
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 '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/shared/helpers/database/database_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:hub/shared/services/license/license_service.dart';
|
||||
import 'package:hub/shared/utils/dialog_util.dart';
|
||||
|
||||
import '../../../backend/api_requests/api_calls.dart';
|
||||
import '../../../components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
|
||||
import '../../../flutter_flow/flutter_flow_util.dart';
|
||||
import '../../utils/log_util.dart';
|
||||
import '../../utils/snackbar_util.dart';
|
||||
import '../authentication/authentication_service.dart';
|
||||
import 'package:hub/shared/utils/log_util.dart';
|
||||
import 'package:hub/shared/utils/snackbar_util.dart';
|
||||
import 'package:hub/shared/extensions/string_extensions.dart';
|
||||
|
||||
class LocalizationService {
|
||||
static Future<void> checkLocals(BuildContext context) async {
|
||||
|
@ -34,15 +35,13 @@ class LocalizationService {
|
|||
enText: 'Verify your connection',
|
||||
ptText: 'Verifique sua conexão',
|
||||
);
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() => selectLocal(context, response));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
|
||||
return;
|
||||
}
|
||||
|
||||
final List<dynamic> locals = response.jsonBody['locais'] ?? [];
|
||||
final bool isEmpty = locals.isEmpty;
|
||||
final bool isActive =
|
||||
locals.where((local) => local['CLU_STATUS'] != 'B').isNotEmpty;
|
||||
final bool isActive = locals.where((local) => local['CLU_STATUS'] != 'B').isNotEmpty;
|
||||
final bool isEnable = !isEmpty && isActive;
|
||||
|
||||
if (isEnable) {
|
||||
|
@ -60,6 +59,7 @@ class LocalizationService {
|
|||
|
||||
static Future<bool> processLocals(BuildContext context) async {
|
||||
try {
|
||||
await LicenseService().cleanLicense();
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
final ApiCallResponse response = await callback.call();
|
||||
final bool? isError = response.jsonBody['error'];
|
||||
|
@ -74,8 +74,7 @@ class LocalizationService {
|
|||
enText: 'Verify your connection',
|
||||
ptText: 'Verifique sua conexão',
|
||||
);
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() => selectLocal(context, response));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -86,8 +85,7 @@ class LocalizationService {
|
|||
final bool isInactived = await _isInactived(locals);
|
||||
final bool isPending = _isPending(locals);
|
||||
final bool isUnique = locals.length == 1;
|
||||
final bool isBlocked =
|
||||
locals.where((local) => local['CLU_STATUS'] == 'B').isNotEmpty;
|
||||
final bool isBlocked = locals.where((local) => local['CLU_STATUS'] == 'B').isNotEmpty;
|
||||
final bool isEnabled = isUnique && isActive;
|
||||
final bool isDisabled = isUnique && isBlocked;
|
||||
final bool isUnselected = await _isUnselected();
|
||||
|
@ -127,8 +125,7 @@ class LocalizationService {
|
|||
enText: 'Error getting locals, verify your connection',
|
||||
ptText: 'Erro ao obter locais, verifique sua conexão',
|
||||
);
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() => selectLocal(context, null));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, null));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -143,8 +140,7 @@ class LocalizationService {
|
|||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
response = await callback.call();
|
||||
final String errorMsg = response.jsonBody['error_msg'];
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() => selectLocal(context, response));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
|
||||
return false;
|
||||
} else if (response.jsonBody == null) {
|
||||
final GetLocalsCall callback = PhpGroup.getLocalsCall;
|
||||
|
@ -153,16 +149,18 @@ class LocalizationService {
|
|||
enText: 'Verify your connection',
|
||||
ptText: 'Verifique sua conexão',
|
||||
);
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() => selectLocal(context, response));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, response));
|
||||
return false;
|
||||
} else {
|
||||
// final bool isNewVersion = await _updateStorageUtil(response.jsonBody);
|
||||
// if (!isNewVersion) {
|
||||
await LicenseService.setupLicense(DatabaseStorage.database);
|
||||
final bool isNewVersion = await _updateStorageUtil(response.jsonBody);
|
||||
if (isNewVersion) {
|
||||
return await LicenseService().fetchLicenses();
|
||||
} else {
|
||||
await LicenseService().setupLicense(DatabaseStorage.database);
|
||||
}
|
||||
log('() => isNewVersion: $isNewVersion');
|
||||
|
||||
return false;
|
||||
// }
|
||||
// return await LicenseService.fetchLicenses();
|
||||
}
|
||||
} catch (e, s) {
|
||||
log('() => stack processData: $s');
|
||||
|
@ -171,14 +169,12 @@ class LocalizationService {
|
|||
enText: 'Error getting data, verify your connection',
|
||||
ptText: 'Erro ao obter dados, verifique sua conexão',
|
||||
);
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() => selectLocal(context, null));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() => selectLocal(context, null));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<bool> selectLocal(
|
||||
BuildContext context, ApiCallResponse? response) async {
|
||||
static Future<bool> selectLocal(BuildContext context, ApiCallResponse? response) async {
|
||||
return await showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
|
@ -242,13 +238,10 @@ class LocalizationService {
|
|||
}
|
||||
|
||||
static void _handleError(BuildContext context, String errorMsg) async {
|
||||
final String devUUID =
|
||||
await StorageHelper().g(KeychainStorageKey.devUUID.value) ?? '';
|
||||
final String userUUID =
|
||||
await StorageHelper().g(KeychainStorageKey.userUUID.value) ?? '';
|
||||
final String devUUID = await StorageHelper().g(KeychainStorageKey.devUUID.value) ?? '';
|
||||
final String userUUID = await StorageHelper().g(KeychainStorageKey.userUUID.value) ?? '';
|
||||
final bool isAuthenticated = userUUID.isNotEmpty && devUUID.isNotEmpty;
|
||||
final bool isDevLinked =
|
||||
!errorMsg.contains('Esse dispositivo nao pertence a esse usuario');
|
||||
final bool isDevLinked = !errorMsg.contains('Esse dispositivo nao pertence a esse usuario');
|
||||
log('() => isLinked: $errorMsg');
|
||||
log('() => isLinked: $errorMsg');
|
||||
if (!isAuthenticated) {
|
||||
|
@ -268,20 +261,15 @@ class LocalizationService {
|
|||
await DialogUtil.warning(context, errorMsg);
|
||||
return;
|
||||
}
|
||||
await DialogUtil.error(context, errorMsg)
|
||||
.whenComplete(() async => await selectLocal(context, null));
|
||||
await DialogUtil.error(context, errorMsg).whenComplete(() async => await selectLocal(context, null));
|
||||
}
|
||||
|
||||
static Future<bool> _handleUnavailable(
|
||||
BuildContext context, List<dynamic> locals) async {
|
||||
static Future<bool> _handleUnavailable(BuildContext context, List<dynamic> locals) async {
|
||||
log('() => isUnavailable');
|
||||
try {
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.clientUUID.value, locals[0]['CLI_ID']);
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.ownerUUID.value, locals[0]['CLU_OWNER_ID']);
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.clientName.value, locals[0]['CLI_NOME']);
|
||||
await StorageHelper().s(KeychainStorageKey.clientUUID.value, locals[0]['CLI_ID']);
|
||||
await StorageHelper().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');
|
||||
if (response.jsonBody['error'] == true) {
|
||||
await StorageHelper().s(KeychainStorageKey.clientUUID.value, '');
|
||||
|
@ -289,28 +277,21 @@ class LocalizationService {
|
|||
await StorageHelper().s(KeychainStorageKey.clientName.value, '');
|
||||
return false;
|
||||
}
|
||||
if (response.jsonBody['error'] == false)
|
||||
return await processData(context).then((value) => value);
|
||||
if (response.jsonBody['error'] == false) return await processData(context).then((value) => value);
|
||||
} catch (e, s) {
|
||||
await DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed(
|
||||
'responderVinculo.php', '', 'Responder Vínculo', e, s);
|
||||
LogUtil.requestAPIFailed('responderVinculo.php', '', 'Responder Vínculo', e, s);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static Future<bool> _handleEnabled(
|
||||
BuildContext context, dynamic local) async {
|
||||
static Future<bool> _handleEnabled(BuildContext context, dynamic local) async {
|
||||
log('() => isEnabled');
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.clientUUID.value, local['CLI_ID']);
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.ownerUUID.value, local['CLU_OWNER_ID']);
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.clientName.value, local['CLI_NOME']);
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.userName.value, local['USU_NOME']);
|
||||
await StorageHelper().s(KeychainStorageKey.clientUUID.value, local['CLI_ID']);
|
||||
await StorageHelper().s(KeychainStorageKey.ownerUUID.value, local['CLU_OWNER_ID']);
|
||||
await StorageHelper().s(KeychainStorageKey.clientName.value, local['CLI_NOME']);
|
||||
await StorageHelper().s(KeychainStorageKey.userName.value, local['USU_NOME']);
|
||||
return await processData(context);
|
||||
}
|
||||
|
||||
|
@ -322,24 +303,21 @@ class LocalizationService {
|
|||
}
|
||||
|
||||
static Future<bool> _updateStorageUtil(Map<String, dynamic> jsonBody) async {
|
||||
await StorageHelper().s(KeychainStorageKey.whatsapp.value,
|
||||
jsonBody['whatsapp'] != null && jsonBody['whatsapp']);
|
||||
await StorageHelper().s(KeychainStorageKey.provisional.value,
|
||||
jsonBody['provisional'] != null && jsonBody['provisional']);
|
||||
await StorageHelper().s(KeychainStorageKey.pets.value,
|
||||
jsonBody['pet'] != null && jsonBody['pet']);
|
||||
await StorageHelper().s(
|
||||
KeychainStorageKey.petAmount.value,
|
||||
jsonBody['petAmountRegister'] != null &&
|
||||
jsonBody['petAmountRegister'].toString().isEmpty
|
||||
? '0'
|
||||
: jsonBody['petAmountRegister'].toString());
|
||||
await StorageHelper()
|
||||
.s(KeychainStorageKey.userName.value, jsonBody['visitado']['VDO_NOME']);
|
||||
await StorageHelper().s(KeychainStorageKey.isNewVersion.value,
|
||||
jsonBody['newVersion'] != null && jsonBody['newVersion']);
|
||||
await StorageHelper().s(KeychainStorageKey.whatsapp.value, jsonBody['whatsapp'] != null && jsonBody['whatsapp']);
|
||||
await StorageHelper().s(KeychainStorageKey.provisional.value, jsonBody['provisional'] != null && jsonBody['provisional']);
|
||||
await StorageHelper().s(KeychainStorageKey.pets.value, jsonBody['pet'] != null && jsonBody['pet']);
|
||||
await StorageHelper().s(KeychainStorageKey.petAmount.value,
|
||||
jsonBody['petAmountRegister'] != null && jsonBody['petAmountRegister'].toString().isEmpty ? '0' : jsonBody['petAmountRegister'].toString());
|
||||
await StorageHelper().s(KeychainStorageKey.userName.value, jsonBody['visitado']['VDO_NOME']);
|
||||
|
||||
late final bool isNewVersion;
|
||||
if (jsonBody['newVersion'] != null)
|
||||
isNewVersion = jsonBody['newVersion'];
|
||||
else
|
||||
isNewVersion = false;
|
||||
log('() => isNewVersion: ${jsonBody['newVersion']}');
|
||||
return jsonBody['newVersion'] == true;
|
||||
await StorageHelper().s(KeychainStorageKey.isNewVersion.value, isNewVersion);
|
||||
return isNewVersion;
|
||||
}
|
||||
|
||||
static bool _isActive(List<dynamic> locals) {
|
||||
|
@ -347,44 +325,30 @@ class LocalizationService {
|
|||
}
|
||||
|
||||
static Future<bool> _isInactived(List<dynamic> locals) async {
|
||||
String cliUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
return locals
|
||||
.where(
|
||||
(local) => local['CLI_ID'] != cliUUID && local['CLU_STATUS'] == 'A')
|
||||
.isNotEmpty;
|
||||
String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
return locals.where((local) => local['CLI_ID'] != cliUUID && local['CLU_STATUS'] == 'A').isNotEmpty;
|
||||
}
|
||||
|
||||
static bool _isPending(List<dynamic> locals) {
|
||||
return locals
|
||||
.where(
|
||||
(local) => local['CLU_STATUS'] != 'B' && local['CLU_STATUS'] != 'A')
|
||||
.isNotEmpty;
|
||||
return locals.where((local) => local['CLU_STATUS'] != 'B' && local['CLU_STATUS'] != 'A').isNotEmpty;
|
||||
}
|
||||
|
||||
static Future<bool> _isUnselected() async {
|
||||
String cliUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
String cliName =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
|
||||
String ownerUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.ownerUUID.value)) ?? '';
|
||||
String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
String cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
|
||||
String ownerUUID = (await StorageHelper().g(KeychainStorageKey.ownerUUID.value)) ?? '';
|
||||
return cliUUID.isEmpty && cliName.isEmpty && ownerUUID.isEmpty;
|
||||
}
|
||||
|
||||
static Future<bool> _isSelected(bool isInactived) async {
|
||||
String cliUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
String cliName =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
|
||||
String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
String cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
|
||||
return cliUUID.isNotEmpty && cliName.isNotEmpty && isInactived;
|
||||
}
|
||||
|
||||
static Future<bool> _isAvailable() async {
|
||||
String cliUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
String cliName =
|
||||
(await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
|
||||
String cliUUID = (await StorageHelper().g(KeychainStorageKey.clientUUID.value)) ?? '';
|
||||
String cliName = (await StorageHelper().g(KeychainStorageKey.clientName.value)) ?? '';
|
||||
return cliUUID.isNotEmpty && cliName.isNotEmpty;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,37 +1,70 @@
|
|||
import 'package:cached_network_image/cached_network_image.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/flutter_flow/flutter_flow_theme.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 {
|
||||
const CustomDrawer({super.key, required this.model});
|
||||
final HomePageModel model;
|
||||
const CustomDrawer({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.8,
|
||||
child: Drawer(
|
||||
elevation: 16.0,
|
||||
child: Container(
|
||||
color: FlutterFlowTheme.of(context).primaryBackground,
|
||||
child: Column(
|
||||
children: [
|
||||
_buildDrawerHeader(context),
|
||||
// _buildSearchBar(context),
|
||||
_buildDrawerBody(),
|
||||
].addToStart(const SizedBox(height: 20)),
|
||||
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(
|
||||
child: SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.8,
|
||||
child: Drawer(
|
||||
elevation: 16.0,
|
||||
child: Container(
|
||||
color: FlutterFlowTheme.of(context).primaryBackground,
|
||||
child: Column(
|
||||
children: [
|
||||
_buildDrawerHeader(context, state),
|
||||
// _buildSearchBar(context, state),
|
||||
_buildDrawerBody(context),
|
||||
].addToStart(const SizedBox(height: 20)),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Container _buildDrawerHeader(BuildContext context) {
|
||||
Container _buildDrawerHeader(BuildContext context, HomeState state) {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
|
@ -56,7 +89,7 @@ class CustomDrawer extends StatelessWidget {
|
|||
child: CachedNetworkImage(
|
||||
imageUrl: valueOrDefault(
|
||||
'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,
|
||||
height: 80.0,
|
||||
|
@ -75,7 +108,7 @@ class CustomDrawer extends StatelessWidget {
|
|||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
model.userName,
|
||||
state.userName,
|
||||
style: FlutterFlowTheme.of(context).bodyLarge.override(
|
||||
fontFamily: 'Nunito Sans',
|
||||
color: FlutterFlowTheme.of(context).primaryText,
|
||||
|
@ -85,7 +118,7 @@ class CustomDrawer extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
Text(
|
||||
model.userEmail,
|
||||
state.userEmail,
|
||||
style: FlutterFlowTheme.of(context).bodySmall.override(
|
||||
fontFamily: 'Nunito Sans',
|
||||
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 errorColor = theme.error;
|
||||
final primaryColor = theme.primary;
|
||||
|
@ -111,8 +144,8 @@ class CustomDrawer extends StatelessWidget {
|
|||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10.0),
|
||||
child: TextFormField(
|
||||
controller: model.textController,
|
||||
focusNode: model.textFieldFocusNode,
|
||||
controller: TextEditingController(), // Replace with appropriate controller
|
||||
focusNode: FocusNode(), // Replace with appropriate focus node
|
||||
autofocus: false,
|
||||
obscureText: false,
|
||||
decoration: InputDecoration(
|
||||
|
@ -153,16 +186,17 @@ class CustomDrawer extends StatelessWidget {
|
|||
fontFamily: FlutterFlowTheme.of(context).bodyMediumFamily,
|
||||
letterSpacing: 0.0,
|
||||
),
|
||||
validator: model.textControllerValidator.asValidator(context),
|
||||
// validator: model.textControllerValidator.asValidator(context),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildDrawerBody() {
|
||||
return wrapWithModel(
|
||||
model: model.drawerMenuComponentModel,
|
||||
updateCallback: () {},
|
||||
child: MenuComponentWidget(model: model.drawerMenuComponentModel),
|
||||
Widget _buildDrawerBody(BuildContext context) {
|
||||
return MenuComponentWidget(
|
||||
style: MenuView.list,
|
||||
item: MenuItem.tile,
|
||||
expandable: false,
|
||||
menuOptions: Module.values.where((e) => e != Module.settings).toList(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,210 +1,210 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hub/flutter_flow/random_data_util.dart';
|
||||
import 'package:hub/main.dart';
|
||||
import 'package:hub/shared/helpers/storage/base_storage.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:flutter/services.dart';
|
||||
// import 'package:flutter_test/flutter_test.dart';
|
||||
// import 'package:hub/flutter_flow/random_data_util.dart';
|
||||
// import 'package:hub/main.dart';
|
||||
// import 'package:hub/shared/helpers/storage/base_storage.dart';
|
||||
// import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
// import 'package:integration_test/integration_test.dart';
|
||||
|
||||
late WidgetTester widget;
|
||||
// late WidgetTester widget;
|
||||
|
||||
void main() {
|
||||
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
// void main() {
|
||||
// IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
group('Initialization', () {
|
||||
group('Navigation', () {
|
||||
setUpAll(() async =>
|
||||
await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
|
||||
testWidgets('Test Welcome', (WidgetTester tester) async {
|
||||
widget = tester;
|
||||
await _testWelcome();
|
||||
});
|
||||
});
|
||||
// group('Initialization', () {
|
||||
// group('Navigation', () {
|
||||
// setUpAll(() async =>
|
||||
// await initializeApp().then((_) async => await StorageHelper().s(SecureStorageKey.isLogged.value, 'false')));
|
||||
// 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;
|
||||
// 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
|
||||
});
|
||||
}
|
||||
// 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;
|
||||
// // 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> _testWelcome() async {
|
||||
await widget.pumpWidget(const App());
|
||||
await widget.pumpAndSettle();
|
||||
await _navigateToSignIn();
|
||||
await _navigateToSignUp();
|
||||
await widget.pumpAndSettle();
|
||||
await widget.pumpWidget(const App());
|
||||
await widget.pumpAndSettle();
|
||||
await _navigateToSignUp();
|
||||
await _navigateToSignIn();
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
// Future<void> _testWelcome() async {
|
||||
// await widget.pumpWidget(const App());
|
||||
// await widget.pumpAndSettle();
|
||||
// await _navigateToSignIn();
|
||||
// await _navigateToSignUp();
|
||||
// await widget.pumpAndSettle();
|
||||
// await widget.pumpWidget(const App());
|
||||
// await widget.pumpAndSettle();
|
||||
// await _navigateToSignUp();
|
||||
// await _navigateToSignIn();
|
||||
// await widget.pumpAndSettle();
|
||||
// }
|
||||
|
||||
Future<void> _testSignIn() async {
|
||||
await widget.pumpWidget(const App());
|
||||
await _navigateToSignIn();
|
||||
await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||
await _auth({'emailTextFormField': 'email_app@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||
}
|
||||
// Future<void> _testSignIn() async {
|
||||
// await widget.pumpWidget(const App());
|
||||
// await _navigateToSignIn();
|
||||
// await _auth({'emailTextFormField': 'erro@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||
// await _auth({'emailTextFormField': 'email_app@exemplo.com', 'passwordTextFormField': '12345678'});
|
||||
// }
|
||||
|
||||
Future<void> _testSignUp() async {
|
||||
await widget.pumpWidget(const App());
|
||||
await _navigateToSignUp();
|
||||
// Future<void> _testSignUp() async {
|
||||
// await widget.pumpWidget(const App());
|
||||
// await _navigateToSignUp();
|
||||
|
||||
var credentials = {
|
||||
'nameTextFormField': 'app',
|
||||
'emailTextFormField': 'email_app@exemplo.com',
|
||||
'passwordTextFormField': '12345678'
|
||||
};
|
||||
await _auth(credentials);
|
||||
// var credentials = {
|
||||
// 'nameTextFormField': 'app',
|
||||
// 'emailTextFormField': 'email_app@exemplo.com',
|
||||
// 'passwordTextFormField': '12345678'
|
||||
// };
|
||||
// await _auth(credentials);
|
||||
|
||||
var name = randomString(7, 7, true, true, true);
|
||||
var email = '$name@example.com';
|
||||
var password = '12345678';
|
||||
credentials = {'nameTextFormField': name, 'emailTextFormField': email, 'passwordTextFormField': password};
|
||||
await _navigateToSignUp();
|
||||
await _auth(credentials);
|
||||
credentials = {'emailTextFormField': email, 'passwordTextFormField': password};
|
||||
await _auth(credentials);
|
||||
}
|
||||
// var name = randomString(7, 7, true, true, true);
|
||||
// var email = '$name@example.com';
|
||||
// var password = '12345678';
|
||||
// credentials = {'nameTextFormField': name, 'emailTextFormField': email, 'passwordTextFormField': password};
|
||||
// await _navigateToSignUp();
|
||||
// await _auth(credentials);
|
||||
// credentials = {'emailTextFormField': email, 'passwordTextFormField': password};
|
||||
// await _auth(credentials);
|
||||
// }
|
||||
|
||||
Future<void> _testForgotPassword() async {
|
||||
await widget.pumpWidget(const App());
|
||||
await _navigateToSignIn();
|
||||
await _recoveryPassword();
|
||||
// Future<void> _testForgotPassword() async {
|
||||
// await widget.pumpWidget(const App());
|
||||
// await _navigateToSignIn();
|
||||
// await _recoveryPassword();
|
||||
|
||||
var addr = randomString(5, 5, true, true, true);
|
||||
var credentials = {'recoveryTextFormField': '$addr@exemple.com'};
|
||||
await _send(credentials);
|
||||
// var addr = randomString(5, 5, true, true, true);
|
||||
// var credentials = {'recoveryTextFormField': '$addr@exemple.com'};
|
||||
// await _send(credentials);
|
||||
|
||||
await Future.delayed(const Duration(seconds: 2));
|
||||
// await Future.delayed(const Duration(seconds: 2));
|
||||
|
||||
await _recoveryPassword();
|
||||
credentials = {'recoveryTextFormField': 'email_app@exemple.com'};
|
||||
await _send(credentials);
|
||||
}
|
||||
// await _recoveryPassword();
|
||||
// credentials = {'recoveryTextFormField': 'email_app@exemple.com'};
|
||||
// await _send(credentials);
|
||||
// }
|
||||
|
||||
Future<void> _recoveryPassword() async {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword'));
|
||||
if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword);
|
||||
await widget.ensureVisible(forgotPassword);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
// Future<void> _recoveryPassword() async {
|
||||
// await widget.pumpAndSettle();
|
||||
// final Finder forgotPassword = find.byKey(const ValueKey<String>('ForgotPassword'));
|
||||
// if (forgotPassword.evaluate().isNotEmpty) await widget.tap(forgotPassword);
|
||||
// await widget.ensureVisible(forgotPassword);
|
||||
// await widget.pumpAndSettle();
|
||||
// }
|
||||
|
||||
Future<void> _navigateBackUsingSystemGesture() async =>
|
||||
IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
|
||||
Future<void> _navigateToSignUp() async {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage'));
|
||||
if (navToSignUp.evaluate().isNotEmpty) {
|
||||
await widget.tap(navToSignUp);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
}
|
||||
// Future<void> _navigateBackUsingSystemGesture() async =>
|
||||
// IntegrationTestWidgetsFlutterBinding.instance.keyboard.isLogicalKeyPressed(LogicalKeyboardKey.escape);
|
||||
// Future<void> _navigateToSignUp() async {
|
||||
// await widget.pumpAndSettle();
|
||||
// final Finder navToSignUp = find.byKey(const ValueKey<String>('toggleSignUpPage'));
|
||||
// if (navToSignUp.evaluate().isNotEmpty) {
|
||||
// await widget.tap(navToSignUp);
|
||||
// await widget.pumpAndSettle();
|
||||
// }
|
||||
// }
|
||||
|
||||
Future<void> _navigateToSignIn() async {
|
||||
await widget.pumpAndSettle();
|
||||
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> _navigateToSignIn() async {
|
||||
// await widget.pumpAndSettle();
|
||||
// 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> _auth(Map<String, dynamic> credentials) async {
|
||||
await _enterCredentials(credentials);
|
||||
await _submit('SubmitButtonWidget');
|
||||
}
|
||||
// Future<void> _auth(Map<String, dynamic> credentials) async {
|
||||
// await _enterCredentials(credentials);
|
||||
// await _submit('SubmitButtonWidget');
|
||||
// }
|
||||
|
||||
Future<void> _send(Map<String, dynamic> credentials) async {
|
||||
await _enterCredentials(credentials);
|
||||
await _submit('SendButtonWidget');
|
||||
}
|
||||
// Future<void> _send(Map<String, dynamic> credentials) async {
|
||||
// await _enterCredentials(credentials);
|
||||
// await _submit('SendButtonWidget');
|
||||
// }
|
||||
|
||||
Future<void> _enterCredentials(Map<String, dynamic> credentials) async {
|
||||
await widget.pumpAndSettle();
|
||||
for (var entry in credentials.entries) {
|
||||
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> _enterCredentials(Map<String, dynamic> credentials) async {
|
||||
// await widget.pumpAndSettle();
|
||||
// for (var entry in credentials.entries) {
|
||||
// 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 {
|
||||
await widget.pumpAndSettle();
|
||||
final Finder submitButton = find.byKey(ValueKey<String>(key));
|
||||
await widget.pumpAndSettle();
|
||||
if (submitButton.evaluate().isNotEmpty) {
|
||||
await widget.tap(submitButton);
|
||||
await widget.pumpAndSettle();
|
||||
}
|
||||
// Future<void> _submit(String key) async {
|
||||
// await widget.pumpAndSettle();
|
||||
// final Finder submitButton = find.byKey(ValueKey<String>(key));
|
||||
// await widget.pumpAndSettle();
|
||||
// if (submitButton.evaluate().isNotEmpty) {
|
||||
// await widget.tap(submitButton);
|
||||
// await widget.pumpAndSettle();
|
||||
// }
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
// 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