Add new user and bot account indicators
This commit is contained in:
parent
94bfd2e889
commit
a3ac6a03b1
Binary file not shown.
After Width: | Height: | Size: 784 B |
|
@ -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,10 +42,9 @@ 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,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
@ -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,10 +222,9 @@ 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,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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,11 +146,9 @@ 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(
|
||||
|
|
|
@ -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(),
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue