From caffb85588829665959bc9dab7aa428efc60e0de Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 24 Nov 2025 23:36:53 +0800 Subject: [PATCH] :sparkles: Explore screen has a drop to share --- assets/i18n/en-US.json | 3 +- lib/screens/explore.dart | 87 ++++++++++++++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 18 deletions(-) diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index b614032a..fa4d5b9d 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -1471,5 +1471,6 @@ "allFilesUploadedSuccess": "All files uploaded successfully", "lotteryLastNumberSpecial": "The last selected number will be your special number.", "lotteryMultiplierRequired": "Please enter a multiplier", - "lotteryMultiplierRange": "Multiplier must be between 1 and 10" + "lotteryMultiplierRange": "Multiplier must be between 1 and 10", + "dropToShare": "Drop to share" } \ No newline at end of file diff --git a/lib/screens/explore.dart b/lib/screens/explore.dart index 8cb1358b..89c49f17 100644 --- a/lib/screens/explore.dart +++ b/lib/screens/explore.dart @@ -1,3 +1,4 @@ +import 'package:desktop_drop/desktop_drop.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -30,6 +31,7 @@ import 'package:island/widgets/publisher/publisher_card.dart'; import 'package:island/widgets/web_article_card.dart'; import 'package:island/widgets/extended_refresh_indicator.dart'; import 'package:island/services/event_bus.dart'; +import 'package:island/widgets/share/share_sheet.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; @@ -240,23 +242,74 @@ class ExploreScreen extends HookConsumerWidget { final appBar = isWide ? null : _buildAppBar(tabController, context); - return AppScaffold( - isNoBackground: false, - appBar: appBar, - body: - isWide - ? _buildWideBody( - context, - ref, - filterBar, - user, - notificationCount, - query, - events, - selectedDay, - currentFilter.value, - ) - : _buildNarrowBody(context, ref, currentFilter.value), + final dragging = useState(false); + + return DropTarget( + onDragDone: (detail) { + dragging.value = false; + if (detail.files.isNotEmpty) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + useRootNavigator: true, + builder: (context) => ShareSheet.files(files: detail.files), + ); + } + }, + onDragEntered: (_) => dragging.value = true, + onDragExited: (_) => dragging.value = false, + child: Stack( + children: [ + AppScaffold( + isNoBackground: false, + appBar: appBar, + body: + isWide + ? _buildWideBody( + context, + ref, + filterBar, + user, + notificationCount, + query, + events, + selectedDay, + currentFilter.value, + ) + : _buildNarrowBody(context, ref, currentFilter.value), + ), + if (dragging.value) + Positioned.fill( + child: Container( + color: Theme.of( + context, + ).colorScheme.primaryContainer.withOpacity(0.9), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Symbols.upload_file, + size: 64, + color: Theme.of(context).colorScheme.primary, + ), + const Gap(16), + Text( + 'dropToShare'.tr(), + style: Theme.of( + context, + ).textTheme.headlineMedium?.copyWith( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ), + ], + ), ); }