TF-1068 add recent url
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
|
||||
|
||||
class UriAdapter extends TypeAdapter<Uri> {
|
||||
@override
|
||||
final int typeId = CachingConstants.URI_CACHE_IDENTITY;
|
||||
|
||||
@override
|
||||
Uri read(BinaryReader reader) {
|
||||
return Uri.parse(reader.readString());
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, Uri obj) {
|
||||
writer.writeString(obj.toString());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,10 +6,12 @@ import 'package:core/utils/app_logger.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:path_provider/path_provider.dart' as path_provider;
|
||||
import 'package:tmail_ui_user/features/caching/adapter/uri_adapter.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/local/encryption_key_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/account_cache.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/encryption_key_cache.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/token_oidc_cache.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_cache.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_rights_cache.dart';
|
||||
@@ -74,6 +76,8 @@ class HiveCacheConfig {
|
||||
Hive.registerAdapter(AccountCacheAdapter());
|
||||
Hive.registerAdapter(EncryptionKeyCacheAdapter());
|
||||
Hive.registerAdapter(AuthenticationInfoCacheAdapter());
|
||||
Hive.registerAdapter(UriAdapter());
|
||||
Hive.registerAdapter(RecentLoginUrlCacheAdapter());
|
||||
}
|
||||
|
||||
Future closeHive() async {
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart';
|
||||
|
||||
class RecentLoginUrlCacheClient extends HiveCacheClient<RecentLoginUrlCache> {
|
||||
|
||||
@override
|
||||
String get tableName => 'RecentLoginUrlCache';
|
||||
|
||||
@override
|
||||
Future<void> clearAllData() {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.clear();
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteItem(String key) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.delete(key);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteMultipleItem(List<String> listKey) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.deleteAll(listKey);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<RecentLoginUrlCache>> getAll() {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.values.toList();
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<RecentLoginUrlCache?> getItem(String key) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.get(key);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> insertItem(String key, RecentLoginUrlCache newObject) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.put(key, newObject);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> insertMultipleItem(Map<String, RecentLoginUrlCache> mapObject) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.putAll(mapObject);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> isExistItem(String key) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.containsKey(key);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> isExistTable() {
|
||||
return Future.sync(() async {
|
||||
return Hive.boxExists(tableName);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Box<RecentLoginUrlCache>> openBox() async {
|
||||
if (Hive.isBoxOpen(tableName)) {
|
||||
return Hive.box<RecentLoginUrlCache>(tableName);
|
||||
}
|
||||
return Hive.openBox<RecentLoginUrlCache>(tableName);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateItem(String key, RecentLoginUrlCache newObject) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.put(key, newObject);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> updateMultipleItem(Map<String, RecentLoginUrlCache> mapObject) {
|
||||
return Future.sync(() async {
|
||||
final boxRecent = await openBox();
|
||||
return boxRecent.putAll(mapObject);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -11,4 +11,6 @@ class CachingConstants {
|
||||
static const int ACCOUNT_HIVE_CACHE_IDENTIFY = 9;
|
||||
static const int ENCRYPTION_KEY_HIVE_CACHE_IDENTIFY = 10;
|
||||
static const int AUTHENTICATION_INFO_HIVE_CACHE_IDENTIFY = 11;
|
||||
static const int URI_CACHE_IDENTITY = 12;
|
||||
static const int LOGIN_URL_CACHE_IDENTITY = 13;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||
|
||||
abstract class LoginUrlDataSource {
|
||||
Future<void> saveLoginUrl(RecentLoginUrl baseUrl);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/login_url_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||
|
||||
class LoginUrlDataSourceImpl implements LoginUrlDataSource {
|
||||
|
||||
final RecentLoginUrlCacheClient _recentLoginUrlCacheClient;
|
||||
|
||||
LoginUrlDataSourceImpl(this._recentLoginUrlCacheClient);
|
||||
|
||||
@override
|
||||
Future<void> saveLoginUrl(RecentLoginUrl recentLoginUrl) {
|
||||
return Future.sync(() async {
|
||||
final tmpRecentLoginUrl = recentLoginUrl.url.toString();
|
||||
if(await _recentLoginUrlCacheClient.isExistItem(tmpRecentLoginUrl)){
|
||||
await _recentLoginUrlCacheClient.updateItem(tmpRecentLoginUrl, recentLoginUrl.toRecentLoginUrlCache());
|
||||
} else {
|
||||
await _recentLoginUrlCacheClient.insertItem(tmpRecentLoginUrl, recentLoginUrl.toRecentLoginUrlCache());
|
||||
}
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||
|
||||
part 'recent_login_url_cache.g.dart';
|
||||
|
||||
@HiveType(typeId: CachingConstants.LOGIN_URL_CACHE_IDENTITY)
|
||||
class RecentLoginUrlCache extends HiveObject with EquatableMixin {
|
||||
|
||||
@HiveField(0)
|
||||
final Uri url;
|
||||
|
||||
@HiveField(1)
|
||||
final DateTime creationDate;
|
||||
|
||||
RecentLoginUrlCache(this.url, this.creationDate);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [url, creationDate];
|
||||
}
|
||||
|
||||
extension RecentLoginUrlExtension on RecentLoginUrl {
|
||||
RecentLoginUrlCache toRecentLoginUrlCache() {
|
||||
return RecentLoginUrlCache(url, creationDate);
|
||||
}
|
||||
}
|
||||
|
||||
extension RecentLoginUrlCacheExtension on RecentLoginUrlCache {
|
||||
RecentLoginUrl toRecentLoginUrl() {
|
||||
return RecentLoginUrl(url, creationDate);
|
||||
}
|
||||
|
||||
bool matchUrl(Uri pattern) {
|
||||
return url.toString().toLowerCase().contains(pattern.toString().toLowerCase());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/login_url_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/login_url_repository.dart';
|
||||
|
||||
class LoginUrlRepositoryImpl implements LoginUrlRepository {
|
||||
final LoginUrlDataSource loginInfoDataSource;
|
||||
|
||||
LoginUrlRepositoryImpl(this.loginInfoDataSource);
|
||||
|
||||
@override
|
||||
Future<void> saveRecentLoginUrl(RecentLoginUrl recentLogin) {
|
||||
return loginInfoDataSource.saveLoginUrl(recentLogin);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
class RecentLoginUrl with EquatableMixin {
|
||||
final Uri url;
|
||||
final DateTime creationDate;
|
||||
|
||||
RecentLoginUrl(this.url, this.creationDate);
|
||||
|
||||
factory RecentLoginUrl.now(Uri url) =>
|
||||
RecentLoginUrl(url, DateTime.now());
|
||||
|
||||
@override
|
||||
List<Object?> get props => [url, creationDate];
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||
|
||||
abstract class LoginUrlRepository {
|
||||
Future<void> saveRecentLoginUrl(RecentLoginUrl recentLoginUrl);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
|
||||
class SaveRecentLoginUrlSuccess extends UIState {
|
||||
|
||||
SaveRecentLoginUrlSuccess();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class SaveRecentLoginUrlFailed extends FeatureFailure {
|
||||
final dynamic exception;
|
||||
|
||||
SaveRecentLoginUrlFailed(this.exception);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [exception];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/login_url_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/state/save_recent_login_url_state.dart';
|
||||
|
||||
class SaveLoginUrlOnMobileInteractor {
|
||||
final LoginUrlRepository loginUrlRepository;
|
||||
|
||||
SaveLoginUrlOnMobileInteractor(this.loginUrlRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(RecentLoginUrl recentLoginUrl) async* {
|
||||
try{
|
||||
await loginUrlRepository.saveRecentLoginUrl(recentLoginUrl);
|
||||
yield Right(SaveRecentLoginUrlSuccess());
|
||||
} catch(e) {
|
||||
yield Left(SaveRecentLoginUrlFailed(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,15 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource/login_url_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/datasource_impl/login_url_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
|
||||
@@ -16,10 +19,12 @@ import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'
|
||||
import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/repository/authentication_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/repository/login_url_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/authentication_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/login_url_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
|
||||
@@ -27,6 +32,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
|
||||
|
||||
@@ -45,6 +51,7 @@ class LoginBindings extends BaseBindings {
|
||||
Get.find<AuthenticateOidcOnBrowserInteractor>(),
|
||||
Get.find<GetAuthenticationInfoInteractor>(),
|
||||
Get.find<GetStoredOidcConfigurationInteractor>(),
|
||||
Get.find<SaveLoginUrlOnMobileInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
@@ -53,6 +60,7 @@ class LoginBindings extends BaseBindings {
|
||||
Get.lazyPut<AuthenticationDataSource>(() => Get.find<AuthenticationDataSourceImpl>());
|
||||
Get.lazyPut<AuthenticationOIDCDataSource>(() => Get.find<AuthenticationOIDCDataSourceImpl>());
|
||||
Get.lazyPut<AccountDatasource>(() => Get.find<HiveAccountDatasourceImpl>());
|
||||
Get.lazyPut<LoginUrlDataSource>(() => Get.find<LoginUrlDataSourceImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -67,6 +75,9 @@ class LoginBindings extends BaseBindings {
|
||||
Get.lazyPut(() => HiveAccountDatasourceImpl(
|
||||
Get.find<AccountCacheManager>()
|
||||
));
|
||||
Get.lazyPut(() => LoginUrlDataSourceImpl(
|
||||
Get.find<RecentLoginUrlCacheClient>()
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -96,6 +107,9 @@ class LoginBindings extends BaseBindings {
|
||||
Get.lazyPut(() => GetStoredOidcConfigurationInteractor(
|
||||
Get.find<AuthenticationOIDCRepository>(),
|
||||
));
|
||||
Get.lazyPut(() => SaveLoginUrlOnMobileInteractor(
|
||||
Get.find<LoginUrlRepository>(),
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -103,6 +117,7 @@ class LoginBindings extends BaseBindings {
|
||||
Get.lazyPut<AuthenticationRepository>(() => Get.find<AuthenticationRepositoryImpl>());
|
||||
Get.lazyPut<AuthenticationOIDCRepository>(() => Get.find<AuthenticationOIDCRepositoryImpl>());
|
||||
Get.lazyPut<AccountRepository>(() => Get.find<AccountRepositoryImpl>());
|
||||
Get.lazyPut<LoginUrlRepository>(() => Get.find<LoginUrlRepositoryImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -110,5 +125,6 @@ class LoginBindings extends BaseBindings {
|
||||
Get.lazyPut(() => AuthenticationRepositoryImpl(Get.find<AuthenticationDataSource>()));
|
||||
Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find<AuthenticationOIDCDataSource>()));
|
||||
Get.lazyPut(() => AccountRepositoryImpl(Get.find<AccountDatasource>()));
|
||||
Get.lazyPut(() => LoginUrlRepositoryImpl(Get.find<LoginUrlDataSource>()));
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
|
||||
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
|
||||
@@ -40,6 +41,7 @@ class LoginController extends BaseController {
|
||||
final AuthenticateOidcOnBrowserInteractor _authenticateOidcOnBrowserInteractor;
|
||||
final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor;
|
||||
final GetStoredOidcConfigurationInteractor _getStoredOidcConfigurationInteractor;
|
||||
final SaveLoginUrlOnMobileInteractor _saveLoginUrlOnMobileInteractor;
|
||||
|
||||
|
||||
final TextEditingController urlInputController = TextEditingController();
|
||||
@@ -56,6 +58,7 @@ class LoginController extends BaseController {
|
||||
this._authenticateOidcOnBrowserInteractor,
|
||||
this._getAuthenticationInfoInteractor,
|
||||
this._getStoredOidcConfigurationInteractor,
|
||||
this._saveLoginUrlOnMobileInteractor,
|
||||
);
|
||||
|
||||
var loginState = LoginState(Right(LoginInitAction())).obs;
|
||||
|
||||
Reference in New Issue
Block a user