Skip to content

Commit fa12974

Browse files
committed
TF-4186 Implement remember choose organisation server
1 parent 3252d58 commit fa12974

15 files changed

+317
-45
lines changed

lib/features/base/base_controller.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:model/model.dart';
1717
import 'package:rule_filter/rule_filter/capability_rule_filter.dart';
1818
import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart';
1919
import 'package:tmail_ui_user/features/base/mixin/emit_state_mixin.dart';
20+
import 'package:tmail_ui_user/features/base/extensions/handle_company_server_login_info_extension.dart';
2021
import 'package:tmail_ui_user/features/base/mixin/logout_mixin.dart';
2122
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
2223
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
@@ -25,8 +26,10 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions
2526
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
2627
import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart';
2728
import 'package:tmail_ui_user/features/login/domain/exceptions/logout_exception.dart';
29+
import 'package:tmail_ui_user/features/login/domain/state/get_company_server_login_info_state.dart';
2830
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
2931
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
32+
import 'package:tmail_ui_user/features/login/domain/usecases/get_company_server_login_info_interactor.dart';
3033
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
3134
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
3235
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart';
@@ -86,6 +89,7 @@ abstract class BaseController extends GetxController
8689

8790
GetStoredFirebaseRegistrationInteractor? _getStoredFirebaseRegistrationInteractor;
8891
DestroyFirebaseRegistrationInteractor? _destroyFirebaseRegistrationInteractor;
92+
GetCompanyServerLoginInfoInteractor? getCompanyServerLoginInfoInteractor;
8993

9094
StreamSubscription<html.Event>? _onBeforeUnloadBrowserSubscription;
9195
StreamSubscription<html.Event>? _onUnloadBrowserSubscription;
@@ -264,6 +268,8 @@ abstract class BaseController extends GetxController
264268
} else if (failure is GetStoredFirebaseRegistrationFailure ||
265269
failure is DestroyFirebaseRegistrationFailure) {
266270
await clearDataAndGoToLoginPage();
271+
} else if (failure is GetCompanyServerLoginInfoFailure) {
272+
handleGetCompanyServerLoginInfoFailure();
267273
}
268274
}
269275

@@ -279,6 +285,8 @@ abstract class BaseController extends GetxController
279285
_destroyFirebaseRegistration(success.firebaseRegistration.id!);
280286
} else if (success is DestroyFirebaseRegistrationSuccess) {
281287
await clearDataAndGoToLoginPage();
288+
} else if (success is GetCompanyServerLoginInfoSuccess) {
289+
handleGetCompanyServerLoginInfoSuccess(success.serverLoginInfo);
282290
}
283291
}
284292

@@ -391,15 +399,15 @@ abstract class BaseController extends GetxController
391399

392400
void goToLogin() {
393401
if (PlatformInfo.isMobile) {
394-
navigateToTwakeWelcomePage();
402+
getCompanyServerLoginInfo(popAllRoute: false);
395403
} else {
396404
navigateToLoginPage();
397405
}
398406
}
399407

