sign_in_screen.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import 'package:app_flowy/startup/startup.dart';
  2. import 'package:app_flowy/user/application/sign_in/sign_in_bloc.dart';
  3. import 'package:app_flowy/user/presentation/sign_in/widgets/background.dart';
  4. import 'package:app_flowy/workspace/presentation/home/home_screen.dart';
  5. import 'package:flowy_infra_ui/widget/rounded_button.dart';
  6. import 'package:flowy_infra_ui/widget/rounded_input_field.dart';
  7. import 'package:flowy_infra_ui/widget/spacing.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-user/user_detail.pb.dart';
  10. import 'package:flutter/material.dart';
  11. import 'package:flutter_bloc/flutter_bloc.dart';
  12. import 'package:dartz/dartz.dart';
  13. class SignInScreen extends StatelessWidget {
  14. const SignInScreen({Key? key}) : super(key: key);
  15. @override
  16. Widget build(BuildContext context) {
  17. return BlocProvider(
  18. create: (context) => getIt<SignInBloc>(),
  19. child: Scaffold(
  20. body: BlocProvider(
  21. create: (context) => getIt<SignInBloc>(),
  22. child: BlocConsumer<SignInBloc, SignInState>(
  23. listenWhen: (p, c) => p != c,
  24. listener: (context, state) {
  25. state.signInFailure.fold(
  26. () {},
  27. (result) => _handleStateErrors(result, context),
  28. );
  29. },
  30. builder: (context, state) => const SignInForm(),
  31. ),
  32. ),
  33. ),
  34. );
  35. }
  36. void _handleStateErrors(
  37. Either<UserDetail, UserError> some, BuildContext context) {
  38. some.fold(
  39. (userDetail) => _showHomeScreen(context, userDetail),
  40. (result) => _showErrorMessage(context, result.msg),
  41. );
  42. }
  43. void _showErrorMessage(BuildContext context, String msg) {
  44. ScaffoldMessenger.of(context).showSnackBar(
  45. SnackBar(
  46. content: Text(msg),
  47. ),
  48. );
  49. }
  50. void _showHomeScreen(BuildContext context, UserDetail userDetail) {
  51. Navigator.pushReplacement(
  52. context,
  53. MaterialPageRoute(
  54. builder: (context) {
  55. return HomeScreen(userDetail);
  56. },
  57. ),
  58. );
  59. }
  60. }
  61. class SignInForm extends StatelessWidget {
  62. const SignInForm({
  63. Key? key,
  64. }) : super(key: key);
  65. @override
  66. Widget build(BuildContext context) {
  67. return Align(
  68. alignment: Alignment.center,
  69. child: SignInFormContainer(
  70. children: [
  71. const SignInTitle(
  72. title: 'Login to Appflowy',
  73. logoSize: Size(60, 60),
  74. ),
  75. const VSpace(30),
  76. RoundedInputField(
  77. hintText: 'email',
  78. onChanged: (value) =>
  79. context.read<SignInBloc>().add(SignInEvent.emailChanged(value)),
  80. ),
  81. RoundedInputField(
  82. obscureText: true,
  83. hintText: 'password',
  84. onChanged: (value) => context
  85. .read<SignInBloc>()
  86. .add(SignInEvent.passwordChanged(value)),
  87. ),
  88. TextButton(
  89. style: TextButton.styleFrom(
  90. textStyle: const TextStyle(fontSize: 12),
  91. ),
  92. onPressed: () => _showForgetPasswordScreen(context),
  93. child: const Text(
  94. 'Forgot Password?',
  95. style: TextStyle(color: Colors.lightBlue),
  96. ),
  97. ),
  98. RoundedButton(
  99. title: 'Login',
  100. height: 60,
  101. borderRadius: BorderRadius.circular(10),
  102. color: Colors.lightBlue,
  103. press: () {
  104. context
  105. .read<SignInBloc>()
  106. .add(const SignInEvent.signedInWithUserEmailAndPassword());
  107. },
  108. ),
  109. const VSpace(10),
  110. Row(
  111. children: [
  112. const Text("Dont't have an account",
  113. style: TextStyle(color: Colors.blueGrey, fontSize: 12)),
  114. TextButton(
  115. style: TextButton.styleFrom(
  116. textStyle: const TextStyle(fontSize: 12),
  117. ),
  118. onPressed: () {},
  119. child: const Text(
  120. 'Sign Up',
  121. style: TextStyle(color: Colors.lightBlue),
  122. ),
  123. ),
  124. ],
  125. mainAxisAlignment: MainAxisAlignment.center,
  126. ),
  127. if (context.read<SignInBloc>().state.isSubmitting) ...[
  128. const SizedBox(height: 8),
  129. const LinearProgressIndicator(value: null),
  130. ]
  131. ],
  132. ),
  133. );
  134. }
  135. void _showForgetPasswordScreen(BuildContext context) {
  136. throw UnimplementedError();
  137. }
  138. }