Skip to content

Commit 7c4ecb8

Browse files
committed
feat: Implement HeadlineDetailsBloc
- Fetches headline by ID - Handles loading and error states - Provides headline data
1 parent c54860f commit 7c4ecb8

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import 'dart:async';
2+
3+
import 'package:bloc/bloc.dart';
4+
import 'package:equatable/equatable.dart';
5+
import 'package:ht_data_repository/ht_data_repository.dart';
6+
import 'package:ht_shared/ht_shared.dart'
7+
show Headline, HtHttpException, NotFoundException;
8+
9+
part 'headline_details_event.dart';
10+
part 'headline_details_state.dart';
11+
12+
class HeadlineDetailsBloc
13+
extends Bloc<HeadlineDetailsEvent, HeadlineDetailsState> {
14+
HeadlineDetailsBloc({required HtDataRepository<Headline> headlinesRepository})
15+
: _headlinesRepository = headlinesRepository,
16+
super(HeadlineDetailsInitial()) {
17+
on<FetchHeadlineById>(_onFetchHeadlineById);
18+
on<HeadlineProvided>(_onHeadlineProvided);
19+
}
20+
21+
final HtDataRepository<Headline> _headlinesRepository;
22+
23+
Future<void> _onFetchHeadlineById(
24+
FetchHeadlineById event,
25+
Emitter<HeadlineDetailsState> emit,
26+
) async {
27+
emit(HeadlineDetailsLoading());
28+
try {
29+
final headline = await _headlinesRepository.read(id: event.headlineId);
30+
emit(HeadlineDetailsLoaded(headline: headline));
31+
} on NotFoundException catch (e) {
32+
emit(HeadlineDetailsFailure(message: e.message));
33+
} on HtHttpException catch (e) {
34+
emit(HeadlineDetailsFailure(message: e.message));
35+
} catch (e) {
36+
emit(HeadlineDetailsFailure(message: 'An unexpected error occurred: $e'));
37+
}
38+
}
39+
40+
void _onHeadlineProvided(
41+
HeadlineProvided event,
42+
Emitter<HeadlineDetailsState> emit,
43+
) {
44+
emit(HeadlineDetailsLoaded(headline: event.headline));
45+
}
46+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
part of 'headline_details_bloc.dart';
2+
3+
abstract class HeadlineDetailsEvent extends Equatable {
4+
const HeadlineDetailsEvent();
5+
6+
@override
7+
List<Object> get props => [];
8+
}
9+
10+
class FetchHeadlineById extends HeadlineDetailsEvent {
11+
const FetchHeadlineById(this.headlineId);
12+
final String headlineId;
13+
14+
@override
15+
List<Object> get props => [headlineId];
16+
}
17+
18+
class HeadlineProvided extends HeadlineDetailsEvent {
19+
const HeadlineProvided(this.headline);
20+
final Headline headline;
21+
22+
@override
23+
List<Object> get props => [headline];
24+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
part of 'headline_details_bloc.dart';
2+
3+
abstract class HeadlineDetailsState extends Equatable {
4+
const HeadlineDetailsState();
5+
6+
@override
7+
List<Object> get props => [];
8+
}
9+
10+
class HeadlineDetailsInitial extends HeadlineDetailsState {}
11+
12+
class HeadlineDetailsLoading extends HeadlineDetailsState {}
13+
14+
class HeadlineDetailsLoaded extends HeadlineDetailsState {
15+
const HeadlineDetailsLoaded({required this.headline});
16+
17+
final Headline headline;
18+
19+
@override
20+
List<Object> get props => [headline];
21+
}
22+
23+
class HeadlineDetailsFailure extends HeadlineDetailsState {
24+
const HeadlineDetailsFailure({required this.message});
25+
26+
final String message;
27+
28+
@override
29+
List<Object> get props => [message];
30+
}

0 commit comments

Comments
 (0)