diff --git a/lib/core/di/external_registrations.dart b/lib/core/di/external_registrations.dart index 231eeef3..dcff4441 100644 --- a/lib/core/di/external_registrations.dart +++ b/lib/core/di/external_registrations.dart @@ -2,7 +2,9 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/interceptors/phone_verify_error_interceptor.dart'; import 'package:eatvio_app/core/interceptors/token_interceptor.dart'; +import 'package:eatvio_app/core/prefs.dart'; import 'package:get_it/get_it.dart'; +import 'package:shared_preferences/shared_preferences.dart'; /// Регистрация внешних зависимостей в системе внедрения зависимостей class ExternalRegistrations { @@ -11,23 +13,20 @@ class ExternalRegistrations { /// Регистрация всех внешних зависимостей static void registerAll() { _registerDio(); + _registerPrefs(); } /// Регистрация Dio HTTP клиента static void _registerDio() { sl.registerLazySingleton( - () => Dio( - BaseOptions( - baseUrl: sl().baseUrl, - headers: { - 'accept': 'application/json', - 'content-type': 'application/json', - }, - ), - )..interceptors.addAll([ - TokenInterceptor(), - PhoneVerifyErrorInterceptor(), - ]), + () => + Dio(BaseOptions(baseUrl: sl().baseUrl, headers: {'accept': 'application/json', 'content-type': 'application/json'})) + ..interceptors.addAll([TokenInterceptor(), PhoneVerifyErrorInterceptor()]), ); } + + /// Регистрация Prefs + static void _registerPrefs() { + sl.registerSingletonAsync(()async => Prefs(await SharedPreferences.getInstance())); + } } diff --git a/lib/core/firebase_api.dart b/lib/core/firebase_api.dart index 7f4baad7..089d7846 100644 --- a/lib/core/firebase_api.dart +++ b/lib/core/firebase_api.dart @@ -29,6 +29,22 @@ class FirebaseApi { return token; } + Future registerAnonymousPushToken() async { + try { + final deviceInfo = DeviceInfoPlugin(); + await sl().post( + '/api/anonymous_token', + data: { + 'platform': Platform.isIOS ? 'ios' : 'android', + 'hw_id': Platform.isIOS ? (await deviceInfo.iosInfo).identifierForVendor : (await deviceInfo.androidInfo).id, + 'token': await getToken(), + }, + ); + } catch (e, st) { + log(e.toString(), stackTrace: st); + } + } + Future registerPushToken() async { if (await TokenStorage.haveTokenInStorage()) { try { diff --git a/lib/core/prefs.dart b/lib/core/prefs.dart new file mode 100644 index 00000000..14ed7812 --- /dev/null +++ b/lib/core/prefs.dart @@ -0,0 +1,43 @@ +import 'package:eatvio_app/core/prefs_keys.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + + +class Prefs { + final SharedPreferences _prefs; + + Prefs(this._prefs); + + String _key(PrefsKeys key) => key.name; + + Future setString(PrefsKeys key, String value) async { + await _prefs.setString(_key(key), value); + } + + String? getString(PrefsKeys key) { + return _prefs.getString(_key(key)); + } + + Future setInt(PrefsKeys key, int value) async { + await _prefs.setInt(_key(key), value); + } + + int? getInt(PrefsKeys key) { + return _prefs.getInt(_key(key)); + } + + Future setBool(PrefsKeys key, bool value) async { + await _prefs.setBool(_key(key), value); + } + + bool? getBool(PrefsKeys key) { + return _prefs.getBool(_key(key)); + } + + Future remove(PrefsKeys key) async { + await _prefs.remove(_key(key)); + } + + Future clear() async { + await _prefs.clear(); + } +} diff --git a/lib/core/prefs_keys.dart b/lib/core/prefs_keys.dart new file mode 100644 index 00000000..0ba552d5 --- /dev/null +++ b/lib/core/prefs_keys.dart @@ -0,0 +1 @@ +enum PrefsKeys { hasAnonymousTokenBeenSent, welcomeScreenWasShowed } diff --git a/lib/core/routing/auth_routes.dart b/lib/core/routing/auth_routes.dart index b94cc2c8..39e7b2a9 100644 --- a/lib/core/routing/auth_routes.dart +++ b/lib/core/routing/auth_routes.dart @@ -1,3 +1,5 @@ +import 'package:eatvio_app/core/firebase_api.dart'; +import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/routing/route_constants.dart'; import 'package:eatvio_app/features/auth/entities/auth_result_entity.dart'; import 'package:eatvio_app/features/auth/presentation/pages/auth_screen.dart'; @@ -18,6 +20,10 @@ class AuthRoutes { path: RouteConstants.authScreen, name: 'authScreen', builder: (context, state) => const AuthScreen(), + redirect: (context, state) { + sl().registerAnonymousPushToken(); + return null; + }, routes: [ GoRoute(path: RouteConstants.registrationScreen, name: 'registrationScreen', builder: (context, state) => const RegistrationScreen()), GoRoute( diff --git a/lib/core/routing/other_routes.dart b/lib/core/routing/other_routes.dart index 7b5017df..060d6f0a 100644 --- a/lib/core/routing/other_routes.dart +++ b/lib/core/routing/other_routes.dart @@ -2,6 +2,8 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/core/app_config.dart'; import 'package:eatvio_app/core/firebase_api.dart'; import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/prefs.dart'; +import 'package:eatvio_app/core/prefs_keys.dart'; import 'package:eatvio_app/core/routing/route_constants.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/features/calendar/presentation/pages/calendar_screen.dart'; @@ -40,7 +42,6 @@ import 'package:eatvio_app/features/finances_and_consultations_archive/presentat import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:version/version.dart'; /// Остальные маршруты приложения @@ -55,18 +56,24 @@ class OtherRoutes { builder: (context, state) => const WelcomeScreen(), redirect: (context, state) async { try { - final sharedPreferences = await SharedPreferences.getInstance(); - final welcomeScreenWasShowed = sharedPreferences.getBool('welcomeScreenWasShowed') ?? false; - await sl().registerPushToken(); - if (welcomeScreenWasShowed == false) { + final prefs = sl(); + final firebaseApi = sl(); + final welcomeScreenWasShowed = prefs.getBool(PrefsKeys.welcomeScreenWasShowed) ?? false; + await firebaseApi.registerPushToken(); + if (!welcomeScreenWasShowed) { return null; } else if (await TokenStorage.haveTokenInStorage()) { - return RouteConstants.feedScreen; + return '/feed-screen'; } else { - return RouteConstants.authScreen; + final hasAnonymousTokenBeenSent = prefs.getBool(PrefsKeys.hasAnonymousTokenBeenSent) ?? false; + if (!hasAnonymousTokenBeenSent) { + await firebaseApi.registerAnonymousPushToken(); + prefs.setBool(PrefsKeys.hasAnonymousTokenBeenSent, true); + } + return '/auth-screen'; } } catch (e) { - return RouteConstants.feedScreen; + return '/feed-screen'; } }, ), diff --git a/lib/features/welcome/presentation/pages/welcome_screen.dart b/lib/features/welcome/presentation/pages/welcome_screen.dart index d0b8f867..c7a815dd 100644 --- a/lib/features/welcome/presentation/pages/welcome_screen.dart +++ b/lib/features/welcome/presentation/pages/welcome_screen.dart @@ -1,10 +1,12 @@ import 'package:eatvio_app/app_keys.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/prefs.dart'; +import 'package:eatvio_app/core/prefs_keys.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; class WelcomeScreen extends StatefulWidget { @@ -82,8 +84,8 @@ class _WelcomeScreenState extends State { InkWell( key: AppKeys.welcomeScreenButton, onTap: () async { - final sharedPreferences = await SharedPreferences.getInstance(); - await sharedPreferences.setBool('welcomeScreenWasShowed', true); + final sharedPreferences = sl(); + await sharedPreferences.setBool(PrefsKeys.welcomeScreenWasShowed, true); if (await TokenStorage.haveTokenInStorage()) { goRouter.go('/feed-screen'); } else {