400408
void removeAllPageAndGoToLogin() {
401409
if (PlatformInfo.isMobile) {
402-
pushAndPopAll(AppRoutes.twakeWelcome);
410+
getCompanyServerLoginInfo(popAllRoute: true);
403411
} else {
404412
navigateToLoginPage();
405413
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:core/utils/app_logger.dart';
2+
import 'package:tmail_ui_user/features/base/base_controller.dart';
3+
import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart';
4+
import 'package:tmail_ui_user/features/login/domain/usecases/get_company_server_login_info_interactor.dart';
5+
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
6+
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
7+
import 'package:tmail_ui_user/main/routes/app_routes.dart';
8+
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
9+
10+
extension HandleCompanyServerLoginInfoExtension on BaseController {
11+
void getCompanyServerLoginInfo({bool popAllRoute = true}) {
12+
final getLoginInfoInteractor =
13+
getBinding<GetCompanyServerLoginInfoInteractor>();
14+
15+
if (getLoginInfoInteractor == null) {
16+
handleGetCompanyServerLoginInfoFailure(popAllRoute: popAllRoute);
17+
return;
18+
}
19+
20+
consumeState(
21+
getLoginInfoInteractor.execute(popAllRoute: popAllRoute),
22+
);
23+
}
24+
25+
void handleGetCompanyServerLoginInfoSuccess(
26+
CompanyServerLoginInfo info, {
27+
bool popAllRoute = true,
28+
}) {
29+
log('$runtimeType::handleGetCompanyServerLoginInfoSuccess: Info = $info, popAllRoute = $popAllRoute');
30+
final arguments = LoginArguments(
31+
LoginFormType.dnsLookupForm,
32+
loginInfo: info,
33+
);
34+
if (popAllRoute) {
35+
pushAndPopAll(AppRoutes.login, arguments: arguments);
36+
} else {
37+
popAndPush(AppRoutes.login, arguments: arguments);
38+
}
39+
}
40+
41+
void handleGetCompanyServerLoginInfoFailure({bool popAllRoute = true}) {
42+
if (popAllRoute) {
43+
pushAndPopAll(AppRoutes.twakeWelcome);
44+
} else {
45+
popAndPush(AppRoutes.twakeWelcome);
46+
}
47+
}
48+
}

lib/features/base/reloadable/reloadable_controller.dart

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -178,19 +178,12 @@ abstract class ReloadableController extends BaseController {
178178
required TokenOIDC tokenOIDC,
179179
required OIDCConfiguration oidcConfiguration,
180180
}) {
181-
final baseUrl = baseUri.toString();
182-
dynamicUrlInterceptors.setJmapUrl(baseUrl);
183-
dynamicUrlInterceptors.changeBaseUrl(baseUrl);
184-
authorizationInterceptors.setTokenAndAuthorityOidc(
185-
newToken: tokenOIDC,
186-
newConfig: oidcConfiguration,
187-
);
188-
authorizationIsolateInterceptors.setTokenAndAuthorityOidc(
189-
newToken: tokenOIDC,
190-
newConfig: oidcConfiguration,
181+
setDataToInterceptors(
182+
baseUrl: baseUri.toString(),
183+
tokenOIDC: tokenOIDC,
184+
oidcConfiguration: oidcConfiguration,
191185
);
192186

193-
getOidcUserInfo(oidcConfiguration);
194187
getSessionAction();
195188
}
196189
}

lib/features/login/domain/state/get_company_server_login_info_state.dart

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,25 @@ class GettingCompanyServerLoginInfo extends LoadingState {}
66

77
class GetCompanyServerLoginInfoSuccess extends UIState {
88
final CompanyServerLoginInfo serverLoginInfo;
9+
final bool popAllRoute;
910

10-
GetCompanyServerLoginInfoSuccess(this.serverLoginInfo);
11+
GetCompanyServerLoginInfoSuccess(
12+
this.serverLoginInfo, {
13+
this.popAllRoute = true,
14+
});
1115

1216
@override
13-
List<Object> get props => [serverLoginInfo];
17+
List<Object> get props => [serverLoginInfo, popAllRoute];
1418
}
1519

1620
class GetCompanyServerLoginInfoFailure extends FeatureFailure {
17-
GetCompanyServerLoginInfoFailure(dynamic exception)
18-
: super(exception: exception);
21+
final bool popAllRoute;
22+
23+
GetCompanyServerLoginInfoFailure(
24+
dynamic exception, {
25+
this.popAllRoute = true,
26+
}) : super(exception: exception);
27+
28+
@override
29+
List<Object> get props => [exception, popAllRoute];
1930
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:core/presentation/state/failure.dart';
2+
import 'package:core/presentation/state/success.dart';
3+
4+
class RemovingCompanyServerLoginInfo extends LoadingState {}
5+
6+
class RemoveCompanyServerLoginInfoSuccess extends UIState {}
7+
8+
class RemoveCompanyServerLoginInfoFailure extends FeatureFailure {
9+
RemoveCompanyServerLoginInfoFailure(dynamic exception)
10+
: super(exception: exception);
11+
}

lib/features/login/domain/usecases/get_company_server_login_info_interactor.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,20 @@ class GetCompanyServerLoginInfoInteractor {
1111

1212
GetCompanyServerLoginInfoInteractor(this._serverLoginRepository);
1313

14-
Stream<Either<Failure, Success>> execute() async* {
14+
Stream<Either<Failure, Success>> execute({bool popAllRoute = true}) async* {
1515
try {
1616
yield Right(GettingCompanyServerLoginInfo());
1717
final serverLoginInfo =
1818
await _serverLoginRepository.getCompanyServerLoginInfo();
19-
yield Right(GetCompanyServerLoginInfoSuccess(serverLoginInfo));
19+
yield Right(GetCompanyServerLoginInfoSuccess(
20+
serverLoginInfo,
21+
popAllRoute: popAllRoute,
22+
));
2023
} catch (exception) {
21-
yield Left(GetCompanyServerLoginInfoFailure(exception));
24+
yield Left(GetCompanyServerLoginInfoFailure(
25+
exception,
26+
popAllRoute: popAllRoute,
27+
));
2228
}
2329
}
2430
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'dart:core';
2+
3+
import 'package:core/presentation/state/failure.dart';
4+
import 'package:core/presentation/state/success.dart';
5+
import 'package:dartz/dartz.dart';
6+
import 'package:tmail_ui_user/features/login/domain/repository/company_server_login_repository.dart';
7+
import 'package:tmail_ui_user/features/login/domain/state/remove_company_server_login_info_state.dart';
8+
9+
class RemoveCompanyServerLoginInfoInteractor {
10+
final CompanyServerLoginRepository _serverLoginRepository;
11+
12+
RemoveCompanyServerLoginInfoInteractor(this._serverLoginRepository);
13+
14+
Stream<Either<Failure, Success>> execute() async* {
15+
try {
16+
yield Right(RemovingCompanyServerLoginInfo());
17+
await _serverLoginRepository.removeCompanyServerLoginInfo();
18+
yield Right(RemoveCompanyServerLoginInfoSuccess());
19+
} catch (exception) {
20+
yield Left(RemoveCompanyServerLoginInfoFailure(exception));
21+
}
22+
}
23+
}

lib/features/login/presentation/base_login_view.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ abstract class BaseLoginView extends GetWidget<LoginController> {
7575
..setHintText(AppLocalizations.of(context).email))
7676
.build(),
7777
debounceDuration: const Duration(milliseconds: 300),
78-
suggestionsCallback: controller.getAllRecentLoginUsernameAction,
78+
suggestionsCallback: (query) =>
79+
controller.getAllRecentLoginUsernameAction(pattern: query),
7980
itemBuilder: (_, loginUsername) => RecentItemTileWidget(loginUsername),
8081
onSuggestionSelected: controller.selectUsernameFromSuggestion,
8182
noItemsFoundBuilder: (context) => const SizedBox(),
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'package:get/get.dart';
2+
import 'package:shared_preferences/shared_preferences.dart';
3+
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
4+
import 'package:tmail_ui_user/features/login/data/datasource/company_server_login_datasource.dart';
5+
import 'package:tmail_ui_user/features/login/data/datasource_impl/company_server_login_datasource_impl.dart';
6+
import 'package:tmail_ui_user/features/login/data/local/company_server_login_cache_manager.dart';
7+
import 'package:tmail_ui_user/features/login/data/repository/company_server_login_repository_impl.dart';
8+
import 'package:tmail_ui_user/features/login/domain/repository/company_server_login_repository.dart';
9+
import 'package:tmail_ui_user/features/login/domain/usecases/get_company_server_login_info_interactor.dart';
10+
import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart';
11+
import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart';
12+
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
13+
14+
class CompanyServerLoginInteractorBindings extends InteractorsBindings {
15+
@override
16+
void dependencies() {
17+
Get.put(CompanyServerLoginCacheManager(Get.find<SharedPreferences>()));
18+
super.dependencies();
19+
}
20+
21+
@override
22+
void bindingsDataSource() {
23+
Get.put<CompanyServerLoginDataSource>(
24+
Get.find<CompanyServerLoginDatasourceImpl>(),
25+
);
26+
}
27+
28+
@override
29+
void bindingsDataSourceImpl() {
30+
Get.put(
31+
CompanyServerLoginDatasourceImpl(
32+
Get.find<CompanyServerLoginCacheManager>(),
33+
Get.find<CacheExceptionThrower>(),
34+
),
35+
);
36+
}
37+
38+
@override
39+
void bindingsInteractor() {
40+
Get.put(
41+
SaveCompanyServerLoginInfoInteractor(
42+
Get.find<CompanyServerLoginRepository>(),
43+
),
44+
);
45+
Get.put(
46+
GetCompanyServerLoginInfoInteractor(
47+
Get.find<CompanyServerLoginRepository>(),
48+
),
49+
);
50+
Get.put(
51+
RemoveCompanyServerLoginInfoInteractor(
52+
Get.find<CompanyServerLoginRepository>(),
53+
),
54+
);
55+
}
56+
57+
@override
58+
void bindingsRepository() {
59+
Get.put<CompanyServerLoginRepository>(
60+
Get.find<CompanyServerLoginRepositoryImpl>(),
61+
);
62+
}
63+
64+
@override
65+
void bindingsRepositoryImpl() {
66+
Get.put(
67+
CompanyServerLoginRepositoryImpl(
68+
Get.find<CompanyServerLoginDataSource>(),
69+
),
70+
);
71+
}
72+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import 'package:core/utils/app_logger.dart';
2+
import 'package:core/utils/platform_info.dart';
3+
import 'package:tmail_ui_user/features/login/domain/model/company_server_login_info.dart';
4+
import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart';
5+
import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart';
6+
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
7+
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
8+
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
9+
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
10+
11+
extension HandleCompanyServerLoginInfoExtension on LoginController {
12+
bool get isDnsLookupFormOnMobile =>
13+
PlatformInfo.isMobile &&
14+
loginFormType.value == LoginFormType.dnsLookupForm;
15+
16+
bool hasPreviousCompanyServerLogin(LoginArguments arguments) {
17+
return PlatformInfo.isMobile &&
18+
arguments.loginFormType == LoginFormType.dnsLookupForm &&
19+
arguments.loginInfo != null;
20+
}
21+
22+
bool isCompanyServerLoginFlow(LoginArguments arguments) {
23+
return PlatformInfo.isMobile &&
24+
arguments.loginFormType == LoginFormType.dnsLookupForm;
25+
}
26+
27+
void saveCompanyServerLoginInfo(String username) {
28+
log('$runtimeType::saveCompanyServerLoginInfo: Username = $username');
29+
saveLoginInfoInteractor = getBinding<SaveCompanyServerLoginInfoInteractor>();
30+
31+
if (saveLoginInfoInteractor != null) {
32+
consumeState(
33+
saveLoginInfoInteractor!.execute(
34+
CompanyServerLoginInfo(email: username),
35+
),
36+
);
37+
}
38+
}
39+
40+
void autoFillPreviousCompanyServerMail(CompanyServerLoginInfo loginInfo) {
41+
final userEmail = loginInfo.email;
42+
onUsernameChange(userEmail);
43+
usernameInputController.text = userEmail;
44+
}
45+
46+
Future<void> autoFillCompanyServerMail() async {
47+
final listUsername = await getAllRecentLoginUsernameAction();
48+
if (listUsername.isNotEmpty) {
49+
final username = listUsername.first.username;
50+
onUsernameChange(username);
51+
usernameInputController.text = username;
52+
}
53+
}
54+
55+
void removeCompanyServerLoginInfo() {
56+
removeLoginInfoInteractor =
57+
getBinding<RemoveCompanyServerLoginInfoInteractor>();
58+
if (removeLoginInfoInteractor != null) {
59+
consumeState(removeLoginInfoInteractor!.execute());
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)