@@ -5,15 +5,16 @@ import 'package:flutter/foundation.dart' show kIsWeb; // Import kIsWeb
5
5
import 'package:flutter/material.dart' ;
6
6
import 'package:flutter_bloc/flutter_bloc.dart' ;
7
7
import 'package:go_router/go_router.dart' ; // Import GoRouter
8
- import 'package:ht_main/account/bloc/account_bloc.dart' ; // Import AccountBloc
9
- import 'package:ht_main/headline-details/bloc/headline_details_bloc.dart' ; // Import BLoC
10
- import 'package:ht_main/headline-details/bloc/similar_headlines_bloc.dart' ; // Import SimilarHeadlinesBloc
11
- import 'package:ht_main/headlines-feed/widgets/headline_item_widget.dart' ; // Import HeadlineItemWidget
8
+ import 'package:ht_main/account/bloc/account_bloc.dart' ;
9
+ import 'package:ht_main/app/bloc/app_bloc.dart' ; // Added AppBloc
10
+ import 'package:ht_main/headline-details/bloc/headline_details_bloc.dart' ;
11
+ import 'package:ht_main/headline-details/bloc/similar_headlines_bloc.dart' ;
12
+ // HeadlineItemWidget import removed
12
13
import 'package:ht_main/l10n/l10n.dart' ;
13
- import 'package:ht_main/router/routes.dart' ; // Import Routes
14
+ import 'package:ht_main/router/routes.dart' ;
14
15
import 'package:ht_main/shared/shared.dart' ;
15
16
import 'package:ht_shared/ht_shared.dart'
16
- show Headline; // Import Headline model
17
+ show Headline, HeadlineImageStyle ; // Added HeadlineImageStyle
17
18
import 'package:intl/intl.dart' ;
18
19
import 'package:share_plus/share_plus.dart' ; // Import share_plus
19
20
import 'package:url_launcher/url_launcher_string.dart' ;
@@ -268,45 +269,59 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
268
269
child: Text (headline.title, style: textTheme.headlineMedium),
269
270
),
270
271
),
271
- if (headline.imageUrl != null )
272
- SliverPadding (
273
- padding: const EdgeInsets .only (
274
- top: AppSpacing .lg,
275
- left: AppSpacing .paddingLarge,
276
- right: AppSpacing .paddingLarge,
277
- ),
278
- sliver: SliverToBoxAdapter (
279
- child: ClipRRect (
280
- borderRadius: BorderRadius .circular (AppSpacing .md),
281
- child: Image .network (
282
- headline.imageUrl! ,
283
- width: double .infinity,
284
- height: 200 ,
285
- fit: BoxFit .cover,
286
- loadingBuilder: (context, child, loadingProgress) {
287
- if (loadingProgress == null ) return child;
288
- return Container (
289
- width: double .infinity,
290
- height: 200 ,
291
- color: colorScheme.surfaceContainerHighest,
292
- child: const Center (child: CircularProgressIndicator ()),
293
- );
294
- },
295
- errorBuilder:
296
- (context, error, stackTrace) => Container (
272
+ // Image or Placeholder Section
273
+ SliverPadding (
274
+ padding: const EdgeInsets .only (
275
+ top: AppSpacing .lg,
276
+ left: AppSpacing .paddingLarge,
277
+ right: AppSpacing .paddingLarge,
278
+ ),
279
+ sliver: SliverToBoxAdapter (
280
+ child: ClipRRect (
281
+ borderRadius: BorderRadius .circular (AppSpacing .md),
282
+ child:
283
+ headline.imageUrl != null
284
+ ? Image .network (
285
+ headline.imageUrl! ,
286
+ width: double .infinity,
287
+ height: 200 ,
288
+ fit: BoxFit .cover,
289
+ loadingBuilder: (context, child, loadingProgress) {
290
+ if (loadingProgress == null ) return child;
291
+ return Container (
292
+ width: double .infinity,
293
+ height: 200 ,
294
+ color: colorScheme.surfaceContainerHighest,
295
+ child: const Center (
296
+ child: CircularProgressIndicator (),
297
+ ),
298
+ );
299
+ },
300
+ errorBuilder:
301
+ (context, error, stackTrace) => Container (
302
+ width: double .infinity,
303
+ height: 200 ,
304
+ color: colorScheme.surfaceContainerHighest,
305
+ child: Icon (
306
+ Icons .broken_image_outlined,
307
+ color: colorScheme.onSurfaceVariant,
308
+ size: AppSpacing .xxl,
309
+ ),
310
+ ),
311
+ )
312
+ : Container (
297
313
width: double .infinity,
298
314
height: 200 ,
299
315
color: colorScheme.surfaceContainerHighest,
300
316
child: Icon (
301
- Icons .broken_image ,
317
+ Icons .image_not_supported_outlined ,
302
318
color: colorScheme.onSurfaceVariant,
303
319
size: AppSpacing .xxl,
304
320
),
305
321
),
306
- ),
307
- ),
308
322
),
309
323
),
324
+ ),
310
325
SliverPadding (
311
326
padding: horizontalPadding.copyWith (top: AppSpacing .lg),
312
327
sliver: SliverToBoxAdapter (
@@ -490,17 +505,54 @@ class _HeadlineDetailsPageState extends State<HeadlineDetailsPage> {
490
505
horizontal: AppSpacing .paddingMedium,
491
506
vertical: AppSpacing .sm,
492
507
),
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
- );
508
+ child: Builder (
509
+ // Use Builder to get a new context that can watch AppBloc
510
+ builder: (context) {
511
+ final imageStyle =
512
+ context
513
+ .watch <AppBloc >()
514
+ .state
515
+ .settings
516
+ .feedPreferences
517
+ .headlineImageStyle;
518
+ Widget tile;
519
+ switch (imageStyle) {
520
+ case HeadlineImageStyle .hidden:
521
+ tile = HeadlineTileTextOnly (
522
+ headline: similarHeadline,
523
+ onHeadlineTap:
524
+ () => context.pushNamed (
525
+ Routes .articleDetailsName,
526
+ pathParameters: {'id' : similarHeadline.id},
527
+ extra: similarHeadline,
528
+ ),
529
+ );
530
+ break ;
531
+ case HeadlineImageStyle .smallThumbnail:
532
+ tile = HeadlineTileImageStart (
533
+ headline: similarHeadline,
534
+ onHeadlineTap:
535
+ () => context.pushNamed (
536
+ Routes .articleDetailsName,
537
+ pathParameters: {'id' : similarHeadline.id},
538
+ extra: similarHeadline,
539
+ ),
540
+ );
541
+ break ;
542
+ case HeadlineImageStyle .largeThumbnail:
543
+ tile = HeadlineTileImageTop (
544
+ headline: similarHeadline,
545
+ onHeadlineTap:
546
+ () => context.pushNamed (
547
+ Routes .articleDetailsName,
548
+ pathParameters: {'id' : similarHeadline.id},
549
+ extra: similarHeadline,
550
+ ),
551
+ );
552
+ break ;
553
+ }
554
+ return tile;
502
555
},
503
- // targetRouteName: Routes.articleDetailsName, // No longer needed here
504
556
),
505
557
);
506
558
}, childCount: loadedState.similarHeadlines.length),
0 commit comments