Skip to content

Commit 25715ae

Browse files
committed
style: misc
1 parent 3fe5a50 commit 25715ae

File tree

5 files changed

+159
-141
lines changed

5 files changed

+159
-141
lines changed

lib/headline-details/bloc/headline_details_bloc.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ part 'headline_details_state.dart';
1212
class HeadlineDetailsBloc
1313
extends Bloc<HeadlineDetailsEvent, HeadlineDetailsState> {
1414
HeadlineDetailsBloc({required HtDataRepository<Headline> headlinesRepository})
15-
: _headlinesRepository = headlinesRepository,
16-
super(HeadlineDetailsInitial()) {
15+
: _headlinesRepository = headlinesRepository,
16+
super(HeadlineDetailsInitial()) {
1717
on<FetchHeadlineById>(_onFetchHeadlineById);
1818
on<HeadlineProvided>(_onHeadlineProvided);
1919
}

lib/headline-details/bloc/similar_headlines_bloc.dart

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ class SimilarHeadlinesBloc
1212
extends Bloc<SimilarHeadlinesEvent, SimilarHeadlinesState> {
1313
SimilarHeadlinesBloc({
1414
required HtDataRepository<Headline> headlinesRepository,
15-
}) : _headlinesRepository = headlinesRepository,
16-
super(SimilarHeadlinesInitial()) {
15+
}) : _headlinesRepository = headlinesRepository,
16+
super(SimilarHeadlinesInitial()) {
1717
on<FetchSimilarHeadlines>(_onFetchSimilarHeadlines);
1818
}
1919

@@ -33,22 +33,24 @@ class SimilarHeadlinesBloc
3333
return;
3434
}
3535

36-
final queryParams = {
37-
'categories': currentHeadline.category!.id,
38-
};
36+
final queryParams = {'categories': currentHeadline.category!.id};
3937

4038
final response = await _headlinesRepository.readAllByQuery(
4139
queryParams,
42-
limit: _similarHeadlinesLimit + 1, // Fetch one extra to check if current is there
40+
limit:
41+
_similarHeadlinesLimit +
42+
1, // Fetch one extra to check if current is there
4343
);
4444

4545
// Filter out the current headline from the results
46-
final similarHeadlines = response.items
47-
.where((headline) => headline.id != currentHeadline.id)
48-
.toList();
46+
final similarHeadlines =
47+
response.items
48+
.where((headline) => headline.id != currentHeadline.id)
49+
.toList();
4950

5051
// Take only the required limit after filtering
51-
final finalSimilarHeadlines = similarHeadlines.take(_similarHeadlinesLimit).toList();
52+
final finalSimilarHeadlines =
53+
similarHeadlines.take(_similarHeadlinesLimit).toList();
5254

5355
if (finalSimilarHeadlines.isEmpty) {
5456
emit(SimilarHeadlinesEmpty());

lib/headline-details/view/headline_details_page.dart

Lines changed: 95 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ import 'package:share_plus/share_plus.dart'; // Import share_plus
1919
import 'package:url_launcher/url_launcher_string.dart';
2020

2121
class HeadlineDetailsPage extends StatefulWidget {
22-
const HeadlineDetailsPage({
23-
super.key,
24-
this.headlineId,
25-
this.initialHeadline,
26-
}) : assert(headlineId != null || initialHeadline != null);
22+
const HeadlineDetailsPage({super.key, this.headlineId, this.initialHeadline})
23+
: assert(headlineId != null || initialHeadline != null);
2724

2825
final String? headlineId;
2926
final Headline? initialHeadline;
@@ -37,17 +34,17 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
3734
void initState() {
3835
super.initState();
3936
if (widget.initialHeadline != null) {
40-
context
41-
.read<HeadlineDetailsBloc>()
42-
.add(HeadlineProvided(widget.initialHeadline!));
37+
context.read<HeadlineDetailsBloc>().add(
38+
HeadlineProvided(widget.initialHeadline!),
39+
);
4340
// Also trigger fetching similar headlines if the main one is already provided
44-
context
45-
.read<SimilarHeadlinesBloc>()
46-
.add(FetchSimilarHeadlines(currentHeadline: widget.initialHeadline!));
41+
context.read<SimilarHeadlinesBloc>().add(
42+
FetchSimilarHeadlines(currentHeadline: widget.initialHeadline!),
43+
);
4744
} else if (widget.headlineId != null) {
48-
context
49-
.read<HeadlineDetailsBloc>()
50-
.add(FetchHeadlineById(widget.headlineId!));
45+
context.read<HeadlineDetailsBloc>().add(
46+
FetchHeadlineById(widget.headlineId!),
47+
);
5148
}
5249
}
5350

@@ -63,8 +60,8 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
6360
// This check ensures it's not re-triggered if already loaded via initialHeadline.
6461
if (widget.initialHeadline == null) {
6562
context.read<SimilarHeadlinesBloc>().add(
66-
FetchSimilarHeadlines(currentHeadline: headlineState.headline),
67-
);
63+
FetchSimilarHeadlines(currentHeadline: headlineState.headline),
64+
);
6865
}
6966
}
7067
},
@@ -77,21 +74,21 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
7774
final currentHeadlineId = detailsState.headline.id;
7875
final wasPreviouslySaved =
7976
previous.preferences?.savedHeadlines.any(
80-
(h) => h.id == currentHeadlineId,
81-
) ??
82-
false;
77+
(h) => h.id == currentHeadlineId,
78+
) ??
79+
false;
8380
final isCurrentlySaved =
8481
current.preferences?.savedHeadlines.any(
85-
(h) => h.id == currentHeadlineId,
86-
) ??
87-
false;
82+
(h) => h.id == currentHeadlineId,
83+
) ??
84+
false;
8885

