diff --git a/lib/providers/chat_provider.dart b/lib/providers/chat_provider.dart index 15f4fbee..7cbfb531 100644 --- a/lib/providers/chat_provider.dart +++ b/lib/providers/chat_provider.dart @@ -1,8 +1,9 @@ -import 'package:flutter/foundation.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/widgets.dart'; import 'package:frosty/models/channel.dart'; import 'package:frosty/providers/authentication_provider.dart'; import 'package:frosty/utility/request.dart'; +import 'package:frosty/widgets/chat_message.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; class ChatProvider extends ChangeNotifier { @@ -64,7 +65,7 @@ class ChatProvider extends ChangeNotifier { } } - List parseIrcMessage(String whole) { + void parseIrcMessage(String whole) { var mappedTags = {}; final tagAndIrcMessageDivider = whole.indexOf(' '); @@ -94,7 +95,11 @@ class ChatProvider extends ChangeNotifier { break; case 'PRIVMSG': final message = splitMessage.sublist(3).join(' ').substring(1); - return privateMessage(tags: mappedTags, chatMessage: message); + messages.add(const SizedBox(height: 10)); + messages.add(ChatMessage( + children: privateMessage(tags: mappedTags, chatMessage: message), + )); + break; case 'ROOMSTATE': break; case 'USERNOTICE': @@ -102,10 +107,10 @@ class ChatProvider extends ChangeNotifier { case 'USERSTATE': break; } - return []; } List privateMessage({required Map tags, required String chatMessage}) { + debugPrint(chatMessage); var result = []; final emoteTags = tags['emotes']; @@ -147,8 +152,10 @@ class ChatProvider extends ChangeNotifier { result.add( WidgetSpan( alignment: PlaceholderAlignment.middle, - child: Image.network( - badgeUrl, + child: CachedNetworkImage( + imageUrl: badgeUrl, + placeholder: (context, url) => const SizedBox(), + fadeInDuration: const Duration(seconds: 0), height: 20, ), ), @@ -179,8 +186,10 @@ class ChatProvider extends ChangeNotifier { result.add( WidgetSpan( alignment: PlaceholderAlignment.middle, - child: Image.network( - emoteUrl, + child: CachedNetworkImage( + imageUrl: emoteUrl, + placeholder: (context, url) => const SizedBox(), + fadeInDuration: const Duration(seconds: 0), height: 25, ), ), diff --git a/lib/screens/chat.dart b/lib/screens/chat.dart index b3623bda..47383d75 100644 --- a/lib/screens/chat.dart +++ b/lib/screens/chat.dart @@ -5,7 +5,6 @@ import 'package:frosty/providers/chat_provider.dart'; import 'package:frosty/widgets/chat_message.dart'; import 'package:provider/provider.dart'; -// TODO: Remove test token dependency. // TODO: Use padding/margin for badge spacing. class Chat extends StatelessWidget { @@ -28,10 +27,7 @@ class Chat extends StatelessWidget { for (final message in snapshot.data.toString().split('\r\n')) { // print(message); if (message.startsWith('@')) { - viewModel.messages.add(const SizedBox(height: 10)); - viewModel.messages.add(ChatMessage( - children: viewModel.parseIrcMessage(message), - )); + viewModel.parseIrcMessage(message); } if (viewModel.autoScroll) { SchedulerBinding.instance?.addPostFrameCallback((_) { diff --git a/lib/widgets/channel_card.dart b/lib/widgets/channel_card.dart index 9abf4329..da37788e 100644 --- a/lib/widgets/channel_card.dart +++ b/lib/widgets/channel_card.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:frosty/models/channel.dart'; import 'package:frosty/providers/chat_provider.dart'; @@ -43,8 +44,8 @@ class ChannelCard extends StatelessWidget { flex: 1, child: Padding( padding: const EdgeInsets.only(left: 10.0), - child: Image.network( - channelInfo.thumbnailUrl.replaceFirst('-{width}x{height}', '-1024x576'), + child: CachedNetworkImage( + imageUrl: channelInfo.thumbnailUrl.replaceFirst('-{width}x{height}', '-1024x576'), ), ), ),