Add new user and bot account indicators

This commit is contained in:
John Wesley 2024-06-06 18:37:31 -04:00
parent 94bfd2e889
commit a3ac6a03b1
9 changed files with 98 additions and 52 deletions

BIN
assets/icons/plant.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

View File

@ -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,
),
],
),
),

View File

@ -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<UserScreen> {
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,
),
],
),
],

View File

@ -51,6 +51,7 @@ class _PostCommentState extends State<PostComment> {
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,

View File

@ -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,

View File

@ -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;

View File

@ -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),
),
);
}
}

View File

@ -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<ContentItem> {
)
: 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),

View File

@ -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(),
);
}
}