From 6b3824d19eb35dd3c50c38cee2733003bed62f56 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Sat, 25 Feb 2023 13:15:46 -0500 Subject: [PATCH] Change sign in screen to split apart username and servername, adds support for by email address --- lib/models/credentials.dart | 23 ------------- lib/screens/sign_in.dart | 69 +++++++++++++++++++++++++++++-------- pubspec.lock | 10 +----- pubspec.yaml | 2 +- 4 files changed, 56 insertions(+), 48 deletions(-) diff --git a/lib/models/credentials.dart b/lib/models/credentials.dart index 94cb53f..a22cea5 100644 --- a/lib/models/credentials.dart +++ b/lib/models/credentials.dart @@ -1,9 +1,5 @@ import 'dart:convert'; -import 'package:result_monad/result_monad.dart'; - -import 'exec_error.dart'; - class Credentials { final String username; final String password; @@ -59,25 +55,6 @@ class Credentials { ); } - static Result buildFromHandle( - String handle, String password) { - final elements = handle.split('@'); - if (elements.length != 2) { - return Result.error(ExecError( - type: ErrorType.authentication, - message: 'Handle has invalid format: $handle')); - } - final result = Credentials( - username: elements[0], - password: password, - serverName: elements[1], - userId: '', - avatar: '', - ); - - return Result.ok(result); - } - @override String toString() { return 'Credentials{username: $username, password?: ${password.isNotEmpty}, serverName: $serverName, userId: $userId}'; diff --git a/lib/screens/sign_in.dart b/lib/screens/sign_in.dart index 10baacb..77de712 100644 --- a/lib/screens/sign_in.dart +++ b/lib/screens/sign_in.dart @@ -1,5 +1,5 @@ -import 'package:email_validator/email_validator.dart'; import 'package:flutter/material.dart'; +import 'package:string_validator/string_validator.dart'; import '../controls/padding.dart'; import '../globals.dart'; @@ -16,6 +16,7 @@ class SignInScreen extends StatefulWidget { class _SignInScreenState extends State { final formKey = GlobalKey(); final usernameController = TextEditingController(); + final serverNameController = TextEditingController(); final passwordController = TextEditingController(); var hidePassword = true; @@ -27,8 +28,9 @@ class _SignInScreenState extends State { return; } - usernameController.text = credentials.handle; + usernameController.text = credentials.username; passwordController.text = credentials.password; + serverNameController.text = credentials.serverName; }); } @@ -49,17 +51,51 @@ class _SignInScreenState extends State { children: [ TextFormField( autovalidateMode: AutovalidateMode.onUserInteraction, - controller: usernameController, - keyboardType: TextInputType.emailAddress, - validator: (value) => EmailValidator.validate(value ?? '') - ? null - : 'Not a valid Friendica Account Address', + controller: serverNameController, + validator: (value) => + isFQDN(value ?? '') ? null : 'Not a valid server name', decoration: InputDecoration( prefixIcon: const Icon(Icons.alternate_email), hintText: 'Username (user@example.com)', border: OutlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).backgroundColor, + color: Theme + .of(context) + .backgroundColor, + ), + borderRadius: BorderRadius.circular(5.0), + ), + labelText: 'Username', + ), + ), + const VerticalPadding(), + TextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, + controller: usernameController, + keyboardType: TextInputType.emailAddress, + validator: (value) { + if (value == null) { + return null; + } + + if (value.contains('@')) { + return isEmail(value ?? '') + ? null + : 'Not a valid Friendica Account Address'; + } + + return isAlphanumeric(value.replaceAll('-', '')) + ? null + : 'Username should be alpha-numeric'; + }, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.alternate_email), + hintText: 'Username (user@example.com)', + border: OutlineInputBorder( + borderSide: BorderSide( + color: Theme + .of(context) + .backgroundColor, ), borderRadius: BorderRadius.circular(5.0), ), @@ -85,7 +121,9 @@ class _SignInScreenState extends State { hintText: 'Password', border: OutlineInputBorder( borderSide: BorderSide( - color: Theme.of(context).backgroundColor, + color: Theme + .of(context) + .backgroundColor, ), borderRadius: BorderRadius.circular(5.0), ), @@ -107,13 +145,14 @@ class _SignInScreenState extends State { void _signIn(BuildContext context) async { if (formKey.currentState?.validate() ?? false) { - final result = await Credentials.buildFromHandle( - usernameController.text, - passwordController.text, - ).andThenAsync((creds) async { - return await getIt().signIn(creds); - }); + final creds = Credentials( + username: usernameController.text, + password: passwordController.text, + serverName: serverNameController.text, + userId: '', + avatar: ''); + final result = await getIt().signIn(creds); if (result.isFailure) { buildSnackbar(context, 'Error signing in: ${result.error}'); } diff --git a/pubspec.lock b/pubspec.lock index d290ee8..9d20e16 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -265,14 +265,6 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" - email_validator: - dependency: "direct main" - description: - name: email_validator - sha256: e9a90f27ab2b915a27d7f9c2a7ddda5dd752d6942616ee83529b686fc086221b - url: "https://pub.dev" - source: hosted - version: "2.1.17" fake_async: dependency: transitive description: @@ -1054,7 +1046,7 @@ packages: source: hosted version: "1.2.0" string_validator: - dependency: transitive + dependency: "direct main" description: name: string_validator sha256: "50dd8ecf91db6a732f4a851eeae81ee12406eedc62d0da72f2d91a04a2d10dd8" diff --git a/pubspec.yaml b/pubspec.yaml index a332a32..eb29482 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,6 @@ dependencies: cached_network_image: ^3.2.2 cupertino_icons: ^1.0.2 desktop_window: ^0.4.0 - email_validator: ^2.1.17 file_picker: ^5.2.4 flutter_dotenv: ^5.0.2 flutter_file_dialog: ^2.3.2 @@ -44,6 +43,7 @@ dependencies: path_provider: ^2.0.11 carousel_slider: ^4.2.1 device_info_plus: ^8.0.0 + string_validator: ^0.3.0 dev_dependencies: flutter_test: