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';