From e6338e8a5a6e0bfbe3b26f2e1b3fc9832a15d1d6 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 21 Dec 2025 13:37:35 +0800 Subject: [PATCH] :wastebasket: Clean up duplicate widget in explore and dashboard --- lib/screens/explore.dart | 72 +------------------- lib/widgets/check_in.dart | 135 +++++--------------------------------- 2 files changed, 17 insertions(+), 190 deletions(-) diff --git a/lib/screens/explore.dart b/lib/screens/explore.dart index 8d7daade..9a0e85a2 100644 --- a/lib/screens/explore.dart +++ b/lib/screens/explore.dart @@ -16,15 +16,11 @@ import 'package:island/pods/userinfo.dart'; import 'package:island/screens/auth/login_modal.dart'; import 'package:island/screens/notification.dart'; import 'package:island/services/responsive.dart'; -import 'package:island/widgets/account/account_name.dart'; -import 'package:island/widgets/account/friends_overview.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/models/post.dart'; -import 'package:island/widgets/check_in.dart'; import 'package:island/widgets/extended_refresh_indicator.dart'; import 'package:island/widgets/navigation/fab_menu.dart'; import 'package:island/widgets/paging/pagination_list.dart'; -import 'package:island/widgets/post/post_featured.dart'; import 'package:island/widgets/post/post_item.dart'; import 'package:island/widgets/post/post_item_skeleton.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -36,38 +32,6 @@ import 'package:island/widgets/share/share_sheet.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; -Widget notificationIndicatorWidget( - BuildContext context, { - required int count, - EdgeInsets? margin, -}) => Card( - margin: margin, - child: ListTile( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(8)), - ), - minTileHeight: 48, - leading: const Icon(Symbols.notifications), - title: Row( - children: [ - Text('notifications').tr().fontSize(14), - const Gap(8), - Badge(label: Text(count.toString())), - ], - ), - trailing: const Icon(Symbols.chevron_right), - contentPadding: EdgeInsets.only(left: 16, right: 15), - onTap: () { - showModalBottomSheet( - context: context, - isScrollControlled: true, - useRootNavigator: true, - builder: (context) => const NotificationSheet(), - ); - }, - ), -); - class ExploreScreen extends HookConsumerWidget { const ExploreScreen({super.key}); @@ -502,9 +466,6 @@ class ExploreScreen extends HookConsumerWidget { WidgetRef ref, String? currentFilter, ) { - final user = ref.watch(userInfoProvider); - final notificationCount = ref.watch(notificationUnreadCountProvider); - final bodyView = _buildActivityList(context, ref); final notifier = ref.watch(activityListProvider.notifier); @@ -516,38 +477,7 @@ class ExploreScreen extends HookConsumerWidget { onRefresh: notifier.refresh, child: CustomScrollView( slivers: [ - const SliverGap(8), - if (user.value?.activatedAt == null) - SliverToBoxAdapter( - child: AccountUnactivatedCard().padding(bottom: 8), - ), - if (user.value != null) - SliverToBoxAdapter( - child: CheckInWidget( - margin: const EdgeInsets.only(bottom: 8), - ), - ), - SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.only(bottom: 8), - child: PostFeaturedList(), - ), - ), - SliverToBoxAdapter( - child: FriendsOverviewWidget( - padding: const EdgeInsets.only(bottom: 8), - hideWhenEmpty: true, - ), - ), - if (notificationCount.value != null && - notificationCount.value! > 0) - SliverToBoxAdapter( - child: notificationIndicatorWidget( - context, - count: notificationCount.value ?? 0, - margin: const EdgeInsets.only(bottom: 8), - ), - ), + SliverGap(8 + MediaQuery.paddingOf(context).top), bodyView, ], ), diff --git a/lib/widgets/check_in.dart b/lib/widgets/check_in.dart index ea2ba540..1e7abec1 100644 --- a/lib/widgets/check_in.dart +++ b/lib/widgets/check_in.dart @@ -17,7 +17,6 @@ import 'package:island/widgets/content/sheet.dart'; import 'package:island/widgets/account/event_calendar_content.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:slide_countdown/slide_countdown.dart'; import 'package:styled_widget/styled_widget.dart'; part 'check_in.g.dart'; @@ -52,18 +51,11 @@ Future nextNotableDay(Ref ref) async { class CheckInWidget extends HookConsumerWidget { final EdgeInsets? margin; final VoidCallback? onChecked; - final bool checkInOnly; - const CheckInWidget({ - super.key, - this.margin, - this.onChecked, - this.checkInOnly = false, - }); + const CheckInWidget({super.key, this.margin, this.onChecked}); @override Widget build(BuildContext context, WidgetRef ref) { final todayResult = ref.watch(checkInResultTodayProvider); - final nextNotableDay = ref.watch(nextNotableDayProvider); // Update time every second for live progress final currentTime = useState(DateTime.now()); @@ -74,28 +66,6 @@ class CheckInWidget extends HookConsumerWidget { return timer.cancel; }, []); - final now = currentTime.value; - - final userinfo = ref.watch(userInfoProvider); - final isAdult = useMemoized(() { - final birthday = userinfo.value?.profile.birthday; - if (birthday == null) return false; - final age = - now.year - - birthday.year - - ((now.month < birthday.month || - (now.month == birthday.month && now.day < birthday.day)) - ? 1 - : 0); - return age >= 18; - }, [userinfo]); - - final progress = (now.hour * 60.0 + now.minute) / (24 * 60); - final endOfDay = DateTime(now.year, now.month, now.day, 23, 59, 59); - final timeLeft = endOfDay.difference(now); - final timeLeftFormatted = - '${timeLeft.inHours.toString().padLeft(2, '0')}:${(timeLeft.inMinutes % 60).toString().padLeft(2, '0')}:${(timeLeft.inSeconds % 60).toString().padLeft(2, '0')}'; - Future checkIn({String? captchatTk}) async { final client = ref.read(apiClientProvider); try { @@ -128,78 +98,22 @@ class CheckInWidget extends HookConsumerWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (checkInOnly) - AnimatedSwitcher( - duration: const Duration(milliseconds: 300), - child: todayResult.when( - data: (result) { - return Text( - result == null - ? 'checkInNone' - : 'checkInResultLevel${result.level}', - textAlign: TextAlign.start, - ).tr().fontSize(15).bold(); - }, - loading: () => - Text('checkInNone').tr().fontSize(15).bold(), - error: (err, stack) => - Text('error').tr().fontSize(15).bold(), - ), - ).padding(right: 4), - if (!checkInOnly) - Row( - spacing: 6, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - switch (DateTime.now().weekday) { - 6 || 7 => Symbols.weekend, - _ => isAdult ? Symbols.work : Symbols.school, - }, - fill: 1, - size: 16, - ).padding(right: 2), - Text( - DateFormat('EEE').format(DateTime.now()), - ).fontSize(16).bold(), - Text( - DateFormat('MM/dd').format(DateTime.now()), - ).fontSize(16), - Tooltip( - message: timeLeftFormatted, - child: SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator( - trackGap: 0, - value: progress, - strokeWidth: 2, - ), - ), - ), - ], + AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: todayResult.when( + data: (result) { + return Text( + result == null + ? 'checkInNone' + : 'checkInResultLevel${result.level}', + textAlign: TextAlign.start, + ).tr().fontSize(15).bold(); + }, + loading: () => Text('checkInNone').tr().fontSize(15).bold(), + error: (err, stack) => + Text('error').tr().fontSize(15).bold(), ), - if (!checkInOnly) - Row( - spacing: 5, - children: [ - Text('notableDayNext') - .tr(args: [nextNotableDay.value?.localName ?? 'idk']) - .fontSize(12), - if (nextNotableDay.value != null) - SlideCountdown( - decoration: const BoxDecoration(), - style: const TextStyle(fontSize: 12), - separatorStyle: const TextStyle(fontSize: 12), - padding: EdgeInsets.zero, - duration: nextNotableDay.value?.date.difference( - DateTime.now(), - ), - ), - ], - ), - const Gap(2), + ).padding(right: 4), AnimatedSwitcher( duration: const Duration(milliseconds: 300), child: todayResult.when( @@ -256,23 +170,6 @@ class CheckInWidget extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.end, spacing: 4, children: [ - if (!checkInOnly) - AnimatedSwitcher( - duration: const Duration(milliseconds: 300), - child: todayResult.when( - data: (result) { - return Text( - result == null - ? 'checkInNone' - : 'checkInResultLevel${result.level}', - textAlign: TextAlign.start, - ).tr().fontSize(15).bold(); - }, - loading: () => Text('checkInNone').tr().fontSize(15).bold(), - error: (err, stack) => - Text('error').tr().fontSize(15).bold(), - ), - ).padding(right: 4), IconButton.outlined( iconSize: 16, visualDensity: const VisualDensity(