Move chat logic to provider
This commit is contained in:
parent
0ab1ecdd22
commit
5e3adfb015
2 changed files with 25 additions and 22 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue