You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
6.3KB

  1. import 'package:farm_tpf/authentication/authentication.dart';
  2. import 'package:farm_tpf/data/repository/authentication_repository.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart';
  4. import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart';
  5. import 'package:farm_tpf/presentation/screens/forgot_password/sc_forgot_password.dart';
  6. import 'package:farm_tpf/presentation/screens/login/bloc/login_bloc.dart';
  7. import 'package:farm_tpf/utils/const_color.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:formz/formz.dart';
  10. import 'package:flutter_bloc/flutter_bloc.dart';
  11. class LoginForm extends StatelessWidget {
  12. late AuthenticationBloc _authenticationBloc;
  13. FocusNode _usernameFocus = FocusNode();
  14. FocusNode _passwordFocus = FocusNode();
  15. @override
  16. Widget build(BuildContext context) {
  17. _authenticationBloc = BlocProvider.of<AuthenticationBloc>(context);
  18. return BlocListener<LoginBloc, LoginState>(
  19. listener: (context, state) {
  20. if (state.status.isSubmissionFailure) {
  21. LoadingDialog.hideLoadingDialog(context);
  22. Utils.showSnackBarError(message: 'Tài khoản hoặc mật khẩu không đúng.');
  23. }
  24. if (state.status.isSubmissionSuccess) {
  25. LoadingDialog.hideLoadingDialog(context);
  26. _authenticationBloc.add(const AuthenticationStatusChanged(AuthenticationStatus.authenticated));
  27. }
  28. if (state.status.isSubmissionInProgress) {
  29. LoadingDialog.showLoadingDialog(context);
  30. }
  31. },
  32. child: Align(
  33. child: Column(
  34. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  35. mainAxisSize: MainAxisSize.min,
  36. children: [
  37. _UsernameInput(usernameFocus: _usernameFocus, nextFocus: _passwordFocus),
  38. const Padding(padding: EdgeInsets.all(12)),
  39. _PasswordInput(
  40. passwordFocus: _passwordFocus,
  41. ),
  42. const Padding(padding: EdgeInsets.all(16)),
  43. _LoginButton(),
  44. const Padding(padding: EdgeInsets.all(6)),
  45. _FogotPasswordButton(),
  46. ],
  47. ),
  48. ),
  49. );
  50. }
  51. }
  52. class _FogotPasswordButton extends StatelessWidget {
  53. @override
  54. Widget build(BuildContext context) {
  55. return Align(
  56. alignment: Alignment.center,
  57. child: FlatButton(
  58. child: Text('Quên mật khẩu', style: TextStyle(color: AppColors.BLUE, fontSize: 16)),
  59. onPressed: () {
  60. Navigator.of(context).push(MaterialPageRoute(builder: (_) => ForgotPasswordScreen()));
  61. }));
  62. }
  63. }
  64. class _UsernameInput extends StatelessWidget {
  65. final FocusNode usernameFocus;
  66. final FocusNode nextFocus;
  67. _UsernameInput({required this.usernameFocus, required this.nextFocus});
  68. @override
  69. Widget build(BuildContext context) {
  70. return BlocBuilder<LoginBloc, LoginState>(
  71. buildWhen: (previous, current) => previous.username != current.username,
  72. builder: (context, state) {
  73. return Container(
  74. height: 50,
  75. padding: const EdgeInsets.symmetric(horizontal: 8),
  76. child: Center(
  77. child: TextFormField(
  78. focusNode: usernameFocus,
  79. textInputAction: TextInputAction.next,
  80. onChanged: (username) => context.bloc<LoginBloc>().add(LoginUsernameChanged(username)),
  81. // autovalidate: true,
  82. validator: (_) {
  83. return state.username.invalid ? 'Vui lòng nhập tài khoản' : null;
  84. },
  85. onFieldSubmitted: (_) {
  86. usernameFocus.unfocus();
  87. FocusScope.of(context).requestFocus(nextFocus);
  88. },
  89. maxLines: 1,
  90. keyboardType: TextInputType.text,
  91. obscureText: false,
  92. textAlign: TextAlign.left,
  93. decoration: const InputDecoration(
  94. hintText: 'Tài khoản',
  95. ),
  96. ),
  97. ));
  98. },
  99. );
  100. }
  101. }
  102. class _PasswordInput extends StatelessWidget {
  103. final FocusNode passwordFocus;
  104. _PasswordInput({required this.passwordFocus});
  105. @override
  106. Widget build(BuildContext context) {
  107. return BlocBuilder<LoginBloc, LoginState>(
  108. buildWhen: (previous, current) => previous.password != current.password,
  109. builder: (context, state) {
  110. return Container(
  111. height: 50,
  112. padding: const EdgeInsets.symmetric(horizontal: 8),
  113. child: Center(
  114. child: TextFormField(
  115. focusNode: passwordFocus,
  116. onChanged: (password) => context.bloc<LoginBloc>().add(LoginPasswordChanged(password)),
  117. // autovalidate: true,
  118. validator: (_) {
  119. return state.password.invalid ? 'Vui lòng nhập mật khẩu' : null;
  120. },
  121. onFieldSubmitted: (_) {
  122. passwordFocus.unfocus();
  123. if (state.status.isValidated) {
  124. context.bloc<LoginBloc>().add(const LoginSubmitted());
  125. }
  126. },
  127. maxLines: 1,
  128. keyboardType: TextInputType.text,
  129. obscureText: true,
  130. textAlign: TextAlign.left,
  131. decoration: const InputDecoration(
  132. hintText: 'Mật khẩu',
  133. ),
  134. ),
  135. ));
  136. },
  137. );
  138. }
  139. }
  140. class _LoginButton extends StatelessWidget {
  141. @override
  142. Widget build(BuildContext context) {
  143. return BlocBuilder<LoginBloc, LoginState>(
  144. buildWhen: (previous, current) => previous.status != current.status,
  145. builder: (context, state) {
  146. return SizedBox(
  147. width: double.infinity,
  148. height: 55,
  149. child: FlatButton(
  150. onPressed: () {
  151. // if (state.status.isValidated) {
  152. // context.bloc<LoginBloc>().add(const LoginSubmitted());
  153. // }
  154. context.bloc<LoginBloc>().add(const LoginSubmitted());
  155. },
  156. color: state.status.isValidated ? AppColors.DEFAULT : AppColors.GRAY1_50,
  157. shape: RoundedRectangleBorder(
  158. borderRadius: BorderRadius.circular(7.0),
  159. ),
  160. child: Text('Đăng nhập'.toUpperCase(), style: TextStyle(fontWeight: FontWeight.bold, color: AppColors.WHITE, fontSize: 18)),
  161. ),
  162. );
  163. },
  164. );
  165. }
  166. }