diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index de73593b..557fe25a 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -25,6 +25,7 @@ class UserProvider extends ChangeNotifier { swipeTransactionModel = null; } + // contain user data // when user not login or register _user = null User _user; @@ -188,6 +189,9 @@ class UserProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { isUserConfirmSwipe = true; await getSwipeLastTransaction(userId: user.userID); + if(user.onlySwipe){ + await getSwipeTransactionHistory(userId: user.userID,dateFrom: DateTime.now(),dateTo: DateTime.now()); + } notifyListeners(); } diff --git a/lib/main.dart b/lib/main.dart index a03a9100..8b971f3d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,6 +53,7 @@ import 'package:test_sa/new_views/pages/splash_page.dart'; import 'package:test_sa/new_views/pages/usSafeDevice_view.dart'; import 'package:test_sa/new_views/swipe_module/swipe_history_view.dart'; import 'package:test_sa/new_views/swipe_module/swipe_success_view.dart'; +import 'package:test_sa/new_views/swipe_module/swipe_view.dart'; import 'package:test_sa/providers/asset_transfer/asset_transfer_status_provider.dart'; import 'package:test_sa/providers/department_provider.dart'; import 'package:test_sa/providers/gas_request_providers/cylinder_size_provider.dart'; @@ -260,11 +261,13 @@ class MyApp extends StatelessWidget { LoginPage.routeName: (_) => const LoginPage(), UnsafeDeviceScreen.routeName: (_) => const UnsafeDeviceScreen(), SwipeSuccessView.routeName: (_) => const SwipeSuccessView(), - SwipeHistoryView.routeName: (_) => const SwipeHistoryView(), - SwipeHistoryView.routeName: (_) => const SwipeHistoryView(), + SwipeHistoryView.routeName: (_) => SwipeHistoryView(), + SwipeView.routeName: (_) => const SwipeView(), + ///todo deleted //old.LandPage.id: (_) => const old.LandPage(), LandPage.routeName: (_) => const LandPage(), + NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(), ServiceRequestsPage.id: (_) => ServiceRequestsPage(), ReportIssuesPage.id: (_) => const ReportIssuesPage(), diff --git a/lib/models/user.dart b/lib/models/user.dart index bc2c1c82..8967dc18 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -14,7 +14,7 @@ class User { bool enableWifi; bool enableNFC; bool enableQR; - + bool onlySwipe; String username; String userID; String email; @@ -58,6 +58,7 @@ class User { this.enableNFC, this.enableQR, this.enableWifi, + this.onlySwipe, this.roles, this.userRoles, this.tokenlife, @@ -141,6 +142,7 @@ class User { map['enableWifi'] = enableWifi; map['enableNFC'] = enableNFC; map['enableQR'] = enableQR; + map['onlySwipe'] = onlySwipe; map['roles'] = roles; if (userRoles != null) { map['userRoles'] = userRoles.map((v) => v.toJson()).toList(); @@ -195,6 +197,7 @@ class User { enableWifi = json['enableWifi']; enableNFC = json['enableNFC']; enableQR = json['enableQR']; + onlySwipe = json['onlySwipe']; roles = json['roles']; if (json['userRoles'] != null) { userRoles = []; diff --git a/lib/new_views/common_widgets/app_drawer.dart b/lib/new_views/common_widgets/app_drawer.dart index fa892f30..bd5ab93b 100644 --- a/lib/new_views/common_widgets/app_drawer.dart +++ b/lib/new_views/common_widgets/app_drawer.dart @@ -66,7 +66,8 @@ class AppDrawer extends StatelessWidget { if ((userProvider.user?.email ?? "").isNotEmpty) (userProvider.user?.email)?.heading6(context)?.custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), 18.height, const Divider().defaultStyle(context), - ListView( + + ListView( padding: const EdgeInsets.only(top: 24), children: [ drawerItem("drawer_notification", context.translation.notifications, context).onPress(() => Navigator.of(context).pushNamed(NotificationsPage.id)), @@ -77,7 +78,7 @@ class AppDrawer extends StatelessWidget { // 18.height, drawerItem("setting", context.translation.settings, context).onPress(() => Navigator.of(context).pushNamed(SettingsPage.id)), 18.height, - if(userProvider.user!=null&&!userProvider.user.employeeIsHMG) + if(userProvider.user!=null&&!userProvider.user.employeeIsHMG&& !userProvider.user.onlySwipe) drawerItem("swipe", "Swipe History", context) .onPress(() => Navigator.of(context).pushNamed(SwipeHistoryView.routeName)), // 18.height, // drawerItem("whats_new", context.translation.whatsNew, context), diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index 3d55f62c..c74d0847 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -39,7 +39,7 @@ class LandPage extends StatefulWidget { class _LandPageState extends State { final GlobalKey _scaffoldKey = GlobalKey(); - bool isNfcSupported = false; + int currentPageIndex = 0; bool showAppbar = true; List _pages; @@ -145,7 +145,7 @@ class _LandPageState extends State { return false; }, child: Consumer(builder: (context, userProvider, child) { - return Scaffold( + return Scaffold( key: _scaffoldKey, drawer: const AppDrawer(), body: _pages[currentPageIndex], diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index 41b14542..5101ea7c 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -12,6 +12,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/forget_password_module/forget_passwod_verify_otp.dart'; import 'package:test_sa/new_views/forget_password_module/models/general_response_model.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart'; +import 'package:test_sa/new_views/swipe_module/swipe_view.dart'; import '../../controllers/providers/api/user_provider.dart'; import '../../controllers/providers/settings/setting_provider.dart'; @@ -158,8 +159,13 @@ class _LoginPageState extends State { (await SharedPreferences.getInstance()).remove(ASettings.localAuth); await _settingProvider.setRememberMe(_user.userName, _user.password, rememberMe); + if(_userProvider.user.onlySwipe){ + Navigator.pushReplacementNamed(context, SwipeView.routeName); + } + else{ + Navigator.pushReplacementNamed(context, LandPage.routeName); - Navigator.pushReplacementNamed(context, LandPage.routeName); + } } else { Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest); } diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index 45cb5e39..4f27f82a 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -13,6 +13,7 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/new_views/pages/usSafeDevice_view.dart'; +import 'package:test_sa/new_views/swipe_module/swipe_view.dart'; import '../../models/size_config.dart'; @@ -65,7 +66,13 @@ class _SplashPageState extends State { bool isSuccess = await checkDualAuthentication(); if (isSuccess) { _userProvider.user = _settingProvider.user; - Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); + + if(_userProvider.user.onlySwipe){ + Navigator.of(context).pushNamedAndRemoveUntil(SwipeView.routeName, (routes) => true); + }else{ + Navigator.of(context).pushNamedAndRemoveUntil(LandPage.routeName, (routes) => true); + } + } else { Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } diff --git a/lib/new_views/swipe_module/swipe_history_view.dart b/lib/new_views/swipe_module/swipe_history_view.dart index 65d1592d..f91cb032 100644 --- a/lib/new_views/swipe_module/swipe_history_view.dart +++ b/lib/new_views/swipe_module/swipe_history_view.dart @@ -10,143 +10,137 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; -import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; - import 'models/swipe_transaction_history.dart'; class SwipeHistoryView extends StatefulWidget { static const routeName = '/swipe_list_view'; + bool showAppBar = true; - const SwipeHistoryView({Key key}) : super(key: key); + SwipeHistoryView({Key key, this.showAppBar = true}) : super(key: key); @override State createState() => _SwipeHistoryViewState(); } - class _SwipeHistoryViewState extends State { DateTime dateFrom = DateTime.now(); DateTime dateTo = DateTime.now(); UserProvider _userProvider; + @override void initState() { getSwipeHistory(); super.initState(); } - void getSwipeHistory () { - _userProvider = Provider.of(context,listen:false); + void getSwipeHistory() { + _userProvider = Provider.of(context, listen: false); WidgetsBinding.instance.addPostFrameCallback((_) async { - await _userProvider.getSwipeTransactionHistory(userId: _userProvider.user.userID,dateFrom: dateFrom,dateTo: dateTo); + await _userProvider.getSwipeTransactionHistory(userId: _userProvider.user.userID, dateFrom: dateFrom, dateTo: dateTo); }); } + @override Widget build(BuildContext context) { - return Scaffold( - appBar: const DefaultAppBar(title: 'Swipe History',), - body: Column( - crossAxisAlignment:CrossAxisAlignment.start, - children: [ - - 8.height, - Row( - children: [ - ADatePicker( - label: context.translation.from, - date: dateFrom, - from: DateTime(DateTime.now().year - 5, DateTime.now().month, DateTime.now().day), - formatDateWithTime: false, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - setState(() { - dateFrom = selectedDate; - }); - // showTimePicker( - // context: context, - // initialTime: TimeOfDay.now(), - // ).then((selectedTime) { - // // Handle the selected date and time here. - // if (selectedTime != null) { - // DateTime selectedDateTime = DateTime( - // selectedDate.year, - // selectedDate.month, - // selectedDate.day, - // selectedTime.hour, - // selectedTime.minute, - // ); - // if (selectedDateTime != null) { - // setState(() { - // dateFrom = selectedDateTime; - // }); - // } - // } - // }); - } - }, - ).expanded, - 8.width, - ADatePicker( - label: context.translation.to, - date: dateTo, - from: DateTime(DateTime.now().year - 5, DateTime.now().month, DateTime.now().day), - formatDateWithTime: false, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - setState(() { - dateTo = selectedDate; - - }); - // showTimePicker( - // context: context, - // initialTime: TimeOfDay.now(), - // ).then((selectedTime) { - // // Handle the selected date and time here. - // if (selectedTime != null) { - // DateTime selectedDateTime = DateTime( - // selectedDate.year, - // selectedDate.month, - // selectedDate.day, - // selectedTime.hour, - // selectedTime.minute, - // ); - // if (selectedDateTime != null) { - // setState(() { - // dateTo = selectedDateTime; - // - // }); + return Scaffold( + appBar: widget.showAppBar ? const DefaultAppBar(title: 'Swipe History') : null, + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 8.height, + Row( + children: [ + ADatePicker( + label: context.translation.from, + date: dateFrom, + from: DateTime(DateTime.now().year - 5, DateTime.now().month, DateTime.now().day), + formatDateWithTime: false, + onDatePicker: (selectedDate) { + if (selectedDate != null) { + setState(() { + dateFrom = selectedDate; + }); + } + + // if (selectedDate != null) { + // showTimePicker( + // context: context, + // initialTime: TimeOfDay.now(), + // ).then((selectedTime) { + // // Handle the selected date and time here. + // if (selectedTime != null) { + // DateTime selectedDateTime = DateTime( + // selectedDate.year, + // selectedDate.month, + // selectedDate.day, + // selectedTime.hour, + // selectedTime.minute, + // ); + // if (selectedDateTime != null) { // + // } // } - // } - // }); - } - }, - ).expanded, - ], - ), - 12.height, - - AppFilledButton(label: context.translation.search, maxWidth: false, onPressed: getSwipeHistory), - 8.height, - Divider(thickness: 2,), - - Consumer( - builder: (context, snapshot,child) { - return SwipeHistoryList(snapshot.swipeHistory ?? [], snapshot.isLoading).expanded; - } - ), - - - ], - ).paddingAll(20), + // }); + // } + }, + ).expanded, + 8.width, + ADatePicker( + label: context.translation.to, + date: dateTo, + from: DateTime(DateTime.now().year - 5, DateTime.now().month, DateTime.now().day), + formatDateWithTime: false, + onDatePicker: (selectedDate) { + if (selectedDate != null) { + setState(() { + dateTo = selectedDate; + }); + } + // if (selectedDate != null) { + // showTimePicker( + // context: context, + // initialTime: TimeOfDay.now(), + // ).then((selectedTime) { + // // Handle the selected date and time here. + // if (selectedTime != null) { + // DateTime selectedDateTime = DateTime( + // selectedDate.year, + // selectedDate.month, + // selectedDate.day, + // selectedTime.hour, + // selectedTime.minute, + // ); + // if (selectedDateTime != null) { + // setState(() { + // dateTo = selectedDateTime; + // }); + // } + // } + // }); + // } + }, + ).expanded, + ], + ), + 12.height, + AppFilledButton(label: context.translation.search, maxWidth: false, onPressed: getSwipeHistory), + 8.height, + const Divider( + thickness: 2, + ), + Consumer(builder: (context, snapshot, child) { + return SwipeHistoryList(snapshot.swipeHistory ?? [], snapshot.isLoading); + }), + ], + ).paddingOnly(start: 20, end: 20, bottom: 20), + ), ); } } - - - class SwipeHistoryList extends StatelessWidget { List list; bool isLoading; @@ -156,21 +150,30 @@ class SwipeHistoryList extends StatelessWidget { @override Widget build(BuildContext context) { return (list.isEmpty && !isLoading) - ? NoItemFound(message: context.translation.noDataFound) + ? context.translation.noDataFound.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50).center : ListView.separated( - padding: EdgeInsets.only(top: 12.toScreenHeight), - itemBuilder: (cxt, index) { - if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading); - return SwipeHistoryCard(list[index]); - }, - separatorBuilder: (cxt, index) => 12.height, - itemCount: isLoading ? 6 : list.length); + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.only(top: 12.toScreenHeight), + itemBuilder: (cxt, index) { + if (isLoading) { + return const SizedBox( + height: 20, + ).toRequestShimmer(cxt, isLoading); + } + return SwipeHistoryCard(list[index]); + }, + separatorBuilder: (cxt, index) => 12.height, + itemCount: isLoading ? 6 : list.length); } } + class SwipeHistoryCard extends StatelessWidget { final SwipeHistory swipeHistory; final bool showShadow; + const SwipeHistoryCard(this.swipeHistory, {Key key, this.showShadow = true}) : super(key: key); + @override Widget build(BuildContext context) { return Column( @@ -180,7 +183,8 @@ class SwipeHistoryCard extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(swipeHistory.swipeTime.toServiceRequestDetailsFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), + Text(swipeHistory.swipeTime.toServiceRequestDetailsFormat, + textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), ], ), 8.height, @@ -193,4 +197,3 @@ class SwipeHistoryCard extends StatelessWidget { ).toShadowContainer(context, showShadow: showShadow); } } - diff --git a/lib/new_views/swipe_module/swipe_view.dart b/lib/new_views/swipe_module/swipe_view.dart new file mode 100644 index 00000000..de92893f --- /dev/null +++ b/lib/new_views/swipe_module/swipe_view.dart @@ -0,0 +1,170 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:nfc_manager/nfc_manager.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; +import 'package:test_sa/controllers/notification/notification_manger.dart'; +import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/enums/user_types.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_drawer.dart'; +import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart'; +import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/recent_activites_fragment.dart'; +import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/requests_fragment.dart'; +import 'package:test_sa/new_views/pages/land_page/widgets/dialogs/dialog.dart'; +import 'package:test_sa/new_views/swipe_module/circular_animated_widget.dart'; +import 'package:test_sa/new_views/swipe_module/swipe_history_view.dart'; +import 'package:test_sa/new_views/swipe_module/utils/swipe_general_utils.dart'; +import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; + +class SwipeView extends StatefulWidget { + static const String routeName = "/swipe-view"; + + const SwipeView({Key key,}) : super(key: key); + + @override + State createState() => _SwipeViewState(); +} + +class _SwipeViewState extends State { + UserProvider _userProvider; + final GlobalKey _scaffoldKey = GlobalKey(); + @override + void initState() { + super.initState(); + _userProvider = Provider.of(context,listen: false); + if (_userProvider.user != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _userProvider.getSwipeLastTransaction(userId: _userProvider.user.userID); + }); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () async { + bool result = await showDialog( + context: context, + builder: (_) => AAlertDialog(title: context.translation.signOut, content: context.translation.logoutAlert), + ); + if (result) { + Provider.of(context, listen: false).resetSettings(); + Provider.of(context, listen: false).reset(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } + return false; + }, + child: Scaffold( + key: _scaffoldKey, + drawer: const AppDrawer(), + appBar: AppBar( + automaticallyImplyLeading: false, + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + titleSpacing: 0, + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Consumer(builder: (context, snapshot, _) { + return CircleAvatar( + radius: 24, + backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40, + child: Padding( + padding: const EdgeInsets.all(1), // Border radius + child: ClipOval( + child: snapshot.profileImage != null + ? Image.file(snapshot.profileImage) + : (snapshot.user.profilePhotoName?.isNotEmpty ?? false) + ? Image.network(snapshot.user.profilePhotoName) + : const Icon(Icons.person, size: 24, color: Colors.white), + ), + ), + ).onPress(() { + _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer(); + }); + }), + ], + ).paddingOnly(start: 16, end: 16), + ), + body: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.translation.welcome, + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + ), + Text( + _userProvider.user?.username ?? "", + style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), + ), + ], + ).paddingOnly(start: 16, end: 16, top: 8, bottom: 4), + + SwipeHistoryView(showAppBar: false).expanded, + ], + ), + Positioned( + right: 20.toScreenWidth, + bottom: 60.toScreenHeight, + child: GestureDetector( + onTap: () async { + bool isNfcSupported = await NfcManager.instance.isAvailable(); + SwipeGeneralUtils.instance.showSwipeTypeBottomSheetSheet(isNfcSupported: isNfcSupported); + + }, + child: CircularAnimatedContainer(child: Container( + width: 100.toScreenWidth, + height: 100.toScreenHeight, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.white, + border: Border.all(color: AppColor.primary80.withOpacity(0.5), width: 2), + ), + child: Consumer( + builder: (context, userProvider,child) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + 'swipe'.toSvgAsset(width: 32, height: 32), + 8.height, + Text( + ("${context.translation.checkIn}\n${userProvider.swipeTransactionModel != null && userProvider.swipeTransactionModel.swipeTime != null ? SwipeGeneralUtils.instance.formatTimeOnly(userProvider.swipeTransactionModel.swipeTime) : '--:--'}"), + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral80, fontWeight: FontWeight.w500, fontFamily: "Poppins"), + ), + + ], + ); + } + ), + ),), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/loaders/no_item_found.dart b/lib/views/widgets/loaders/no_item_found.dart index b2d186dd..390a78f2 100644 --- a/lib/views/widgets/loaders/no_item_found.dart +++ b/lib/views/widgets/loaders/no_item_found.dart @@ -18,7 +18,8 @@ class NoItemFound extends StatelessWidget { Center( child: Text(message ?? "no item found", style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), ), - ListView(), + ListView( + ), ], ); }