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 'badge_avatar.dart'; class ChatTile extends StatefulWidget { const ChatTile({ super.key, required this.index, required this.contactId, required this.senderId, required this.type, required this.text, required this.attachments, required this.dateTime, required this.isShowTime, }); final int index; final String contactId, senderId, type, text, dateTime; final List attachments; final bool isShowTime; @override State createState() => _ChatTileState(); } class _ChatTileState extends State { @override Widget build(BuildContext context) { return Slidable( key: const ValueKey(0), endActionPane: ActionPane( motion: const BehindMotion(), dismissible: DismissiblePane( onDismissed: () { Box chatSettingBox = Hive.box('chat_setting'); ChatSetting chatSetting = chatSettingBox.getAt(widget.index)!; 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) {}, 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( 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, ), ), ), ], ), ), ); } }