diff --git a/lib/modules/store/chatbox/store_chatbox_page.dart b/lib/modules/store/chatbox/store_chatbox_page.dart index 53d4178..01fe66f 100644 --- a/lib/modules/store/chatbox/store_chatbox_page.dart +++ b/lib/modules/store/chatbox/store_chatbox_page.dart @@ -56,12 +56,10 @@ class _StoreChatboxPageState Widget buildItem(StoreListResBean res) { return SCStoreGridItemCard( res: res.res, - selected: res.isSelecte, discount: disCount, coverHeight: 45.w, previewWidth: 88.w, previewHeight: 58.w, - onPreviewTap: () => _togglePreview(res), onDetailsTap: () => _showDetail(res.res), ); } @@ -100,15 +98,6 @@ class _StoreChatboxPageState }, ); } - - void _togglePreview(StoreListResBean res) { - final shouldSelect = !res.isSelecte; - for (var value in items) { - value.isSelecte = false; - } - res.isSelecte = shouldSelect; - setState(() {}); - } } class StoreListResBean { diff --git a/lib/modules/store/data_card/store_data_card_page.dart b/lib/modules/store/data_card/store_data_card_page.dart index 05684bb..f52b50d 100644 --- a/lib/modules/store/data_card/store_data_card_page.dart +++ b/lib/modules/store/data_card/store_data_card_page.dart @@ -53,7 +53,6 @@ class StoreDataCardPageState final res = item; return SCStoreGridItemCard( res: res.res, - selected: res.isSelecte, discount: disCount, previewKind: SCStoreItemPreviewKind.dataCard, coverWidth: 72.w, @@ -63,7 +62,6 @@ class StoreDataCardPageState coverFit: BoxFit.cover, previewFit: BoxFit.cover, coverBorderRadius: BorderRadius.circular(6.w), - onPreviewTap: () => _togglePreview(res), onDetailsTap: () => _showDetail(res.res), ); } @@ -99,15 +97,6 @@ class StoreDataCardPageState }, ); } - - void _togglePreview(StoreDataCardListResBean res) { - final shouldSelect = !res.isSelecte; - for (final value in items) { - value.isSelecte = false; - } - res.isSelecte = shouldSelect; - setState(() {}); - } } class StoreDataCardListResBean { diff --git a/lib/modules/store/headdress/store_headdress_page.dart b/lib/modules/store/headdress/store_headdress_page.dart index 3d51c15..2985059 100644 --- a/lib/modules/store/headdress/store_headdress_page.dart +++ b/lib/modules/store/headdress/store_headdress_page.dart @@ -55,10 +55,8 @@ class _StoreHeaddressPageState Widget buildItem(StoreListResBean res) { return SCStoreGridItemCard( res: res.res, - selected: res.isSelecte, discount: disCount, previewKind: SCStoreItemPreviewKind.avatarFrame, - onPreviewTap: () => _togglePreview(res), onDetailsTap: () => _showDetail(res.res), ); } @@ -97,15 +95,6 @@ class _StoreHeaddressPageState }, ); } - - void _togglePreview(StoreListResBean res) { - final shouldSelect = !res.isSelecte; - for (var value in items) { - value.isSelecte = false; - } - res.isSelecte = shouldSelect; - setState(() {}); - } } class StoreListResBean { diff --git a/lib/modules/store/mountains/store_mountains_page.dart b/lib/modules/store/mountains/store_mountains_page.dart index 69d4428..6fb11a3 100644 --- a/lib/modules/store/mountains/store_mountains_page.dart +++ b/lib/modules/store/mountains/store_mountains_page.dart @@ -56,9 +56,7 @@ class _StoreMountainsPageState Widget buildItem(StoreListResBean res) { return SCStoreGridItemCard( res: res.res, - selected: res.isSelecte, discount: disCount, - onPreviewTap: () => _togglePreview(res), onDetailsTap: () => _showDetail(res.res), ); } @@ -97,13 +95,4 @@ class _StoreMountainsPageState }, ); } - - void _togglePreview(StoreListResBean res) { - final shouldSelect = !res.isSelecte; - for (var value in items) { - value.isSelecte = false; - } - res.isSelecte = shouldSelect; - setState(() {}); - } } diff --git a/lib/modules/store/theme/store_theme_page.dart b/lib/modules/store/theme/store_theme_page.dart index d7eebbe..c624227 100644 --- a/lib/modules/store/theme/store_theme_page.dart +++ b/lib/modules/store/theme/store_theme_page.dart @@ -57,10 +57,8 @@ class _StoreThemePagePageState Widget buildItem(StoreListResBean res) { return SCStoreGridItemCard( res: res.res, - selected: res.isSelecte, discount: disCount, coverBorderRadius: BorderRadius.all(Radius.circular(8.w)), - onPreviewTap: () => _togglePreview(res), onDetailsTap: () => _showDetail(res.res), ); } @@ -99,13 +97,4 @@ class _StoreThemePagePageState } } } - - void _togglePreview(StoreListResBean res) { - final shouldSelect = !res.isSelecte; - for (var value in items) { - value.isSelecte = false; - } - res.isSelecte = shouldSelect; - setState(() {}); - } } diff --git a/lib/ui_kit/widgets/store/store_bag_page_helpers.dart b/lib/ui_kit/widgets/store/store_bag_page_helpers.dart index a16801f..478338e 100644 --- a/lib/ui_kit/widgets/store/store_bag_page_helpers.dart +++ b/lib/ui_kit/widgets/store/store_bag_page_helpers.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:yumi/app/constants/sc_global_config.dart'; import 'package:yumi/app_localizations.dart'; import 'package:yumi/shared/business_logic/models/res/store_list_res.dart'; @@ -16,6 +17,7 @@ const Color _kStoreBagSkeletonShellStrong = Color(0xFF1A4A41); const Color _kStoreBagSkeletonBoneBase = Color(0xFF2B5C53); const Color _kStoreBagSkeletonBoneHighlight = Color(0xFF5F8177); const Color _kStoreBagSkeletonBorder = Color(0x66D8B57B); +const String _kStoreItemPreviewDialogTag = "storeItemFullScreenPreview"; enum SCStoreItemPreviewKind { resource, avatarFrame, dataCard } @@ -107,9 +109,7 @@ class SCStoreGridItemCard extends StatelessWidget { const SCStoreGridItemCard({ super.key, required this.res, - required this.selected, required this.discount, - required this.onPreviewTap, required this.onDetailsTap, this.previewKind = SCStoreItemPreviewKind.resource, this.coverWidth, @@ -122,9 +122,7 @@ class SCStoreGridItemCard extends StatelessWidget { }); final StoreListRes res; - final bool selected; final double discount; - final VoidCallback onPreviewTap; final VoidCallback onDetailsTap; final SCStoreItemPreviewKind previewKind; final double? coverWidth; @@ -147,17 +145,12 @@ class SCStoreGridItemCard extends StatelessWidget { child: Container( decoration: BoxDecoration( color: - selected - ? const Color(0xff18F2B1).withValues(alpha: 0.1) - : SCGlobalConfig.businessLogicStrategy - .getStoreItemBackgroundColor(), + SCGlobalConfig.businessLogicStrategy + .getStoreItemBackgroundColor(), border: Border.all( color: - selected - ? SCGlobalConfig.businessLogicStrategy - .getStoreItemSelectedBorderColor() - : SCGlobalConfig.businessLogicStrategy - .getStoreItemUnselectedBorderColor(), + SCGlobalConfig.businessLogicStrategy + .getStoreItemUnselectedBorderColor(), width: 1.w, ), borderRadius: BorderRadius.all(Radius.circular(8.w)), @@ -174,7 +167,7 @@ class SCStoreGridItemCard extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - _buildPreviewTapArea(), + _buildPreviewTapArea(context), SizedBox(height: 8.w), _buildPriceRow(amount, firstPrice), ], @@ -186,21 +179,45 @@ class SCStoreGridItemCard extends StatelessWidget { ); } - Widget _buildPreviewTapArea() { + Widget _buildPreviewTapArea(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.opaque, - onTap: onPreviewTap, + onTap: () => _showFullScreenPreview(context), child: SizedBox( width: double.infinity, height: previewHeight ?? coverHeight ?? (previewKind == SCStoreItemPreviewKind.avatarFrame ? 64.w : 62.w), - child: Center(child: selected ? _buildPreview() : _buildCover()), + child: Center(child: _buildCover()), ), ); } + void _showFullScreenPreview(BuildContext context) { + SmartDialog.show( + tag: _kStoreItemPreviewDialogTag, + alignment: Alignment.center, + animationType: SmartAnimationType.fade, + maskColor: Colors.transparent, + builder: (_) { + final size = MediaQuery.sizeOf(context); + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => SmartDialog.dismiss(tag: _kStoreItemPreviewDialogTag), + child: Container( + width: size.width, + height: size.height, + color: Colors.black.withValues(alpha: 0.86), + child: Center( + child: IgnorePointer(child: _buildFullScreenPreview(size)), + ), + ), + ); + }, + ); + } + Widget _buildCover() { Widget child = netImage( url: res.propsResources?.cover ?? "", @@ -214,22 +231,23 @@ class SCStoreGridItemCard extends StatelessWidget { return child; } - Widget _buildPreview() { + Widget _buildFullScreenPreview(Size screenSize) { switch (previewKind) { case SCStoreItemPreviewKind.avatarFrame: return head( url: AccountStorage().getCurrentUser()?.userProfile?.userAvatar ?? "", - width: previewWidth ?? 64.w, - height: previewHeight ?? 64.w, + width: screenSize.width * 0.58, + height: screenSize.width * 0.58, headdress: res.propsResources?.sourceUrl, headdressCover: res.propsResources?.cover, ); case SCStoreItemPreviewKind.dataCard: + final width = screenSize.width * 0.84; return ClipRRect( - borderRadius: BorderRadius.circular(6.w), + borderRadius: BorderRadius.circular(14.w), child: SizedBox( - width: previewWidth ?? 88.w, - height: previewHeight ?? 58.w, + width: width, + height: width * 0.66, child: SCDataCardResourceView( resource: res.propsResources, fit: previewFit, @@ -238,8 +256,8 @@ class SCStoreGridItemCard extends StatelessWidget { ); case SCStoreItemPreviewKind.resource: return SizedBox( - width: previewWidth ?? 72.w, - height: previewHeight ?? 62.w, + width: screenSize.width * 0.86, + height: screenSize.height * 0.42, child: SCDataCardResourceView( resource: res.propsResources, fit: previewFit,