157 lines
3.7 KiB
Dart
157 lines
3.7 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:equatable/equatable.dart';
|
|
import 'package:barber_app/features/auth/data/models/user_model.dart';
|
|
import 'package:barber_app/features/auth/data/repositories/auth_repository.dart';
|
|
|
|
// Events
|
|
abstract class AuthEvent extends Equatable {
|
|
const AuthEvent();
|
|
|
|
@override
|
|
List<Object?> get props => [];
|
|
}
|
|
|
|
class AuthCheckRequested extends AuthEvent {}
|
|
|
|
class AuthLoginRequested extends AuthEvent {
|
|
final String email;
|
|
final String password;
|
|
|
|
const AuthLoginRequested({required this.email, required this.password});
|
|
|
|
@override
|
|
List<Object?> get props => [email, password];
|
|
}
|
|
|
|
class AuthRegisterRequested extends AuthEvent {
|
|
final String email;
|
|
final String password;
|
|
final String barberName;
|
|
final String barberShopName;
|
|
|
|
const AuthRegisterRequested({
|
|
required this.email,
|
|
required this.password,
|
|
required this.barberName,
|
|
required this.barberShopName,
|
|
});
|
|
|
|
@override
|
|
List<Object?> get props => [email, password, barberName, barberShopName];
|
|
}
|
|
|
|
class AuthLogoutRequested extends AuthEvent {}
|
|
|
|
// States
|
|
abstract class AuthState extends Equatable {
|
|
const AuthState();
|
|
|
|
@override
|
|
List<Object?> get props => [];
|
|
}
|
|
|
|
class AuthInitial extends AuthState {}
|
|
|
|
class AuthLoading extends AuthState {}
|
|
|
|
class AuthAuthenticated extends AuthState {
|
|
final UserModel user;
|
|
|
|
const AuthAuthenticated(this.user);
|
|
|
|
@override
|
|
List<Object?> get props => [user];
|
|
}
|
|
|
|
class AuthUnauthenticated extends AuthState {}
|
|
|
|
class AuthError extends AuthState {
|
|
final String message;
|
|
|
|
const AuthError(this.message);
|
|
|
|
@override
|
|
List<Object?> get props => [message];
|
|
}
|
|
|
|
// Bloc
|
|
class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
|
final AuthRepository _authRepository;
|
|
|
|
AuthBloc({required AuthRepository authRepository})
|
|
: _authRepository = authRepository,
|
|
super(AuthInitial()) {
|
|
on<AuthCheckRequested>(_onCheckRequested);
|
|
on<AuthLoginRequested>(_onLoginRequested);
|
|
on<AuthRegisterRequested>(_onRegisterRequested);
|
|
on<AuthLogoutRequested>(_onLogoutRequested);
|
|
}
|
|
|
|
Future<void> _onCheckRequested(
|
|
AuthCheckRequested event,
|
|
Emitter<AuthState> emit,
|
|
) async {
|
|
emit(AuthLoading());
|
|
try {
|
|
final user = _authRepository.getCurrentUser();
|
|
if (user != null) {
|
|
emit(AuthAuthenticated(user));
|
|
} else {
|
|
emit(AuthUnauthenticated());
|
|
}
|
|
} catch (e) {
|
|
emit(AuthUnauthenticated());
|
|
}
|
|
}
|
|
|
|
Future<void> _onLoginRequested(
|
|
AuthLoginRequested event,
|
|
Emitter<AuthState> emit,
|
|
) async {
|
|
emit(AuthLoading());
|
|
try {
|
|
final user = await _authRepository.login(
|
|
email: event.email,
|
|
password: event.password,
|
|
);
|
|
if (user != null) {
|
|
emit(AuthAuthenticated(user));
|
|
} else {
|
|
emit(const AuthError('Erro ao fazer login'));
|
|
}
|
|
} catch (e) {
|
|
emit(AuthError(e.toString().replaceAll('Exception: ', '')));
|
|
}
|
|
}
|
|
|
|
Future<void> _onRegisterRequested(
|
|
AuthRegisterRequested event,
|
|
Emitter<AuthState> emit,
|
|
) async {
|
|
emit(AuthLoading());
|
|
try {
|
|
final user = await _authRepository.register(
|
|
email: event.email,
|
|
password: event.password,
|
|
barberName: event.barberName,
|
|
barberShopName: event.barberShopName,
|
|
);
|
|
if (user != null) {
|
|
emit(AuthAuthenticated(user));
|
|
} else {
|
|
emit(const AuthError('Erro ao criar conta'));
|
|
}
|
|
} catch (e) {
|
|
emit(AuthError(e.toString().replaceAll('Exception: ', '')));
|
|
}
|
|
}
|
|
|
|
Future<void> _onLogoutRequested(
|
|
AuthLogoutRequested event,
|
|
Emitter<AuthState> emit,
|
|
) async {
|
|
await _authRepository.logout();
|
|
emit(AuthUnauthenticated());
|
|
}
|
|
}
|