Skip to content

Commit af47e92

Browse files
fixup! TF-3455 Add applicative token login method
1 parent 21f4330 commit af47e92

File tree

7 files changed

+88
-44
lines changed

7 files changed

+88
-44
lines changed

lib/features/login/presentation/login_controller.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration
4040
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_is_available_state.dart';
4141
import 'package:tmail_ui_user/features/login/domain/state/get_stored_oidc_configuration_state.dart';
4242
import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.dart';
43+
import 'package:tmail_ui_user/features/login/domain/state/update_authentication_account_state.dart';
4344
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
4445
import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart';
4546
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
@@ -98,6 +99,19 @@ class LoginController extends ReloadableController {
9899
Password? _password;
99100
Uri? _baseUri;
100101
String _applicativeToken = '';
102+
bool get isShowingMessage {
103+
return viewState.value.fold(
104+
(failure) {
105+
// Ignore message when login by applicative token
106+
if (failure is UpdateAccountCacheFailure && _password == null && _applicativeToken.isNotEmpty) {
107+
return false;
108+
}
109+
110+
return true;
111+
},
112+
(success) => true
113+
);
114+
}
101115

102116
DeepLinksManager? _deepLinksManager;
103117
StreamSubscription<DeepLinkData?>? _deepLinkDataStreamSubscription;

lib/features/login/presentation/login_view.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ class LoginView extends BaseLoginView {
9595
Obx(() => LoginMessageWidget(
9696
formType: controller.loginFormType.value,
9797
viewState: controller.viewState.value,
98+
isShowingMessage: controller.isShowingMessage,
9899
)),
99100
Obx(() {
100101
switch (controller.loginFormType.value) {

lib/features/login/presentation/widgets/applicative_token_field.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,12 @@ class _ApplicativeTokenFieldState extends State<ApplicativeTokenField> with Sing
7272
children: [
7373
Row(
7474
children: [
75-
Text(
76-
widget.appLocalizations.applicativeToken,
77-
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
75+
Expanded(
76+
child: Text(
77+
widget.appLocalizations.applicativeToken,
78+
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
79+
maxLines: 2,
80+
),
7881
),
7982
const SizedBox(width: 8),
8083
Expanded(

lib/features/login/presentation/widgets/login_message_widget.dart

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ class LoginMessageWidget extends StatelessWidget {
2222

2323
final LoginFormType formType;
2424
final Either<Failure, Success> viewState;
25+
final bool isShowingMessage;
2526

2627
final ToastManager? _toastManager = getBinding<ToastManager>();
2728

2829
LoginMessageWidget({
2930
super.key,
3031
required this.formType,
31-
required this.viewState
32+
required this.viewState,
33+
this.isShowingMessage = true,
3234
});
3335

3436
@override
@@ -45,35 +47,7 @@ class LoginMessageWidget extends StatelessWidget {
4547
? _loginTextFieldWidthSmallScreen
4648
: _loginTextFieldWidthLargeScreen,
4749
child: Text(
48-
viewState.fold(
49-
(failure) {
50-
if (failure is GetOIDCConfigurationFailure) {
51-
return AppLocalizations.of(context).canNotVerifySSOConfiguration;
52-
} else if (failure is DNSLookupToGetJmapUrlFailure) {
53-
return AppLocalizations.of(context).dnsLookupLoginMessage;
54-
} else if (failure is GetTokenOIDCFailure && failure.exception is NoSuitableBrowserForOIDCException) {
55-
return AppLocalizations.of(context).noSuitableBrowserForOIDC;
56-
} else if (failure is FeatureFailure) {
57-
return _toastManager?.getMessageByException(context, failure.exception)
58-
?? AppLocalizations.of(context).unknownError;
59-
} else {
60-
return AppLocalizations.of(context).unknownError;
61-
}
62-
},
63-
(success) {
64-
if (formType == LoginFormType.credentialForm) {
65-
return AppLocalizations.of(context).loginInputCredentialMessage;
66-
} else if (formType == LoginFormType.dnsLookupForm) {
67-
return AppLocalizations.of(context).dnsLookupLoginMessage;
68-
} else if (formType == LoginFormType.passwordForm) {
69-
return AppLocalizations.of(context).enterYourPasswordToSignIn;
70-
} else if (formType == LoginFormType.baseUrlForm) {
71-
return AppLocalizations.of(context).loginInputUrlMessage;
72-
} else {
73-
return '';
74-
}
75-
}
76-
),
50+
isShowingMessage ? messageFromViewState(context) : '',
7751
textAlign: TextAlign.center,
7852
style: TextStyle(
7953
fontSize: 15,
@@ -87,4 +61,36 @@ class LoginMessageWidget extends StatelessWidget {
8761
)
8862
);
8963
}
64+
65+
String messageFromViewState(BuildContext context) {
66+
return viewState.fold(
67+
(failure) {
68+
if (failure is GetOIDCConfigurationFailure) {
69+
return AppLocalizations.of(context).canNotVerifySSOConfiguration;
70+
} else if (failure is DNSLookupToGetJmapUrlFailure) {
71+
return AppLocalizations.of(context).dnsLookupLoginMessage;
72+
} else if (failure is GetTokenOIDCFailure && failure.exception is NoSuitableBrowserForOIDCException) {
73+
return AppLocalizations.of(context).noSuitableBrowserForOIDC;
74+
} else if (failure is FeatureFailure) {
75+
return _toastManager?.getMessageByException(context, failure.exception)
76+
?? AppLocalizations.of(context).unknownError;
77+
} else {
78+
return AppLocalizations.of(context).unknownError;
79+
}
80+
},
81+
(success) {
82+
if (formType == LoginFormType.credentialForm) {
83+
return AppLocalizations.of(context).loginInputCredentialMessage;
84+
} else if (formType == LoginFormType.dnsLookupForm) {
85+
return AppLocalizations.of(context).dnsLookupLoginMessage;
86+
} else if (formType == LoginFormType.passwordForm) {
87+
return AppLocalizations.of(context).enterYourPasswordToSignIn;
88+
} else if (formType == LoginFormType.baseUrlForm) {
89+
return AppLocalizations.of(context).loginInputUrlMessage;
90+
} else {
91+
return '';
92+
}
93+
}
94+
);
95+
}
9096
}

lib/features/mailbox_dashboard/data/network/linagora_ecosystem_api.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@ class LinagoraEcosystemApi {
1414
LinagoraEcosystemApi(this._dioClient);
1515

1616
Future<LinagoraEcosystem> getLinagoraEcosystem(String baseUrl) async {
17-
final result = await _dioClient.get(
18-
Endpoint.linagoraEcosystem.usingBaseUrl(baseUrl).generateEndpointPath(),
19-
);
20-
log('LinagoraEcosystemApi::getLinagoraEcosystem: $result');
21-
if (result is Map<String, dynamic>) {
22-
return LinagoraEcosystem.deserialize(result);
23-
} else if (result is String) {
24-
return LinagoraEcosystem.deserialize(jsonDecode(result));
25-
} else {
17+
try {
18+
final result = await _dioClient.get(
19+
Endpoint.linagoraEcosystem.usingBaseUrl(baseUrl).generateEndpointPath(),
20+
);
21+
log('LinagoraEcosystemApi::getLinagoraEcosystem: $result');
22+
if (result is Map<String, dynamic>) {
23+
return LinagoraEcosystem.deserialize(result);
24+
} else if (result is String) {
25+
return LinagoraEcosystem.deserialize(jsonDecode(result));
26+
} else {
27+
throw NotFoundLinagoraEcosystem();
28+
}
29+
} catch (_) {
2630
throw NotFoundLinagoraEcosystem();
2731
}
2832
}

lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,6 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
182182
}),
183183
mobile: Obx(() {
184184
switch(controller.dashboardRoute.value) {
185-
case DashboardRoutes.thread:
186-
return _buildScaffoldHaveDrawer(body: ThreadView());
187185
case DashboardRoutes.emailDetailed:
188186
return const EmailView();
189187
case DashboardRoutes.searchEmail:

lib/l10n/intl_messages.arb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4268,6 +4268,24 @@
42684268
"placeholders_order": [],
42694269
"placeholders": {}
42704270
},
4271+
"advancedSettings": "Advanced settings",
4272+
"@advancedSettings": {
4273+
"type": "text",
4274+
"placeholders_order": [],
4275+
"placeholders": {}
4276+
},
4277+
"applicativeToken": "Applicative token",
4278+
"@applicativeToken": {
4279+
"type": "text",
4280+
"placeholders_order": [],
4281+
"placeholders": {}
4282+
},
4283+
"someJMAPServicesDoNotSupportLoginViaPassword": "Some JMAP services do not support login via password for third party apps but instead allow generate applicative tokens.",
4284+
"@someJMAPServicesDoNotSupportLoginViaPassword": {
4285+
"type": "text",
4286+
"placeholders_order": [],
4287+
"placeholders": {}
4288+
},
42714289
"downloadAttachmentInEMLPreviewWarningMessage": "Downloading attachment. You can only download one file at a time.",
42724290
"@downloadAttachmentInEMLPreviewWarningMessage": {
42734291
"type": "text",

0 commit comments

Comments
 (0)