From d3bd10730cc3f1ff76cd2cd0e9fb2f88c29e9bc4 Mon Sep 17 00:00:00 2001 From: Mohammad Salameh Date: Mon, 11 Mar 2024 12:04:26 +0300 Subject: [PATCH] Modified Devices Pages --- assets/icons/qr_scan.png | Bin 16799 -> 0 bytes assets/icons/qr_scan.svg | 11 --- lib/features/app_layout/bloc/nav_cubit.dart | 45 +++++------ .../app_layout/view/widgets/app_body.dart | 4 +- .../view/widgets/default_nav_bar.dart | 4 + lib/features/auth/bloc/auth_cubit.dart | 18 ++++- lib/features/auth/bloc/auth_state.dart | 2 + lib/features/auth/model/user_model.dart | 2 +- .../view/widgets/devices_view_body.dart | 4 +- .../devices/view/widgets/rooms_slider.dart | 52 ------------- lib/features/menu/view/menu_view.dart | 73 +++++++++++++----- .../shared_widgets/default_button.dart | 17 +++- lib/features/splash/view/splash_view.dart | 21 ++--- lib/generated/assets.dart | 3 +- lib/main.dart | 9 +++ lib/utils/resource_manager/constants.dart | 2 +- 16 files changed, 136 insertions(+), 131 deletions(-) delete mode 100644 assets/icons/qr_scan.png delete mode 100644 assets/icons/qr_scan.svg diff --git a/assets/icons/qr_scan.png b/assets/icons/qr_scan.png deleted file mode 100644 index 7228c7b4370ae22d912eb0d00cda1c74ef4e905d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16799 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 LcBc5W>)rncVe^m~ diff --git a/assets/icons/qr_scan.svg b/assets/icons/qr_scan.svg deleted file mode 100644 index ba9e926..0000000 --- a/assets/icons/qr_scan.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/lib/features/app_layout/bloc/nav_cubit.dart b/lib/features/app_layout/bloc/nav_cubit.dart index bb00d0d..87a1967 100644 --- a/lib/features/app_layout/bloc/nav_cubit.dart +++ b/lib/features/app_layout/bloc/nav_cubit.dart @@ -33,14 +33,14 @@ class NavCubit extends Cubit { ), ], 'Devices': [ - IconButton( - icon: Image.asset( - Assets.iconsFilter, - height: 20, - width: 20, - ), - onPressed: () {}, - ), + // IconButton( + // icon: Image.asset( + // Assets.iconsFilter, + // height: 20, + // width: 20, + // ), + // onPressed: () {}, + // ), IconButton( icon: const Icon( Icons.add, @@ -65,14 +65,14 @@ class NavCubit extends Cubit { ), ], 'Routine': [ - IconButton( - icon: Image.asset( - Assets.iconsFilter, - height: 20, - width: 20, - ), - onPressed: () {}, - ), + // IconButton( + // icon: Image.asset( + // Assets.iconsFilter, + // height: 20, + // width: 20, + // ), + // onPressed: () {}, + // ), IconButton( icon: const Icon( Icons.add, @@ -98,16 +98,8 @@ class NavCubit extends Cubit { ], 'Menu': [ IconButton( - icon: Image.asset( - Assets.iconsQrScan, - height: 20, - width: 20, - ), - onPressed: () {}, - ), - IconButton( - icon: Image.asset( - Assets.iconsSettings, + icon: SvgPicture.asset( + Assets.iconsScan, height: 20, width: 20, ), @@ -151,6 +143,7 @@ class NavCubit extends Cubit { void updatePageIndex(int index) { pageIndex = index; + print('index: $index'); pageController.animateToPage(index, duration: const Duration(milliseconds: 150), curve: Curves.easeIn); emit(NavChangePage()); diff --git a/lib/features/app_layout/view/widgets/app_body.dart b/lib/features/app_layout/view/widgets/app_body.dart index a3335a4..e98fa87 100644 --- a/lib/features/app_layout/view/widgets/app_body.dart +++ b/lib/features/app_layout/view/widgets/app_body.dart @@ -26,9 +26,7 @@ class AppBody extends StatelessWidget { ), ), child: PageView( - onPageChanged: (int index) { - NavCubit.of(context).updatePageIndex(index); - }, + physics: const NeverScrollableScrollPhysics(), controller: NavCubit.of(context).pageController, children: NavCubit.of(context).pages, ) diff --git a/lib/features/app_layout/view/widgets/default_nav_bar.dart b/lib/features/app_layout/view/widgets/default_nav_bar.dart index 2db04ff..92515db 100644 --- a/lib/features/app_layout/view/widgets/default_nav_bar.dart +++ b/lib/features/app_layout/view/widgets/default_nav_bar.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart'; +import 'package:syncrow_app/features/app_layout/bloc/spaces_cubit.dart'; import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart'; @@ -24,6 +25,9 @@ class DefaultNavBar extends StatelessWidget { if (DevicesCubit.get(context).chosenCategoryView != null) { DevicesCubit().clearCategoriesSelection(context); } + if (SpacesCubit.get(context).selectedRoom != null) { + SpacesCubit.get(context).unselectRoom(); + } }, currentIndex: NavCubit.pageIndex, selectedItemColor: ColorsManager.primaryColor, diff --git a/lib/features/auth/bloc/auth_cubit.dart b/lib/features/auth/bloc/auth_cubit.dart index e82e3d3..95d6115 100644 --- a/lib/features/auth/bloc/auth_cubit.dart +++ b/lib/features/auth/bloc/auth_cubit.dart @@ -2,11 +2,13 @@ import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:syncrow_app/features/auth/model/login_with_email_model.dart'; import 'package:syncrow_app/features/auth/model/token.dart'; import 'package:syncrow_app/features/auth/model/user_model.dart'; import 'package:syncrow_app/services/api/authentication_api.dart'; import 'package:syncrow_app/services/api/network_exception.dart'; +import 'package:syncrow_app/utils/resource_manager/constants.dart'; part 'auth_state.dart'; @@ -50,7 +52,10 @@ class AuthCubit extends Cubit { ); if (token.accessTokenIsNotEmpty) { - //Map dictionary + FlutterSecureStorage storage = const FlutterSecureStorage(); + await storage.write( + key: Constants.tokenAccessKey, value: token.accessToken); + user = UserModel.fromToken(token); emit(AuthSuccess()); } else { @@ -60,4 +65,15 @@ class AuthCubit extends Cubit { throw ServerFailure.fromDioError(e); } } + + logout() async { + emit(AuthLoading()); + try { + FlutterSecureStorage storage = const FlutterSecureStorage(); + await storage.delete(key: Constants.tokenAccessKey); + emit(AuthLoggedOut()); + } on DioException catch (e) { + throw ServerFailure.fromDioError(e); + } + } } diff --git a/lib/features/auth/bloc/auth_state.dart b/lib/features/auth/bloc/auth_state.dart index a48552c..8a370b0 100644 --- a/lib/features/auth/bloc/auth_state.dart +++ b/lib/features/auth/bloc/auth_state.dart @@ -16,6 +16,8 @@ class AuthError extends AuthState { class AuthSuccess extends AuthState {} +class AuthLoggedOut extends AuthState {} + class AuthPasswordVisibilityChanged extends AuthState {} class AuthAgreeToTermsChanged extends AuthState {} diff --git a/lib/features/auth/model/user_model.dart b/lib/features/auth/model/user_model.dart index baf44af..4d003a5 100644 --- a/lib/features/auth/model/user_model.dart +++ b/lib/features/auth/model/user_model.dart @@ -49,7 +49,7 @@ class UserModel { Map tempJson = token.decodeToken(); return UserModel( - id: tempJson['userId'].toString(), + id: tempJson['uuid'].toString(), email: tempJson['email'], name: null, photoUrl: null, diff --git a/lib/features/devices/view/widgets/devices_view_body.dart b/lib/features/devices/view/widgets/devices_view_body.dart index 7b53425..35858b7 100644 --- a/lib/features/devices/view/widgets/devices_view_body.dart +++ b/lib/features/devices/view/widgets/devices_view_body.dart @@ -65,12 +65,10 @@ class DevicesViewBody extends StatelessWidget { SpacesCubit.get(context).devicesPageController, count: 3, effect: const WormEffect( + paintStyle: PaintingStyle.stroke, dotHeight: 8, dotWidth: 8, ), - onDotClicked: (index) { - SpacesCubit.get(context).unselectRoom(); - }, ), ), ], diff --git a/lib/features/devices/view/widgets/rooms_slider.dart b/lib/features/devices/view/widgets/rooms_slider.dart index 5e9c3d9..8941e6c 100644 --- a/lib/features/devices/view/widgets/rooms_slider.dart +++ b/lib/features/devices/view/widgets/rooms_slider.dart @@ -67,58 +67,6 @@ class RoomsSlider extends StatelessWidget { ], ), ); - - // SingleChildScrollView( - // controller: SpacesCubit.get(context).roomsScrollController, - // scrollDirection: Axis.horizontal, - // child: Row( - // mainAxisAlignment: MainAxisAlignment.start, - // children: [ - // Padding( - // padding: const EdgeInsets.symmetric(horizontal: 15), - // child: InkWell( - // onTap: () { - // SpacesCubit.get(context).unselectRoom(); - // }, - // child: TitleMedium( - // text: StringsManager.wizard, - // style: context.titleMedium.copyWith( - // fontSize: 25, - // color: SpacesCubit.get(context).selectedRoom == null - // ? ColorsManager.textPrimaryColor - // : ColorsManager.textPrimaryColor.withOpacity(.2), - // ), - // ), - // ), - // ), - // ...SpacesCubit.get(context).selectedSpace.rooms.map( - // (room) => Padding( - // padding: const EdgeInsets.symmetric(horizontal: 15), - // child: InkWell( - // onTap: () { - // SpacesCubit.get(context).selectRoom(room); - // }, - // child: TitleMedium( - // text: room.name, - // style: context.titleMedium.copyWith( - // fontSize: 25, - // color: SpacesCubit.get(context).selectedRoomIndex == - // SpacesCubit.get(context) - // .selectedSpace - // .rooms - // .indexOf(room) + - // 1 - // ? ColorsManager.textPrimaryColor - // : ColorsManager.textPrimaryColor - // .withOpacity(.2), - // ), - // ), - // ), - // ), - // ) - // ], - // ), - // ); }, ); } diff --git a/lib/features/menu/view/menu_view.dart b/lib/features/menu/view/menu_view.dart index 2a491dc..1c55a36 100644 --- a/lib/features/menu/view/menu_view.dart +++ b/lib/features/menu/view/menu_view.dart @@ -1,8 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/auth/bloc/auth_cubit.dart'; import 'package:syncrow_app/features/menu/bloc/menu_cubit.dart'; import 'package:syncrow_app/features/menu/view/widgets/menu_list.dart'; import 'package:syncrow_app/features/menu/view/widgets/profile_tab.dart'; +import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/navigation/routing_constants.dart'; +import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart'; class MenuView extends StatelessWidget { @@ -14,26 +19,56 @@ class MenuView extends StatelessWidget { create: (BuildContext context) => MenuCubit(), child: BlocBuilder( builder: (context, state) { - return Padding( - padding: EdgeInsets.only( - top: Constants.appBarHeight, - bottom: Constants.bottomNavBarHeight, - left: Constants.defaultPadding, - right: Constants.defaultPadding, - ), - child: SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: Column( - children: [ - const ProfileTab(), - ...MenuCubit.of(context).menuLists.map( - (list) => MenuList( - listModel: list, - ), + return BlocBuilder( + builder: (context, state) { + return Padding( + padding: EdgeInsets.only( + top: Constants.appBarHeight, + bottom: Constants.bottomNavBarHeight, + left: Constants.defaultPadding, + right: Constants.defaultPadding, + ), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + const ProfileTab(), + ...MenuCubit.of(context).menuLists.map( + (list) => MenuList( + listModel: list, + ), + ), + const SizedBox( + height: 15, ), - ], - ), - ), + InkWell( + onTap: () { + AuthCubit.get(context).logout(); + Navigator.of(context).pushNamedAndRemoveUntil( + Routes.authLogin, (route) => false); + }, + child: Row( + children: [ + Expanded( + child: DefaultContainer( + child: Center( + child: BodyLarge( + text: 'Logout', + style: context.bodyLarge.copyWith( + color: Colors.red, + ), + ), + ), + ), + ), + ], + ), + ) + ], + ), + ), + ); + }, ); }, ), diff --git a/lib/features/shared_widgets/default_button.dart b/lib/features/shared_widgets/default_button.dart index cbb70ce..05bcf7d 100644 --- a/lib/features/shared_widgets/default_button.dart +++ b/lib/features/shared_widgets/default_button.dart @@ -13,6 +13,8 @@ class DefaultButton extends StatelessWidget { this.isDone = false, this.customTextStyle, this.customButtonStyle, + this.backgroundColor, + this.foregroundColor, }); final void Function()? onPressed; @@ -29,6 +31,10 @@ class DefaultButton extends StatelessWidget { final ButtonStyle? customButtonStyle; + final Color? backgroundColor; + + final Color? foregroundColor; + @override Widget build(BuildContext context) { return ElevatedButton( @@ -41,17 +47,22 @@ class DefaultButton extends StatelessWidget { customTextStyle ?? context.bodyMedium.copyWith( fontSize: 16, + color: foregroundColor, ), ), foregroundColor: MaterialStateProperty.all( isSecondary ? Colors.black : enabled - ? Colors.white + ? foregroundColor ?? Colors.white : Colors.black, ), - backgroundColor: MaterialStateProperty.all( - enabled ? ColorsManager.primaryColor : Colors.grey), + backgroundColor: MaterialStateProperty.resolveWith( + (Set states) { + return enabled + ? backgroundColor ?? ColorsManager.primaryColor + : Colors.grey; + }), shape: MaterialStateProperty.all( RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), diff --git a/lib/features/splash/view/splash_view.dart b/lib/features/splash/view/splash_view.dart index 218bc63..d36745f 100644 --- a/lib/features/splash/view/splash_view.dart +++ b/lib/features/splash/view/splash_view.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/navigation/routing_constants.dart'; +import 'package:syncrow_app/utils/resource_manager/constants.dart'; class SplashView extends StatelessWidget { const SplashView({super.key}); @@ -9,15 +11,16 @@ class SplashView extends StatelessWidget { @override Widget build(BuildContext context) { //TODO remove this delay - Future.delayed( - const Duration(seconds: 5), - () { - Navigator.popAndPushNamed( - context, - Routes.authLogin, - ); - }, - ); + Future.value().then((value) async { + var isLoggedIn = await const FlutterSecureStorage() + .read(key: Constants.tokenAccessKey) != + null; + if (isLoggedIn) { + Navigator.pushReplacementNamed(context, Routes.homeRoute); + } else { + Navigator.pushReplacementNamed(context, Routes.authLogin); + } + }); return Scaffold( body: Stack( alignment: Alignment.center, diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index 8237caa..b3da647 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -2,7 +2,6 @@ class Assets { Assets._(); - static const String assetsIconsQrScan = 'assets/icons/qr_scan.svg'; static const String assetsIconsSettings = 'assets/icons/settings.svg'; static const String fontsAftikaRegular = 'assets/fonts/AftikaRegular.ttf'; static const String iconsAC = 'assets/icons/AC.svg'; @@ -38,9 +37,9 @@ class Assets { static const String iconsMenuFill = 'assets/icons/Menu-fill.svg'; static const String iconsMinus = 'assets/icons/minus.svg'; static const String iconsPlus = 'assets/icons/plus.svg'; - static const String iconsQrScan = 'assets/icons/qr_scan.png'; static const String iconsRoutines = 'assets/icons/Routines.svg'; static const String iconsRoutinesFill = 'assets/icons/Routines-fill.svg'; + static const String iconsScan = 'assets/icons/Scan.svg'; static const String iconsScreen = 'assets/icons/Screen.svg'; static const String iconsSettings = 'assets/icons/settings.png'; static const String iconsSummer = 'assets/icons/Summer.svg'; diff --git a/lib/main.dart b/lib/main.dart index edb3229..2fa8e01 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,9 +2,11 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:syncrow_app/services/locator.dart'; import 'package:syncrow_app/utils/bloc_observer.dart'; import 'package:syncrow_app/utils/helpers/localization_helpers.dart'; +import 'package:syncrow_app/utils/resource_manager/constants.dart'; import 'my_app.dart'; @@ -32,6 +34,13 @@ void main() { //to initialize the locator initialSetup(); + //final SharedPreferences prefs = await SharedPreferences.getInstance(); + // var isLoggedIn = (prefs.getBool('isLoggedIn') == null) ? false : prefs.getBool('isLoggedIn'); + // + var storage = const FlutterSecureStorage(); + bool isLoggedIn = + await (storage.read(key: Constants.tokenAccessKey)) != null; + //to save the locale in the shared preferences await LocalizationService.saveLocale(const Locale("en", "AE")); final savedLocale = await LocalizationService.savedLocale(); diff --git a/lib/utils/resource_manager/constants.dart b/lib/utils/resource_manager/constants.dart index b185b28..6327b1b 100644 --- a/lib/utils/resource_manager/constants.dart +++ b/lib/utils/resource_manager/constants.dart @@ -11,7 +11,7 @@ abstract class Constants { static const double defaultPadding = 16; - static const String tokenKey = 'userToken'; + static const String tokenAccessKey = 'access_token'; } enum DeviceType {