Skip to content

Commit ac15f43

Browse files
authored
Merge pull request #19 from headlines-toolkit/implement_timestamp_logic_for_creating_and_updating_items
Implement timestamp logic for creating and updating items
2 parents 15fb076 + 6426aa7 commit ac15f43

26 files changed

+274
-315
lines changed

lib/content_management/bloc/content_management_bloc.dart

Lines changed: 72 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:bloc/bloc.dart';
22
import 'package:equatable/equatable.dart';
33
import 'package:ht_data_repository/ht_data_repository.dart';
4-
import 'package:ht_dashboard/shared/constants/pagination_constants.dart';
54
import 'package:ht_shared/ht_shared.dart';
65

76
part 'content_management_event.dart';
@@ -31,16 +30,16 @@ class ContentManagementBloc
3130
super(const ContentManagementState()) {
3231
on<ContentManagementTabChanged>(_onContentManagementTabChanged);
3332
on<LoadHeadlinesRequested>(_onLoadHeadlinesRequested);
34-
on<CreateHeadlineRequested>(_onCreateHeadlineRequested);
35-
on<UpdateHeadlineRequested>(_onUpdateHeadlineRequested);
33+
on<HeadlineAdded>(_onHeadlineAdded);
34+
on<HeadlineUpdated>(_onHeadlineUpdated);
3635
on<DeleteHeadlineRequested>(_onDeleteHeadlineRequested);
3736
on<LoadCategoriesRequested>(_onLoadCategoriesRequested);
38-
on<CreateCategoryRequested>(_onCreateCategoryRequested);
39-
on<UpdateCategoryRequested>(_onUpdateCategoryRequested);
37+
on<CategoryAdded>(_onCategoryAdded);
38+
on<CategoryUpdated>(_onCategoryUpdated);
4039
on<DeleteCategoryRequested>(_onDeleteCategoryRequested);
4140
on<LoadSourcesRequested>(_onLoadSourcesRequested);
42-
on<CreateSourceRequested>(_onCreateSourceRequested);
43-
on<UpdateSourceRequested>(_onUpdateSourceRequested);
41+
on<SourceAdded>(_onSourceAdded);
42+
on<SourceUpdated>(_onSourceUpdated);
4443
on<DeleteSourceRequested>(_onOnDeleteSourceRequested);
4544
}
4645

@@ -93,73 +92,41 @@ class ContentManagementBloc
9392
}
9493
}
9594

