import 'package:flutter/material.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:go_router/go_router.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:hive_flutter/hive_flutter.dart'; import '/common/constants.dart'; import '/database/box_type.dart'; import '/models/contact_model.dart'; import '/models/init_get_it.dart'; import '/request/server.dart'; import 'badge_avatar.dart'; class FriendChatTile extends StatefulWidget { const FriendChatTile({ super.key, required this.contactId, required this.senderId, required this.messageType, required this.text, required this.attachments, required this.dateTime, required this.isShowTime, required this.unreadCount, }); final int unreadCount; final String contactId, senderId, messageType, text, dateTime; final List attachments; final bool isShowTime; @override State createState() => _FriendChatTileState(); } class _FriendChatTileState extends State { @override Widget build(BuildContext context) { Box chatSettingBox = Hive.box('chat_setting'); ChatSetting chatSetting = chatSettingBox.get(widget.contactId)!; return Slidable( key: const ValueKey(0), endActionPane: ActionPane( motion: const BehindMotion(), dismissible: DismissiblePane( onDismissed: () { chatSetting.isOpen = false; chatSettingBox.put(widget.contactId, chatSetting); }, ), children: [ SlidableAction( onPressed: (BuildContext context) {}, backgroundColor: kSecondaryColor, foregroundColor: kContentColorDark, icon: Icons.arrow_upward_rounded, label: '置顶', ), SlidableAction( onPressed: (BuildContext context) { chatSetting.isHideMsg = !chatSetting.isHideMsg; chatSettingBox.put(widget.contactId, chatSetting); }, foregroundColor: kContentColorDark, backgroundColor: kPrimaryColor, icon: Icons.remove_red_eye, label: chatSetting.isHideMsg ? '显示消息' : '隐藏消息', flex: 1, ), ], ), child: ListTile( // Must have a onTap callback or Ink won't work onTap: () { context.pushNamed( 'Message', queryParameters: { 'friendId': widget.contactId, 'type': '0', }, ); }, leading: BadgeAvatar( unreadCount: widget.unreadCount, radius: 25, backgroundImage: CachedNetworkImageProvider( '$userAvatarsUrl/${getIt.get().friends[widget.contactId]!.avatar}', ), ), title: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( // friend remark or nickname child: Text( getIt .get() .friends[widget.contactId]! .friendRemark .isEmpty ? getIt .get() .friends[widget.contactId]! .nickname : getIt .get() .friends[widget.contactId]! .friendRemark, overflow: TextOverflow.ellipsis, ), ), // latest msg datetime Text( widget.dateTime, style: const TextStyle( fontSize: 14, color: kUnActivatedColor, ), ), ], ), subtitle: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( widget.text, overflow: TextOverflow.ellipsis, style: const TextStyle( color: kUnActivatedColor, fontSize: 15, ), ), ), ], ), ), ); } }