Move chat logic to provider

This commit is contained in:
Tommy Chow 2021-09-11 02:17:09 -04:00
parent 0ab1ecdd22
commit 5e3adfb015
2 changed files with 25 additions and 22 deletions

View file

@ -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 = <String, String>{};
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();

View file

@ -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(),
);
},
),
);