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 getLoginError() => loginError;
Future<bool> login(String username, String password);
Future<LoginUser?> signInWithSocial(SocialLoginBundle bundle);
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({
required String phoneNumber,
void Function(
@ -27,8 +37,8 @@ abstract class LoginRepository {
String phoneNumber, {
LoginConfirmationResult? resultWeb,
});
Future<bool> forgotPassword(String email);
Future<bool> isRegistrationRequired(LoginUser user);
Future<void> reLogin({required VoidCallback onLoggedIn});
Future<LoginUser?> signInAnonymous();
}
abstract class LoginRepositoryWithSocial extends LoginRepository {
Future<LoginUser?> signInWithSocial(SocialLoginBundle bundle);
}

View file

@ -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 {

View file

@ -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<LoginPhoneNumber>
@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<LoginPhoneNumber>
],
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;
});
}
},
);
}
},
),
)
],
),

View file

@ -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<LoginPhoneNumberVerify>
@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<LoginPhoneNumberVerify>
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<LoginPhoneNumberVerify>
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<LoginPhoneNumberVerify>
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),
);
},
),
],
),
],

View file

@ -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,