Skip to content

Instantly share code, notes, and snippets.

@felangel
Created April 27, 2019 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felangel/0084e8032c73edb8863f7b5d0aed10e0 to your computer and use it in GitHub Desktop.
Save felangel/0084e8032c73edb8863f7b5d0aed10e0 to your computer and use it in GitHub Desktop.
[flutter_firebase_login] Login Bloc
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';
import 'package:rxdart/rxdart.dart';
import 'package:flutter_firebase_login/login/login.dart';
import 'package:flutter_firebase_login/user_repository.dart';
import 'package:flutter_firebase_login/validators.dart';
class LoginBloc extends Bloc<LoginEvent, LoginState> {
UserRepository _userRepository;
LoginBloc({
@required UserRepository userRepository,
}) : assert(userRepository != null),
_userRepository = userRepository;
@override
LoginState get initialState => LoginState.empty();
@override
Stream<LoginState> transform(
Stream<LoginEvent> events,
Stream<LoginState> Function(LoginEvent event) next,
) {
final observableStream = events as Observable<LoginEvent>;
final nonDebounceStream = observableStream.where((event) {
return (event is! EmailChanged && event is! PasswordChanged);
});
final debounceStream = observableStream.where((event) {
return (event is EmailChanged || event is PasswordChanged);
}).debounce(Duration(milliseconds: 300));
return super.transform(nonDebounceStream.mergeWith([debounceStream]), next);
}
@override
Stream<LoginState> mapEventToState(LoginEvent event) async* {
if (event is EmailChanged) {
yield* _mapEmailChangedToState(event.email);
} else if (event is PasswordChanged) {
yield* _mapPasswordChangedToState(event.password);
} else if (event is LoginWithGooglePressed) {
yield* _mapLoginWithGooglePressedToState();
} else if (event is LoginWithCredentialsPressed) {
yield* _mapLoginWithCredentialsPressedToState(
email: event.email,
password: event.password,
);
}
}
Stream<LoginState> _mapEmailChangedToState(String email) async* {
yield currentState.update(
isEmailValid: Validators.isValidEmail(email),
);
}
Stream<LoginState> _mapPasswordChangedToState(String password) async* {
yield currentState.update(
isPasswordValid: Validators.isValidPassword(password),
);
}
Stream<LoginState> _mapLoginWithGooglePressedToState() async* {
try {
await _userRepository.signInWithGoogle();
yield LoginState.success();
} catch (_) {
yield LoginState.failure();
}
}
Stream<LoginState> _mapLoginWithCredentialsPressedToState({
String email,
String password,
}) async* {
yield LoginState.loading();
try {
await _userRepository.signInWithCredentials(email, password);
yield LoginState.success();
} catch (_) {
yield LoginState.failure();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment