TF-1068 Implement make recent list for input of URL

This commit is contained in:
dab246
2022-10-21 12:10:00 +07:00
committed by Dat H. Pham
parent 87839351f2
commit 2a39904b35
14 changed files with 225 additions and 55 deletions
@@ -28,6 +28,7 @@ import 'package:tmail_ui_user/features/login/domain/repository/login_url_reposit
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
@@ -52,6 +53,7 @@ class LoginBindings extends BaseBindings {
Get.find<GetAuthenticationInfoInteractor>(),
Get.find<GetStoredOidcConfigurationInteractor>(),
Get.find<SaveLoginUrlOnMobileInteractor>(),
Get.find<GetAllRecentLoginUrlOnMobileInteractor>(),
));
}
@@ -110,6 +112,7 @@ class LoginBindings extends BaseBindings {
Get.lazyPut(() => SaveLoginUrlOnMobileInteractor(
Get.find<LoginUrlRepository>(),
));
Get.lazyPut(() => GetAllRecentLoginUrlOnMobileInteractor(Get.find<LoginUrlRepository>()));
}
@override
@@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart'
import 'package:tmail_ui_user/features/login/domain/state/authenticate_oidc_on_browser_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/authentication_user_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_all_recent_login_url_latest_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_authentication_info_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_oidc_configuration_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_stored_oidc_configuration_state.dart';
@@ -17,6 +18,7 @@ import 'package:tmail_ui_user/features/login/domain/state/get_token_oidc_state.d
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_all_recent_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_info_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
@@ -43,6 +45,7 @@ class LoginController extends BaseController {
final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor;
final GetStoredOidcConfigurationInteractor _getStoredOidcConfigurationInteractor;
final SaveLoginUrlOnMobileInteractor _saveLoginUrlOnMobileInteractor;
final GetAllRecentLoginUrlOnMobileInteractor _getAllRecentLoginUrlOnMobileInteractor;
final TextEditingController urlInputController = TextEditingController();
@@ -60,6 +63,7 @@ class LoginController extends BaseController {
this._getAuthenticationInfoInteractor,
this._getStoredOidcConfigurationInteractor,
this._saveLoginUrlOnMobileInteractor,
this._getAllRecentLoginUrlOnMobileInteractor,
);
var loginState = LoginState(Right(LoginInitAction())).obs;
@@ -340,6 +344,17 @@ class LoginController extends BaseController {
}
}
Future<List<RecentLoginUrl>> getAllRecentLoginUrlAction(String pattern) async {
return await _getAllRecentLoginUrlOnMobileInteractor
.execute(pattern: pattern)
.then((result) => result.fold(
(failure) => <RecentLoginUrl>[],
(success) => success is GetAllRecentLoginUrlLatestSuccess
? success.listRecentLoginUrl
: <RecentLoginUrl>[]
));
}
@override
void onClose() {
urlInputController.clear();
+56 -43
View File
@@ -1,7 +1,10 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/widget/recent_item_tile_widget.dart';
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.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';
@@ -18,38 +21,37 @@ class LoginView extends BaseLoginView {
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.primaryLightColor,
body: Stack(children: [
GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Container(
color: Colors.white,
child: SafeArea(
child: _supportScrollForm(context)
? Stack(
children: [
Center(child: SingleChildScrollView(child: _buildCenterForm(context), scrollDirection: Axis.vertical)),
Obx(() {
if (loginController.loginFormType.value == LoginFormType.credentialForm
|| loginController.loginFormType.value == LoginFormType.ssoForm) {
return _buildBackButton(context);
}
return const SizedBox.shrink();
})
]
)
: Stack(
children: [
_buildCenterForm(context),
Obx(() {
if (loginController.loginFormType.value == LoginFormType.credentialForm
|| loginController.loginFormType.value == LoginFormType.ssoForm) {
return _buildBackButton(context);
}
return const SizedBox.shrink();
})
]
),
? Stack(children: [
Center(child: SingleChildScrollView(
child: _buildCenterForm(context),
scrollDirection: Axis.vertical)),
Obx(() {
if (loginController.loginFormType.value == LoginFormType.credentialForm
|| loginController.loginFormType.value == LoginFormType.ssoForm) {
return _buildBackButton(context);
}
return const SizedBox.shrink();
})
])
: Stack(children: [
_buildCenterForm(context),
Obx(() {
if (loginController.loginFormType.value == LoginFormType.credentialForm
|| loginController.loginFormType.value == LoginFormType.ssoForm) {
return _buildBackButton(context);
}
return const SizedBox.shrink();
})
]),
),
),
]));
));
}
Widget _buildCenterForm(BuildContext context) {
@@ -130,21 +132,32 @@ class LoginView extends BaseLoginView {
Widget _buildUrlInput(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(right: 24, left: 24, bottom: 24),
child: Container(
child: (TextFieldBuilder()
..key(const Key('login_url_input'))
..onChange((value) => loginController.formatUrl(value))
..textInputAction(TextInputAction.next)
..addController(loginController.urlInputController)
..keyboardType(TextInputType.url)
..onSubmitted((value) {
controller.handleNextInUrlInputFormPress();
})
..textDecoration((LoginInputDecorationBuilder()
..setLabelText(AppLocalizations.of(context).prefix_https)
..setPrefixText(AppLocalizations.of(context).prefix_https))
.build()))
.build()));
child: TypeAheadFormField<RecentLoginUrl>(
textFieldConfiguration: TextFieldConfiguration(
controller: loginController.urlInputController,
textInputAction: TextInputAction.next,
keyboardType: TextInputType.url,
onSubmitted: (value) => controller.handleNextInUrlInputFormPress(),
decoration: (LoginInputDecorationBuilder()
..setLabelText(AppLocalizations.of(context).prefix_https)
..setPrefixText(AppLocalizations.of(context).prefix_https))
.build()
),
debounceDuration: const Duration(milliseconds: 300),
suggestionsCallback: (pattern) async {
loginController.formatUrl(pattern);
return loginController.getAllRecentLoginUrlAction(pattern);
},
itemBuilder: (context, loginUrl) =>
RecentItemTileWidget(loginUrl, imagePath: imagePaths),
onSuggestionSelected: (loginUrl) => controller.formatUrl(loginUrl.url),
suggestionsBoxDecoration: const SuggestionsBoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(14))),
noItemsFoundBuilder: (context) => const SizedBox(),
hideOnEmpty: true,
hideOnError: true,
hideOnLoading: true,
));
}
Widget _buildExpandedButton(BuildContext context, Widget child) {
@@ -15,16 +15,12 @@ class LoginView extends BaseLoginView {
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.primaryLightColor,
body: Stack(children: [
SafeArea(
child: Center(child: SingleChildScrollView(
child: ResponsiveWidget(
responsiveUtils: responsiveUtils,
mobile: _buildMobileForm(context),
desktop: _buildWebForm(context),
)))
),
]),
body: Center(child: SingleChildScrollView(
child: ResponsiveWidget(
responsiveUtils: responsiveUtils,
mobile: _buildMobileForm(context),
desktop: _buildWebForm(context),
))),
);
}