adding packages
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
import './bloc.dart';
|
||||
import '../../../fb_auth.dart';
|
||||
import '../../classes/auth_user.dart';
|
||||
|
||||
class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
||||
AuthBloc({
|
||||
@required this.app,
|
||||
this.saveUser,
|
||||
this.deleteUser,
|
||||
}) : _auth = FBAuth(app);
|
||||
|
||||
final FbApp app;
|
||||
|
||||
final FBAuth _auth;
|
||||
|
||||
@override
|
||||
AuthState get initialState => InitialAuthState();
|
||||
|
||||
@override
|
||||
Stream<AuthState> mapEventToState(
|
||||
AuthEvent event,
|
||||
) async* {
|
||||
if (event is CheckUser) {
|
||||
yield* _mapCheckToState(event);
|
||||
}
|
||||
if (event is LoginEvent) {
|
||||
yield* _mapLoginToState(event);
|
||||
}
|
||||
if (event is LogoutEvent) {
|
||||
yield* _mapLogoutToState(event);
|
||||
}
|
||||
if (event is CreateAccount) {
|
||||
yield* _mapCreateToState(event);
|
||||
}
|
||||
if (event is UpdateUser) {
|
||||
yield* _mapUpdateToState(event);
|
||||
}
|
||||
if (event is EditInfo) {
|
||||
yield* _mapEditInfoToState(event);
|
||||
}
|
||||
if (event is ForgotPassword) {
|
||||
yield* _mapForgotPasswordToState(event);
|
||||
}
|
||||
if (event is SendEmailVerification) {
|
||||
yield* _mapVerifyToState(event);
|
||||
}
|
||||
if (event is LoginGuest) {
|
||||
yield* _mapGuestToState(event);
|
||||
}
|
||||
if (event is LoginGoogle) {
|
||||
yield* _mapGoogleToState(event);
|
||||
}
|
||||
if (event is ChangeUser) {
|
||||
yield LoggedInState(event.user);
|
||||
}
|
||||
}
|
||||
|
||||
/// Called every time the user info changes. You can use this method for updating a database.
|
||||
final Function(AuthUser) saveUser;
|
||||
|
||||
/// Called when the user logs out. You can use this method for updating a database.
|
||||
final Function() deleteUser;
|
||||
|
||||
Stream<AuthState> _mapGoogleToState(LoginGoogle event) async* {
|
||||
yield AuthLoadingState();
|
||||
final _user = await _auth.loginGoogle(
|
||||
idToken: event.idToken, accessToken: event.accessToken);
|
||||
if (_user != null) {
|
||||
if (saveUser != null) saveUser(_user);
|
||||
yield LoggedInState(_user);
|
||||
} else {
|
||||
yield LoggedOutState();
|
||||
}
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapGuestToState(LoginGuest event) async* {
|
||||
yield AuthLoadingState();
|
||||
final _user = await _auth.startAsGuest();
|
||||
if (_user != null) {
|
||||
if (saveUser != null) saveUser(_user);
|
||||
yield LoggedInState(_user);
|
||||
} else {
|
||||
yield LoggedOutState();
|
||||
}
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapCheckToState(CheckUser event) async* {
|
||||
yield AuthLoadingState();
|
||||
final _user = await _auth.currentUser();
|
||||
if (_user != null) {
|
||||
if (saveUser != null) saveUser(_user);
|
||||
yield LoggedInState(_user);
|
||||
} else {
|
||||
yield LoggedOutState();
|
||||
}
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapCreateToState(CreateAccount event) async* {
|
||||
yield AuthLoadingState();
|
||||
try {
|
||||
AuthUser _user = await _auth.createAccount(event.username, event.password,
|
||||
displayName: event?.displayName, photoUrl: event?.photoUrl);
|
||||
if (_user != null) {
|
||||
if (saveUser != null) saveUser(_user);
|
||||
yield LoggedInState(_user);
|
||||
} else {
|
||||
yield AuthErrorState('Error creating user!');
|
||||
}
|
||||
} catch (e) {
|
||||
yield AuthErrorState('Email already exists!');
|
||||
}
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapLoginToState(LoginEvent event) async* {
|
||||
yield AuthLoadingState();
|
||||
final _user = await _auth.login(event.username, event.password);
|
||||
if (_user != null) {
|
||||
if (saveUser != null) saveUser(_user);
|
||||
yield LoggedInState(_user);
|
||||
} else {
|
||||
yield AuthErrorState('Username or Password Incorrect!');
|
||||
}
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapLogoutToState(LogoutEvent event) async* {
|
||||
yield AuthLoadingState();
|
||||
await _auth.logout();
|
||||
if (deleteUser != null) deleteUser();
|
||||
yield LoggedOutState();
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapVerifyToState(SendEmailVerification event) async* {
|
||||
await _auth.sendEmailVerification();
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapEditInfoToState(EditInfo event) async* {
|
||||
yield AuthLoadingState();
|
||||
await _auth.editInfo(
|
||||
displayName: event?.displayName, photoUrl: event?.photoUrl);
|
||||
final _user = await _auth.currentUser();
|
||||
if (saveUser != null) saveUser(_user);
|
||||
yield LoggedInState(_user);
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapUpdateToState(UpdateUser event) async* {
|
||||
if (event?.user != null) {
|
||||
if (saveUser != null) saveUser(event.user);
|
||||
yield LoggedInState(event.user);
|
||||
} else {
|
||||
yield LoggedOutState();
|
||||
}
|
||||
}
|
||||
|
||||
Stream<AuthState> _mapForgotPasswordToState(ForgotPassword event) async* {
|
||||
await _auth.forgotPassword(event.email);
|
||||
}
|
||||
|
||||
static AuthUser currentUser(BuildContext context) {
|
||||
final auth = BlocProvider.of<AuthBloc>(context);
|
||||
final state = auth.state;
|
||||
if (state is LoggedInState) {
|
||||
return state.user;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
import '../../classes/index.dart';
|
||||
|
||||
@immutable
|
||||
abstract class AuthEvent {}
|
||||
|
||||
class CheckUser extends AuthEvent {}
|
||||
|
||||
class LoginEvent extends AuthEvent {
|
||||
LoginEvent(this.username, this.password);
|
||||
|
||||
final String username, password;
|
||||
}
|
||||
|
||||
class LoginGuest extends AuthEvent {}
|
||||
|
||||
class CreateAccount extends AuthEvent {
|
||||
CreateAccount(this.username, this.password,
|
||||
{this.displayName, this.photoUrl});
|
||||
|
||||
final String username, password;
|
||||
final String displayName, photoUrl;
|
||||
}
|
||||
|
||||
class ChangeUser extends AuthEvent {
|
||||
ChangeUser(this.user);
|
||||
|
||||
final AuthUser user;
|
||||
}
|
||||
|
||||
class LogoutEvent extends AuthEvent {
|
||||
LogoutEvent(this.user);
|
||||
|
||||
final AuthUser user;
|
||||
}
|
||||
|
||||
class UpdateUser extends AuthEvent {
|
||||
UpdateUser(this.user);
|
||||
|
||||
final AuthUser user;
|
||||
}
|
||||
|
||||
class ForgotPassword extends AuthEvent {
|
||||
ForgotPassword(this.email);
|
||||
|
||||
final String email;
|
||||
}
|
||||
|
||||
class LoginGoogle extends AuthEvent {
|
||||
LoginGoogle({
|
||||
this.accessToken,
|
||||
this.idToken,
|
||||
});
|
||||
|
||||
final String idToken;
|
||||
final String accessToken;
|
||||
}
|
||||
|
||||
class SendEmailVerification extends AuthEvent {}
|
||||
|
||||
class EditInfo extends AuthEvent {
|
||||
EditInfo(this.user, {this.displayName, this.photoUrl});
|
||||
|
||||
final String displayName, photoUrl;
|
||||
final AuthUser user;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import 'package:meta/meta.dart';
|
||||
|
||||
import '../../classes/index.dart';
|
||||
|
||||
@immutable
|
||||
abstract class AuthState {}
|
||||
|
||||
class InitialAuthState extends AuthState {}
|
||||
|
||||
class LoggedInState extends AuthState {
|
||||
LoggedInState(this.user);
|
||||
|
||||
final AuthUser user;
|
||||
}
|
||||
|
||||
class LoggedOutState extends AuthState {}
|
||||
|
||||
class AuthLoadingState extends AuthState {}
|
||||
|
||||
class AuthErrorState extends AuthState {
|
||||
AuthErrorState(this.message);
|
||||
|
||||
final String message;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export 'auth_bloc.dart';
|
||||
export 'auth_event.dart';
|
||||
export 'auth_state.dart';
|
||||
@@ -0,0 +1 @@
|
||||
export 'auth/bloc.dart';
|
||||
@@ -0,0 +1,21 @@
|
||||
import 'package:bloc/bloc.dart';
|
||||
|
||||
class SimpleBlocDelegate extends BlocDelegate {
|
||||
@override
|
||||
void onEvent(Bloc bloc, Object event) {
|
||||
super.onEvent(bloc, event);
|
||||
print(event);
|
||||
}
|
||||
|
||||
@override
|
||||
void onTransition(Bloc bloc, Transition transition) {
|
||||
super.onTransition(bloc, transition);
|
||||
print(transition);
|
||||
}
|
||||
|
||||
@override
|
||||
void onError(Bloc bloc, Object error, StackTrace stacktrace) {
|
||||
super.onError(bloc, error, stacktrace);
|
||||
print('$error, $stacktrace');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user