96-
Future<void> _onCreateHeadlineRequested(
97-
CreateHeadlineRequested event,
95+
void _onHeadlineAdded(
96+
HeadlineAdded event,
9897
Emitter<ContentManagementState> emit,
99-
) async {
100-
emit(state.copyWith(headlinesStatus: ContentManagementStatus.loading));
101-
try {
102-
await _headlinesRepository.create(item: event.headline);
103-
// Reload headlines after creation
104-
add(
105-
const LoadHeadlinesRequested(limit: kDefaultRowsPerPage),
106-
);
107-
} on HtHttpException catch (e) {
108-
emit(
109-
state.copyWith(
110-
headlinesStatus: ContentManagementStatus.failure,
111-
errorMessage: e.message,
112-
),
113-
);
114-
} catch (e) {
115-
emit(
116-
state.copyWith(
117-
headlinesStatus: ContentManagementStatus.failure,
118-
errorMessage: e.toString(),
119-
),
120-
);
121-
}
98+
) {
99+
final updatedHeadlines = [event.headline, ...state.headlines];
100+
emit(
101+
state.copyWith(
102+
headlines: updatedHeadlines,
103+
headlinesStatus: ContentManagementStatus.success,
104+
),
105+
);
122106
}
123107

124-
Future<void> _onUpdateHeadlineRequested(
125-
UpdateHeadlineRequested event,
108+
void _onHeadlineUpdated(
109+
HeadlineUpdated event,
126110
Emitter<ContentManagementState> emit,
127-
) async {
128-
emit(state.copyWith(headlinesStatus: ContentManagementStatus.loading));
129-
try {
130-
await _headlinesRepository.update(id: event.id, item: event.headline);
131-
// Reload headlines after update
132-
add(
133-
const LoadHeadlinesRequested(limit: kDefaultRowsPerPage),
134-
);
135-
} on HtHttpException catch (e) {
136-
emit(
137-
state.copyWith(
138-
headlinesStatus: ContentManagementStatus.failure,
139-
errorMessage: e.message,
140-
),
141-
);
142-
} catch (e) {
143-
emit(
144-
state.copyWith(
145-
headlinesStatus: ContentManagementStatus.failure,
146-
errorMessage: e.toString(),
147-
),
148-
);
111+
) {
112+
final updatedHeadlines = List<Headline>.from(state.headlines);
113+
final index = updatedHeadlines.indexWhere((h) => h.id == event.headline.id);
114+
if (index != -1) {
115+
updatedHeadlines[index] = event.headline;
116+
emit(state.copyWith(headlines: updatedHeadlines));
149117
}
150118
}
151119

152120
Future<void> _onDeleteHeadlineRequested(
153121
DeleteHeadlineRequested event,
154122
Emitter<ContentManagementState> emit,
155123
) async {
156-
emit(state.copyWith(headlinesStatus: ContentManagementStatus.loading));
157124
try {
158125
await _headlinesRepository.delete(id: event.id);
159-
// Reload headlines after deletion
160-
add(
161-
const LoadHeadlinesRequested(limit: kDefaultRowsPerPage),
162-
);
126+
final updatedHeadlines = state.headlines
127+
.where((h) => h.id != event.id)
128+
.toList();
129+
emit(state.copyWith(headlines: updatedHeadlines));
163130
} on HtHttpException catch (e) {
164131
emit(
165132
state.copyWith(
@@ -215,73 +182,43 @@ class ContentManagementBloc
215182
}
216183
}
217184

218-
Future<void> _onCreateCategoryRequested(
219-
CreateCategoryRequested event,
185+
void _onCategoryAdded(
186+
CategoryAdded event,
220187
Emitter<ContentManagementState> emit,
221-
) async {
222-
emit(state.copyWith(categoriesStatus: ContentManagementStatus.loading));
223-
try {
224-
await _categoriesRepository.create(item: event.category);
225-
// Reload categories after creation
226-
add(
227-
const LoadCategoriesRequested(limit: kDefaultRowsPerPage),
228-
);
229-
} on HtHttpException catch (e) {
230-
emit(
231-
state.copyWith(
232-
categoriesStatus: ContentManagementStatus.failure,
233-
errorMessage: e.message,
234-
),
235-
);
236-
} catch (e) {
237-
emit(
238-
state.copyWith(
239-
categoriesStatus: ContentManagementStatus.failure,
240-
errorMessage: e.toString(),
241-
),
242-
);
243-
}
188+
) {
189+
final updatedCategories = [event.category, ...state.categories];
190+
emit(
191+
state.copyWith(
192+
categories: updatedCategories,
193+
categoriesStatus: ContentManagementStatus.success,
194+
),
195+
);
244196
}
245197

246-
Future<void> _onUpdateCategoryRequested(
247-
UpdateCategoryRequested event,
198+
void _onCategoryUpdated(
199+
CategoryUpdated event,
248200
Emitter<ContentManagementState> emit,
249-
) async {
250-
emit(state.copyWith(categoriesStatus: ContentManagementStatus.loading));
251-
try {
252-
await _categoriesRepository.update(id: event.id, item: event.category);
253-
// Reload categories after update
254-
add(
255-
const LoadCategoriesRequested(limit: kDefaultRowsPerPage),
256-
);
257-
} on HtHttpException catch (e) {
258-
emit(
259-
state.copyWith(
260-
categoriesStatus: ContentManagementStatus.failure,
261-
errorMessage: e.message,
262-
),
263-
);
264-
} catch (e) {
265-
emit(
266-
state.copyWith(
267-
categoriesStatus: ContentManagementStatus.failure,
268-
errorMessage: e.toString(),
269-
),
270-
);
201+
) {
202+
final updatedCategories = List<Category>.from(state.categories);
203+
final index = updatedCategories.indexWhere(
204+
(c) => c.id == event.category.id,
205+
);
206+
if (index != -1) {
207+
updatedCategories[index] = event.category;
208+
emit(state.copyWith(categories: updatedCategories));
271209
}
272210
}
273211

274212
Future<void> _onDeleteCategoryRequested(
275213
DeleteCategoryRequested event,
276214
Emitter<ContentManagementState> emit,
277215
) async {
278-
emit(state.copyWith(categoriesStatus: ContentManagementStatus.loading));
279216
try {
280217
await _categoriesRepository.delete(id: event.id);
281-
// Reload categories after deletion
282-
add(
283-
const LoadCategoriesRequested(limit: kDefaultRowsPerPage),
284-
);
218+
final updatedCategories = state.categories
219+
.where((c) => c.id != event.id)
220+
.toList();
221+
emit(state.copyWith(categories: updatedCategories));
285222
} on HtHttpException catch (e) {
286223
emit(
287224
state.copyWith(
@@ -337,73 +274,38 @@ class ContentManagementBloc
337274
}
338275
}
339276

340-
Future<void> _onCreateSourceRequested(
341-
CreateSourceRequested event,
342-
Emitter<ContentManagementState> emit,
343-
) async {
344-
emit(state.copyWith(sourcesStatus: ContentManagementStatus.loading));
345-
try {
346-
await _sourcesRepository.create(item: event.source);
347-
// Reload sources after creation
348-
add(
349-
const LoadSourcesRequested(limit: kDefaultRowsPerPage),
350-
);
351-
} on HtHttpException catch (e) {
352-
emit(
353-
state.copyWith(
354-
sourcesStatus: ContentManagementStatus.failure,
355-
errorMessage: e.message,
356-
),
357-
);
358-
} catch (e) {
359-
emit(
360-
state.copyWith(
361-
sourcesStatus: ContentManagementStatus.failure,
362-
errorMessage: e.toString(),
363-
),
364-
);
365-
}
277+
void _onSourceAdded(SourceAdded event, Emitter<ContentManagementState> emit) {
278+
final updatedSources = [event.source, ...state.sources];
279+
emit(
280+
state.copyWith(
281+
sources: updatedSources,
282+
sourcesStatus: ContentManagementStatus.success,
283+
),
284+
);
366285
}
367286

368-
Future<void> _onUpdateSourceRequested(
369-
UpdateSourceRequested event,
287+
void _onSourceUpdated(
288+
SourceUpdated event,
370289
Emitter<ContentManagementState> emit,
371-
) async {
372-
emit(state.copyWith(sourcesStatus: ContentManagementStatus.loading));
373-
try {
374-
await _sourcesRepository.update(id: event.id, item: event.source);
375-
// Reload sources after update
376-
add(
377-
const LoadSourcesRequested(limit: kDefaultRowsPerPage),
378-
);
379-
} on HtHttpException catch (e) {
380-
emit(
381-
state.copyWith(
382-
sourcesStatus: ContentManagementStatus.failure,
383-
errorMessage: e.message,
384-
),
385-
);
386-
} catch (e) {
387-
emit(
388-
state.copyWith(
389-
sourcesStatus: ContentManagementStatus.failure,
390-
errorMessage: e.toString(),
391-
),
392-
);
290+
) {
291+
final updatedSources = List<Source>.from(state.sources);
292+
final index = updatedSources.indexWhere((s) => s.id == event.source.id);
293+
if (index != -1) {
294+
updatedSources[index] = event.source;
295+
emit(state.copyWith(sources: updatedSources));
393296
}
394297
}
395298

396299
Future<void> _onOnDeleteSourceRequested(
397300
DeleteSourceRequested event,
398301
Emitter<ContentManagementState> emit,
399302
) async {
400-
emit(state.copyWith(sourcesStatus: ContentManagementStatus.loading));
401303
try {
402304
await _sourcesRepository.delete(id: event.id);
403-
// Reload sources after deletion
404-
add(
405-
const LoadSourcesRequested(limit: kDefaultRowsPerPage),
406-
);
305+
final updatedSources = state.sources
306+
.where((s) => s.id != event.id)
307+
.toList();
308+
emit(state.copyWith(sources: updatedSources));
407309
} on HtHttpException catch (e) {
408310
emit(
409311
state.copyWith(

0 commit comments

Comments
 (0)