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.

114 lines
3.8KB

  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/screens/login/bloc/login_bloc.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:formz/formz.dart';
  7. import 'package:flutter_bloc/flutter_bloc.dart';
  8. class LoginForm extends StatelessWidget {
  9. AuthenticationBloc _authenticationBloc;
  10. @override
  11. Widget build(BuildContext context) {
  12. _authenticationBloc = BlocProvider.of<AuthenticationBloc>(context);
  13. return BlocListener<LoginBloc, LoginState>(
  14. listener: (context, state) {
  15. if (state.status.isSubmissionFailure) {
  16. LoadingDialog.hideLoadingDialog(context);
  17. Scaffold.of(context)
  18. ..hideCurrentSnackBar()
  19. ..showSnackBar(
  20. const SnackBar(content: Text('Authentication Failure')),
  21. );
  22. }
  23. if (state.status.isSubmissionSuccess) {
  24. LoadingDialog.hideLoadingDialog(context);
  25. _authenticationBloc.add(
  26. AuthenticationStatusChanged(AuthenticationStatus.authenticated));
  27. }
  28. if (state.status.isSubmissionInProgress) {
  29. LoadingDialog.showLoadingDialog(context);
  30. }
  31. },
  32. child: Align(
  33. alignment: const Alignment(0, -1 / 3),
  34. child: Column(
  35. mainAxisSize: MainAxisSize.min,
  36. children: [
  37. _UsernameInput(),
  38. const Padding(padding: EdgeInsets.all(12)),
  39. _PasswordInput(),
  40. const Padding(padding: EdgeInsets.all(12)),
  41. _LoginButton(),
  42. ],
  43. ),
  44. ),
  45. );
  46. }
  47. }
  48. class _UsernameInput extends StatelessWidget {
  49. @override
  50. Widget build(BuildContext context) {
  51. return BlocBuilder<LoginBloc, LoginState>(
  52. buildWhen: (previous, current) => previous.username != current.username,
  53. builder: (context, state) {
  54. return TextField(
  55. key: const Key('loginForm_usernameInput_textField'),
  56. onChanged: (username) =>
  57. context.bloc<LoginBloc>().add(LoginUsernameChanged(username)),
  58. decoration: InputDecoration(
  59. labelText: 'Tên đăng nhập',
  60. errorText:
  61. state.username.invalid ? 'Vui lòng nhập tên đăng nhập' : null,
  62. ),
  63. );
  64. },
  65. );
  66. }
  67. }
  68. class _PasswordInput extends StatelessWidget {
  69. @override
  70. Widget build(BuildContext context) {
  71. return BlocBuilder<LoginBloc, LoginState>(
  72. buildWhen: (previous, current) => previous.password != current.password,
  73. builder: (context, state) {
  74. return TextField(
  75. key: const Key('loginForm_passwordInput_textField'),
  76. onChanged: (password) =>
  77. context.bloc<LoginBloc>().add(LoginPasswordChanged(password)),
  78. obscureText: true,
  79. decoration: InputDecoration(
  80. labelText: 'Mật khẩu',
  81. errorText: state.password.invalid ? 'Vui lòng nhập mật khẩu' : null,
  82. ),
  83. );
  84. },
  85. );
  86. }
  87. }
  88. class _LoginButton extends StatelessWidget {
  89. @override
  90. Widget build(BuildContext context) {
  91. return BlocBuilder<LoginBloc, LoginState>(
  92. buildWhen: (previous, current) => previous.status != current.status,
  93. builder: (context, state) {
  94. return state.status.isSubmissionInProgress
  95. ? const CircularProgressIndicator()
  96. : RaisedButton(
  97. key: const Key('loginForm_continue_raisedButton'),
  98. child: const Text('Đăng nhập'),
  99. onPressed: state.status.isValidated
  100. ? () {
  101. context.bloc<LoginBloc>().add(const LoginSubmitted());
  102. }
  103. : null,
  104. );
  105. },
  106. );
  107. }
  108. }