8986
// Condition 1: Actual change in saved status for this headline
9087
if (wasPreviouslySaved != isCurrentlySaved) {
9188
// Only trigger if the status is success (to show confirmation)
9289
// or failure (to show error). Avoid triggering if status is just loading.
9390
return current.status == AccountStatus.success ||
94-
current.status == AccountStatus.failure;
91+
current.status == AccountStatus.failure;
9592
}
9693

9794
// Condition 2: A specific save/unsave operation just failed
@@ -108,9 +105,9 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
108105
if (detailsState is HeadlineDetailsLoaded) {
109106
final nowIsSaved =
110107
accountState.preferences?.savedHeadlines.any(
111-
(h) => h.id == detailsState.headline.id,
112-
) ??
113-
false;
108+
(h) => h.id == detailsState.headline.id,
109+
) ??
110+
false;
114111

115112
if (accountState.status == AccountStatus.failure &&
116113
accountState.errorMessage != null) {
@@ -145,20 +142,19 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
145142
builder: (context, state) {
146143
return switch (state) {
147144
HeadlineDetailsInitial() ||
148-
HeadlineDetailsLoading() =>
149-
LoadingStateWidget(
150-
icon: Icons.downloading,
151-
headline: l10n.headlineDetailsLoadingHeadline,
152-
subheadline: l10n.headlineDetailsLoadingSubheadline,
153-
),
145+
HeadlineDetailsLoading() => LoadingStateWidget(
146+
icon: Icons.downloading,
147+
headline: l10n.headlineDetailsLoadingHeadline,
148+
subheadline: l10n.headlineDetailsLoadingSubheadline,
149+
),
154150
final HeadlineDetailsFailure failureState =>
155151
FailureStateWidget(
156152
message: failureState.message,
157153
onRetry: () {
158154
if (widget.headlineId != null) {
159-
context
160-
.read<HeadlineDetailsBloc>()
161-
.add(FetchHeadlineById(widget.headlineId!));
155+
context.read<HeadlineDetailsBloc>().add(
156+
FetchHeadlineById(widget.headlineId!),
157+
);
162158
}
163159
},
164160
),
@@ -187,19 +183,20 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
187183
final accountState = context.watch<AccountBloc>().state;
188184
final isSaved =
189185
accountState.preferences?.savedHeadlines.any(
190-
(h) => h.id == headline.id,
191-
) ??
192-
false;
186+
(h) => h.id == headline.id,
187+
) ??
188+
false;
193189

194190
final bookmarkButton = IconButton(
195191
icon: Icon(isSaved ? Icons.bookmark : Icons.bookmark_border),
196-
tooltip: isSaved
197-
? l10n.headlineDetailsRemoveFromSavedTooltip
198-
: l10n.headlineDetailsSaveTooltip,
192+
tooltip:
193+
isSaved
194+
? l10n.headlineDetailsRemoveFromSavedTooltip
195+
: l10n.headlineDetailsSaveTooltip,
199196
onPressed: () {
200197
context.read<AccountBloc>().add(
201-
AccountSaveHeadlineToggled(headline: headline),
202-
);
198+
AccountSaveHeadlineToggled(headline: headline),
199+
);
203200
},
204201
);
205202

@@ -241,9 +238,7 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
241238
if (buttonContext.mounted) {
242239
if (shareResult.status == ShareResultStatus.unavailable) {
243240
ScaffoldMessenger.of(buttonContext).showSnackBar(
244-
SnackBar(
245-
content: Text(l10n.sharingUnavailableSnackbar),
246-
),
241+
SnackBar(content: Text(l10n.sharingUnavailableSnackbar)),
247242
);
248243
}
249244
}
@@ -297,16 +292,17 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
297292
child: const Center(child: CircularProgressIndicator()),
298293
);
299294
},
300-
errorBuilder: (context, error, stackTrace) => Container(
301-
width: double.infinity,
302-
height: 200,
303-
color: colorScheme.surfaceContainerHighest,
304-
child: Icon(
305-
Icons.broken_image,
306-
color: colorScheme.onSurfaceVariant,
307-
size: AppSpacing.xxl,
308-
),
309-
),
295+
errorBuilder:
296+
(context, error, stackTrace) => Container(
297+
width: double.infinity,
298+
height: 200,
299+
color: colorScheme.surfaceContainerHighest,
300+
child: Icon(
301+
Icons.broken_image,
302+
color: colorScheme.onSurfaceVariant,
303+
size: AppSpacing.xxl,
304+
),
305+
),
310306
),
311307
),
312308
),
@@ -400,7 +396,9 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
400396
}
401397

