import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:news/ui/widgets/customTextLabel.dart'; import 'package:news/ui/widgets/newsCard.dart'; import 'package:news/utils/uiUtils.dart'; import 'package:news/utils/internetConnectivity.dart'; import 'package:news/app/routes.dart'; import 'package:news/cubits/Auth/authCubit.dart'; import 'package:news/cubits/Bookmark/UpdateBookmarkCubit.dart'; import 'package:news/cubits/Bookmark/bookmarkCubit.dart'; import 'package:news/cubits/appLocalizationCubit.dart'; import 'package:news/cubits/appSystemSettingCubit.dart'; import 'package:news/cubits/LikeAndDislikeNews/LikeAndDislikeCubit.dart'; import 'package:news/cubits/LikeAndDislikeNews/updateLikeAndDislikeCubit.dart'; import 'package:news/data/models/NewsModel.dart'; import 'package:news/data/repositories/Bookmark/bookmarkRepository.dart'; import 'package:news/data/repositories/LikeAndDisLikeNews/LikeAndDisLikeNewsRepository.dart'; import 'package:news/ui/styles/colors.dart'; import 'package:news/ui/widgets/networkImage.dart'; import 'package:news/ui/widgets/SnackBarWidget.dart'; class NewsItem extends StatefulWidget { final NewsModel model; final int index; final List newslist; final bool fromShowMore; const NewsItem({super.key, required this.model, required this.index, required this.newslist, required this.fromShowMore}); @override NewsItemState createState() => NewsItemState(); } class NewsItemState extends State { late BannerAd bannerAd; @override void initState() { super.initState(); if (context.read().getInAppAdsMode() == "1" && (context.read().getAdsType() != "unity" || context.read().getIOSAdsType() != "unity")) bannerAd = UiUtils.createBannerAd(context: context); } Widget setButton({required Widget childWidget}) { return Container(padding: const EdgeInsets.all(3), decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: UiUtils.getColorScheme(context).secondary), child: childWidget); } Widget setNewsImage() { return ClipRRect( borderRadius: BorderRadius.circular(10), child: ShaderMask( shaderCallback: (rect) => LinearGradient(begin: Alignment.center, end: Alignment.bottomCenter, colors: [Colors.transparent, darkSecondaryColor.withOpacity(0.9)]).createShader(rect), blendMode: BlendMode.darken, child: Container( color: primaryColor.withAlpha(5), width: double.maxFinite, height: MediaQuery.of(context).size.height / 3.3, child: CustomNetworkImage(networkImageUrl: widget.model.image!, width: double.infinity, height: MediaQuery.of(context).size.height / 4.2, fit: BoxFit.cover, isVideo: false)))); } Widget setTagsList({required List tagList, required List tagId}) { return Positioned.directional( textDirection: Directionality.of(context), bottom: 80.0, start: 7.0, child: widget.model.tagName! != "" ? SizedBox( height: 16.0, child: ListView.builder( physics: const AlwaysScrollableScrollPhysics(), scrollDirection: Axis.horizontal, shrinkWrap: true, itemCount: tagList.length, itemBuilder: (context, index) { return Padding( padding: EdgeInsetsDirectional.only(start: index == 0 ? 0 : 5.5), child: InkWell( child: Container( height: 20.0, width: 65, alignment: Alignment.center, padding: const EdgeInsetsDirectional.only(start: 3.0, end: 3.0, top: 1.0, bottom: 1.0), decoration: BoxDecoration( borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)), color: UiUtils.getColorScheme(context).primaryContainer.withOpacity(0.85)), child: CustomTextLabel( text: tagList[index], textStyle: Theme.of(context).textTheme.bodyMedium?.copyWith(color: UiUtils.getColorScheme(context).secondary, fontSize: 8.5), overflow: TextOverflow.ellipsis, softWrap: true)), onTap: () async { Navigator.of(context).pushNamed(Routes.tagScreen, arguments: {"tagId": tagId[index], "tagName": tagList[index]}); }, ), ); })) : const SizedBox.shrink()); } Widget setTitleAndDate() { return Positioned.directional( textDirection: Directionality.of(context), bottom: 20, start: 10, end: 10, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.bottomLeft, padding: const EdgeInsetsDirectional.only(top: 4.0, start: 5.0, end: 5.0), child: CustomTextLabel( text: widget.model.title!, textStyle: Theme.of(context).textTheme.titleSmall?.copyWith(color: secondaryColor), maxLines: 2, softWrap: true, overflow: TextOverflow.ellipsis)), Padding( padding: const EdgeInsetsDirectional.only(top: 4.0, start: 5.0, end: 5.0), child: CustomTextLabel( text: UiUtils.convertToAgo(context, DateTime.parse(widget.model.publishDate ?? widget.model.date!), 0)!, textStyle: Theme.of(context).textTheme.bodySmall!.copyWith(color: secondaryColor.withOpacity(0.6)))), ], ), ); } Widget shareButton() { return Padding( padding: const EdgeInsetsDirectional.only(start: 13.0), child: InkWell( child: setButton(childWidget: const Icon(Icons.share_rounded, size: 20)), onTap: () async { if (await InternetConnectivity.isNetworkAvailable()) { UiUtils.shareNews(context: context, slug: widget.model.slug!, title: widget.model.title!, isVideo: false, videoId: "", isBreakingNews: false, isNews: true); } else { showSnackBar(UiUtils.getTranslatedLabel(context, 'internetmsg'), context); } }, ), ); } Widget bookmarkButton() { return BlocProvider( create: (context) => UpdateBookmarkStatusCubit(BookmarkRepository()), child: BlocBuilder( bloc: context.read(), builder: (context, bookmarkState) { bool isBookmark = context.read().isNewsBookmark(widget.model.id!); return BlocConsumer( bloc: context.read(), listener: ((context, state) { if (state is UpdateBookmarkStatusSuccess) { (state.wasBookmarkNewsProcess) ? context.read().addBookmarkNews(state.news) : context.read().removeBookmarkNews(state.news); } }), builder: (context, state) { return InkWell( onTap: () { if (context.read().getUserId() != "0") { if (state is UpdateBookmarkStatusInProgress) return; context.read().setBookmarkNews(news: widget.model, status: (isBookmark) ? "0" : "1"); } else { UiUtils.loginRequired(context); } }, child: setButton( childWidget: (state is UpdateBookmarkStatusInProgress) ? SizedBox(height: 20, width: 20, child: UiUtils.showCircularProgress(true, Theme.of(context).primaryColor)) : ((isBookmark) ? const Icon(Icons.bookmark_added_rounded, size: 20) : const Icon(Icons.bookmark_add_outlined, size: 20)))); }); }), ); } Widget likeButton() { bool isLike = context.read().isNewsLikeAndDisLike(widget.model.id!); return BlocProvider( create: (context) => UpdateLikeAndDisLikeStatusCubit(LikeAndDisLikeRepository()), child: BlocConsumer( bloc: context.read(), listener: ((context, state) { if (state is LikeAndDisLikeFetchSuccess) { isLike = context.read().isNewsLikeAndDisLike(widget.model.id!); } }), builder: (context, likeAndDislikeState) { return BlocConsumer( bloc: context.read(), listener: ((context, state) { if (state is UpdateLikeAndDisLikeStatusSuccess) { context.read().getLike(langId: context.read().state.id); widget.model.totalLikes = (!isLike) ? (int.parse(widget.model.totalLikes.toString()) + 1).toString() : (widget.model.totalLikes!.isNotEmpty) ? (int.parse(widget.model.totalLikes.toString()) - 1).toString() : "0"; } }), builder: (context, state) { return InkWell( splashColor: Colors.transparent, onTap: () { if (context.read().getUserId() != "0") { if (state is UpdateLikeAndDisLikeStatusInProgress) { return; } context.read().setLikeAndDisLikeNews(news: widget.model, status: (isLike) ? "0" : "1"); } else { UiUtils.loginRequired(context); } }, child: setButton( childWidget: (state is UpdateLikeAndDisLikeStatusInProgress) ? SizedBox(height: 20, width: 20, child: UiUtils.showCircularProgress(true, Theme.of(context).primaryColor)) : ((isLike) ? const Icon(Icons.thumb_up_alt, size: 20) : const Icon(Icons.thumb_up_off_alt, size: 20)))); }); })); } Widget setShareBookmarkLikeOptions() { return Positioned.directional( end: 5, bottom: 5, textDirection: Directionality.of(context), child: Row( children: [shareButton(), SizedBox(width: MediaQuery.of(context).size.width / 98.0), bookmarkButton(), SizedBox(width: MediaQuery.of(context).size.width / 98.0), likeButton()], ), ); } Widget newsData() { return Builder(builder: (context) { return Padding( padding: EdgeInsetsDirectional.only(top: widget.index == 0 ? 0 : 15.0, start: 15, end: 15), child: Column(children: [ if (context.read().getInAppAdsMode() == "1" && (context.read().getAdsType() != "unity" || context.read().getIOSAdsType() != "unity")) nativeAdsShow(context: context, index: widget.index), NewsCard( newsDetail: widget.model, showTags: true, onTap: () { List newsList = []; newsList.addAll(widget.newslist); newsList.removeAt(widget.index); Navigator.of(context).pushNamed(Routes.newsDetails, arguments: {"model": widget.model, "newsList": newsList, "isFromBreak": false, "fromShowMore": widget.fromShowMore}); }) ])); }); } @override Widget build(BuildContext context) { return newsData(); } }