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 'package:together_mobile/common/constants.dart'; import 'package:together_mobile/database/box_type.dart'; import 'package:together_mobile/models/contact_model.dart'; import 'package:together_mobile/models/init_get_it.dart'; import 'package:together_mobile/request/server.dart'; import 'package:together_mobile/utils/format_datetime.dart'; import 'badge_avatar.dart'; class ChatTile extends StatefulWidget { const ChatTile({ super.key, required this.contactId, }); final String contactId; @override State createState() => _ChatTileState(); } class _ChatTileState extends State { late Map _latestMsg; @override void initState() { super.initState(); Box messageTBox = Hive.box('message_${widget.contactId}'); int length = messageTBox.length; if (length > 0) { MessageT messageT = messageTBox.getAt(length - 1)!; _latestMsg = { 'senderId': messageT.senderId, 'type': messageT.type, 'text': messageT.text, 'attachments': messageT.attachments, 'dateTime': formatMessageDateTime(messageT.dateTime), 'isShowTime': messageT.isShowTime, }; } else { _latestMsg = { 'senderId': '', 'type': '', 'text': '', 'attachments': [], 'dateTime': [], 'isShowTime': false, }; } } @override Widget build(BuildContext context) { return Slidable( key: const ValueKey(0), endActionPane: ActionPane( motion: const BehindMotion(), dismissible: DismissiblePane( onDismissed: () {}, ), children: [ SlidableAction( onPressed: (BuildContext context) {}, backgroundColor: kSecondaryColor, foregroundColor: kContentColorDark, icon: Icons.arrow_upward_rounded, label: '置顶', ), SlidableAction( onPressed: (BuildContext context) {}, foregroundColor: kContentColorDark, backgroundColor: kPrimaryColor, icon: Icons.remove_red_eye, label: '隐藏信息', flex: 1, ), ], ), child: ListTile( // Must have a onTap callback or Ink won't work onTap: () => context.goNamed( 'Message', queryParameters: {'contactId': widget.contactId}, ), leading: getIt .get() .friends[widget.contactId]! .avatar .isEmpty ? const BadgeAvatar( count: 99, radius: 25, backgroundImage: AssetImage('assets/images/user_3.png'), ) : BadgeAvatar( count: 99, radius: 25, backgroundImage: CachedNetworkImageProvider( '$avatarsUrl/${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( _latestMsg['dateTime']!, style: const TextStyle( fontSize: 14, color: kUnActivatedColor, ), ), ], ), subtitle: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( _latestMsg['text'], overflow: TextOverflow.ellipsis, style: const TextStyle( color: kUnActivatedColor, fontSize: 15, ), ), ), // Text('10:13'), ], ), ), ); } }