♻️ Basic things to move to events system

This commit is contained in:
2024-06-28 00:05:43 +08:00
parent e84bca8948
commit bbc9ea69f7
14 changed files with 416 additions and 308 deletions

View File

@ -4,11 +4,11 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:get/get.dart';
import 'package:solian/controllers/chat_history_controller.dart';
import 'package:solian/controllers/chat_events_controller.dart';
import 'package:solian/exts.dart';
import 'package:solian/models/call.dart';
import 'package:solian/models/channel.dart';
import 'package:solian/models/message.dart';
import 'package:solian/models/event.dart';
import 'package:solian/models/packet.dart';
import 'package:solian/providers/auth.dart';
import 'package:solian/providers/chat.dart';
@ -50,7 +50,7 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
ChannelMember? _channelProfile;
StreamSubscription<NetworkPackage>? _subscription;
late final ChatHistoryController _chatController;
late final ChatEventController _chatController;
getProfile() async {
final AuthProvider auth = Get.find();
@ -109,36 +109,22 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
final ChatProvider provider = Get.find();
_subscription = provider.stream.stream.listen((event) {
switch (event.method) {
case 'messages.new':
final payload = Message.fromJson(event.payload!);
if (payload.channelId == _channel?.id) {
_chatController.receiveMessage(payload);
}
break;
case 'messages.update':
final payload = Message.fromJson(event.payload!);
if (payload.channelId == _channel?.id) {
_chatController.replaceMessage(payload);
}
break;
case 'messages.burnt':
final payload = Message.fromJson(event.payload!);
if (payload.channelId == _channel?.id) {
_chatController.burnMessage(payload.id);
}
case 'events.new':
final payload = Event.fromJson(event.payload!);
_chatController.receiveEvent(payload);
break;
case 'calls.new':
final payload = Call.fromJson(event.payload!);
_ongoingCall = payload;
setState(() => _ongoingCall = payload);
break;
case 'calls.end':
_ongoingCall = null;
setState(() => _ongoingCall = null);
break;
}
});
}
bool checkMessageMergeable(Message? a, Message? b) {
bool checkMessageMergeable(Event? a, Event? b) {
if (a?.replyTo != null) return false;
if (a == null || b == null) return false;
if (a.sender.account.id != b.sender.account.id) return false;
@ -156,10 +142,10 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
);
}
Message? _messageToReplying;
Message? _messageToEditing;
Event? _messageToReplying;
Event? _messageToEditing;
Widget buildHistoryBody(Message item, {bool isMerged = false}) {
Widget buildHistoryBody(Event item, {bool isMerged = false}) {
if (item.replyTo != null) {
return Column(
children: [
@ -188,18 +174,18 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
bool isMerged = false, hasMerged = false;
if (index > 0) {
hasMerged = checkMessageMergeable(
_chatController.currentHistory[index - 1].data,
_chatController.currentHistory[index].data,
_chatController.currentEvents[index - 1].data,
_chatController.currentEvents[index].data,
);
}
if (index + 1 < _chatController.currentHistory.length) {
if (index + 1 < _chatController.currentEvents.length) {
isMerged = checkMessageMergeable(
_chatController.currentHistory[index].data,
_chatController.currentHistory[index + 1].data,
_chatController.currentEvents[index].data,
_chatController.currentEvents[index + 1].data,
);
}
final item = _chatController.currentHistory[index].data;
final item = _chatController.currentEvents[index].data;
return InkWell(
child: Container(
@ -230,18 +216,19 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
@override
void initState() {
_chatController = ChatHistoryController();
_chatController = ChatEventController();
_chatController.initialize();
getChannel().then((_) {
_chatController.getMessages(_channel!, widget.realm);
_chatController.channel = _channel!;
_chatController.getEvents(_channel!, widget.realm);
listenMessages();
});
getProfile();
getOngoingCall();
listenMessages();
super.initState();
}
@ -325,13 +312,13 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
Obx(() {
return SliverList.builder(
key: Key('chat-history#${_channel!.id}'),
itemCount: _chatController.currentHistory.length,
itemCount: _chatController.currentEvents.length,
itemBuilder: buildHistory,
);
}),
Obx(() {
final amount = _chatController.totalHistoryCount -
_chatController.currentHistory.length;
final amount = _chatController.totalEvents -
_chatController.currentEvents.length;
if (amount.value <= 0 ||
_chatController.isLoading.isTrue) {
@ -348,7 +335,7 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
'count': amount.string,
})),
onTap: () {
_chatController.getMoreMessages(
_chatController.loadEvents(
_channel!,
widget.realm,
);
@ -378,9 +365,9 @@ class _ChannelChatScreenState extends State<ChannelChatScreen> {
realm: widget.realm,
placeholder: placeholder,
channel: _channel!,
onSent: (Message item) {
onSent: (Event item) {
setState(() {
_chatController.addTemporaryMessage(item);
_chatController.addPendingEvent(item);
});
},
onReset: () {