diff --git a/lib/core/app_export.dart b/lib/core/app_export.dart index 76a79551..41302e56 100644 --- a/lib/core/app_export.dart +++ b/lib/core/app_export.dart @@ -12,6 +12,4 @@ export 'package:eatvio_app/theme/custom_text_style.dart'; export 'package:eatvio_app/theme/theme_helper.dart'; export 'package:eatvio_app/widgets/custom_image_view.dart'; export 'package:flutter_bloc/flutter_bloc.dart'; - -export '../theme/bloc/theme_bloc.dart'; export '../theme/custom_button_style.dart'; diff --git a/lib/core/token_storage.dart b/lib/core/token_storage.dart index 1179241b..c73e2aba 100644 --- a/lib/core/token_storage.dart +++ b/lib/core/token_storage.dart @@ -1,6 +1,6 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/locator_service.dart'; -import 'package:hive_flutter/hive_flutter.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; abstract class TokenStorage { static _addTokenToDioHeader(String token) { @@ -8,22 +8,20 @@ abstract class TokenStorage { } static haveTokenInStorage() async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (await FlutterSecureStorage().read(key: 'token') == null) { return false; } else { - _addTokenToDioHeader(token); + _addTokenToDioHeader((await FlutterSecureStorage().read(key: 'token'))!); return true; } } - static Future getTokenFromStorage() async => (await Hive.openBox('token')).get('token'); + static Future getTokenFromStorage() async => (await FlutterSecureStorage().read(key: 'token'))!; static saveTokenInStorage(String token) async { - (await Hive.openBox('token')).put('token', token); + await FlutterSecureStorage().write(key: 'token', value: token); _addTokenToDioHeader(token); } - static removeTokenInStorage() async => (await Hive.openBox('token')).delete('token'); + static removeTokenInStorage() async => (await FlutterSecureStorage().delete(key: 'token')); } diff --git a/lib/core/utils/pref_utils.dart b/lib/core/utils/pref_utils.dart deleted file mode 100644 index 9c49a3d2..00000000 --- a/lib/core/utils/pref_utils.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:shared_preferences/shared_preferences.dart'; - -class PrefUtils { - static SharedPreferences? _sharedPreferences; - - PrefUtils() { - // init(); - SharedPreferences.getInstance().then((value) { - _sharedPreferences = value; - }); - } - - Future init() async { - _sharedPreferences ??= await SharedPreferences.getInstance(); - print('SharedPreference Initialized'); - } - - ///will clear all the data stored in preference - void clearPreferencesData() async { - _sharedPreferences!.clear(); - } - - Future setThemeData(String value) { - return _sharedPreferences!.setString('themeData', value); - } - - String getThemeData() { - try { - return _sharedPreferences!.getString('themeData')!; - } catch (e) { - return 'primary'; - } - } -} diff --git a/lib/data/models/tokenModel/token_model.dart b/lib/data/models/tokenModel/token_model.dart deleted file mode 100644 index ce310e2e..00000000 --- a/lib/data/models/tokenModel/token_model.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:hive/hive.dart'; - -/// https://pub.dev/packages/flutter_secure_storage TODO replace hive to secure_storage for token storage -@HiveType(typeId: 0) -class TokenModel { - @HiveField(0) - String token; - - TokenModel({required this.token}); -} diff --git a/lib/main.dart b/lib/main.dart index 34f37ccf..e031d6a6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,11 +17,8 @@ import 'package:eatvio_app/presentation/profile/my_profile_screen/models/my_prof import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:hive_flutter/hive_flutter.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart'; -import 'package:path_provider/path_provider.dart'; - import 'core/app_export.dart'; var globalMessengerKey = GlobalKey(); @@ -29,15 +26,11 @@ var globalMessengerKey = GlobalKey(); void main() async { WidgetsFlutterBinding.ensureInitialized(); await di.init(); - final appDocumentDir = await getApplicationDocumentsDirectory(); - final path = appDocumentDir.path; - await Hive.initFlutter(path); SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, DeviceOrientation.portraitUp, ]); - await PrefUtils().init(); initializeDateFormatting().then((_) => runApp(MyApp())); } @@ -49,7 +42,6 @@ class MyApp extends StatelessWidget { BlocProvider(create: (context) => sl()), BlocProvider(create: (context) => sl()), BlocProvider(create: (context) => sl()), - BlocProvider(create: (context) => ThemeBloc(ThemeState(themeType: PrefUtils().getThemeData()))), BlocProvider(create: (context) => sl()..loadFeedBlogPostList()), BlocProvider(create: (context) => sl()..loadRecipesList()), BlocProvider(create: (context) => sl()..loadDiets()), @@ -61,31 +53,27 @@ class MyApp extends StatelessWidget { ], child: BlocListener( listener: (BuildContext context, InitializationState state) {}, - child: BlocBuilder( - builder: (context, state) { - return KeyboardDismisser( - gestures: [ - GestureType.onTap, - GestureType.onPanUpdateDownDirection, - ], - child: MaterialApp.router( - theme: theme, - routerConfig: AppRouter.appRouter, - debugShowCheckedModeBanner: false, - localizationsDelegates: [ - AppLocalizationDelegate(), - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - supportedLocales: [ - Locale( - 'ru', - ), - ], + child: KeyboardDismisser( + gestures: [ + GestureType.onTap, + GestureType.onPanUpdateDownDirection, + ], + child: MaterialApp.router( + theme: theme, + routerConfig: AppRouter.appRouter, + debugShowCheckedModeBanner: false, + localizationsDelegates: [ + AppLocalizationDelegate(), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: [ + Locale( + 'ru', ), - ); - }, + ], + ), ), ), ); diff --git a/lib/presentation/auth/auth_screen/auth_screen.dart b/lib/presentation/auth/auth_screen/auth_screen.dart index 2c738524..502eff15 100644 --- a/lib/presentation/auth/auth_screen/auth_screen.dart +++ b/lib/presentation/auth/auth_screen/auth_screen.dart @@ -6,7 +6,6 @@ import 'package:eatvio_app/widgets/app_bar/appbar_title_image.dart'; import 'package:eatvio_app/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:url_launcher/url_launcher.dart'; import 'package:validators/validators.dart'; @@ -167,9 +166,7 @@ class _AuthScreenState extends State { print(response.statusCode); if (response.statusCode == 200) { var res = await jsonDecode(response.body); - final box = await Hive.openBox('token'); final token = res['token']; - box.put('token', token); await TokenStorage.saveTokenInStorage(token); GoRouter.of(context).go('/my-profile-screen'); } else { diff --git a/lib/presentation/diets/diet_create_screen/bloc/diet_create_bloc.dart b/lib/presentation/diets/diet_create_screen/bloc/diet_create_bloc.dart index 65ea65b9..db2f02a9 100644 --- a/lib/presentation/diets/diet_create_screen/bloc/diet_create_bloc.dart +++ b/lib/presentation/diets/diet_create_screen/bloc/diet_create_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/diets/diet_create_screen/models/diet_create_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -25,9 +25,7 @@ class DietCreateBloc extends Bloc { DietCreateInitialEvent event, Emitter emit, ) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } if (state is DietCreateLoadedState) { diff --git a/lib/presentation/diets/diet_edit_screen/bloc/diet_edit_bloc.dart b/lib/presentation/diets/diet_edit_screen/bloc/diet_edit_bloc.dart index 81e034a1..5f92e25b 100644 --- a/lib/presentation/diets/diet_edit_screen/bloc/diet_edit_bloc.dart +++ b/lib/presentation/diets/diet_edit_screen/bloc/diet_edit_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/diets/diet_edit_screen/models/diet_edit_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,16 +26,14 @@ class DietEditBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? dietID = state.dietModelObj?.dietID; final response = await http.get( Uri.parse(baseUrl + '/api/diets/show/$dietID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { diff --git a/lib/presentation/diets/diet_select_screen/bloc/diet_select_bloc.dart b/lib/presentation/diets/diet_select_screen/bloc/diet_select_bloc.dart index 56dabcf2..6910f250 100644 --- a/lib/presentation/diets/diet_select_screen/bloc/diet_select_bloc.dart +++ b/lib/presentation/diets/diet_select_screen/bloc/diet_select_bloc.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/diets/diet_select_screen/models/diet_select_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; @@ -27,15 +27,13 @@ class DietSelectBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( Uri.parse(baseUrl + '/api/diets/index'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); print('Got response'); diff --git a/lib/presentation/diets/diet_show_screen/bloc/diet_show_bloc.dart b/lib/presentation/diets/diet_show_screen/bloc/diet_show_bloc.dart index 3d0551a2..b680d054 100644 --- a/lib/presentation/diets/diet_show_screen/bloc/diet_show_bloc.dart +++ b/lib/presentation/diets/diet_show_screen/bloc/diet_show_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/diets/diet_show_screen/models/diet_show_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,16 +26,14 @@ class DietBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? dietID = state.dietModelObj?.dietID; final response = await http.get( Uri.parse(baseUrl + '/api/diets/show/$dietID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { @@ -62,16 +60,14 @@ class DietBloc extends Bloc { } FutureOr _deleteEntry(DeleteEntry event, Emitter emit) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final int id = event.id; final response = await http.post( Uri.parse(baseUrl + '/api/diets/delete/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { diff --git a/lib/presentation/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart b/lib/presentation/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart index 798b771c..0cfd4cc4 100644 --- a/lib/presentation/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart +++ b/lib/presentation/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'package:dio/dio.dart'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/locator_service.dart'; import 'package:eatvio_app/presentation/feed/blog_post_create_screen/models/blog_post_create_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:image_picker/image_picker.dart'; import '/core/app_export.dart'; @@ -27,9 +27,7 @@ class BlogPostCreateBloc extends Bloc BlogPostCreateInitialEvent event, Emitter emit, ) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } if (state is BlogPostCreateLoadedState) { @@ -46,7 +44,7 @@ class BlogPostCreateBloc extends Bloc } else { emit( BlogPostCreateLoadedState( - token: token, + token: await TokenStorage.getTokenFromStorage(), title: TextEditingController(), description: TextEditingController(), youtubeURL: TextEditingController(), diff --git a/lib/presentation/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart b/lib/presentation/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart index c9c6bf9c..813a66d0 100644 --- a/lib/presentation/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart +++ b/lib/presentation/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/feed/blog_post_edit_screen/models/blog_post_edit_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,16 +26,14 @@ class BlogPostEditBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? blog_postID = state.blog_postModelObj?.blog_postID; final response = await http.get( Uri.parse(baseUrl + '/api/blogPosts/show/$blog_postID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { diff --git a/lib/presentation/glossary/glossary_screen/bloc/glossary_screen_bloc.dart b/lib/presentation/glossary/glossary_screen/bloc/glossary_screen_bloc.dart index 3bae9e80..c45d5569 100644 --- a/lib/presentation/glossary/glossary_screen/bloc/glossary_screen_bloc.dart +++ b/lib/presentation/glossary/glossary_screen/bloc/glossary_screen_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/glossary/glossary_screen/models/glossary_screen_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,15 +26,13 @@ class GlossaryBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final responseProductGroups = await http.get( Uri.parse(baseUrl + '/api/glossaries/group/index'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (responseProductGroups.statusCode == 200) { @@ -54,12 +52,12 @@ class GlossaryBloc extends Bloc { List productGroupsModel = _fillProductGroups(dataProductGroups); emit( GlossaryLoadedState( - token: token, + token: await TokenStorage.getTokenFromStorage(), productGroups: productGroupsModel, productList: [], ), ); - await _getProductListById(token, emit, productGroupsModel[0].id); + await _getProductListById(await TokenStorage.getTokenFromStorage(), emit, productGroupsModel[0].id); } } else { // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку diff --git a/lib/presentation/plans/plan_create_screen/bloc/plan_create_bloc.dart b/lib/presentation/plans/plan_create_screen/bloc/plan_create_bloc.dart index 3cab0f65..871c2dc1 100644 --- a/lib/presentation/plans/plan_create_screen/bloc/plan_create_bloc.dart +++ b/lib/presentation/plans/plan_create_screen/bloc/plan_create_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/plans/plan_create_screen/models/plan_create_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -25,9 +25,7 @@ class PlanCreateBloc extends Bloc { PlanCreateInitialEvent event, Emitter emit, ) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } if (state is PlanCreateLoadedState) { diff --git a/lib/presentation/plans/plan_edit_screen/bloc/plan_edit_bloc.dart b/lib/presentation/plans/plan_edit_screen/bloc/plan_edit_bloc.dart index 5987b6bd..656e671c 100644 --- a/lib/presentation/plans/plan_edit_screen/bloc/plan_edit_bloc.dart +++ b/lib/presentation/plans/plan_edit_screen/bloc/plan_edit_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/plans/plan_edit_screen/models/plan_edit_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,16 +26,14 @@ class PlanEditBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? planID = state.planModelObj?.planID; final response = await http.get( Uri.parse(baseUrl + '/api/plans/show/$planID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { diff --git a/lib/presentation/plans/plan_select_screen/bloc/plan_select_bloc.dart b/lib/presentation/plans/plan_select_screen/bloc/plan_select_bloc.dart index dcf60700..fa32b77f 100644 --- a/lib/presentation/plans/plan_select_screen/bloc/plan_select_bloc.dart +++ b/lib/presentation/plans/plan_select_screen/bloc/plan_select_bloc.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/plans/plan_select_screen/models/plan_select_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; @@ -27,9 +27,7 @@ class PlanSelectBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( diff --git a/lib/presentation/plans/plan_show_screen/bloc/plan_show_bloc.dart b/lib/presentation/plans/plan_show_screen/bloc/plan_show_bloc.dart index ad9a7a43..f09463a9 100644 --- a/lib/presentation/plans/plan_show_screen/bloc/plan_show_bloc.dart +++ b/lib/presentation/plans/plan_show_screen/bloc/plan_show_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/plans/plan_show_screen/models/plan_show_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,16 +26,14 @@ class PlanBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? planID = state.planModelObj?.planID; final response = await http.get( Uri.parse(baseUrl + '/api/plans/show/$planID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { @@ -62,16 +60,14 @@ class PlanBloc extends Bloc { } FutureOr _deleteEntry(DeleteEntry event, Emitter emit) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final int id = event.id; final response = await http.post( Uri.parse(baseUrl + '/api/plans/delete/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { diff --git a/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart b/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart index 8b01f618..4678416e 100644 --- a/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart +++ b/lib/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/profile/my_profile_screen/models/my_profile_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; @@ -28,9 +28,7 @@ class MyProfileBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } //final token = @@ -38,7 +36,7 @@ class MyProfileBloc extends Bloc { final response = await http.get( Uri.parse(baseUrl + '/api/profile/index'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { @@ -48,10 +46,6 @@ class MyProfileBloc extends Bloc { data.containsKey('userDetails') && data.containsKey('chartPoints') && data.containsKey('circumferences')) { - final avatarBox = await Hive.openBox('avatar'); - final avatar = data['user']['profile_photo_path']; - print(avatar); - avatarBox.put('avatar', avatar); if (state is MyProfileLoadedState) { var currentState = state as MyProfileLoadedState; var plans = [] @@ -69,7 +63,7 @@ class MyProfileBloc extends Bloc { user: data['user'], userDetails: data['userDetails'], plans: plans, - token: token, + token: await TokenStorage.getTokenFromStorage(), chestCircumferenceController: TextEditingController(), waistCircumferenceController: TextEditingController(), hipCircumferenceController: TextEditingController(), @@ -172,7 +166,7 @@ class MyProfileBloc extends Bloc { user: data['user'], userDetails: data['userDetails'], plans: plans, - token: token, + token: await TokenStorage.getTokenFromStorage(), chestCircumferenceController: TextEditingController(), waistCircumferenceController: TextEditingController(), hipCircumferenceController: TextEditingController(), diff --git a/lib/presentation/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart b/lib/presentation/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart index 560c75ee..fa817935 100644 --- a/lib/presentation/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart +++ b/lib/presentation/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/recipe/recipe_edit_screen/models/recipe_edit_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -29,16 +29,14 @@ class RecipeEditBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? recipeID = state.recipeModelObj?.recipeID; final response = await http.get( Uri.parse(baseUrl + '/api/recipes/show/$recipeID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { @@ -79,7 +77,7 @@ class RecipeEditBloc extends Bloc { emit( RecipeEditLoadedState( - token: token, + token: await TokenStorage.getTokenFromStorage(), recipe: data, title: TextEditingController(text: data['title']), description: TextEditingController(text: data['description']), @@ -191,17 +189,14 @@ class RecipeEditBloc extends Bloc { } _fetchTags(int id) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( Uri.parse(baseUrl + '/api/recipes/getTags/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); final data = jsonDecode(response.body); @@ -210,9 +205,7 @@ class RecipeEditBloc extends Bloc { FutureOr _reloadScreen(RecipeEditEvent? event, Emitter emit) async { print('Reloading..'); - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } if (state is RecipeEditLoadedState) { diff --git a/lib/presentation/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart b/lib/presentation/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart index 399e20f8..21f14634 100644 --- a/lib/presentation/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart +++ b/lib/presentation/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'package:dio/dio.dart'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/locator_service.dart'; import 'package:eatvio_app/presentation/recipe/recipe_select_screen/models/recipe_select_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:image_picker/image_picker.dart'; import '/core/app_export.dart'; @@ -26,9 +26,7 @@ class RecipeSelectBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await sl().get(baseUrl + '/api/recipes/index'); diff --git a/lib/presentation/recipe/recipe_show_screen/bloc/recipe_show_bloc.dart b/lib/presentation/recipe/recipe_show_screen/bloc/recipe_show_bloc.dart index ac2d9a9a..2ae1d76d 100644 --- a/lib/presentation/recipe/recipe_show_screen/bloc/recipe_show_bloc.dart +++ b/lib/presentation/recipe/recipe_show_screen/bloc/recipe_show_bloc.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/feed/blog_post_screen/models/comment_model.dart'; import 'package:eatvio_app/presentation/recipe/recipe_show_screen/models/recipe_show_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; @@ -29,16 +29,14 @@ class RecipeBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final String? recipeID = state.recipeModelObj?.recipeID; final response = await http.get( Uri.parse(baseUrl + '/api/recipes/show/$recipeID'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { @@ -60,7 +58,7 @@ class RecipeBloc extends Bloc { } else { emit( RecipeLoadedState( - token: token, + token: await TokenStorage.getTokenFromStorage(), recipe: data, steps: data['steps'], author: await _fetchAuthor(data['id']), @@ -85,16 +83,14 @@ class RecipeBloc extends Bloc { } FutureOr _deleteEntry(DeleteEntry event, Emitter emit) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final int id = event.id; final response = await http.post( Uri.parse(baseUrl + '/api/recipes/delete/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); if (response.statusCode == 200) { @@ -122,17 +118,14 @@ class RecipeBloc extends Bloc { } _fetchAuthor(int id) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( Uri.parse(baseUrl + '/api/recipes/getAuthor/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); final data = jsonDecode(response.body); @@ -140,15 +133,13 @@ class RecipeBloc extends Bloc { } Future _fetchComments(int id) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( Uri.parse(baseUrl + '/api/recipes/getComments/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); final data = jsonDecode(response.body); @@ -156,17 +147,14 @@ class RecipeBloc extends Bloc { } _fetchTags(int id) async { - final box = await Hive.openBox('token'); - final token = box.get('token'); - - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( Uri.parse(baseUrl + '/api/recipes/getTags/$id'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); final data = jsonDecode(response.body); diff --git a/lib/presentation/users/subscribers_screen/bloc/subscribers_bloc.dart b/lib/presentation/users/subscribers_screen/bloc/subscribers_bloc.dart index a48d6198..f29ace07 100644 --- a/lib/presentation/users/subscribers_screen/bloc/subscribers_bloc.dart +++ b/lib/presentation/users/subscribers_screen/bloc/subscribers_bloc.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'dart:convert'; import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/users/subscribers_screen/models/subscribers_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import '/core/app_export.dart'; @@ -26,15 +26,13 @@ class SubscribersBloc extends Bloc { Emitter emit, ) async { try { - final box = await Hive.openBox('token'); - final token = box.get('token'); - if (token == null) { + if (!await TokenStorage.haveTokenInStorage()) { AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); } final response = await http.get( Uri.parse(baseUrl + '/api/profile/subscribers'), headers: { - 'Authorization': 'Bearer $token', + 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', }, ); print('Got response'); diff --git a/lib/theme/bloc/theme_bloc.dart b/lib/theme/bloc/theme_bloc.dart deleted file mode 100644 index ae2863bd..00000000 --- a/lib/theme/bloc/theme_bloc.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -import '../../core/app_export.dart'; - -part 'theme_event.dart'; -part 'theme_state.dart'; - -class ThemeBloc extends Bloc { - ThemeBloc(ThemeState initialState) : super(initialState) { - on(_changeTheme); - } - - _changeTheme( - ThemeChangeEvent event, - Emitter emit, - ) async { - emit(state.copyWith(themeType: event.themeType)); - } -} diff --git a/lib/theme/bloc/theme_event.dart b/lib/theme/bloc/theme_event.dart deleted file mode 100644 index 700cbdec..00000000 --- a/lib/theme/bloc/theme_event.dart +++ /dev/null @@ -1,15 +0,0 @@ -part of 'theme_bloc.dart'; - -@immutable -abstract class ThemeEvent extends Equatable {} - -class ThemeChangeEvent extends ThemeEvent { - ThemeChangeEvent({required this.themeType}) : super() { - PrefUtils().setThemeData(themeType); - } - - final String themeType; - - @override - List get props => []; -} diff --git a/lib/theme/bloc/theme_state.dart b/lib/theme/bloc/theme_state.dart deleted file mode 100644 index 191bcfe4..00000000 --- a/lib/theme/bloc/theme_state.dart +++ /dev/null @@ -1,15 +0,0 @@ -part of 'theme_bloc.dart'; - -@immutable -class ThemeState extends Equatable { - ThemeState({required this.themeType}); - - final String themeType; - - @override - List get props => [themeType]; - - ThemeState copyWith({String? themeType}) { - return ThemeState(themeType: themeType ?? this.themeType); - } -} diff --git a/lib/theme/theme_helper.dart b/lib/theme/theme_helper.dart index b33d056b..20fa5474 100644 --- a/lib/theme/theme_helper.dart +++ b/lib/theme/theme_helper.dart @@ -7,7 +7,7 @@ import '../../core/app_export.dart'; /// Helper class for managing themes and colors. class ThemeHelper { // The current app theme - var _appTheme = PrefUtils().getThemeData(); + var _appTheme = 'primary'; // A map of custom color themes supported by the app Map _supportedCustomColor = { diff --git a/lib/widgets/custom_expandable_list.dart b/lib/widgets/custom_expandable_list.dart index 5678f3e4..2489c0d7 100644 --- a/lib/widgets/custom_expandable_list.dart +++ b/lib/widgets/custom_expandable_list.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart'; import 'package:eatvio_app/widgets/custom_hyper_switch.dart'; import 'package:eatvio_app/widgets/custom_hypo_switch.dart'; @@ -8,7 +9,6 @@ import 'package:eatvio_app/widgets/next_step_button.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:intl/intl.dart'; @@ -384,8 +384,7 @@ class _ExpandableListState extends State { } Future _getTokenFromBox() async { - final box = await Hive.openBox('token'); - return box.get('token'); + return await TokenStorage.getTokenFromStorage(); } String _buildApiUrl() { diff --git a/lib/widgets/custom_navigation_menu.dart b/lib/widgets/custom_navigation_menu.dart index eece5f8f..4bc712d8 100644 --- a/lib/widgets/custom_navigation_menu.dart +++ b/lib/widgets/custom_navigation_menu.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/widgets/custom_navigation_menu_item.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; class CustomNavigationMenu extends StatelessWidget { @@ -61,8 +61,7 @@ class CustomNavigationMenu extends StatelessWidget { _onTapLogout(BuildContext context) { return () async { - final box = await Hive.openBox('token'); - final token = box.get('token'); + final token = await TokenStorage.getTokenFromStorage(); final response = await http.post( Uri.parse(baseUrl + '/api/profile/logout'), headers: { @@ -71,8 +70,7 @@ _onTapLogout(BuildContext context) { ); if (response.statusCode == 204) { - print(response.statusCode); - box.delete('token'); // Удаляем токен из Hive + await TokenStorage.removeTokenInStorage(); GoRouter.of(context).go('/auth-screen'); } }; diff --git a/pubspec.yaml b/pubspec.yaml index 1cb02791..e5f44648 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,10 +13,8 @@ dependencies: flutter_localizations: sdk: flutter + flutter_secure_storage: ^9.2.2 flutter_bloc: ^8.1.6 - shared_preferences: ^2.3.2 - hive: ^2.2.3 - hive_flutter: ^1.1.0 cached_network_image: ^3.4.1 flutter_svg: ^2.0.10 equatable: ^2.0.5