From 0093b62c295217afdcc63d0986670e0acb86da6f Mon Sep 17 00:00:00 2001 From: Phuoc Nguyen Date: Tue, 11 Nov 2025 16:02:09 +0700 Subject: [PATCH] update --- ios/Podfile.lock | 4 +- ios/Runner/Info.plist | 2 +- .../presentation/pages/news_detail_page.dart | 229 ++++++++---------- pubspec.lock | 16 +- pubspec.yaml | 5 +- 5 files changed, 117 insertions(+), 139 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8805236..ac9a427 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -176,7 +176,7 @@ SPEC CHECKSUMS: connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 + file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a @@ -196,7 +196,7 @@ SPEC CHECKSUMS: path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a - share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad + share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 85759b3..c5a8729 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Worker + DBIZ Partner CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/lib/features/news/presentation/pages/news_detail_page.dart b/lib/features/news/presentation/pages/news_detail_page.dart index d971461..650b451 100644 --- a/lib/features/news/presentation/pages/news_detail_page.dart +++ b/lib/features/news/presentation/pages/news_detail_page.dart @@ -10,6 +10,8 @@ import 'package:flutter/services.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:worker/core/constants/api_constants.dart'; import 'package:worker/core/constants/ui_constants.dart'; import 'package:worker/core/theme/colors.dart'; import 'package:worker/features/news/domain/entities/news_article.dart'; @@ -159,76 +161,73 @@ class _NewsDetailPageState extends ConsumerState { // Article Body - Render HTML content if (article.content != null && article.content!.isNotEmpty) - Container( - // Wrap Html in Container to prevent rendering issues - child: Html( - data: article.content, - style: { - "body": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - fontSize: FontSize(16), - lineHeight: const LineHeight(1.7), - color: const Color(0xFF1E293B), + Html( + data: article.content, + style: { + "body": Style( + margin: Margins.zero, + padding: HtmlPaddings.zero, + fontSize: FontSize(16), + lineHeight: const LineHeight(1.7), + color: const Color(0xFF1E293B), + ), + "h2": Style( + fontSize: FontSize(20), + fontWeight: FontWeight.w600, + color: const Color(0xFF1E293B), + margin: Margins.only(top: 32, bottom: 16), + ), + "h3": Style( + fontSize: FontSize(18), + fontWeight: FontWeight.w600, + color: const Color(0xFF1E293B), + margin: Margins.only(top: 24, bottom: 12), + ), + "p": Style( + fontSize: FontSize(16), + color: const Color(0xFF1E293B), + lineHeight: const LineHeight(1.7), + margin: Margins.only(bottom: 16), + ), + "strong": Style( + fontWeight: FontWeight.w600, + color: const Color(0xFF1E293B), + ), + "img": Style( + margin: Margins.symmetric(vertical: 16), + ), + "ul": Style( + margin: Margins.only(left: 16, bottom: 16), + ), + "ol": Style( + margin: Margins.only(left: 16, bottom: 16), + ), + "li": Style( + fontSize: FontSize(16), + color: const Color(0xFF1E293B), + lineHeight: const LineHeight(1.5), + margin: Margins.only(bottom: 8), + ), + "blockquote": Style( + backgroundColor: const Color(0xFFF0F9FF), + border: const Border( + left: BorderSide(color: AppColors.primaryBlue, width: 4), ), - "h2": Style( - fontSize: FontSize(20), - fontWeight: FontWeight.w600, - color: const Color(0xFF1E293B), - margin: Margins.only(top: 32, bottom: 16), - ), - "h3": Style( - fontSize: FontSize(18), - fontWeight: FontWeight.w600, - color: const Color(0xFF1E293B), - margin: Margins.only(top: 24, bottom: 12), - ), - "p": Style( - fontSize: FontSize(16), - color: const Color(0xFF1E293B), - lineHeight: const LineHeight(1.7), - margin: Margins.only(bottom: 16), - ), - "strong": Style( - fontWeight: FontWeight.w600, - color: const Color(0xFF1E293B), - ), - "img": Style( - margin: Margins.symmetric(vertical: 16), - ), - "ul": Style( - margin: Margins.only(left: 16, bottom: 16), - ), - "ol": Style( - margin: Margins.only(left: 16, bottom: 16), - ), - "li": Style( - fontSize: FontSize(16), - color: const Color(0xFF1E293B), - lineHeight: const LineHeight(1.5), - margin: Margins.only(bottom: 8), - ), - "blockquote": Style( - backgroundColor: const Color(0xFFF0F9FF), - border: const Border( - left: BorderSide(color: AppColors.primaryBlue, width: 4), - ), - padding: HtmlPaddings.all(16), - margin: Margins.symmetric(vertical: 24), - fontStyle: FontStyle.italic, - ), - "div": Style( - margin: Margins.zero, - padding: HtmlPaddings.zero, - ), - }, - onLinkTap: (url, attributes, element) { - // Handle link taps if needed - if (url != null) { - debugPrint('Link tapped: $url'); - } - }, - ), + padding: HtmlPaddings.all(16), + margin: Margins.symmetric(vertical: 24), + fontStyle: FontStyle.italic, + ), + "div": Style( + margin: Margins.zero, + padding: HtmlPaddings.zero, + ), + }, + onLinkTap: (url, attributes, element) { + // Handle link taps if needed + if (url != null) { + debugPrint('Link tapped: $url'); + } + }, ), const SizedBox(height: 32), @@ -256,9 +255,8 @@ class _NewsDetailPageState extends ConsumerState { /// Build metadata Widget _buildMetadata(NewsArticle article) { - return Wrap( + return Row( spacing: 16, - runSpacing: 8, children: [ // Category badge Container( @@ -281,13 +279,13 @@ class _NewsDetailPageState extends ConsumerState { _buildMetaItem(Icons.calendar_today, article.formattedDate), // Reading time - _buildMetaItem(Icons.schedule, article.readingTimeText), + // _buildMetaItem(Icons.schedule, article.readingTimeText), // Views - _buildMetaItem( - Icons.visibility, - '${article.formattedViewCount} lượt xem', - ), + // _buildMetaItem( + // Icons.visibility, + // '${article.formattedViewCount} lượt xem', + // ), ], ); } @@ -362,48 +360,27 @@ class _NewsDetailPageState extends ConsumerState { Widget _buildSocialActions(NewsArticle article) { return Container( padding: const EdgeInsets.all(16), - decoration: BoxDecoration( + decoration: const BoxDecoration( border: Border.symmetric( - horizontal: BorderSide(color: const Color(0xFFE2E8F0)), + horizontal: BorderSide(color: Color(0xFFE2E8F0)), ), ), - child: Column( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - // Engagement stats - Wrap( - spacing: 16, - runSpacing: 8, - children: [ - _buildStatItem(Icons.favorite, '${article.likeCount} lượt thích'), - _buildStatItem( - Icons.comment, - '${article.commentCount} bình luận', - ), - _buildStatItem(Icons.share, '${article.shareCount} lượt chia sẻ'), - ], + _buildActionButton( + icon: _isLiked ? Icons.favorite : Icons.favorite_border, + onPressed: _onLikeTap, + color: _isLiked ? Colors.red : null, ), - - const SizedBox(height: 16), - - // Action buttons - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _buildActionButton( - icon: _isLiked ? Icons.favorite : Icons.favorite_border, - onPressed: _onLikeTap, - color: _isLiked ? Colors.red : null, - ), - const SizedBox(width: 8), - _buildActionButton( - icon: _isBookmarked ? Icons.bookmark : Icons.bookmark_border, - onPressed: _onBookmarkTap, - color: _isBookmarked ? AppColors.warning : null, - ), - const SizedBox(width: 8), - _buildActionButton(icon: Icons.share, onPressed: _onShareTap), - ], + const SizedBox(width: 8), + _buildActionButton( + icon: _isBookmarked ? Icons.bookmark : Icons.bookmark_border, + onPressed: _onBookmarkTap, + color: _isBookmarked ? AppColors.warning : null, ), + const SizedBox(width: 8), + _buildActionButton(icon: Icons.share, onPressed: _onShareTap), ], ), ); @@ -577,21 +554,21 @@ class _NewsDetailPageState extends ConsumerState { /// Handle share tap void _onShareTap() { // Copy link to clipboard - Clipboard.setData( - ClipboardData(text: 'https://worker.app/news/${widget.articleId}'), - ); - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Đã sao chép link bài viết!'), - duration: Duration(seconds: 2), - ), - ); + // Clipboard.setData( + // ClipboardData(text: 'https://worker.app/news/${widget.articleId}'), + // ); + // + // ScaffoldMessenger.of(context).showSnackBar( + // const SnackBar( + // content: Text('Đã sao chép link bài viết!'), + // duration: Duration(seconds: 2), + // ), + // ); // TODO: Implement native share when share_plus package is added - // Share.share( - // 'Xem bài viết: ${article.title}\nhttps://worker.app/news/${article.id}', - // subject: article.title, - // ); + SharePlus.instance.share( + ShareParams(text: 'Xem bài viết: ${ApiConstants.baseUrl}') + ); + } } diff --git a/pubspec.lock b/pubspec.lock index effc660..11d4c6a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -413,10 +413,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3" + sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810 url: "https://pub.dev" source: hosted - version: "8.0.7" + version: "8.3.7" file_selector_linux: dependency: transitive description: @@ -1160,18 +1160,18 @@ packages: dependency: "direct main" description: name: share_plus - sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 + sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840" url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "12.0.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "6.1.0" shared_preferences: dependency: "direct main" description: @@ -1565,10 +1565,10 @@ packages: dependency: transitive description: name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "1.1.1" web_socket: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 695c5a2..c40c105 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 +version: 1.0.0+3 environment: sdk: ^3.9.2 @@ -63,9 +63,10 @@ dependencies: qr_flutter: ^4.1.0 mobile_scanner: ^5.2.3 + # Utilities intl: ^0.20.0 - share_plus: ^9.0.0 + share_plus: ^12.0.1 image_picker: ^1.1.2 file_picker: ^8.0.0 url_launcher: ^6.3.0