From a3ac6a03b10129fbaf5f27eff7bbdbc15cb3d17d Mon Sep 17 00:00:00 2001 From: John Wesley Date: Thu, 6 Jun 2024 18:37:31 -0400 Subject: [PATCH] Add new user and bot account indicators --- assets/icons/plant.png | Bin 0 -> 784 bytes lib/src/screens/explore/user_item.dart | 11 ++-- lib/src/screens/explore/user_screen.dart | 11 ++-- lib/src/screens/feed/post_comment.dart | 1 + lib/src/screens/feed/post_item.dart | 1 + lib/src/utils/utils.dart | 6 -- lib/src/widgets/cake_day_icon.dart | 27 -------- lib/src/widgets/content_item.dart | 14 ++-- lib/src/widgets/user_status_icons.dart | 79 +++++++++++++++++++++++ 9 files changed, 98 insertions(+), 52 deletions(-) create mode 100644 assets/icons/plant.png delete mode 100644 lib/src/widgets/cake_day_icon.dart create mode 100644 lib/src/widgets/user_status_icons.dart diff --git a/assets/icons/plant.png b/assets/icons/plant.png new file mode 100644 index 0000000000000000000000000000000000000000..39e76da86f1c564ed7068b7e33ff54a59dcb0240 GIT binary patch literal 784 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$W1AIbUf%NW5m7nFIYh-~_2QXB>tBP-W(O-gYo>4iy<_h&rd2;%%l7}- zxO1w-l~-0f`jQ!c7M0B9e{+4Q`S;uU%88j`3e(L+g6G6mGPtZfX?$2ban}76cll#C zr{up|Gt>Dbv)Jj3^*zUmCrRB1KF=(Yed5err*$8B56oIT@$Q|Rt7=!aGc_Dt5wX$p z6@!DtN8j+2OWCGRCPp60IJ$|oBlef?>KAchI>vlW$wQFU#v|(*-VtH9z z)s<-)^xyH{;Ersta8 z-?QFqwryaxe{7DRRo>0VFZU+LGITt?nZK>0V{&@(*^*P~ELXx^drbd0hI|NTdUPXZ z-xIzE+lBs~GF<$=$|T%z4YDe!a-pAWAJqKb6Mw< G&;$UKVvi{R literal 0 HcmV?d00001 diff --git a/lib/src/screens/explore/user_item.dart b/lib/src/screens/explore/user_item.dart index 48a2795..80956a0 100644 --- a/lib/src/screens/explore/user_item.dart +++ b/lib/src/screens/explore/user_item.dart @@ -4,8 +4,8 @@ import 'package:interstellar/src/screens/explore/user_screen.dart'; import 'package:interstellar/src/screens/settings/settings_controller.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:interstellar/src/widgets/avatar.dart'; -import 'package:interstellar/src/widgets/cake_day_icon.dart'; import 'package:interstellar/src/widgets/subscription_button.dart'; +import 'package:interstellar/src/widgets/user_status_icons.dart'; import 'package:provider/provider.dart'; class UserItem extends StatelessWidget { @@ -42,11 +42,10 @@ class UserItem extends StatelessWidget { children: [ Flexible( child: Text(user.name, overflow: TextOverflow.ellipsis)), - if (isSameDayOfYear(user.createdAt)) - const Padding( - padding: EdgeInsets.only(left: 5), - child: CakeDayIcon(), - ), + UserStatusIcons( + cakeDay: user.createdAt, + isBot: user.isBot, + ), ], ), ), diff --git a/lib/src/screens/explore/user_screen.dart b/lib/src/screens/explore/user_screen.dart index 927e737..a80343b 100644 --- a/lib/src/screens/explore/user_screen.dart +++ b/lib/src/screens/explore/user_screen.dart @@ -17,13 +17,13 @@ import 'package:interstellar/src/screens/profile/profile_edit_screen.dart'; import 'package:interstellar/src/screens/settings/settings_controller.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:interstellar/src/widgets/avatar.dart'; -import 'package:interstellar/src/widgets/cake_day_icon.dart'; import 'package:interstellar/src/widgets/image.dart'; import 'package:interstellar/src/widgets/loading_template.dart'; import 'package:interstellar/src/widgets/markdown/markdown.dart'; import 'package:interstellar/src/widgets/markdown/markdown_editor.dart'; import 'package:interstellar/src/widgets/star_button.dart'; import 'package:interstellar/src/widgets/subscription_button.dart'; +import 'package:interstellar/src/widgets/user_status_icons.dart'; import 'package:provider/provider.dart'; enum UserFeedType { thread, microblog, comment, reply, follower, following } @@ -222,11 +222,10 @@ class _UserScreenState extends State { children: [ Text( 'Joined: ${dateOnlyFormat(user.createdAt)}'), - if (isSameDayOfYear(user.createdAt)) - const Padding( - padding: EdgeInsets.only(left: 5), - child: CakeDayIcon(), - ), + UserStatusIcons( + cakeDay: user.createdAt, + isBot: user.isBot, + ), ], ), ], diff --git a/lib/src/screens/feed/post_comment.dart b/lib/src/screens/feed/post_comment.dart index 2fa6844..56581e0 100644 --- a/lib/src/screens/feed/post_comment.dart +++ b/lib/src/screens/feed/post_comment.dart @@ -51,6 +51,7 @@ class _PostCommentState extends State { userIcon: widget.comment.user.avatar, userIdOnClick: widget.comment.user.id, userCakeDay: widget.comment.user.createdAt, + userIsBot: widget.comment.user.isBot ?? false, opUserId: widget.opUserId, boosts: widget.comment.boosts, isBoosted: widget.comment.myBoost == true, diff --git a/lib/src/screens/feed/post_item.dart b/lib/src/screens/feed/post_item.dart index c091d22..63f4358 100644 --- a/lib/src/screens/feed/post_item.dart +++ b/lib/src/screens/feed/post_item.dart @@ -45,6 +45,7 @@ class PostItem extends StatelessWidget { userIcon: item.user.avatar, userIdOnClick: item.user.id, userCakeDay: item.user.createdAt, + userIsBot: item.user.isBot ?? false, magazine: item.magazine.name, magazineIcon: item.magazine.icon, magazineIdOnClick: item.magazine.id, diff --git a/lib/src/utils/utils.dart b/lib/src/utils/utils.dart index 2d4b93f..b743a76 100644 --- a/lib/src/utils/utils.dart +++ b/lib/src/utils/utils.dart @@ -55,12 +55,6 @@ String dateDiffFormat(DateTime input) { return '${seconds}s'; } -bool isSameDayOfYear(DateTime input) { - final now = DateTime.now(); - - return input.month == now.month && input.day == now.day; -} - void httpErrorHandler(http.Response response, {String? message}) { if (response.statusCode >= 400) { String? errorDetails; diff --git a/lib/src/widgets/cake_day_icon.dart b/lib/src/widgets/cake_day_icon.dart deleted file mode 100644 index 449c730..0000000 --- a/lib/src/widgets/cake_day_icon.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -class CakeDayIcon extends StatelessWidget { - const CakeDayIcon({super.key}); - - @override - Widget build(BuildContext context) { - return Tooltip( - message: 'Cake Day', - child: ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (Rect bounds) => const LinearGradient( - transform: GradientRotation(pi / 2), - stops: [0, 0.5, 1], - colors: [ - Colors.yellow, - Colors.pink, - Colors.blue, - ], - ).createShader(bounds), - child: const Icon(Icons.cake), - ), - ); - } -} diff --git a/lib/src/widgets/content_item.dart b/lib/src/widgets/content_item.dart index 560fdb2..94f9c03 100644 --- a/lib/src/widgets/content_item.dart +++ b/lib/src/widgets/content_item.dart @@ -6,13 +6,13 @@ import 'package:interstellar/src/screens/explore/user_screen.dart'; import 'package:interstellar/src/screens/settings/settings_controller.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:interstellar/src/widgets/blur.dart'; -import 'package:interstellar/src/widgets/cake_day_icon.dart'; import 'package:interstellar/src/widgets/display_name.dart'; import 'package:interstellar/src/widgets/image.dart'; import 'package:interstellar/src/widgets/markdown/markdown.dart'; import 'package:interstellar/src/widgets/markdown/markdown_editor.dart'; import 'package:interstellar/src/widgets/open_webpage.dart'; import 'package:interstellar/src/widgets/report_content.dart'; +import 'package:interstellar/src/widgets/user_status_icons.dart'; import 'package:interstellar/src/widgets/video.dart'; import 'package:interstellar/src/widgets/wrapper.dart'; import 'package:provider/provider.dart'; @@ -38,6 +38,7 @@ class ContentItem extends StatefulWidget { final ImageModel? userIcon; final int? userIdOnClick; final DateTime? userCakeDay; + final bool userIsBot; final int? opUserId; final String? magazine; @@ -87,6 +88,7 @@ class ContentItem extends StatefulWidget { this.userIcon, this.userIdOnClick, this.userCakeDay, + this.userIsBot = false, this.opUserId, this.magazine, this.magazineIcon, @@ -144,12 +146,10 @@ class _ContentItemState extends State { ) : null, ), - if (widget.userCakeDay != null && - isSameDayOfYear(widget.userCakeDay!)) - const Padding( - padding: EdgeInsets.only(left: 5), - child: CakeDayIcon(), - ), + UserStatusIcons( + cakeDay: widget.userCakeDay, + isBot: widget.userIsBot, + ), if (widget.opUserId == widget.userIdOnClick) const Padding( padding: EdgeInsets.only(left: 5), diff --git a/lib/src/widgets/user_status_icons.dart b/lib/src/widgets/user_status_icons.dart new file mode 100644 index 0000000..709d0bb --- /dev/null +++ b/lib/src/widgets/user_status_icons.dart @@ -0,0 +1,79 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class UserStatusIcons extends StatelessWidget { + final DateTime? cakeDay; + final bool isBot; + + const UserStatusIcons({ + required this.cakeDay, + required this.isBot, + super.key, + }); + + @override + Widget build(BuildContext context) { + final now = DateTime.now(); + + Widget? botWidget; + Widget? cakeDayWidget; + + if (isBot) { + botWidget = const Tooltip( + message: 'Bot Account', + child: Icon(Icons.smart_toy_outlined), + ); + } + + if (cakeDay == null) { + } else if (now.difference(cakeDay!).inDays <= 14) { + cakeDayWidget = Tooltip( + message: 'New User', + child: ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (Rect bounds) => const LinearGradient( + transform: GradientRotation(pi / 2), + stops: [0, 1], + colors: [ + Colors.green, + Colors.lightGreen, + ], + ).createShader(bounds), + child: const ImageIcon( + AssetImage('assets/icons/plant.png'), + ), + ), + ); + } else if (cakeDay!.day == now.day && cakeDay!.month == now.month) { + cakeDayWidget = Tooltip( + message: 'Cake Day', + child: ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (Rect bounds) => const LinearGradient( + transform: GradientRotation(pi / 2), + stops: [0, 0.5, 1], + colors: [ + Colors.yellow, + Colors.pink, + Colors.blue, + ], + ).createShader(bounds), + child: const Icon(Icons.cake), + ), + ); + } + + return Row( + children: [ + if (botWidget != null) botWidget, + if (cakeDayWidget != null) cakeDayWidget, + ] + .map((widget) => Padding( + padding: const EdgeInsets.only(left: 5), + child: widget, + )) + .toList(), + ); + } +}