From 6e8d419e7f67a0a9b3fd8d60d072844e8520e6a3 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 26 Aug 2019 12:18:26 +0300 Subject: [PATCH] Create account --- lib/data/repositories/auth_repository.dart | 17 ++++++++++++ lib/redux/auth/auth_actions.dart | 14 ++++++++++ lib/redux/auth/auth_middleware.dart | 31 +++++++++++++++++++++- lib/ui/auth/login_vm.dart | 9 ++++++- 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/lib/data/repositories/auth_repository.dart b/lib/data/repositories/auth_repository.dart index 9998b19af..71ec78f5e 100644 --- a/lib/data/repositories/auth_repository.dart +++ b/lib/data/repositories/auth_repository.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; import 'package:invoiceninja_flutter/.env.dart'; +import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/web_client.dart'; @@ -14,6 +15,22 @@ class AuthRepository { final WebClient webClient; + Future signUp( + {String email, + String password, + String platform,}) async { + final credentials = { + 'token_name': 'invoice-ninja-$platform-app', + 'api_secret': Config.API_SECRET, + 'email': email, + 'password': password, + }; + + final url = formatApiUrl(kAppUrl) + '/register'; + + return sendRequest(url: url, data: credentials); + } + Future login( {String email, String password, diff --git a/lib/redux/auth/auth_actions.dart b/lib/redux/auth/auth_actions.dart index d257aeb19..e84d64c69 100644 --- a/lib/redux/auth/auth_actions.dart +++ b/lib/redux/auth/auth_actions.dart @@ -75,4 +75,18 @@ class UserLoginFailure implements StopLoading { class UserLogout implements PersistData, PersistUI {} +class UserSignUpRequest implements StartLoading { + UserSignUpRequest({ + this.completer, + this.email, + this.password, + this.platform, + }); + + final Completer completer; + final String email; + final String password; + final String platform; +} + class ClearAuthError {} diff --git a/lib/redux/auth/auth_middleware.dart b/lib/redux/auth/auth_middleware.dart index de7ef4e26..208c5ec97 100644 --- a/lib/redux/auth/auth_middleware.dart +++ b/lib/redux/auth/auth_middleware.dart @@ -15,18 +15,21 @@ List> createStoreAuthMiddleware([ ]) { final loginInit = _createLoginInit(); final loginRequest = _createLoginRequest(repository); + final signUpRequest = _createSignUpRequest(repository); final oauthRequest = _createOAuthRequest(repository); final refreshRequest = _createRefreshRequest(repository); return [ TypedMiddleware(loginInit), TypedMiddleware(loginRequest), + TypedMiddleware(signUpRequest), TypedMiddleware(oauthRequest), TypedMiddleware(refreshRequest), ]; } -void _saveAuthLocal({String email, String url, String secret}) async { +void _saveAuthLocal( + {String email = '', String url = '', String secret = ''}) async { final SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setString(kSharedPrefEmail, email ?? ''); @@ -109,6 +112,32 @@ Middleware _createLoginRequest(AuthRepository repository) { }; } +Middleware _createSignUpRequest(AuthRepository repository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as UserSignUpRequest; + + repository + .signUp( + email: action.email, + password: action.password, + platform: action.platform, + ) + .then((data) { + _saveAuthLocal( + email: action.email, + ); + + store.dispatch( + LoadAccountSuccess(completer: action.completer, loginResponse: data)); + }).catchError((Object error) { + print(error); + store.dispatch(UserLoginFailure(error)); + }); + + next(action); + }; +} + Middleware _createOAuthRequest(AuthRepository repository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as OAuthLoginRequest; diff --git a/lib/ui/auth/login_vm.dart b/lib/ui/auth/login_vm.dart index edd672aa2..d6e948485 100644 --- a/lib/ui/auth/login_vm.dart +++ b/lib/ui/auth/login_vm.dart @@ -46,6 +46,7 @@ class LoginVM { bool isLoading; AuthState authState; final Function() onCancel2FAPressed; + final Function(BuildContext, {@required String email, @required String password, @@ -53,6 +54,7 @@ class LoginVM { @required String secret, @required String oneTimePassword, @required bool createAccount}) onLoginPressed; + final Function(BuildContext, String, String) onGoogleLoginPressed; static LoginVM fromStore(Store store) { @@ -118,7 +120,12 @@ class LoginVM { final Completer completer = Completer(); if (createAccount) { - // TODO + store.dispatch(UserSignUpRequest( + completer: completer, + email: email.trim(), + password: password.trim(), + platform: getPlatform(context), + )); } else { store.dispatch(UserLoginRequest( completer: completer,