Skip to content

Commit 4f7c9e7

Browse files
committed
refactor: move filter bottom sheet inline
- Removed separate filter file - Simplified filter logic - Kept state inside bottom sheet
1 parent 8f9f611 commit 4f7c9e7

File tree

3 files changed

+117
-130
lines changed

3 files changed

+117
-130
lines changed

lib/headlines-feed/view/headline_filter_bottom_sheet.dart

Lines changed: 0 additions & 113 deletions
This file was deleted.

lib/headlines-feed/view/headlines_feed_page.dart

Lines changed: 116 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33
import 'package:ht_headlines_repository/ht_headlines_repository.dart';
44
import 'package:ht_main/headlines-feed/bloc/headlines_feed_bloc.dart';
5-
import 'package:ht_main/headlines-feed/view/headline_filter_bottom_sheet.dart';
65
import 'package:ht_main/headlines-feed/widgets/headline_item_widget.dart';
76
import 'package:ht_main/shared/widgets/failure_state_widget.dart';
87
import 'package:ht_main/shared/widgets/loading_state_widget.dart';
@@ -73,24 +72,12 @@ class _HeadlinesFeedViewState extends State<_HeadlinesFeedView> {
7372
IconButton(
7473
icon: const Icon(Icons.filter_list),
7574
onPressed: () {
75+
final bloc = context.read<HeadlinesFeedBloc>();
7676
showModalBottomSheet<void>(
7777
context: context,
7878
builder: (BuildContext context) {
79-
final bloc = context.read<HeadlinesFeedBloc>();
80-
return BlocProvider.value(
81-
value: bloc,
82-
child: HeadlineFilterBottomSheet(
83-
bloc: bloc,
84-
onApplyFilters: (category, source, eventCountry) {
85-
bloc.add(
86-
HeadlinesFeedFilterChanged(
87-
category: category,
88-
source: source,
89-
eventCountry: eventCountry,
90-
),
91-
);
92-
},
93-
),
79+
return _HeadlinesFilterBottomSheet(
80+
bloc: bloc,
9481
);
9582
},
9683
);
@@ -139,3 +126,116 @@ class _HeadlinesFeedViewState extends State<_HeadlinesFeedView> {
139126
);
140127
}
141128
}
129+
130+
class _HeadlinesFilterBottomSheet extends StatefulWidget {
131+
const _HeadlinesFilterBottomSheet({
132+
required this.bloc,
133+
});
134+
135+
final HeadlinesFeedBloc bloc;
136+
137+
@override
138+
State<_HeadlinesFilterBottomSheet> createState() =>
139+
_HeadlinesFilterBottomSheetState();
140+
}
141+
142+
class _HeadlinesFilterBottomSheetState
143+
extends State<_HeadlinesFilterBottomSheet> {
144+
String? selectedCategory;
145+
String? selectedSource;
146+
String? selectedEventCountry;
147+
148+
@override
149+
void initState() {
150+
super.initState();
151+
final state = widget.bloc.state;
152+
if (state is HeadlinesFeedLoaded) {
153+
selectedCategory = state.filter.category;
154+
selectedSource = state.filter.source;
155+
selectedEventCountry = state.filter.eventCountry;
156+
}
157+
}
158+
159+
@override
160+
Widget build(BuildContext context) {
161+
return BlocProvider.value(
162+
value: widget.bloc,
163+
child: Padding(
164+
padding: const EdgeInsets.all(16),
165+
child: Column(
166+
mainAxisSize: MainAxisSize.min,
167+
children: [
168+
Text(
169+
'Filter Headlines',
170+
style: Theme.of(context).textTheme.titleLarge,
171+
),
172+
const SizedBox(height: 16),
173+
// Category Dropdown
174+
DropdownButtonFormField<String>(
175+
decoration: const InputDecoration(labelText: 'Category'),
176+
value: selectedCategory,
177+
items: const [
178+
// Placeholder items
179+
DropdownMenuItem(value: 'technology', child: Text('Technology')),
180+
DropdownMenuItem(value: 'business', child: Text('Business')),
181+
DropdownMenuItem(value: 'Politics', child: Text('Sports')),
182+
],
183+
onChanged: (value) {
184+
setState(() {
185+
selectedCategory = value;
186+
});
187+
},
188+
),
189+
const SizedBox(height: 16),
190+
// Source Dropdown
191+
DropdownButtonFormField<String>(
192+
decoration: const InputDecoration(labelText: 'Source'),
193+
value: selectedSource,
194+
items: const [
195+
// Placeholder items
196+
DropdownMenuItem(value: 'cnn', child: Text('CNN')),
197+
DropdownMenuItem(value: 'reuters', child: Text('Reuters')),
198+
],
199+
onChanged: (value) {
200+
setState(() {
201+
selectedSource = value;
202+
});
203+
},
204+
),
205+
const SizedBox(height: 16),
206+
// Event Country Dropdown
207+
DropdownButtonFormField<String>(
208+
decoration: const InputDecoration(labelText: 'Event Country'),
209+
value: selectedEventCountry,
210+
items: const [
211+
// Placeholder items
212+
DropdownMenuItem(value: 'US', child: Text('United States')),
213+
DropdownMenuItem(value: 'UK', child: Text('United Kingdom')),
214+
DropdownMenuItem(value: 'CA', child: Text('Canada')),
215+
],
216+
onChanged: (value) {
217+
setState(() {
218+
selectedEventCountry = value;
219+
});
220+
},
221+
),
222+
const SizedBox(height: 24),
223+
ElevatedButton(
224+
onPressed: () {
225+
widget.bloc.add(
226+
HeadlinesFeedFilterChanged(
227+
category: selectedCategory,
228+
source: selectedSource,
229+
eventCountry: selectedEventCountry,
230+
),
231+
);
232+
Navigator.pop(context);
233+
},
234+
child: const Text('Apply Filters'),
235+
),
236+
],
237+
),
238+
),
239+
);
240+
}
241+
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: ht_main
22
description: main headlines toolkit mobile app.
3-
version: 0.9.5
3+
version: 0.11.5
44
publish_to: none
55
repository: https://github.com/headlines-toolkit/ht-main
66
environment:

0 commit comments

Comments
 (0)