From a9cfbe7817b06acede4f354c1a63db3fe79efe2f Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 10 May 2025 13:19:28 +0800 Subject: [PATCH] :sparkles: Status activity --- assets/i18n/en-US.json | 5 ++- lib/main.dart | 2 ++ lib/screens/explore.dart | 3 ++ lib/widgets/account/status.dart | 55 +++++++++++++++++++++++++++++++++ pubspec.lock | 8 +++++ pubspec.yaml | 1 + 6 files changed, 73 insertions(+), 1 deletion(-) diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index 6f3a92f..b92d13e 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -138,5 +138,8 @@ "statusClearTime": "Cleared At", "statusNoAutoClear": "Do not auto clear", "online": "Online", - "offline": "Offline" + "offline": "Offline", + "status": "Status", + "statusActivityTitle": "{} is {} {}", + "statusActivityEndedTitle": "{} is {} {} until {}" } diff --git a/lib/main.dart b/lib/main.dart index 4fefc41..0860137 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,6 +19,7 @@ import 'package:island/pods/websocket.dart'; import 'package:island/route.dart'; import 'package:island/services/notify.dart'; import 'package:island/widgets/app_scaffold.dart'; +import 'package:relative_time/relative_time.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; @@ -102,6 +103,7 @@ class IslandApp extends HookConsumerWidget { localizationsDelegates: [ ...context.localizationDelegates, CroppyLocalizations.delegate, + RelativeTimeLocalizations.delegate, ], // this contains the cupertino one locale: context.locale, builder: (context, child) { diff --git a/lib/screens/explore.dart b/lib/screens/explore.dart index 4a85ab8..d591236 100644 --- a/lib/screens/explore.dart +++ b/lib/screens/explore.dart @@ -5,6 +5,7 @@ import 'package:gap/gap.dart'; import 'package:island/models/activity.dart'; import 'package:island/pods/userinfo.dart'; import 'package:island/route.gr.dart'; +import 'package:island/widgets/account/status.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/models/post.dart'; import 'package:island/widgets/check_in.dart'; @@ -66,6 +67,8 @@ class ExploreScreen extends ConsumerWidget { ); case 'accounts.check-in': return CheckInActivityWidget(item: item); + case 'accounts.status': + return StatusActivityWidget(item: item); default: return Placeholder(); } diff --git a/lib/widgets/account/status.dart b/lib/widgets/account/status.dart index 9e767f6..074b078 100644 --- a/lib/widgets/account/status.dart +++ b/lib/widgets/account/status.dart @@ -1,11 +1,15 @@ import 'package:dio/dio.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:island/models/activity.dart'; import 'package:island/models/user.dart'; import 'package:island/pods/network.dart'; import 'package:island/widgets/account/status_creation.dart'; +import 'package:island/widgets/content/cloud_files.dart'; import 'package:material_symbols_icons/symbols.dart'; +import 'package:relative_time/relative_time.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:styled_widget/styled_widget.dart'; @@ -128,3 +132,54 @@ class AccountStatusWidget extends HookConsumerWidget { ).opacity((userStatus.value?.isCustomized ?? false) ? 1 : 0.85); } } + +class StatusActivityWidget extends StatelessWidget { + final SnActivity item; + const StatusActivityWidget({super.key, required this.item}); + + @override + Widget build(BuildContext context) { + final result = SnAccountStatus.fromJson(item.data); + return Row( + spacing: 12, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ProfilePictureWidget( + fileId: item.account.profile.pictureId, + radius: 12, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon(Symbols.circle, size: 12).padding(top: 1, left: 2), + const Gap(4), + Text('status').fontSize(11).tr(), + ], + ).opacity(0.85), + Text( + result.clearedAt == null + ? 'statusActivityTitle' + : 'statusActivityEndedTitle', + ) + .tr( + args: [ + item.account.nick, + result.label, + RelativeTime(context).format(result.createdAt), + if (result.clearedAt != null) + RelativeTime(context).format(result.clearedAt!), + ], + ) + .fontSize(13) + .padding(left: 2), + ], + ), + ), + ], + ).padding(horizontal: 16, vertical: 12); + } +} diff --git a/pubspec.lock b/pubspec.lock index 0ca4448..207a3d2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1397,6 +1397,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.0" + relative_time: + dependency: "direct main" + description: + name: relative_time + sha256: "4e6c3b27d98ff6af5061b6dbaca178b5aa2607b7a7c2a77e6cae1d32b2759893" + url: "https://pub.dev" + source: hosted + version: "5.0.0" responsive_framework: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index c78f40a..411a6c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -93,6 +93,7 @@ dependencies: croppy: ^1.3.6 tencent_rtc_sdk: ^12.3.6 table_calendar: ^3.1.3 + relative_time: ^5.0.0 dev_dependencies: flutter_test: