import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:hive_flutter/hive_flutter.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/utils/format_datetime.dart'; import 'components/message_bubble.dart'; import 'components/message_input_box.dart'; class MessageScreen extends StatefulWidget { const MessageScreen({ super.key, required this.contactId, }); final String contactId; @override State createState() => _MessageScreenState(); } class _MessageScreenState extends State { ScrollController _controller = ScrollController(); @override void initState() { super.initState(); Future.delayed( const Duration(microseconds: 500), () => _controller.jumpTo(_controller.position.maxScrollExtent), ); } @override void dispose() { super.dispose(); _controller.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: IconButton( onPressed: () { context.go('/chat'); }, icon: const Icon(Icons.arrow_back), ), // friend remark or nickname title: getIt .get() .friends[widget.contactId]! .friendRemark .isEmpty ? Text( getIt .get() .friends[widget.contactId]! .nickname, ) : Text( getIt.get().friends[widget.contactId]!.friendRemark, ), centerTitle: true, actions: [ IconButton( onPressed: () {}, icon: const Icon(Icons.menu), splashRadius: 18, ), ], ), body: Column( children: [ Expanded( child: ValueListenableBuilder( valueListenable: Hive.box('message_${widget.contactId}') .listenable(), builder: (context, value, _) { return ListView.builder( physics: const BouncingScrollPhysics( parent: AlwaysScrollableScrollPhysics(), ), controller: _controller, itemCount: Hive.box('message_${widget.contactId}').length, itemBuilder: (context, index) { Box messageTBox = Hive.box('message_${widget.contactId}'); MessageT messageT = messageTBox.getAt(index)!; return MessageBubble( contactId: widget.contactId, senderId: messageT.senderId, dateTime: formatMessageDateTime(messageT.dateTime), isShowTime: messageT.isShowTime, type: messageT.type, text: messageT.text, attachments: messageT.attachments, ); }, ); }, ), ), MessageInputBox( contactId: widget.contactId, scrollController: _controller, ), ], ), bottomNavigationBar: null, ); } }