Skip to content

Commit e938ec1

Browse files
committed
TF-4186 Auto fill email when user back to welcome screen -> go to user company server again
1 parent 25b6e8b commit e938ec1

File tree

8 files changed

+69
-45
lines changed

8 files changed

+69
-45
lines changed

lib/features/base/reloadable/reloadable_controller.dart

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,16 +178,10 @@ 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

193187
getOidcUserInfo(oidcConfiguration);

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: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
import 'package:core/utils/app_logger.dart';
22
import 'package:core/utils/platform_info.dart';
33
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';
45
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
56
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
67
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
8+
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
79

810
extension HandleCompanyServerLoginInfoExtension on LoginController {
911
bool get isDnsLookupFormOnMobile =>
1012
PlatformInfo.isMobile &&
1113
loginFormType.value == LoginFormType.dnsLookupForm;
1214

13-
bool isCompanyServerUsing(LoginArguments arguments) {
15+
bool hasPreviousCompanyServerLogin(LoginArguments arguments) {
1416
return PlatformInfo.isMobile &&
1517
arguments.loginFormType == LoginFormType.dnsLookupForm &&
1618
arguments.loginInfo != null;
1719
}
1820

21+
bool isCompanyServerLoginFlow(LoginArguments arguments) {
22+
return PlatformInfo.isMobile &&
23+
arguments.loginFormType == LoginFormType.dnsLookupForm;
24+
}
25+
1926
void saveCompanyServerLoginInfo(String username) {
2027
log('$runtimeType::saveCompanyServerLoginInfo: Username = $username');
2128
consumeState(
@@ -25,13 +32,26 @@ extension HandleCompanyServerLoginInfoExtension on LoginController {
2532
);
2633
}
2734

28-
void autoFillCompanyServerMail(CompanyServerLoginInfo loginInfo) {
35+
void autoFillPreviousCompanyServerMail(CompanyServerLoginInfo loginInfo) {
2936
final userEmail = loginInfo.email;
3037
onUsernameChange(userEmail);
3138
usernameInputController.text = userEmail;
3239
}
3340

41+
Future<void> autoFillCompanyServerMail() async {
42+
final listUsername = await getAllRecentLoginUsernameAction();
43+
if (listUsername.isNotEmpty) {
44+
final username = listUsername.first.username;
45+
onUsernameChange(username);
46+
usernameInputController.text = username;
47+
}
48+
}
49+
3450
void removeCompanyServerLoginInfo() {
35-
consumeState(removeCompanyServerLoginInfoInteractor.execute());
51+
removeCompanyServerLoginInfoInteractor =
52+
getBinding<RemoveCompanyServerLoginInfoInteractor>();
53+
if (removeCompanyServerLoginInfoInteractor != null) {
54+
consumeState(removeCompanyServerLoginInfoInteractor!.execute());
55+
}
3656
}
3757
}

lib/features/login/presentation/login_bindings.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configurat
2424
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
2525
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
2626
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
27-
import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart';
2827
import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart';
2928
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
3029
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
@@ -59,7 +58,6 @@ class LoginBindings extends BaseBindings {
5958
Get.find<TryGuessingWebFingerInteractor>(),
6059
Get.find<RemoveAuthDestinationUrlInteractor>(),
6160
Get.find<SaveCompanyServerLoginInfoInteractor>(),
62-
Get.find<RemoveCompanyServerLoginInfoInteractor>(),
6361
));
6462
}
6563

lib/features/login/presentation/login_controller.dart

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ class LoginController extends ReloadableController {
8787
final TryGuessingWebFingerInteractor _tryGuessingWebFingerInteractor;
8888
final RemoveAuthDestinationUrlInteractor _removeAuthDestinationUrlInteractor;
8989
final SaveCompanyServerLoginInfoInteractor saveCompanyServerLoginInfoInteractor;
90-
final RemoveCompanyServerLoginInfoInteractor removeCompanyServerLoginInfoInteractor;
90+
91+
RemoveCompanyServerLoginInfoInteractor? removeCompanyServerLoginInfoInteractor;
9192

9293
final TextEditingController urlInputController = TextEditingController();
9394
final TextEditingController usernameInputController = TextEditingController();
@@ -122,7 +123,6 @@ class LoginController extends ReloadableController {
122123
this._tryGuessingWebFingerInteractor,
123124
this._removeAuthDestinationUrlInteractor,
124125
this.saveCompanyServerLoginInfoInteractor,
125-
this.removeCompanyServerLoginInfoInteractor,
126126
);
127127

128128
@override
@@ -144,8 +144,10 @@ class LoginController extends ReloadableController {
144144
? LoginFormType.dnsLookupForm
145145
: arguments.loginFormType;
146146

147-
if (isCompanyServerUsing(arguments)) {
148-
autoFillCompanyServerMail(arguments.loginInfo!);
147+
if (hasPreviousCompanyServerLogin(arguments)) {
148+
autoFillPreviousCompanyServerMail(arguments.loginInfo!);
149+
} else if (isCompanyServerLoginFlow(arguments)) {
150+
autoFillCompanyServerMail();
149151
} else if (PlatformInfo.isWeb) {
150152
_checkOIDCIsAvailable();
151153
}
@@ -208,6 +210,9 @@ class LoginController extends ReloadableController {
208210
onBaseUrlChange(success.oidcResponse.subject);
209211
getOIDCConfiguration(success.oidcResponse);
210212
} else if (success is SignInTwakeWorkplaceSuccess) {
213+
if (PlatformInfo.isMobile) {
214+
removeCompanyServerLoginInfo();
215+
}
211216
synchronizeTokenAndGetSession(
212217
baseUri: success.baseUri,
213218
tokenOIDC: success.tokenOIDC,
@@ -297,6 +302,9 @@ class LoginController extends ReloadableController {
297302
}
298303

299304
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
305+
if (PlatformInfo.isMobile) {
306+
removeCompanyServerLoginInfo();
307+
}
300308
synchronizeTokenAndGetSession(
301309
baseUri: success.baseUri,
302310
tokenOIDC: success.tokenOIDC,
@@ -530,7 +538,7 @@ class LoginController extends ReloadableController {
530538
_saveLoginUsernameOnMobileInteractor.execute(RecentLoginUsername.now(userName));
531539
}
532540

533-
Future<List<RecentLoginUsername>> getAllRecentLoginUsernameAction(String pattern) async {
541+
Future<List<RecentLoginUsername>> getAllRecentLoginUsernameAction({String? pattern}) async {
534542
return await _getAllRecentLoginUsernameOnMobileInteractor
535543
.execute(pattern: pattern)
536544
.then((result) => result.fold(
@@ -653,6 +661,7 @@ class LoginController extends ReloadableController {
653661
passwordInputController.dispose();
654662
if (PlatformInfo.isMobile) {
655663
_deepLinkDataStreamSubscription?.cancel();
664+
removeCompanyServerLoginInfoInteractor = null;
656665
}
657666
super.onClose();
658667
}

lib/features/login/presentation/login_view.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ class LoginView extends BaseLoginView {
103103
textEditingController: controller.usernameInputController,
104104
onTextChange: controller.onUsernameChange,
105105
onTextSubmitted: (_) => controller.invokeDNSLookupToGetJmapUrl(),
106-
suggestionsCallback: controller.getAllRecentLoginUsernameAction,
106+
suggestionsCallback: (query) =>
107+
controller.getAllRecentLoginUsernameAction(pattern: query),
107108
onSuggestionSelected: controller.selectUsernameFromSuggestion
108109
);
109110
case LoginFormType.passwordForm:

lib/features/starting_page/presentation/twake_welcome/twake_welcome_controller.dart

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import 'package:flutter/cupertino.dart';
99
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
1010
import 'package:jmap_dart_client/jmap/core/session/session.dart';
1111
import 'package:model/oidc/oidc_configuration.dart';
12-
import 'package:model/oidc/token_oidc.dart';
1312
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
1413
import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart';
1514
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
1615
import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.dart';
1716
import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart';
17+
import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart';
1818
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
1919
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
2020
import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_twake_workplace_state.dart';
@@ -36,6 +36,8 @@ class TwakeWelcomeController extends ReloadableController {
3636
final SignInTwakeWorkplaceInteractor _signInTwakeWorkplaceInteractor;
3737
final SignUpTwakeWorkplaceInteractor _signUpTwakeWorkplaceInteractor;
3838

39+
RemoveCompanyServerLoginInfoInteractor? _removeCompanyServerLoginInfoInteractor;
40+
3941
DeepLinksManager? _deepLinksManager;
4042
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;
4143

@@ -81,7 +83,10 @@ class TwakeWelcomeController extends ReloadableController {
8183
}
8284

8385
void _handleAutoSignInViaDeepLinkSuccess(AutoSignInViaDeepLinkSuccess success) {
84-
_synchronizeTokenAndGetSession(
86+
if (PlatformInfo.isMobile) {
87+
removeCompanyServerLoginInfo();
88+
}
89+
synchronizeTokenAndGetSession(
8590
baseUri: success.baseUri,
8691
tokenOIDC: success.tokenOIDC,
8792
oidcConfiguration: success.oidcConfiguration,
@@ -140,16 +145,30 @@ class TwakeWelcomeController extends ReloadableController {
140145
));
141146
}
142147

148+
void removeCompanyServerLoginInfo() {
149+
_removeCompanyServerLoginInfoInteractor =
150+
getBinding<RemoveCompanyServerLoginInfoInteractor>();
151+
if (_removeCompanyServerLoginInfoInteractor != null) {
152+
consumeState(_removeCompanyServerLoginInfoInteractor!.execute());
153+
}
154+
}
155+
143156
@override
144157
void handleSuccessViewState(Success success) {
145158
if (success is SignInTwakeWorkplaceSuccess) {
146-
_synchronizeTokenAndGetSession(
159+
if (PlatformInfo.isMobile) {
160+
removeCompanyServerLoginInfo();
161+
}
162+
synchronizeTokenAndGetSession(
147163
baseUri: success.baseUri,
148164
tokenOIDC: success.tokenOIDC,
149165
oidcConfiguration: success.oidcConfiguration,
150166
);
151167
} else if (success is SignUpTwakeWorkplaceSuccess) {
152-
_synchronizeTokenAndGetSession(
168+
if (PlatformInfo.isMobile) {
169+
removeCompanyServerLoginInfo();
170+
}
171+
synchronizeTokenAndGetSession(
153172
baseUri: success.baseUri,
154173
tokenOIDC: success.tokenOIDC,
155174
oidcConfiguration: success.oidcConfiguration,
@@ -192,20 +211,6 @@ class TwakeWelcomeController extends ReloadableController {
192211
super.handleUrgentExceptionOnMobile(failure: failure, exception: exception);
193212
}
194213

195-
void _synchronizeTokenAndGetSession({
196-
required Uri baseUri,
197-
required TokenOIDC tokenOIDC,
198-
required OIDCConfiguration oidcConfiguration,
199-
}) {
200-
setDataToInterceptors(
201-
baseUrl: baseUri.toString(),
202-
tokenOIDC: tokenOIDC,
203-
oidcConfiguration: oidcConfiguration,
204-
);
205-
206-
getSessionAction();
207-
}
208-
209214
void _handleSignInTwakeWorkplaceFailure(SignInTwakeWorkplaceFailure failure) {
210215
SmartDialog.dismiss();
211216

@@ -222,6 +227,7 @@ class TwakeWelcomeController extends ReloadableController {
222227
void onClose() {
223228
if (PlatformInfo.isMobile) {
224229
_deepLinkDataStreamSubscription?.cancel();
230+
_removeCompanyServerLoginInfoInteractor = null;
225231
}
226232
super.onClose();
227233
}

test/features/login/presentation/login_controller_test.dart

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_user_info_
3535
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
3636
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
3737
import 'package:tmail_ui_user/features/login/domain/usecases/remove_auth_destination_url_interactor.dart';
38-
import 'package:tmail_ui_user/features/login/domain/usecases/remove_company_server_login_info_interactor.dart';
3938
import 'package:tmail_ui_user/features/login/domain/usecases/save_company_server_login_info_interactor.dart';
4039
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
4140
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_username_on_mobile_interactor.dart';
@@ -90,7 +89,6 @@ import 'login_controller_test.mocks.dart';
9089
MockSpec<ToastManager>(),
9190
MockSpec<TwakeAppManager>(),
9291
MockSpec<SaveCompanyServerLoginInfoInteractor>(),
93-
MockSpec<RemoveCompanyServerLoginInfoInteractor>(),
9492
])
9593
void main() {
9694
late MockAuthenticationInteractor mockAuthenticationInteractor;
@@ -109,7 +107,6 @@ void main() {
109107
late MockTryGuessingWebFingerInteractor mockTryGuessingWebFingerInteractor;
110108
late MockRemoveAuthDestinationUrlInteractor mockRemoveAuthDestinationUrlInteractor;
111109
late MockSaveCompanyServerLoginInfoInteractor mockSaveCompanyServerLoginInfoInteractor;
112-
late MockRemoveCompanyServerLoginInfoInteractor mockRemoveCompanyServerLoginInfoInteractor;
113110
late MockGetSessionInteractor mockGetSessionInteractor;
114111
late MockGetAuthenticatedAccountInteractor mockGetAuthenticatedAccountInteractor;
115112
late MockUpdateAccountCacheInteractor mockUpdateAccountCacheInteractor;
@@ -149,7 +146,6 @@ void main() {
149146
mockTryGuessingWebFingerInteractor = MockTryGuessingWebFingerInteractor();
150147
mockRemoveAuthDestinationUrlInteractor = MockRemoveAuthDestinationUrlInteractor();
151148
mockSaveCompanyServerLoginInfoInteractor = MockSaveCompanyServerLoginInfoInteractor();
152-
mockRemoveCompanyServerLoginInfoInteractor = MockRemoveCompanyServerLoginInfoInteractor();
153149

154150
// mock reloadable controller
155151
mockGetSessionInteractor = MockGetSessionInteractor();
@@ -220,7 +216,6 @@ void main() {
220216
mockTryGuessingWebFingerInteractor,
221217
mockRemoveAuthDestinationUrlInteractor,
222218
mockSaveCompanyServerLoginInfoInteractor,
223-
mockRemoveCompanyServerLoginInfoInteractor,
224219
);
225220
});
226221

0 commit comments

Comments
 (0)