Optimized chat

This commit is contained in:
LittleSheep 2024-06-05 23:55:21 +08:00
parent ca1a8a04cb
commit df7dd85a0c
3 changed files with 62 additions and 70 deletions

View File

@ -339,7 +339,6 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
Expanded(
child: PagedListView<int, Message>(
reverse: true,
clipBehavior: Clip.none,
pagingController: _pagingController,
builderDelegate: PagedChildBuilderDelegate<Message>(
itemBuilder: buildHistory,
@ -351,8 +350,8 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
),
Positioned(
bottom: math.max(MediaQuery.of(context).padding.bottom, 16),
left: 16,
right: 16,
left: 0,
right: 0,
child: ChatMessageInput(
edit: _messageToEditing,
reply: _messageToReplying,

View File

@ -116,8 +116,6 @@ class ChatMessage extends StatelessWidget {
item.sender.account.nick,
style: const TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(width: 4),
Text(format(item.createdAt, locale: 'en_short')),
Expanded(child: buildContent()),
],
);

View File

@ -157,8 +157,6 @@ class _ChatMessageInputState extends State<ChatMessageInput> {
@override
Widget build(BuildContext context) {
const borderRadius = BorderRadius.all(Radius.circular(20));
final notifyBannerActions = [
TextButton(
onPressed: resetInput,
@ -167,71 +165,68 @@ class _ChatMessageInputState extends State<ChatMessageInput> {
];
return Material(
borderRadius: borderRadius,
elevation: 2,
child: ClipRRect(
borderRadius: borderRadius,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_replyTo != null)
MaterialBanner(
leading: const FaIcon(FontAwesomeIcons.reply, size: 18),
dividerColor: Colors.transparent,
content: ChatMessage(
item: _replyTo!,
isContentPreviewing: true,
),
actions: notifyBannerActions,
color: Theme.of(context).colorScheme.surface,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Divider(thickness: 0.3, height: 0.3),
if (_replyTo != null)
MaterialBanner(
leading: const FaIcon(FontAwesomeIcons.reply, size: 18),
dividerColor: Colors.transparent,
content: ChatMessage(
item: _replyTo!,
isContentPreviewing: true,
),
if (_editTo != null)
MaterialBanner(
leading: const Icon(Icons.edit),
dividerColor: Colors.transparent,
content: ChatMessage(
item: _editTo!,
isContentPreviewing: true,
),
actions: notifyBannerActions,
),
SizedBox(
height: 56,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: TextField(
controller: _textController,
focusNode: _focusNode,
maxLines: null,
autocorrect: true,
keyboardType: TextInputType.text,
decoration: InputDecoration.collapsed(
hintText: widget.placeholder ??
'messageInputPlaceholder'.trParams(
{'channel': '#${widget.channel.alias}'},
),
),
onSubmitted: (_) => sendMessage(),
onTapOutside: (_) =>
FocusManager.instance.primaryFocus?.unfocus(),
),
),
IconButton(
icon: const Icon(Icons.attach_file),
color: Colors.teal,
onPressed: () => showAttachments(),
),
IconButton(
icon: const Icon(Icons.send),
color: Theme.of(context).colorScheme.primary,
onPressed: () => sendMessage(),
)
],
).paddingOnly(left: 16, right: 4),
actions: notifyBannerActions,
),
],
),
if (_editTo != null)
MaterialBanner(
leading: const Icon(Icons.edit),
dividerColor: Colors.transparent,
content: ChatMessage(
item: _editTo!,
isContentPreviewing: true,
),
actions: notifyBannerActions,
),
SizedBox(
height: 56,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: TextField(
controller: _textController,
focusNode: _focusNode,
maxLines: null,
autocorrect: true,
keyboardType: TextInputType.text,
decoration: InputDecoration.collapsed(
hintText: widget.placeholder ??
'messageInputPlaceholder'.trParams(
{'channel': '#${widget.channel.alias}'},
),
),
onSubmitted: (_) => sendMessage(),
onTapOutside: (_) =>
FocusManager.instance.primaryFocus?.unfocus(),
),
),
IconButton(
icon: const Icon(Icons.attach_file),
color: Colors.teal,
onPressed: () => showAttachments(),
),
IconButton(
icon: const Icon(Icons.send),
color: Theme.of(context).colorScheme.primary,
onPressed: () => sendMessage(),
)
],
).paddingOnly(left: 20, right: 16),
),
],
),
);
}