Init home feature add presentation layer

This commit is contained in:
dab246
2021-07-27 12:54:28 +07:00
committed by Dat H. Pham
parent c235fcdecd
commit 360ab9a501
16 changed files with 677 additions and 0 deletions
@@ -0,0 +1,22 @@
import 'package:core/core.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tmail_ui_user/features/home/presentation/home_controller.dart';
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart';
class HomeBindings extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => CredentialRepositoryImpl(Get.find<SharedPreferences>()));
Get.lazyPut<CredentialRepository>(() => Get.find<CredentialRepositoryImpl>());
Get.lazyPut(() => GetCredentialInteractor(Get.find<CredentialRepository>()));
Get.lazyPut(() => HomeController(
Get.find<GetCredentialInteractor>(),
Get.find<DynamicUrlInterceptors>(),
Get.find<AuthorizationInterceptors>()));
}
}
@@ -0,0 +1,39 @@
import 'package:core/core.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
class HomeController extends GetxController {
final GetCredentialInteractor _getCredentialInteractor;
final DynamicUrlInterceptors _dynamicUrlInterceptors;
final AuthorizationInterceptors _authorizationInterceptors;
HomeController(this._getCredentialInteractor, this._dynamicUrlInterceptors, this._authorizationInterceptors);
@override
void onReady() {
super.onReady();
_getCredentialAction();
}
void _getCredentialAction() async {
await _getCredentialInteractor.execute()
.then((response) => response.fold(
(failure) => _goToLogin(),
(success) => success is GetCredentialViewState ? _goToMailbox(success) : _goToLogin()));
}
void _goToLogin() {
Get.offNamed(AppRoutes.LOGIN);
}
void _goToMailbox(GetCredentialViewState credentialViewState) {
_dynamicUrlInterceptors.changeBaseUrl(credentialViewState.baseUrl.origin);
_authorizationInterceptors.changeAuthorization(
credentialViewState.userName.userName,
credentialViewState.password.value,
);
Get.offNamed(AppRoutes.MAILBOX);
}
}
@@ -0,0 +1,26 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/home/presentation/home_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class HomeView extends GetWidget<HomeController> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.primaryColor,
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(AppLocalizations.of(context).initializing_data, style: TextStyle(color: Colors.white, fontSize: 17)),
],
),
),
),
);
}
}
+63
View File
@@ -0,0 +1,63 @@
{
"@@last_modified": "2021-07-01T16:29:46.979874",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
"placeholders": {}
},
"login_text_slogan": "TMail",
"@login_text_slogan": {
"type": "text",
"placeholders": {}
},
"prefix_https": "https://",
"@prefix_https": {
"type": "text",
"placeholders": {}
},
"username": "username",
"@username": {
"type": "text",
"placeholders": {}
},
"password": "password",
"@password": {
"type": "text",
"placeholders": {}
},
"login": "Login",
"@login": {
"type": "text",
"placeholders": {}
},
"login_text_login_to_continue": "Please login to continue",
"@login_text_login_to_continue": {
"type": "text",
"placeholders": {}
},
"unknown_error_login_message": "Unknown error occurred, please try again",
"@unknown_error_login_message": {
"type": "text",
"placeholders": {}
},
"search_folder": "Search folder",
"@search_folder": {
"type": "text",
"placeholders": {}
},
"storage": "STORAGE",
"@storage": {
"type": "text",
"placeholders": {}
},
"my_folders": "MY FOLDERS",
"@my_folders": {
"type": "text",
"placeholders": {}
},
"new_folder": "New folder",
"@new_folder": {
"type": "text",
"placeholders": {}
}
}
+63
View File
@@ -0,0 +1,63 @@
{
"@@last_modified": "2021-07-01T16:29:46.979874",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
"placeholders": {}
},
"login_text_slogan": "TMail",
"@login_text_slogan": {
"type": "text",
"placeholders": {}
},
"prefix_https": "https://",
"@prefix_https": {
"type": "text",
"placeholders": {}
},
"username": "username",
"@username": {
"type": "text",
"placeholders": {}
},
"password": "password",
"@password": {
"type": "text",
"placeholders": {}
},
"login": "Login",
"@login": {
"type": "text",
"placeholders": {}
},
"login_text_login_to_continue": "Please login to continue",
"@login_text_login_to_continue": {
"type": "text",
"placeholders": {}
},
"unknown_error_login_message": "Unknown error occurred, please try again",
"@unknown_error_login_message": {
"type": "text",
"placeholders": {}
},
"search_folder": "Search folder",
"@search_folder": {
"type": "text",
"placeholders": {}
},
"storage": "STORAGE",
"@storage": {
"type": "text",
"placeholders": {}
},
"my_folders": "MY FOLDERS",
"@my_folders": {
"type": "text",
"placeholders": {}
},
"new_folder": "New folder",
"@new_folder": {
"type": "text",
"placeholders": {}
}
}
+63
View File
@@ -0,0 +1,63 @@
{
"@@last_modified": "2021-07-23T09:09:13.997889",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
"placeholders": {}
},
"login_text_slogan": "TMail",
"@login_text_slogan": {
"type": "text",
"placeholders": {}
},
"prefix_https": "https://",
"@prefix_https": {
"type": "text",
"placeholders": {}
},
"username": "username",
"@username": {
"type": "text",
"placeholders": {}
},
"password": "password",
"@password": {
"type": "text",
"placeholders": {}
},
"login": "Login",
"@login": {
"type": "text",
"placeholders": {}
},
"login_text_login_to_continue": "Please login to continue",
"@login_text_login_to_continue": {
"type": "text",
"placeholders": {}
},
"unknown_error_login_message": "Unknown error occurred, please try again",
"@unknown_error_login_message": {
"type": "text",
"placeholders": {}
},
"search_folder": "Search folder",
"@search_folder": {
"type": "text",
"placeholders": {}
},
"storage": "STORAGE",
"@storage": {
"type": "text",
"placeholders": {}
},
"my_folders": "MY FOLDERS",
"@my_folders": {
"type": "text",
"placeholders": {}
},
"new_folder": "New folder",
"@new_folder": {
"type": "text",
"placeholders": {}
}
}
+63
View File
@@ -0,0 +1,63 @@
{
"@@last_modified": "2021-07-01T16:29:46.979874",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
"placeholders": {}
},
"login_text_slogan": "TMail",
"@login_text_slogan": {
"type": "text",
"placeholders": {}
},
"prefix_https": "https://",
"@prefix_https": {
"type": "text",
"placeholders": {}
},
"username": "username",
"@username": {
"type": "text",
"placeholders": {}
},
"password": "password",
"@password": {
"type": "text",
"placeholders": {}
},
"login": "Login",
"@login": {
"type": "text",
"placeholders": {}
},
"login_text_login_to_continue": "Please login to continue",
"@login_text_login_to_continue": {
"type": "text",
"placeholders": {}
},
"unknown_error_login_message": "Unknown error occurred, please try again",
"@unknown_error_login_message": {
"type": "text",
"placeholders": {}
},
"search_folder": "Search folder",
"@search_folder": {
"type": "text",
"placeholders": {}
},
"storage": "STORAGE",
"@storage": {
"type": "text",
"placeholders": {}
},
"my_folders": "MY FOLDERS",
"@my_folders": {
"type": "text",
"placeholders": {}
},
"new_folder": "New folder",
"@new_folder": {
"type": "text",
"placeholders": {}
}
}
+63
View File
@@ -0,0 +1,63 @@
{
"@@last_modified": "2021-07-01T16:29:46.979874",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
"placeholders": {}
},
"login_text_slogan": "TMail",
"@login_text_slogan": {
"type": "text",
"placeholders": {}
},
"prefix_https": "https://",
"@prefix_https": {
"type": "text",
"placeholders": {}
},
"username": "username",
"@username": {
"type": "text",
"placeholders": {}
},
"password": "password",
"@password": {
"type": "text",
"placeholders": {}
},
"login": "Login",
"@login": {
"type": "text",
"placeholders": {}
},
"login_text_login_to_continue": "Please login to continue",
"@login_text_login_to_continue": {
"type": "text",
"placeholders": {}
},
"unknown_error_login_message": "Unknown error occurred, please try again",
"@unknown_error_login_message": {
"type": "text",
"placeholders": {}
},
"search_folder": "Search folder",
"@search_folder": {
"type": "text",
"placeholders": {}
},
"storage": "STORAGE",
"@storage": {
"type": "text",
"placeholders": {}
},
"my_folders": "MY FOLDERS",
"@my_folders": {
"type": "text",
"placeholders": {}
},
"new_folder": "New folder",
"@new_folder": {
"type": "text",
"placeholders": {}
}
}
+30
View File
@@ -0,0 +1,30 @@
import 'package:core/core.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
class CoreBindings extends Bindings {
@override
Future dependencies() async {
await _bindingSharePreference();
_bindingAppImagePaths();
_bindingResponsiveManager();
_bindingKeyboardManager();
}
void _bindingAppImagePaths() {
Get.put(ImagePaths());
}
void _bindingResponsiveManager() {
Get.put(ResponsiveUtils());
}
Future _bindingSharePreference() async {
await Get.putAsync(() async => await SharedPreferences.getInstance(), permanent: true);
}
void _bindingKeyboardManager() {
Get.put(KeyboardUtils());
}
}
+11
View File
@@ -0,0 +1,11 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/main/bindings/core/core_bindings.dart';
import 'package:tmail_ui_user/main/bindings/network/network_bindings.dart';
class MainBindings extends Bindings {
@override
Future dependencies() async {
await CoreBindings().dependencies();
NetworkBindings().dependencies();
}
}
@@ -0,0 +1,49 @@
import 'dart:io';
import 'package:core/core.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/http/http_client.dart' as JmapHttpClient;
import 'package:tmail_ui_user/features/login/data/network/login_api.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
class NetworkBindings extends Bindings {
@override
void dependencies() {
_bindingDio();
_bindingApi();
}
void _bindingBaseOption() {
final headers = <String, dynamic>{
HttpHeaders.acceptHeader: Constant.acceptHeaderDefault,
HttpHeaders.contentTypeHeader: Constant.contentTypeHeaderDefault
};
Get.put(BaseOptions(headers: headers));
}
void _bindingDio() {
_bindingBaseOption();
Get.put(Dio(Get.find<BaseOptions>()));
_bindingInterceptors();
Get.find<Dio>().interceptors.add(Get.find<DynamicUrlInterceptors>());
Get.find<Dio>().interceptors.add(Get.find<AuthorizationInterceptors>());
if (kDebugMode) {
Get.find<Dio>().interceptors.add(LogInterceptor(requestBody: true));
}
}
void _bindingInterceptors() {
Get.put(DynamicUrlInterceptors());
Get.put(AuthorizationInterceptors());
}
void _bindingApi() {
Get.put(DioClient(Get.find<Dio>()));
Get.put(JmapHttpClient.HttpClient(Get.find<Dio>()));
Get.put(LoginAPI(Get.find<DioClient>()));
Get.put(MailboxAPI(Get.find<JmapHttpClient.HttpClient>()));
}
}
@@ -0,0 +1,90 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:tmail_ui_user/l10n/messages_all.dart';
class AppLocalizations {
static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
}
static Future<AppLocalizations> load(Locale locale) async {
final name = locale.countryCode == null ? locale.languageCode : locale.toString();
final localeName = Intl.canonicalizedLocale(name);
return initializeMessages(localeName).then((_) {
Intl.defaultLocale = localeName;
return AppLocalizations();
});
}
String get initializing_data {
return Intl.message('Initializing data...',
name: 'initializing_data');
}
String get login_text_slogan {
return Intl.message('TMail',
name: 'login_text_slogan');
}
String get prefix_https {
return Intl.message('https://',
name: 'prefix_https');
}
String get username {
return Intl.message('username',
name: 'username');
}
String get password {
return Intl.message('password',
name: 'password');
}
String get login {
return Intl.message('Login',
name: 'login');
}
String get login_text_login_to_continue {
return Intl.message('Please login to continue',
name: 'login_text_login_to_continue');
}
String get unknown_error_login_message {
return Intl.message('Unknown error occurred, please try again',
name: 'unknown_error_login_message');
}
String get search_folder {
return Intl.message(
'Search folder',
name: 'search_folder',
);
}
String get storage {
return Intl.message(
'STORAGE',
name: 'storage',
);
}
String get my_folders {
return Intl.message(
'MY FOLDERS',
name: 'my_folders',
);
}
String get new_folder {
return Intl.message(
'New folder',
name: 'new_folder',
);
}
}
@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
const AppLocalizationsDelegate();
@override
bool isSupported(Locale locale) {
return ['en', 'vi', 'fr', 'ru'].contains(locale.languageCode);
}
@override
Future<AppLocalizations> load(Locale locale) async {
return AppLocalizations.load(locale);
}
@override
bool shouldReload(covariant LocalizationsDelegate<AppLocalizations> old) => false;
}
+46
View File
@@ -0,0 +1,46 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/main/bindings/main_bindings.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations_delegate.dart';
import 'package:tmail_ui_user/main/pages/app_pages.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await MainBindings().dependencies();
runApp(TMailApp());
}
class TMailApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
theme: appTheme(),
supportedLocales: [
Locale('en'),
Locale('vi'),
Locale('ru'),
Locale('fr')
],
localizationsDelegates: [
AppLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
localeResolutionCallback: (deviceLocale, supportedLocales) {
for (var locale in supportedLocales) {
if (locale.languageCode == deviceLocale?.languageCode) {
return deviceLocale;
}
}
return supportedLocales.first;
},
defaultTransition: Transition.fade,
initialRoute: AppRoutes.HOME,
getPages: AppPages.pages);
}
}
+25
View File
@@ -0,0 +1,25 @@
import 'package:get/get_navigation/src/routes/get_route.dart';
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/login/presentation/login_bindings.dart';
import 'package:tmail_ui_user/features/login/presentation/login_view.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
class AppPages {
static final pages = [
GetPage(
name: AppRoutes.HOME,
page: () => HomeView(),
binding: HomeBindings()),
GetPage(
name: AppRoutes.LOGIN,
page: () => LoginView(),
binding: LoginBindings()),
GetPage(
name: AppRoutes.MAILBOX,
page: () => MailboxView(),
binding: MailboxBindings()),
];
}
+5
View File
@@ -0,0 +1,5 @@
abstract class AppRoutes {
static const HOME = '/';
static const LOGIN = '/login';
static const MAILBOX = '/mailbox';
}