2025-02-26 13:40:43 +03:00
|
|
|
|
import 'package:equatable/equatable.dart';
|
|
|
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
|
|
import 'package:friflex_starter/features/profile/domain/repository/i_profile_repository.dart';
|
|
|
|
|
|
|
|
|
|
|
|
part 'profile_event.dart';
|
|
|
|
|
|
part 'profile_state.dart';
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template profile_bloc}
|
|
|
|
|
|
/// Bloc для управления состоянием профиля пользователя.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Обрабатывает события загрузки данных профиля и управляет
|
|
|
|
|
|
/// соответствующими состояниями (загрузка, успех, ошибка).
|
|
|
|
|
|
/// {@endtemplate}
|
2025-02-26 13:40:43 +03:00
|
|
|
|
class ProfileBloc extends Bloc<ProfileEvent, ProfileState> {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro profile_bloc}
|
2025-02-26 13:40:43 +03:00
|
|
|
|
ProfileBloc(this._profileRepository) : super(ProfileInitialState()) {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
// Регистрируем обработчики событий в конструкторе
|
2025-02-26 13:40:43 +03:00
|
|
|
|
on<ProfileEvent>((event, emit) async {
|
2025-06-25 10:31:37 +03:00
|
|
|
|
// Обрабатываем событие загрузки профиля
|
2025-02-26 13:40:43 +03:00
|
|
|
|
if (event is ProfileFetchProfileEvent) {
|
|
|
|
|
|
await _fetchProfile(event, emit);
|
|
|
|
|
|
}
|
2025-06-25 10:31:37 +03:00
|
|
|
|
// Обрабатываем событие выхода из профиля
|
|
|
|
|
|
else if (event is ProfileLogoutProfileEvent) {
|
|
|
|
|
|
await _logout(event, emit);
|
|
|
|
|
|
}
|
2025-02-26 13:40:43 +03:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Репозиторий для работы с данными профиля
|
2025-02-26 13:40:43 +03:00
|
|
|
|
final IProfileRepository _profileRepository;
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Метод для загрузки данных профиля пользователя.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Принимает:
|
|
|
|
|
|
/// - [event] - событие с ID пользователя для загрузки
|
|
|
|
|
|
/// - [emit] - функция для эмиссии состояний
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Последовательность состояний:
|
|
|
|
|
|
/// 1. ProfileWaitingState - начало загрузки
|
|
|
|
|
|
/// 2. ProfileSuccessState - успешная загрузка с данными
|
|
|
|
|
|
/// 3. ProfileErrorState - ошибка загрузки с сообщением
|
2025-02-26 13:40:43 +03:00
|
|
|
|
Future<void> _fetchProfile(
|
|
|
|
|
|
ProfileFetchProfileEvent event,
|
|
|
|
|
|
Emitter<ProfileState> emit,
|
|
|
|
|
|
) async {
|
|
|
|
|
|
try {
|
|
|
|
|
|
emit(ProfileWaitingState());
|
|
|
|
|
|
final data = await _profileRepository.fetchUserProfile(event.id);
|
|
|
|
|
|
emit(ProfileSuccessState(data: data));
|
|
|
|
|
|
} on Object catch (error, stackTrace) {
|
2025-06-25 10:31:37 +03:00
|
|
|
|
// Обработка ошибки при загрузке профиля
|
2025-02-26 13:40:43 +03:00
|
|
|
|
emit(
|
|
|
|
|
|
ProfileErrorState(
|
|
|
|
|
|
message: 'Ошибка при загрузке профиля',
|
|
|
|
|
|
error: error,
|
|
|
|
|
|
stackTrace: stackTrace,
|
|
|
|
|
|
),
|
|
|
|
|
|
);
|
2025-08-25 15:04:36 +03:00
|
|
|
|
// Пробрасываем исключение в BlocObserver, для логирования или обработки
|
|
|
|
|
|
addError(error, stackTrace);
|
2025-02-26 13:40:43 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-25 10:31:37 +03:00
|
|
|
|
|
|
|
|
|
|
/// Метод для выхода из профиля пользователя.
|
|
|
|
|
|
Future<void> _logout(
|
|
|
|
|
|
ProfileLogoutProfileEvent event,
|
|
|
|
|
|
Emitter<ProfileState> emit,
|
|
|
|
|
|
) async {
|
|
|
|
|
|
// Здесь можно добавить логику выхода из профиля
|
|
|
|
|
|
// Например, очистка токенов, данных пользователя и т.д.
|
|
|
|
|
|
// В данном примере просто эмитим начальное состояние
|
|
|
|
|
|
emit(ProfileInitialState());
|
|
|
|
|
|
}
|
2025-02-26 13:40:43 +03:00
|
|
|
|
}
|