Skip to content

Commit 7d5272d

Browse files
committed
feat(content_management): implement loading, restoring, and deleting archived headlines
1 parent 769861f commit 7d5272d

File tree

1 file changed

+109
-5
lines changed

1 file changed

+109
-5
lines changed
Lines changed: 109 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,118 @@
11
import 'package:bloc/bloc.dart';
22
import 'package:core/core.dart';
3+
import 'package:data_repository/data_repository.dart';
34
import 'package:equatable/equatable.dart';
45

56
part 'archived_headlines_event.dart';
67
part 'archived_headlines_state.dart';
78

8-
class ArchivedHeadlinesBloc extends Bloc<ArchivedHeadlinesEvent, ArchivedHeadlinesState> {
9-
ArchivedHeadlinesBloc() : super(ArchivedHeadlinesInitial()) {
10-
on<ArchivedHeadlinesEvent>((event, emit) {
11-
// TODO: implement event handler
12-
});
9+
class ArchivedHeadlinesBloc
10+
extends Bloc<ArchivedHeadlinesEvent, ArchivedHeadlinesState> {
11+
ArchivedHeadlinesBloc({
12+
required DataRepository<Headline> headlinesRepository,
13+
}) : _headlinesRepository = headlinesRepository,
14+
super(const ArchivedHeadlinesState()) {
15+
on<LoadArchivedHeadlinesRequested>(_onLoadArchivedHeadlinesRequested);
16+
on<RestoreHeadlineRequested>(_onRestoreHeadlineRequested);
17+
on<DeleteHeadlineForeverRequested>(_onDeleteHeadlineForeverRequested);
18+
}
19+
20+
final DataRepository<Headline> _headlinesRepository;
21+
22+
Future<void> _onLoadArchivedHeadlinesRequested(
23+
LoadArchivedHeadlinesRequested event,
24+
Emitter<ArchivedHeadlinesState> emit,
25+
) async {
26+
emit(state.copyWith(status: ArchivedHeadlinesStatus.loading));
27+
try {
28+
final isPaginating = event.startAfterId != null;
29+
final previousHeadlines = isPaginating ? state.headlines : <Headline>[];
30+
31+
final paginatedHeadlines = await _headlinesRepository.readAll(
32+
filter: {'status': ContentStatus.archived.name},
33+
sort: [const SortOption('updatedAt', SortOrder.desc)],
34+
pagination: PaginationOptions(
35+
cursor: event.startAfterId,
36+
limit: event.limit,
37+
),
38+
);
39+
emit(
40+
state.copyWith(
41+
status: ArchivedHeadlinesStatus.success,
42+
headlines: [...previousHeadlines, ...paginatedHeadlines.items],
43+
cursor: paginatedHeadlines.cursor,
44+
hasMore: paginatedHeadlines.hasMore,
45+
),
46+
);
47+
} on HttpException catch (e) {
48+
emit(
49+
state.copyWith(
50+
status: ArchivedHeadlinesStatus.failure,
51+
exception: e,
52+
),
53+
);
54+
} catch (e) {
55+
emit(
56+
state.copyWith(
57+
status: ArchivedHeadlinesStatus.failure,
58+
exception: UnknownException('An unexpected error occurred: $e'),
59+
),
60+
);
61+
}
62+
}
63+
64+
Future<void> _onRestoreHeadlineRequested(
65+
RestoreHeadlineRequested event,
66+
Emitter<ArchivedHeadlinesState> emit,
67+
) async {
68+
final originalHeadlines = List<Headline>.from(state.headlines);
69+
final headlineIndex = originalHeadlines.indexWhere((h) => h.id == event.id);
70+
if (headlineIndex == -1) return;
71+
72+
final headlineToRestore = originalHeadlines[headlineIndex];
73+
final updatedHeadlines = originalHeadlines..removeAt(headlineIndex);
74+
75+
emit(state.copyWith(headlines: updatedHeadlines));
76+
77+
try {
78+
await _headlinesRepository.update(
79+
id: event.id,
80+
item: headlineToRestore.copyWith(status: ContentStatus.active),
81+
);
82+
} on HttpException catch (e) {
83+
emit(state.copyWith(headlines: originalHeadlines, exception: e));
84+
} catch (e) {
85+
emit(
86+
state.copyWith(
87+
headlines: originalHeadlines,
88+
exception: UnknownException('An unexpected error occurred: $e'),
89+
),
90+
);
91+
}
92+
}
93+
94+
Future<void> _onDeleteHeadlineForeverRequested(
95+
DeleteHeadlineForeverRequested event,
96+
Emitter<ArchivedHeadlinesState> emit,
97+
) async {
98+
final originalHeadlines = List<Headline>.from(state.headlines);
99+
final headlineIndex = originalHeadlines.indexWhere((h) => h.id == event.id);
100+
if (headlineIndex == -1) return;
101+
102+
final updatedHeadlines = originalHeadlines..removeAt(headlineIndex);
103+
emit(state.copyWith(headlines: updatedHeadlines));
104+
105+
try {
106+
await _headlinesRepository.delete(id: event.id);
107+
} on HttpException catch (e) {
108+
emit(state.copyWith(headlines: originalHeadlines, exception: e));
109+
} catch (e) {
110+
emit(
111+
state.copyWith(
112+
headlines: originalHeadlines,
113+
exception: UnknownException('An unexpected error occurred: $e'),
114+
),
115+
);
116+
}
13117
}
14118
}

0 commit comments

Comments
 (0)