From 084f939ed045681fc17c01ceb28795e22736d48e Mon Sep 17 00:00:00 2001 From: appflowy Date: Sun, 25 Jul 2021 16:07:53 +0800 Subject: [PATCH] config sign in screen --- app_flowy/.vscode/tasks.json | 6 +- app_flowy/analysis_options.yaml | 2 +- app_flowy/assets/images/app_flowy_logo.jpg | Bin 0 -> 30368 bytes .../presentation/sign_in/sign_in_screen.dart | 133 +++++++++++++++++- .../sign_in/widgets/background.dart | 66 ++++++--- .../presentation/sign_in/widgets/body.dart | 125 ---------------- .../lib/widget/rounded_button.dart | 31 +++- .../lib/widget/rounded_input_field.dart | 31 ++-- .../lib/widget/text_field_container.dart | 15 +- 9 files changed, 236 insertions(+), 173 deletions(-) create mode 100644 app_flowy/assets/images/app_flowy_logo.jpg delete mode 100644 app_flowy/lib/user/presentation/sign_in/widgets/body.dart diff --git a/app_flowy/.vscode/tasks.json b/app_flowy/.vscode/tasks.json index 539b284ce9..98ce703ff7 100644 --- a/app_flowy/.vscode/tasks.json +++ b/app_flowy/.vscode/tasks.json @@ -18,9 +18,9 @@ "options": { "cwd": "${workspaceFolder}/../" }, - "problemMatcher": [ - "$rustc" - ], + // "problemMatcher": [ + // "$rustc" + // ], "label": "BuildRust" } ] diff --git a/app_flowy/analysis_options.yaml b/app_flowy/analysis_options.yaml index eb5b057c3c..c4268a9269 100644 --- a/app_flowy/analysis_options.yaml +++ b/app_flowy/analysis_options.yaml @@ -15,7 +15,7 @@ analyzer: - "**/*.g.dart" - "**/*.freezed.dart" - "packages/flowy_editor/**" - - "packages/flowy_infra_ui/**" + # - "packages/flowy_infra_ui/**" linter: # The lint rules applied to this project can be customized in the diff --git a/app_flowy/assets/images/app_flowy_logo.jpg b/app_flowy/assets/images/app_flowy_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb27e0ddb1ecf6521956acae24b0b6b9e3e3912d GIT binary patch literal 30368 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 getIt(), - child: const Scaffold( - body: Body(), + child: Scaffold( + body: BlocProvider( + create: (context) => getIt(), + child: BlocConsumer( + listenWhen: (p, c) => p != c, + listener: (context, state) { + state.signInFailure.fold( + () {}, + (result) => _handleStateErrors(result, context), + ); + }, + builder: (context, state) => const SignInForm(), + ), + ), + ), + ); + } + + void _handleStateErrors( + Either some, BuildContext context) { + some.fold( + (userDetail) => _showHomeScreen(context, userDetail), + (result) => _showErrorMessage(context, result.msg), + ); + } + + void _showErrorMessage(BuildContext context, String msg) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(msg), + ), + ); + } + + void _showHomeScreen(BuildContext context, UserDetail userDetail) { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) { + return HomeScreen(userDetail); + }, ), ); } } + +class SignInForm extends StatelessWidget { + const SignInForm({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.center, + child: SignInFormContainer( + children: [ + const SignInTitle( + title: 'Login to Appflowy', + logoSize: Size(60, 60), + ), + const VSpace(30), + RoundedInputField( + hintText: 'email', + onChanged: (value) => + context.read().add(SignInEvent.emailChanged(value)), + ), + RoundedInputField( + obscureText: true, + hintText: 'password', + onChanged: (value) => context + .read() + .add(SignInEvent.passwordChanged(value)), + ), + TextButton( + style: TextButton.styleFrom( + textStyle: const TextStyle(fontSize: 12), + ), + onPressed: () => _showForgetPasswordScreen(context), + child: const Text( + 'Forgot Password?', + style: TextStyle(color: Colors.lightBlue), + ), + ), + RoundedButton( + title: 'Login', + height: 60, + borderRadius: BorderRadius.circular(10), + color: Colors.lightBlue, + press: () { + context + .read() + .add(const SignInEvent.signedInWithUserEmailAndPassword()); + }, + ), + const VSpace(10), + Row( + children: [ + const Text("Dont't have an account", + style: TextStyle(color: Colors.blueGrey, fontSize: 12)), + TextButton( + style: TextButton.styleFrom( + textStyle: const TextStyle(fontSize: 12), + ), + onPressed: () {}, + child: const Text( + 'Sign Up', + style: TextStyle(color: Colors.lightBlue), + ), + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + ), + if (context.read().state.isSubmitting) ...[ + const SizedBox(height: 8), + const LinearProgressIndicator(value: null), + ] + ], + ), + ); + } + + void _showForgetPasswordScreen(BuildContext context) { + throw UnimplementedError(); + } +} diff --git a/app_flowy/lib/user/presentation/sign_in/widgets/background.dart b/app_flowy/lib/user/presentation/sign_in/widgets/background.dart index a33ae64e27..4bab31741f 100644 --- a/app_flowy/lib/user/presentation/sign_in/widgets/background.dart +++ b/app_flowy/lib/user/presentation/sign_in/widgets/background.dart @@ -1,29 +1,57 @@ +import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flutter/material.dart'; -class SignInBackground extends StatelessWidget { - final Widget child; - const SignInBackground({ +class SignInFormContainer extends StatelessWidget { + final List children; + const SignInFormContainer({ Key? key, - required this.child, + required this.children, }) : super(key: key); @override Widget build(BuildContext context) { - var size = MediaQuery.of(context).size; + final size = MediaQuery.of(context).size; return SizedBox( - height: size.height, - width: double.infinity, - child: Stack( - alignment: Alignment.center, - children: [ - Image( - fit: BoxFit.cover, - width: size.width, - height: size.height, - image: const AssetImage( - 'assets/images/appflowy_launch_splash.jpg')), - child, - ], - )); + width: size.width * 0.3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: children, + ), + ); + } +} + +class SignInTitle extends StatelessWidget { + final String title; + final Size logoSize; + const SignInTitle({ + Key? key, + required this.title, + required this.logoSize, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image( + fit: BoxFit.cover, + width: logoSize.width, + height: logoSize.height, + image: const AssetImage('assets/images/app_flowy_logo.jpg')), + const VSpace(30), + Text( + title, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ) + ], + ), + ); } } diff --git a/app_flowy/lib/user/presentation/sign_in/widgets/body.dart b/app_flowy/lib/user/presentation/sign_in/widgets/body.dart deleted file mode 100644 index be49b3f7b9..0000000000 --- a/app_flowy/lib/user/presentation/sign_in/widgets/body.dart +++ /dev/null @@ -1,125 +0,0 @@ -import 'package:app_flowy/startup/startup.dart'; -import 'package:app_flowy/user/application/sign_in/sign_in_bloc.dart'; -import 'package:app_flowy/user/presentation/sign_in/widgets/background.dart'; -import 'package:app_flowy/workspace/presentation/home/home_screen.dart'; -import 'package:dartz/dartz.dart'; -import 'package:flowy_infra_ui/widget/rounded_button.dart'; -import 'package:flowy_infra_ui/widget/rounded_input_field.dart'; -import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -class Body extends StatelessWidget { - const Body({Key? key}) : super(key: key); - @override - Widget build(BuildContext context) { - return BlocProvider( - create: (context) => getIt(), - child: const SignInBackground( - child: SignInForm(), - ), - ); - } -} - -class SignInForm extends StatelessWidget { - const SignInForm({ - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocConsumer( - listenWhen: (p, c) => p != c, - listener: (context, state) { - state.signInFailure.fold( - () {}, - (result) => _handleStateErrors(result, context), - ); - }, - builder: (context, state) { - return SignInFormBackground( - children: [ - const SizedBox(height: 30), - RoundedInputField( - icon: Icons.person, - hintText: 'email', - onChanged: (value) => context - .read() - .add(SignInEvent.emailChanged(value)), - ), - RoundedInputField( - icon: Icons.lock, - obscureText: true, - hintText: 'password', - onChanged: (value) => context - .read() - .add(SignInEvent.passwordChanged(value)), - ), - RoundedButton( - title: 'LOGIN', - press: () { - context - .read() - .add(const SignInEvent.signedInWithUserEmailAndPassword()); - }, - ), - if (state.isSubmitting) ...[ - const SizedBox(height: 8), - const LinearProgressIndicator(value: null), - ] - ], - ); - }, - ); - } - - void _handleStateErrors( - Either some, BuildContext context) { - some.fold( - (userDetail) => showHomeScreen(context, userDetail), - (result) => _showErrorMessage(context, result.msg), - ); - } - - void _showErrorMessage(BuildContext context, String msg) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(msg), - ), - ); - } - - void showHomeScreen(BuildContext context, UserDetail userDetail) { - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) { - return HomeScreen(userDetail); - }, - ), - ); - } -} - -class SignInFormBackground extends StatelessWidget { - final List children; - const SignInFormBackground({ - Key? key, - required this.children, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final size = MediaQuery.of(context).size; - - return Container( - width: size.width * 0.4, - alignment: Alignment.center, - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, children: children), - ), - ); - } -} diff --git a/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_button.dart b/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_button.dart index 72ead5951e..eced9d0ab6 100644 --- a/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_button.dart +++ b/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_button.dart @@ -3,13 +3,23 @@ import 'package:flutter/material.dart'; class RoundedButton extends StatelessWidget { final VoidCallback? press; final String? title; - final Size? size; + final double? width; + final double? height; + final BorderRadius borderRadius; + final Color borderColor; + final Color color; + final Color textColor; const RoundedButton({ Key? key, this.press, this.title, - this.size, + this.width, + this.height, + this.borderRadius = BorderRadius.zero, + this.borderColor = Colors.transparent, + this.color = Colors.transparent, + this.textColor = Colors.white, }) : super(key: key); @override @@ -17,15 +27,22 @@ class RoundedButton extends StatelessWidget { return ConstrainedBox( constraints: BoxConstraints( minWidth: 100, - maxWidth: size?.width ?? double.infinity, + maxWidth: width ?? double.infinity, minHeight: 50, - maxHeight: size?.height ?? double.infinity, + maxHeight: height ?? 60, ), child: Container( margin: const EdgeInsets.symmetric(vertical: 10), - child: TextButton( - child: Text(title ?? ''), - onPressed: press, + decoration: BoxDecoration( + border: Border.all(color: borderColor), + borderRadius: borderRadius, + color: color, + ), + child: SizedBox.expand( + child: TextButton( + child: Text(title ?? '', style: TextStyle(color: textColor)), + onPressed: press, + ), ), ), ); diff --git a/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_input_field.dart b/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_input_field.dart index e570e4e2b6..e3339b2118 100644 --- a/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_input_field.dart +++ b/app_flowy/packages/flowy_infra_ui/lib/widget/rounded_input_field.dart @@ -10,26 +10,33 @@ class RoundedInputField extends StatelessWidget { const RoundedInputField({ Key? key, this.hintText, - this.icon = Icons.person, + this.icon, this.obscureText = false, this.onChanged, }) : super(key: key); @override Widget build(BuildContext context) { + final Icon? newIcon = icon == null + ? null + : Icon( + icon!, + color: const Color(0xFF6F35A5), + ); + return TextFieldContainer( - child: TextFormField( - onChanged: onChanged, - cursorColor: const Color(0xFF6F35A5), - obscureText: obscureText, - decoration: InputDecoration( - icon: Icon( - icon, - color: const Color(0xFF6F35A5), + borderRadius: BorderRadius.circular(10), + borderColor: Colors.blueGrey, + child: TextFormField( + onChanged: onChanged, + cursorColor: const Color(0xFF6F35A5), + obscureText: obscureText, + decoration: InputDecoration( + icon: newIcon, + hintText: hintText, + border: InputBorder.none, ), - hintText: hintText, - border: InputBorder.none, ), - )); + ); } } diff --git a/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart b/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart index 5808ae7b8a..d6116b4c7c 100644 --- a/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart +++ b/app_flowy/packages/flowy_infra_ui/lib/widget/text_field_container.dart @@ -3,21 +3,30 @@ import 'package:flutter/material.dart'; class TextFieldContainer extends StatelessWidget { final Widget child; + final BorderRadius borderRadius; + final Color borderColor; + final Size? size; const TextFieldContainer({ Key? key, required this.child, + this.borderRadius = BorderRadius.zero, + this.borderColor = Colors.white, + this.size, }) : super(key: key); @override Widget build(BuildContext context) { + double height = size == null ? 50 : size!.height; return Container( margin: const EdgeInsets.symmetric(vertical: 10), - padding: const EdgeInsets.symmetric(horizontal: 20), + padding: const EdgeInsets.symmetric(horizontal: 15), + height: height, decoration: BoxDecoration( + border: Border.all(color: borderColor), color: Colors.white, - borderRadius: BorderRadius.circular(30), + borderRadius: borderRadius, ), - child: child, + child: Align(alignment: Alignment.center, child: child), ); }