Skip to content

Instantly share code, notes, and snippets.

@felangel
Created April 27, 2019 18:22
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/4cb5a94b40e1a7df436bd47602ff7ef5 to your computer and use it in GitHub Desktop.
Save felangel/4cb5a94b40e1a7df436bd47602ff7ef5 to your computer and use it in GitHub Desktop.
[flutter_firebase_login] Register Bloc
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';
import 'package:rxdart/rxdart.dart';
import 'package:flutter_firebase_login/user_repository.dart';
import 'package:flutter_firebase_login/register/register.dart';
import 'package:flutter_firebase_login/validators.dart';
class RegisterBloc extends Bloc<RegisterEvent, RegisterState> {
final UserRepository _userRepository;
RegisterBloc({@required UserRepository userRepository})
: assert(userRepository != null),
_userRepository = userRepository;
@override
RegisterState get initialState => RegisterState.empty();
@override
Stream<RegisterState> transform(
Stream<RegisterEvent> events,
Stream<RegisterState> Function(RegisterEvent event) next,
) {
final observableStream = events as Observable<RegisterEvent>;
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<RegisterState> mapEventToState(
RegisterEvent event,
) async* {
if (event is EmailChanged) {
yield* _mapEmailChangedToState(event.email);
} else if (event is PasswordChanged) {
yield* _mapPasswordChangedToState(event.password);
} else if (event is Submitted) {
yield* _mapFormSubmittedToState(event.email, event.password);
}
}
Stream<RegisterState> _mapEmailChangedToState(String email) async* {
yield currentState.update(
isEmailValid: Validators.isValidEmail(email),
);
}
Stream<RegisterState> _mapPasswordChangedToState(String password) async* {
yield currentState.update(
isPasswordValid: Validators.isValidPassword(password),
);
}
Stream<RegisterState> _mapFormSubmittedToState(
String email,
String password,
) async* {
yield RegisterState.loading();
try {
await _userRepository.signUp(
email: email,
password: password,
);
yield RegisterState.success();
} catch (_) {
yield RegisterState.failure();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment