This commit is contained in:
Stein Milder 2022-09-21 16:11:23 +02:00
parent dab2b7fb6e
commit f0be8a8c79
5 changed files with 122 additions and 115 deletions

View file

@ -8,8 +8,18 @@ abstract class LoginRepository {
String loginError = ''; String loginError = '';
String getLoginError() => loginError; String getLoginError() => loginError;
Future<bool> login(String username, String password); Future<bool> login(String username, String password);
Future<LoginUser?> signInWithSocial(SocialLoginBundle bundle);
Future sendLoginEmail(String input); Future sendLoginEmail(String input);
Future<bool> forgotPassword(String email);
Future<bool> isRegistrationRequired(LoginUser user);
Future<void> reLogin({required VoidCallback onLoggedIn});
}
abstract class LoginRespositoryWithAnonymous extends LoginRepository {
Future<LoginUser?> signInAnonymous();
}
abstract class LoginRespositoryWithPhoneNumber extends LoginRepository {
Future<void> trySignInWithPhoneNumber({ Future<void> trySignInWithPhoneNumber({
required String phoneNumber, required String phoneNumber,
void Function( void Function(
@ -27,8 +37,8 @@ abstract class LoginRepository {
String phoneNumber, { String phoneNumber, {
LoginConfirmationResult? resultWeb, LoginConfirmationResult? resultWeb,
}); });
Future<bool> forgotPassword(String email); }
Future<bool> isRegistrationRequired(LoginUser user);
Future<void> reLogin({required VoidCallback onLoggedIn}); abstract class LoginRepositoryWithSocial extends LoginRepository {
Future<LoginUser?> signInAnonymous(); Future<LoginUser?> signInWithSocial(SocialLoginBundle bundle);
} }

View file

@ -1,8 +1,6 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_login/flutter_login_view.dart'; import 'package:flutter_login/flutter_login_view.dart';
import '../../extensions/widget.dart'; import '../../extensions/widget.dart';
import 'resend.dart'; import 'resend.dart';
class LoginAwaitEmailScreen extends StatefulWidget { class LoginAwaitEmailScreen extends StatefulWidget {

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_login/backend/login_repository.dart';
import 'package:flutter_login/flutter_login_view.dart'; import 'package:flutter_login/flutter_login_view.dart';
import 'package:intl_phone_number_input/intl_phone_number_input.dart'; import 'package:intl_phone_number_input/intl_phone_number_input.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -30,6 +31,10 @@ class LoginPhoneNumberState extends State<LoginPhoneNumber>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var config = FlutterLogin.of(context).config;
var repository =
context.loginRepository() as LoginRespositoryWithPhoneNumber;
return Material( return Material(
child: Scaffold( child: Scaffold(
backgroundColor: Theme.of(context).backgroundColor, backgroundColor: Theme.of(context).backgroundColor,
@ -99,68 +104,61 @@ class LoginPhoneNumberState extends State<LoginPhoneNumber>
], ],
Padding( Padding(
padding: const EdgeInsets.only(top: 10), padding: const EdgeInsets.only(top: 10),
child: context child: config.appTheme.buttons.primaryButton(
.login() context: context,
.config isLoading: _loading,
.appTheme isDisabled: _loading,
.buttons child: Text(
.primaryButton( context.translate(
context: context, 'login_phone_number.button.submit',
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;
});
}
},
);
}
},
), ),
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;
});
}
},
);
}
},
),
) )
], ],
), ),

View file

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_login/flutter_login_view.dart'; import 'package:flutter_login/flutter_login_view.dart';
import 'package:pinput/pinput.dart'; import 'package:pinput/pinput.dart';
import '../../backend/login_repository.dart';
import '../../extensions/widget.dart'; import '../../extensions/widget.dart';
class LoginPhoneNumberVerify extends StatefulWidget { class LoginPhoneNumberVerify extends StatefulWidget {
@ -35,6 +36,10 @@ class LoginPhoneNumberVerifyState extends State<LoginPhoneNumberVerify>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var config = FlutterLogin.of(context).config;
var repository =
context.loginRepository() as LoginRespositoryWithPhoneNumber;
return Material( return Material(
child: Scaffold( child: Scaffold(
backgroundColor: Theme.of(context).backgroundColor, backgroundColor: Theme.of(context).backgroundColor,
@ -48,9 +53,9 @@ class LoginPhoneNumberVerifyState extends State<LoginPhoneNumberVerify>
top: 10, top: 10,
left: 5, left: 5,
), ),
child: context.login().config.appTheme.buttons.backButton( child: config.appTheme.buttons.backButton(
context: context, context: context,
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.only(top: 40), padding: const EdgeInsets.only(top: 40),
@ -81,13 +86,12 @@ class LoginPhoneNumberVerifyState extends State<LoginPhoneNumberVerify>
errorMsg = false; errorMsg = false;
}), }),
onCompleted: (String code) async { onCompleted: (String code) async {
var user = var user = await repository.signInWithSMSCode(
await context.loginRepository().signInWithSMSCode( widget.verificationId,
widget.verificationId, code,
code, widget.phoneNumber,
widget.phoneNumber, resultWeb: widget.resultWeb,
resultWeb: widget.resultWeb, );
);
if (user != null) { if (user != null) {
widget.onLogin.call(user); widget.onLogin.call(user);
} else { } else {
@ -129,43 +133,39 @@ class LoginPhoneNumberVerifyState extends State<LoginPhoneNumberVerify>
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
), ),
), ),
context.login().config.appTheme.buttons.tertiaryButton( config.appTheme.buttons.tertiaryButton(
context: context, context: context,
child: Text( child: Text(
context.translate( context.translate(
'login_phone_number_verify.button.send_again', '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),
);
},
), ),
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),
);
},
),
], ],
), ),
], ],

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_login/backend/login_repository.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import '../../flutter_login_view.dart'; import '../../flutter_login_view.dart';
@ -15,7 +16,7 @@ class LoginSocialButtons extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var config = FlutterLogin.of(context).config; var config = FlutterLogin.of(context).config;
var repository = context.loginRepository(); var repository = context.loginRepository() as LoginRepositoryWithSocial;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,