diff --git a/lib/backend/login_repository.dart b/lib/backend/login_repository.dart index c276d91..8e7d5f5 100644 --- a/lib/backend/login_repository.dart +++ b/lib/backend/login_repository.dart @@ -8,8 +8,18 @@ abstract class LoginRepository { String loginError = ''; String getLoginError() => loginError; Future login(String username, String password); - Future signInWithSocial(SocialLoginBundle bundle); Future sendLoginEmail(String input); + + Future forgotPassword(String email); + Future isRegistrationRequired(LoginUser user); + Future reLogin({required VoidCallback onLoggedIn}); +} + +abstract class LoginRespositoryWithAnonymous extends LoginRepository { + Future signInAnonymous(); +} + +abstract class LoginRespositoryWithPhoneNumber extends LoginRepository { Future trySignInWithPhoneNumber({ required String phoneNumber, void Function( @@ -27,8 +37,8 @@ abstract class LoginRepository { String phoneNumber, { LoginConfirmationResult? resultWeb, }); - Future forgotPassword(String email); - Future isRegistrationRequired(LoginUser user); - Future reLogin({required VoidCallback onLoggedIn}); - Future signInAnonymous(); +} + +abstract class LoginRepositoryWithSocial extends LoginRepository { + Future signInWithSocial(SocialLoginBundle bundle); } diff --git a/lib/plugins/login/login_await_email.dart b/lib/plugins/login/login_await_email.dart index 131b9b8..c771f77 100644 --- a/lib/plugins/login/login_await_email.dart +++ b/lib/plugins/login/login_await_email.dart @@ -1,8 +1,6 @@ -import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_login/flutter_login_view.dart'; import '../../extensions/widget.dart'; - import 'resend.dart'; class LoginAwaitEmailScreen extends StatefulWidget { diff --git a/lib/plugins/login/login_phone_number.dart b/lib/plugins/login/login_phone_number.dart index 1206fc8..3fd2e09 100644 --- a/lib/plugins/login/login_phone_number.dart +++ b/lib/plugins/login/login_phone_number.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_login/backend/login_repository.dart'; import 'package:flutter_login/flutter_login_view.dart'; import 'package:intl_phone_number_input/intl_phone_number_input.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -30,6 +31,10 @@ class LoginPhoneNumberState extends State @override Widget build(BuildContext context) { + var config = FlutterLogin.of(context).config; + var repository = + context.loginRepository() as LoginRespositoryWithPhoneNumber; + return Material( child: Scaffold( backgroundColor: Theme.of(context).backgroundColor, @@ -99,68 +104,61 @@ class LoginPhoneNumberState extends State ], Padding( padding: const EdgeInsets.only(top: 10), - child: context - .login() - .config - .appTheme - .buttons - .primaryButton( - context: context, - isLoading: _loading, - isDisabled: _loading, - child: Text( - context.translate( - 'login_phone_number.button.submit', - ), - style: Theme.of(context).textTheme.button, - textAlign: TextAlign.center, - ), - onPressed: () { - if (phoneNumber != null) { - setState(() { - errorMsg = null; - _loading = true; - }); - context - .loginRepository() - .trySignInWithPhoneNumber( - phoneNumber: phoneNumber!, - onCodeSent: ( - verificationId, - resendToken, - resultWeb, - ) => - navigateFadeTo( - context, - (ctx) => LoginPhoneNumberVerify( - resultWeb: resultWeb, - verificationId: verificationId, - phoneNumber: phoneNumber!, - onLogin: _onLoggedIn, - ), - ), - onAutoLogin: (_) => _onLoggedIn, - onVerificationFailed: (String errorCode) { - if (errorCode == 'invalid-phone-number') { - setState(() { - errorMsg = context.translate( - 'login_phone_number.text.error.invalid_phone_number', - ); - _loading = false; - }); - } else { - setState(() { - errorMsg = context.translate( - 'login_phone_number.text.error.verification_failed', - ); - _loading = false; - }); - } - }, - ); - } - }, + child: config.appTheme.buttons.primaryButton( + context: context, + isLoading: _loading, + isDisabled: _loading, + child: Text( + context.translate( + 'login_phone_number.button.submit', ), + style: Theme.of(context).textTheme.button, + textAlign: TextAlign.center, + ), + onPressed: () { + if (phoneNumber != null) { + setState(() { + errorMsg = null; + _loading = true; + }); + repository.trySignInWithPhoneNumber( + phoneNumber: phoneNumber!, + onCodeSent: ( + verificationId, + resendToken, + resultWeb, + ) => + navigateFadeTo( + context, + (ctx) => LoginPhoneNumberVerify( + resultWeb: resultWeb, + verificationId: verificationId, + phoneNumber: phoneNumber!, + onLogin: _onLoggedIn, + ), + ), + onAutoLogin: (_) => _onLoggedIn, + onVerificationFailed: (String errorCode) { + if (errorCode == 'invalid-phone-number') { + setState(() { + errorMsg = context.translate( + 'login_phone_number.text.error.invalid_phone_number', + ); + _loading = false; + }); + } else { + setState(() { + errorMsg = context.translate( + 'login_phone_number.text.error.verification_failed', + ); + _loading = false; + }); + } + }, + ); + } + }, + ), ) ], ), diff --git a/lib/plugins/login/login_phone_number_verify.dart b/lib/plugins/login/login_phone_number_verify.dart index ede43e1..3522a8e 100644 --- a/lib/plugins/login/login_phone_number_verify.dart +++ b/lib/plugins/login/login_phone_number_verify.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_login/flutter_login_view.dart'; import 'package:pinput/pinput.dart'; +import '../../backend/login_repository.dart'; import '../../extensions/widget.dart'; class LoginPhoneNumberVerify extends StatefulWidget { @@ -35,6 +36,10 @@ class LoginPhoneNumberVerifyState extends State @override Widget build(BuildContext context) { + var config = FlutterLogin.of(context).config; + var repository = + context.loginRepository() as LoginRespositoryWithPhoneNumber; + return Material( child: Scaffold( backgroundColor: Theme.of(context).backgroundColor, @@ -48,9 +53,9 @@ class LoginPhoneNumberVerifyState extends State top: 10, left: 5, ), - child: context.login().config.appTheme.buttons.backButton( - context: context, - ), + child: config.appTheme.buttons.backButton( + context: context, + ), ), Padding( padding: const EdgeInsets.only(top: 40), @@ -81,13 +86,12 @@ class LoginPhoneNumberVerifyState extends State errorMsg = false; }), onCompleted: (String code) async { - var user = - await context.loginRepository().signInWithSMSCode( - widget.verificationId, - code, - widget.phoneNumber, - resultWeb: widget.resultWeb, - ); + var user = await repository.signInWithSMSCode( + widget.verificationId, + code, + widget.phoneNumber, + resultWeb: widget.resultWeb, + ); if (user != null) { widget.onLogin.call(user); } else { @@ -129,43 +133,39 @@ class LoginPhoneNumberVerifyState extends State style: Theme.of(context).textTheme.bodyText1, ), ), - context.login().config.appTheme.buttons.tertiaryButton( - context: context, - child: Text( - context.translate( - 'login_phone_number_verify.button.send_again', - ), - style: Theme.of(context).textTheme.bodyText1, - ), - onPressed: () { - context - .loginRepository() - .trySignInWithPhoneNumber( - phoneNumber: widget.phoneNumber, - onCodeSent: ( - verificationId, - resendToken, - resultWeb, - ) { - this.verificationId = verificationId; - this.resultWeb = resultWeb; - pinPutController.clear(); - ScaffoldMessenger.of(context) - .showSnackBar( - SnackBar( - content: Text( - context.translate( - 'login_phone_verify.text.send_again', - ), - ), - ), - ); - }, - onAutoLogin: (user) => - widget.onLogin.call(user), - ); - }, + config.appTheme.buttons.tertiaryButton( + context: context, + child: Text( + context.translate( + 'login_phone_number_verify.button.send_again', ), + style: Theme.of(context).textTheme.bodyText1, + ), + onPressed: () { + repository.trySignInWithPhoneNumber( + phoneNumber: widget.phoneNumber, + onCodeSent: ( + verificationId, + resendToken, + resultWeb, + ) { + this.verificationId = verificationId; + this.resultWeb = resultWeb; + pinPutController.clear(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + context.translate( + 'login_phone_verify.text.send_again', + ), + ), + ), + ); + }, + onAutoLogin: (user) => widget.onLogin.call(user), + ); + }, + ), ], ), ], diff --git a/lib/plugins/login/login_social_buttons.dart b/lib/plugins/login/login_social_buttons.dart index 07b3b21..2168e22 100644 --- a/lib/plugins/login/login_social_buttons.dart +++ b/lib/plugins/login/login_social_buttons.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_login/backend/login_repository.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../flutter_login_view.dart'; @@ -15,7 +16,7 @@ class LoginSocialButtons extends StatelessWidget { @override Widget build(BuildContext context) { var config = FlutterLogin.of(context).config; - var repository = context.loginRepository(); + var repository = context.loginRepository() as LoginRepositoryWithSocial; return Column( crossAxisAlignment: CrossAxisAlignment.center,