From 5e3adfb01556e89db98aeeefbc1acfdaabed6e25 Mon Sep 17 00:00:00 2001 From: Tommy Chow Date: Sat, 11 Sep 2021 02:17:09 -0400 Subject: [PATCH] Move chat logic to provider --- lib/providers/chat_provider.dart | 27 ++++++++++++++++++++------- lib/screens/chat.dart | 20 +++++--------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/providers/chat_provider.dart b/lib/providers/chat_provider.dart index 50923ff2..899c748c 100644 --- a/lib/providers/chat_provider.dart +++ b/lib/providers/chat_provider.dart @@ -66,15 +66,20 @@ class ChatProvider extends ChangeNotifier { } } - void parseIrcMessage(String whole) { - if (whole.startsWith('P')) { - channel.sink.add('PONG :tmi.twitch.tv'); - return; - } - if (!whole.startsWith('@')) { - return; + void handleWebsocketData(Object? data) { + for (final message in data.toString().split('\r\n')) { + if (message.startsWith('@')) { + parseIrcMessage(message); + continue; + } + if (message.startsWith('P')) { + channel.sink.add('PONG :tmi.twitch.tv'); + continue; + } } + } + void parseIrcMessage(String whole) { var mappedTags = {}; final tagAndIrcMessageDivider = whole.indexOf(' '); @@ -216,6 +221,14 @@ class ChatProvider extends ChangeNotifier { return result; } + void resumeScroll() { + autoScroll = true; + scrollController.jumpTo(scrollController.position.maxScrollExtent); + SchedulerBinding.instance?.addPostFrameCallback((_) { + scrollController.jumpTo(scrollController.position.maxScrollExtent); + }); + } + @override void dispose() { channel.sink.close(); diff --git a/lib/screens/chat.dart b/lib/screens/chat.dart index 9f35e6b5..797eeec8 100644 --- a/lib/screens/chat.dart +++ b/lib/screens/chat.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; import 'package:frosty/models/channel.dart'; import 'package:frosty/providers/chat_provider.dart'; import 'package:provider/provider.dart'; @@ -21,9 +20,7 @@ class Chat extends StatelessWidget { return StreamBuilder( stream: viewModel.channel.stream, builder: (context, snapshot) { - for (final message in snapshot.data.toString().split('\r\n')) { - viewModel.parseIrcMessage(message); - } + viewModel.handleWebsocketData(snapshot.data); return Stack( alignment: AlignmentDirectional.bottomCenter, children: [ @@ -40,13 +37,7 @@ class Chat extends StatelessWidget { return Visibility( visible: !viewModel.autoScroll, child: ElevatedButton( - onPressed: () { - viewModel.autoScroll = true; - viewModel.scrollController.jumpTo(viewModel.scrollController.position.maxScrollExtent); - SchedulerBinding.instance?.addPostFrameCallback((_) { - viewModel.scrollController.jumpTo(viewModel.scrollController.position.maxScrollExtent); - }); - }, + onPressed: () => viewModel.resumeScroll(), child: const Text('Resume Scroll'), ), ); @@ -56,11 +47,10 @@ class Chat extends StatelessWidget { ); }, ); - } else { - return const Center( - child: CircularProgressIndicator(), - ); } + return const Center( + child: CircularProgressIndicator(), + ); }, ), );