402398
if (headline.publishedAt != null) {
403-
final formattedDate = DateFormat('MMM d, yyyy').format(headline.publishedAt!);
399+
final formattedDate = DateFormat(
400+
'MMM d, yyyy',
401+
).format(headline.publishedAt!);
404402
chips.add(
405403
Chip(
406404
avatar: Icon(
@@ -459,58 +457,54 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
459457
builder: (context, state) {
460458
return switch (state) {
461459
SimilarHeadlinesInitial() ||
462-
SimilarHeadlinesLoading() =>
463-
const SliverToBoxAdapter(
464-
child: Padding(
465-
padding: EdgeInsets.all(AppSpacing.lg),
466-
child: Center(child: CircularProgressIndicator()),
467-
),
460+
SimilarHeadlinesLoading() => const SliverToBoxAdapter(
461+
child: Padding(
462+
padding: EdgeInsets.all(AppSpacing.lg),
463+
child: Center(child: CircularProgressIndicator()),
468464
),
465+
),
469466
final SimilarHeadlinesError errorState => SliverToBoxAdapter(
470-
child: Padding(
471-
padding: const EdgeInsets.all(AppSpacing.lg),
472-
child: Text(
473-
errorState.message,
474-
textAlign: TextAlign.center,
475-
style: TextStyle(color: Theme.of(context).colorScheme.error),
476-
),
467+
child: Padding(
468+
padding: const EdgeInsets.all(AppSpacing.lg),
469+
child: Text(
470+
errorState.message,
471+
textAlign: TextAlign.center,
472+
style: TextStyle(color: Theme.of(context).colorScheme.error),
477473
),
478474
),
475+
),
479476
SimilarHeadlinesEmpty() => SliverToBoxAdapter(
480-
child: Padding(
481-
padding: const EdgeInsets.all(AppSpacing.lg),
482-
child: Text(
483-
l10n.similarHeadlinesEmpty,
484-
textAlign: TextAlign.center,
485-
),
477+
child: Padding(
478+
padding: const EdgeInsets.all(AppSpacing.lg),
479+
child: Text(
480+
l10n.similarHeadlinesEmpty,
481+
textAlign: TextAlign.center,
486482
),
487483
),
484+
),
488485
final SimilarHeadlinesLoaded loadedState => SliverList(
489-
delegate: SliverChildBuilderDelegate(
490-
(context, index) {
491-
final similarHeadline = loadedState.similarHeadlines[index];
492-
return Padding(
493-
padding: const EdgeInsets.symmetric(
494-
horizontal: AppSpacing.paddingMedium,
495-
vertical: AppSpacing.sm,
496-
),
497-
child: HeadlineItemWidget(
498-
headline: similarHeadline,
499-
// Use the onTap callback for navigation
500-
onTap: (tappedHeadline) {
501-
context.pushNamed(
502-
Routes.articleDetailsName,
503-
pathParameters: {'id': tappedHeadline.id},
504-
extra: tappedHeadline,
505-
);
506-
},
507-
// targetRouteName: Routes.articleDetailsName, // No longer needed here
508-
),
509-
);
510-
},
511-
childCount: loadedState.similarHeadlines.length,
512-
),
513-
),
486+
delegate: SliverChildBuilderDelegate((context, index) {
487+
final similarHeadline = loadedState.similarHeadlines[index];
488+
return Padding(
489+
padding: const EdgeInsets.symmetric(
490+
horizontal: AppSpacing.paddingMedium,
491+
vertical: AppSpacing.sm,
492+
),
493+
child: HeadlineItemWidget(
494+
headline: similarHeadline,
495+
// Use the onTap callback for navigation
496+
onTap: (tappedHeadline) {
497+
context.pushNamed(
498+
Routes.articleDetailsName,
499+
pathParameters: {'id': tappedHeadline.id},
500+
extra: tappedHeadline,
501+
);
502+
},
503+
// targetRouteName: Routes.articleDetailsName, // No longer needed here
504+
),
505+
);
506+
}, childCount: loadedState.similarHeadlines.length),
507+
),
514508
_ => const SliverToBoxAdapter(child: SizedBox.shrink()),
515509
};
516510
},

lib/headlines-feed/widgets/headline_item_widget.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ class HeadlineItemWidget extends StatelessWidget {
1313
this.onTap, // Add optional onTap callback
1414
this.trailing, // Add optional trailing widget
1515
super.key,
16-
}) : assert(targetRouteName != null || onTap != null, 'Either targetRouteName or onTap must be provided');
16+
}) : assert(
17+
targetRouteName != null || onTap != null,
18+
'Either targetRouteName or onTap must be provided',
19+
);
1720

1821
/// The headline to display.
1922
final Headline headline;

0 commit comments

Comments
 (0)