From f0a3194cab86d1f18b0277e5f4de92689f6c35ea Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 17 Feb 2021 21:03:04 +0200 Subject: [PATCH] FOSS changes --- lib/ui/app/menu_drawer_vm.dart | 3 +- lib/ui/app/upgrade_dialog.dart.foss | 13 ++ lib/ui/auth/login_vm.dart.foss | 185 ++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 lib/ui/app/upgrade_dialog.dart.foss create mode 100644 lib/ui/auth/login_vm.dart.foss diff --git a/lib/ui/app/menu_drawer_vm.dart b/lib/ui/app/menu_drawer_vm.dart index 93bb94b21..7f7817af4 100644 --- a/lib/ui/app/menu_drawer_vm.dart +++ b/lib/ui/app/menu_drawer_vm.dart @@ -2,7 +2,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; -import 'package:google_sign_in/google_sign_in.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/auth/auth_actions.dart'; @@ -56,7 +55,7 @@ class MenuDrawerVM { final bool isLoading; static MenuDrawerVM fromStore(Store store) { - final GoogleSignIn _googleSignIn = GoogleSignIn(); + //final GoogleSignIn _googleSignIn = GoogleSignIn(); final AppState state = store.state; diff --git a/lib/ui/app/upgrade_dialog.dart.foss b/lib/ui/app/upgrade_dialog.dart.foss new file mode 100644 index 000000000..cd2e12414 --- /dev/null +++ b/lib/ui/app/upgrade_dialog.dart.foss @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class UpgradeDialog extends StatefulWidget { + @override + _UpgradeDialogState createState() => _UpgradeDialogState(); +} + +class _UpgradeDialogState extends State { + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/ui/auth/login_vm.dart.foss b/lib/ui/auth/login_vm.dart.foss new file mode 100644 index 000000000..62704cdda --- /dev/null +++ b/lib/ui/auth/login_vm.dart.foss @@ -0,0 +1,185 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; +import 'package:invoiceninja_flutter/redux/dashboard/dashboard_actions.dart'; +import 'package:invoiceninja_flutter/redux/ui/pref_state.dart'; +import 'package:invoiceninja_flutter/ui/app/app_builder.dart'; +import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/platforms.dart'; +import 'package:redux/redux.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/auth/auth_actions.dart'; +import 'package:invoiceninja_flutter/ui/auth/login_view.dart'; +import 'package:invoiceninja_flutter/redux/auth/auth_state.dart'; + +class LoginScreen extends StatelessWidget { + const LoginScreen({Key key}) : super(key: key); + + static const String route = '/login'; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: StoreConnector( + converter: LoginVM.fromStore, + builder: (context, viewModel) { + return LoginView( + viewModel: viewModel, + ); + }, + ), + ); + } +} + +class LoginVM { + LoginVM({ + @required this.state, + @required this.isLoading, + @required this.authState, + @required this.onLoginPressed, + @required this.onRecoverPressed, + @required this.onSignUpPressed, + @required this.onGoogleLoginPressed, + @required this.onGoogleSignUpPressed, + }); + + AppState state; + bool isLoading; + AuthState authState; + + final Function( + BuildContext, + Completer completer, { + @required String email, + @required String password, + @required String url, + @required String secret, + @required String oneTimePassword, + }) onLoginPressed; + + final Function( + BuildContext, + Completer completer, { + @required String email, + @required String url, + @required String secret, + }) onRecoverPressed; + + final Function( + BuildContext, + Completer completer, { + @required String email, + @required String password, + }) onSignUpPressed; + + final Function(BuildContext, Completer completer, + {String url, String secret, String oneTimePassword}) onGoogleLoginPressed; + final Function(BuildContext, Completer completer) onGoogleSignUpPressed; + + static LoginVM fromStore(Store store) { + void _handleLogin({BuildContext context, bool isSignUp = false}) { + final layout = calculateLayout(context); + + store.dispatch(UpdateUserPreferences(appLayout: layout)); + AppBuilder.of(context).rebuild(); + + WidgetsBinding.instance.addPostFrameCallback((duration) { + if (layout == AppLayout.mobile) { + if (isSignUp) { + store.dispatch( + UpdateUserPreferences(moduleLayout: ModuleLayout.list)); + } + store.dispatch(ViewDashboard(navigator: Navigator.of(context))); + } else { + store.dispatch(ViewMainScreen(navigator: Navigator.of(context))); + } + }); + } + + return LoginVM( + state: store.state, + isLoading: store.state.isLoading, + authState: store.state.authState, + onGoogleLoginPressed: ( + BuildContext context, + Completer completer, { + @required String url, + @required String secret, + @required String oneTimePassword, + }) async {}, + onGoogleSignUpPressed: + (BuildContext context, Completer completer) async {}, + onSignUpPressed: ( + BuildContext context, + Completer completer, { + @required String email, + @required String password, + }) async { + if (store.state.isLoading) { + return; + } + + store.dispatch(UserSignUpRequest( + completer: completer, + email: email.trim(), + password: password.trim(), + )); + completer.future + .then((_) => _handleLogin(context: context, isSignUp: true)); + }, + onRecoverPressed: ( + BuildContext context, + Completer completer, { + @required String email, + @required String url, + @required String secret, + }) async { + if (store.state.isLoading) { + return; + } + + if (url.isNotEmpty && !url.startsWith('http')) { + url = 'https://' + url; + } + + store.dispatch(RecoverPasswordRequest( + completer: completer, + email: email.trim(), + url: formatApiUrl(url.trim()), + secret: secret.trim(), + )); + }, + onLoginPressed: ( + BuildContext context, + Completer completer, { + @required String email, + @required String password, + @required String url, + @required String secret, + @required String oneTimePassword, + }) async { + if (store.state.isLoading) { + return; + } + + if (url.isNotEmpty && !url.startsWith('http')) { + url = 'https://' + url; + } + + store.dispatch(UserLoginRequest( + completer: completer, + email: email.trim(), + password: password.trim(), + url: formatApiUrl(url.trim()), + secret: secret.trim(), + platform: getPlatform(context), + oneTimePassword: oneTimePassword.trim(), + )); + completer.future.then((_) => _handleLogin(context: context)); + }); + } +}