diff --git a/assets/images/2.0x/login_graphic.png b/assets/images/2.0x/login_graphic.png new file mode 100644 index 000000000..1d5fa72c6 Binary files /dev/null and b/assets/images/2.0x/login_graphic.png differ diff --git a/assets/images/3.0x/login_graphic.png b/assets/images/3.0x/login_graphic.png new file mode 100644 index 000000000..48fa5849c Binary files /dev/null and b/assets/images/3.0x/login_graphic.png differ diff --git a/assets/images/ic_encrypted.svg b/assets/images/ic_encrypted.svg new file mode 100644 index 000000000..c76927ffe --- /dev/null +++ b/assets/images/ic_encrypted.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/ic_integration.svg b/assets/images/ic_integration.svg new file mode 100644 index 000000000..e2be035e2 --- /dev/null +++ b/assets/images/ic_integration.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/ic_jmap_standard.svg b/assets/images/ic_jmap_standard.svg new file mode 100644 index 000000000..3782b479f --- /dev/null +++ b/assets/images/ic_jmap_standard.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/ic_team.svg b/assets/images/ic_team.svg new file mode 100644 index 000000000..dd9c15c1b --- /dev/null +++ b/assets/images/ic_team.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/login_graphic.png b/assets/images/login_graphic.png new file mode 100644 index 000000000..29a34dada Binary files /dev/null and b/assets/images/login_graphic.png differ diff --git a/assets/images/power_by_linagora.svg b/assets/images/power_by_linagora.svg new file mode 100644 index 000000000..8fdc92e4d --- /dev/null +++ b/assets/images/power_by_linagora.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 855c58493..4866722ce 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -106,6 +106,12 @@ class ImagePaths { String get icEdit => _getImagePath('ic_edit.svg'); String get icEye => _getImagePath('ic_eye.svg'); String get icEyeOff => _getImagePath('ic_eye_off.svg'); + String get icJMAPStandard => _getImagePath('ic_jmap_standard.svg'); + String get icEncrypted => _getImagePath('ic_encrypted.svg'); + String get icIntegration => _getImagePath('ic_integration.svg'); + String get icTeam => _getImagePath('ic_team.svg'); + String get loginGraphic => _getImagePath('login_graphic.png'); + String get icPowerByLinagora => _getImagePath('power_by_linagora.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/core/lib/presentation/views/text/slogan_builder.dart b/core/lib/presentation/views/text/slogan_builder.dart index bf71a5ca3..5942bb902 100644 --- a/core/lib/presentation/views/text/slogan_builder.dart +++ b/core/lib/presentation/views/text/slogan_builder.dart @@ -19,6 +19,7 @@ class SloganBuilder { String? _logo; double? _sizeLogo; OnTapCallback? _onTapCallback; + EdgeInsetsGeometry? _padding; SloganBuilder({this.arrangedByHorizontal = false}); @@ -54,6 +55,10 @@ class SloganBuilder { _onTapCallback = onTapCallback; } + void setPadding(EdgeInsetsGeometry? padding) { + _padding = padding; + } + Widget build() { if (!arrangedByHorizontal) { return InkWell( @@ -61,7 +66,7 @@ class SloganBuilder { child: Column(children: [ _logoApp(), Padding( - padding: EdgeInsets.only(top: 16, left: 16, right: 16), + padding: _padding ?? EdgeInsets.only(top: 16, left: 16, right: 16), child: Text(_text ?? '', key: _key, style: _textStyle, textAlign: _textAlign), ), ]), @@ -72,7 +77,7 @@ class SloganBuilder { child: Row(children: [ _logoApp(), Padding( - padding: EdgeInsets.symmetric(horizontal: 10), + padding: _padding ?? EdgeInsets.symmetric(horizontal: 10), child: Text(_text ?? '', key: _key, style: _textStyle, textAlign: _textAlign), ), ]), diff --git a/lib/features/login/presentation/base_login_view.dart b/lib/features/login/presentation/base_login_view.dart new file mode 100644 index 000000000..3b2a7faa3 --- /dev/null +++ b/lib/features/login/presentation/base_login_view.dart @@ -0,0 +1,116 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/views/text/text_builder.dart'; +import 'package:core/presentation/views/text/text_field_builder.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart'; +import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'; +import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; +import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart'; +import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart'; +import 'package:tmail_ui_user/features/login/presentation/widgets/login_text_input_builder.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +abstract class BaseLoginView extends GetWidget { + BaseLoginView({Key? key}) : super(key: key); + + final loginController = Get.find(); + final responsiveUtils = Get.find(); + final imagePaths = Get.find(); + + Widget buildLoginMessage(BuildContext context, LoginState loginState) { + return Padding( + padding: const EdgeInsets.only(top: 11, bottom: 36, left: 58, right: 58), + child: SizedBox( + width: responsiveUtils.getWidthLoginTextField(context), + child: CenterTextBuilder() + .key(const Key('login_message')) + .text(loginState.viewState.fold( + (failure) => failure is AuthenticationUserFailure + ? AppLocalizations.of(context).unknown_error_login_message + : AppLocalizations.of(context).loginInputUrlMessage, + (success) { + if (loginController.loginFormType.value == LoginFormType.credentialForm || kIsWeb) { + return AppLocalizations.of(context).loginInputCredentialMessage; + } + return AppLocalizations.of(context).loginInputUrlMessage; + })) + .textStyle(TextStyle( + fontSize: 15, + fontWeight: FontWeight.w400, + color: loginState.viewState.fold( + (failure) => failure is AuthenticationUserFailure + ? AppColor.textFieldErrorBorderColor + : AppColor.colorNameEmail, + (success) => AppColor.colorNameEmail))) + .build() + ) + ); + } + + Widget buildLoginButton(BuildContext context) { + return Container( + margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), + width: responsiveUtils.getDeviceWidth(context),height: 48, + child: ElevatedButton( + key: const Key('loginSubmitForm'), + style: ButtonStyle( + foregroundColor: MaterialStateProperty.resolveWith((Set states) => Colors.white), + backgroundColor: MaterialStateProperty.resolveWith((Set states) => AppColor.primaryColor), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: const BorderSide(width: 0, color: AppColor.primaryColor) + )) + ), + child: Text(AppLocalizations.of(context).signIn, + style: const TextStyle(fontSize: 16, color: Colors.white) + ), + onPressed: () { + loginController.handleLoginPressed(); + } + ) + ); + } + + Widget buildInputCredentialForm(BuildContext context) { + return Column( + children: [ + buildUserNameInput(context), + buildPasswordInput(context) + ], + ); + } + + Widget buildUserNameInput(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 16, right: 24, left: 24), + child: Container( + child: (TextFieldBuilder()..key(const Key('login_username_input')) + ..onChange((value) => loginController.setUserNameText(value)) + ..textInputAction(TextInputAction.next) + ..keyboardType(TextInputType.emailAddress) + ..textDecoration((LoginInputDecorationBuilder() + ..setLabelText(AppLocalizations.of(context).email) + ..setHintText(AppLocalizations.of(context).email)) + .build())) + .build())); + } + + Widget buildPasswordInput(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 40, right: 24, left: 24), + child: Container( + child: (LoginTextInputBuilder(context, imagePaths) + ..setOnSubmitted((value) => loginController.handleLoginPressed()) + ..passwordInput(true) + ..key(const Key('login_password_input')) + ..obscureText(true) + ..onChange((value) => loginController.setPasswordText(value)) + ..textInputAction(TextInputAction.done) + ..hintText(AppLocalizations.of(context).password)) + .build())); + } +} \ No newline at end of file diff --git a/lib/features/login/presentation/login_view.dart b/lib/features/login/presentation/login_view.dart index 80b3ce229..0c360f46b 100644 --- a/lib/features/login/presentation/login_view.dart +++ b/lib/features/login/presentation/login_view.dart @@ -2,19 +2,14 @@ import 'package:core/core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; -import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart'; -import 'package:tmail_ui_user/features/login/presentation/login_controller.dart'; +import 'package:tmail_ui_user/features/login/presentation/base_login_view.dart'; import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart'; import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart'; import 'package:tmail_ui_user/features/login/presentation/widgets/login_input_decoration_builder.dart'; -import 'package:tmail_ui_user/features/login/presentation/widgets/login_text_input_builder.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -class LoginView extends GetWidget { +class LoginView extends BaseLoginView { - final loginController = Get.find(); - final imagePaths = Get.find(); - final _responsiveUtils = Get.find(); final keyboardUtils = Get.find(); LoginView({Key? key}) : super(key: key); @@ -64,19 +59,19 @@ class LoginView extends GetWidget { children: [ Padding( padding: EdgeInsets.only( - top: _responsiveUtils.isHeightShortest(context) ? 64 : 0), + top: responsiveUtils.isHeightShortest(context) ? 64 : 0), child: Text( AppLocalizations.of(context).login, style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900) ) ), - Obx(() => _buildLoginMessage(context, loginController.loginState.value)), + Obx(() => buildLoginMessage(context, loginController.loginState.value)), Obx(() { switch (controller.loginFormType.value) { case LoginFormType.baseUrlForm: return _buildUrlInput(context); case LoginFormType.credentialForm: - return _buildInputCredentialForm(context); + return buildInputCredentialForm(context); default: return const SizedBox.shrink(); } @@ -119,40 +114,6 @@ class LoginView extends GetWidget { ); } - Widget _buildLoginMessage(BuildContext context, LoginState loginState) { - return Padding( - padding: const EdgeInsets.only(top: 11, bottom: 36, left: 58, right: 58), - child: SizedBox( - width: _responsiveUtils.getWidthLoginTextField(context), - child: CenterTextBuilder() - .key(const Key('login_message')) - .text(loginState.viewState.fold( - (failure) => failure is AuthenticationUserFailure - ? AppLocalizations.of(context).unknown_error_login_message - : AppLocalizations.of(context).loginInputUrlMessage, - (success) => AppLocalizations.of(context).loginInputUrlMessage)) - .textStyle(TextStyle( - fontSize: 15, - fontWeight: FontWeight.w400, - color: loginState.viewState.fold( - (failure) => failure is AuthenticationUserFailure - ? AppColor.textFieldErrorBorderColor - : AppColor.colorNameEmail, - (success) => AppColor.colorNameEmail))) - .build() - ) - ); - } - - Widget _buildInputCredentialForm(BuildContext context) { - return Column( - children: [ - _buildUserNameInput(context), - _buildPasswordInput(context) - ], - ); - } - Widget _buildUrlInput(BuildContext context) { return Padding( padding: const EdgeInsets.only(right: 24, left: 24, bottom: 24), @@ -173,37 +134,6 @@ class LoginView extends GetWidget { .build())); } - Widget _buildUserNameInput(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: 16, right: 24, left: 24), - child: Container( - child: (TextFieldBuilder() - ..key(const Key('login_username_input')) - ..onChange((value) => loginController.setUserNameText(value)) - ..textInputAction(TextInputAction.next) - ..keyboardType(TextInputType.emailAddress) - ..textDecoration((LoginInputDecorationBuilder() - ..setLabelText(AppLocalizations.of(context).email) - ..setHintText(AppLocalizations.of(context).email)) - .build())) - .build())); - } - - Widget _buildPasswordInput(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: 40, right: 24, left: 24), - child: Container( - child: (LoginTextInputBuilder(context, imagePaths) - ..setOnSubmitted((value) => loginController.handleLoginPressed()) - ..passwordInput(true) - ..key(const Key('login_password_input')) - ..obscureText(true) - ..onChange((value) => loginController.setPasswordText(value)) - ..textInputAction(TextInputAction.done) - ..hintText(AppLocalizations.of(context).password)) - .build())); - } - Widget _buildExpandedButton(BuildContext context, Widget child) { return Expanded( child: Align( @@ -216,7 +146,7 @@ class LoginView extends GetWidget { Widget _buildNextButton(BuildContext context) { return Container( margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), - width: _responsiveUtils.getDeviceWidth(context),height: 48, + width: responsiveUtils.getDeviceWidth(context),height: 48, child: ElevatedButton( key: const Key('nextToCredentialForm'), style: ButtonStyle( @@ -239,32 +169,8 @@ class LoginView extends GetWidget { Widget _buildLoginButtonInContext(BuildContext context) { return _supportScrollForm(context) - ? _buildLoginButton(context) - : _buildExpandedButton(context, _buildLoginButton(context)); - } - - Widget _buildLoginButton(BuildContext context) { - return Container( - margin: const EdgeInsets.only(bottom: 16, left: 24, right: 24), - width: _responsiveUtils.getDeviceWidth(context),height: 48, - child: ElevatedButton( - key: const Key('loginSubmitForm'), - style: ButtonStyle( - foregroundColor: MaterialStateProperty.resolveWith((Set states) => Colors.white), - backgroundColor: MaterialStateProperty.resolveWith((Set states) => AppColor.primaryColor), - shape: MaterialStateProperty.all(RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - side: const BorderSide(width: 0, color: AppColor.primaryColor) - )) - ), - child: Text(AppLocalizations.of(context).login, - style: const TextStyle(fontSize: 16, color: Colors.white) - ), - onPressed: () { - loginController.handleLoginPressed(); - } - ) - ); + ? buildLoginButton(context) + : _buildExpandedButton(context, buildLoginButton(context)); } Widget _buildLoadingCircularProgress() { diff --git a/lib/features/login/presentation/login_view_web.dart b/lib/features/login/presentation/login_view_web.dart new file mode 100644 index 000000000..d71eb9325 --- /dev/null +++ b/lib/features/login/presentation/login_view_web.dart @@ -0,0 +1,192 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart'; +import 'package:tmail_ui_user/features/login/presentation/base_login_view.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class LoginView extends BaseLoginView { + + LoginView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.primaryLightColor, + body: SafeArea( + child: Center(child: SingleChildScrollView( + child: ResponsiveWidget( + responsiveUtils: responsiveUtils, + mobile: _buildMobileForm(context), + desktop: _buildWebForm(context), + ))) + ), + ); + } + + Widget _buildMobileForm(BuildContext context) { + return Stack( + children: [ + ConstrainedBox( + constraints: const BoxConstraints(minWidth: 200, maxWidth: 720, minHeight: 720), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsets.only(top: 67), + child: (SloganBuilder(arrangedByHorizontal: true) + ..setSloganText(AppLocalizations.of(context).app_name) + ..setSloganTextAlign(TextAlign.center) + ..setSloganTextStyle(const TextStyle(color: Colors.black, fontSize: 24, fontWeight: FontWeight.bold)) + ..setSizeLogo(36) + ..setLogo(imagePaths.icLogoTMail)) + .build() + ), + Padding( + padding: const EdgeInsets.only(top: 67), + child: Text( + AppLocalizations.of(context).signIn, + style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900) + ) + ), + Obx(() => buildLoginMessage(context, loginController.loginState.value)), + buildInputCredentialForm(context), + buildLoginButton(context) + ], + ) + ), + Positioned.fill( + bottom: 24, + child: Align( + alignment: Alignment.bottomCenter, + child: SvgPicture.asset( + imagePaths.icPowerByLinagora, + width: 97, + height: 44, + fit: BoxFit.fill))) + ], + ); + } + + Widget _buildWebForm(BuildContext context) { + return Stack( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(right: 86), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context).jmapBasedMailSolution, + style: const TextStyle(fontSize: 36, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900) + ), + Padding( + padding: const EdgeInsets.only(top: 24), + child: (SloganBuilder(arrangedByHorizontal: true, ) + ..setLogoSVG(imagePaths.icJMAPStandard) + ..setSizeLogo(48.0) + ..setPadding(const EdgeInsets.only(left: 12)) + ..setSloganText(AppLocalizations.of(context).jmapStandard) + ..setSloganTextStyle(const TextStyle(fontSize: 24, fontWeight: FontWeight.w400, color: AppColor.colorNameEmail))) + .build() + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: (SloganBuilder(arrangedByHorizontal: true, ) + ..setLogoSVG(imagePaths.icEncrypted) + ..setSizeLogo(48.0) + ..setPadding(const EdgeInsets.only(left: 12)) + ..setSloganText(AppLocalizations.of(context).encryptedMailbox) + ..setSloganTextStyle(const TextStyle(fontSize: 24, fontWeight: FontWeight.w400, color: AppColor.colorNameEmail))) + .build() + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: (SloganBuilder(arrangedByHorizontal: true, ) + ..setLogoSVG(imagePaths.icTeam) + ..setSizeLogo(48.0) + ..setPadding(const EdgeInsets.only(left: 12)) + ..setSloganText(AppLocalizations.of(context).manageEmailAsATeam) + ..setSloganTextStyle(const TextStyle(fontSize: 24, fontWeight: FontWeight.w400, color: AppColor.colorNameEmail))) + .build() + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: (SloganBuilder(arrangedByHorizontal: true, ) + ..setLogoSVG(imagePaths.icIntegration) + ..setSizeLogo(48.0) + ..setPadding(const EdgeInsets.only(left: 12)) + ..setSloganText(AppLocalizations.of(context).multipleIntegrations) + ..setSloganTextStyle(const TextStyle(fontSize: 24, fontWeight: FontWeight.w400, color: AppColor.colorNameEmail))) + .build() + ), + Padding( + padding: const EdgeInsets.only(top: 44), + child: Image( + image: AssetImage(imagePaths.loginGraphic), + fit: BoxFit.fill, + alignment: Alignment.center + ) + ) + ], + ) + ), + Column( + children: [ + SizedBox( + height: 690, + width: 445, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20.0), + ), + elevation: 10, + child: Padding( + padding: const EdgeInsets.only(left: 31, right: 31), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(top: 66), + child: (SloganBuilder(arrangedByHorizontal: true) + ..setSloganText(AppLocalizations.of(context).app_name) + ..setSloganTextAlign(TextAlign.center) + ..setSloganTextStyle(const TextStyle(color: Colors.black, fontSize: 24, fontWeight: FontWeight.bold)) + ..setSizeLogo(36) + ..setLogo(imagePaths.icLogoTMail)) + .build() + ), + Padding( + padding: const EdgeInsets.only(top: 67), + child: Text( + AppLocalizations.of(context).signIn, + style: const TextStyle(fontSize: 32, color: AppColor.colorNameEmail, fontWeight: FontWeight.w900) + ) + ), + Obx(() => buildLoginMessage(context, loginController.loginState.value)), + buildInputCredentialForm(context), + buildLoginButton(context) + ], + ) + ) + ) + ), + Padding( + padding: const EdgeInsets.only(top: 44, bottom: 10), + child: SvgPicture.asset(imagePaths.icPowerByLinagora, width: 97, height: 44, fit: BoxFit.fill)) + ] + ) + ], + ) + ], + ); + } +} \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 60e2a5aae..17e60be24 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-05-06T15:08:19.074758", + "@@last_modified": "2022-05-06T16:58:28.388035", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -12,6 +12,24 @@ "placeholders_order": [], "placeholders": {} }, + "loginInputUrlMessage": "To login and access your message please connect to your JMAP server", + "@loginInputUrlMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "loginInputCredentialMessage": "Enter your credentials to sign in", + "@loginInputCredentialMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "next": "Next", + "@next": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "prefix_https": "https://", "@prefix_https": { "type": "text", @@ -36,8 +54,38 @@ "placeholders_order": [], "placeholders": {} }, - "login_text_login_to_continue": "Please login to continue", - "@login_text_login_to_continue": { + "signIn": "Sign In", + "@signIn": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "jmapBasedMailSolution": "JMAP-based\ncollaborative team mail solution", + "@jmapBasedMailSolution": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "jmapStandard": "JMAP standard", + "@jmapStandard": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "encryptedMailbox": "Encrypted mailbox", + "@encryptedMailbox": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "manageEmailAsATeam": "Manage email as a team", + "@manageEmailAsATeam": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "multipleIntegrations": "Multiple integrations", + "@multipleIntegrations": { "type": "text", "placeholders_order": [], "placeholders": {} diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index e42d304e5..a0245e466 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -33,6 +33,10 @@ class AppLocalizations { return Intl.message('To login and access your message please connect to your JMAP server', name: 'loginInputUrlMessage'); } + String get loginInputCredentialMessage { + return Intl.message('Enter your credentials to sign in', name: 'loginInputCredentialMessage'); + } + String get next { return Intl.message('Next', name: 'next'); } @@ -57,6 +61,35 @@ class AppLocalizations { name: 'login'); } + String get signIn { + return Intl.message('Sign In', + name: 'signIn'); + } + + String get jmapBasedMailSolution { + return Intl.message('JMAP-based\ncollaborative team mail solution', + name: 'jmapBasedMailSolution'); + } + + String get jmapStandard { + return Intl.message('JMAP standard', + name: 'jmapStandard'); + } + + String get encryptedMailbox { + return Intl.message('Encrypted mailbox', + name: 'encryptedMailbox'); + } + + String get manageEmailAsATeam { + return Intl.message('Manage email as a team', + name: 'manageEmailAsATeam'); + } + + String get multipleIntegrations { + return Intl.message('Multiple integrations', name: 'multipleIntegrations'); + } + String get unknown_error_login_message { return Intl.message('Unknown error occurred, please try again', name: 'unknown_error_login_message'); diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index 0da44727f..9e083cc49 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -9,7 +9,8 @@ import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart'; import 'package:tmail_ui_user/features/home/presentation/home_view.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart'; import 'package:tmail_ui_user/features/login/presentation/login_bindings.dart'; -import 'package:tmail_ui_user/features/login/presentation/login_view.dart' deferred as login; +import 'package:tmail_ui_user/features/login/presentation/login_view.dart' + if (dart.library.html) 'package:tmail_ui_user/features/login/presentation/login_view_web.dart' deferred as login; import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_view.dart' deferred as mailbox_creator; import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_view.dart' deferred as identity_creator; @@ -17,9 +18,9 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_da import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart' if (dart.library.html) 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart' deferred as mailbox_dashboard; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_view.dart' deferred as manage_account_dashboard; import 'package:tmail_ui_user/features/session/presentation/session_page_bindings.dart'; import 'package:tmail_ui_user/features/session/presentation/session_view.dart' deferred as session; -import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_view.dart' deferred as manage_account_dashboard; import 'package:tmail_ui_user/main/pages/deferred_widget.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart';