✨ Handle more chat server events
This commit is contained in:
@ -6,33 +6,65 @@ import 'package:solian/models/message.dart';
|
||||
import 'package:solian/models/packet.dart';
|
||||
import 'package:solian/providers/auth.dart';
|
||||
import 'package:solian/providers/chat.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
class ChatMaintainer extends StatefulWidget {
|
||||
final Widget child;
|
||||
final Function(Message val) onNewMessage;
|
||||
final Function(Message val) onInsertMessage;
|
||||
final Function(Message val) onUpdateMessage;
|
||||
final Function(Message val) onDeleteMessage;
|
||||
|
||||
const ChatMaintainer({super.key, required this.child, required this.onNewMessage});
|
||||
const ChatMaintainer({
|
||||
super.key,
|
||||
required this.child,
|
||||
required this.onInsertMessage,
|
||||
required this.onUpdateMessage,
|
||||
required this.onDeleteMessage,
|
||||
});
|
||||
|
||||
@override
|
||||
State<ChatMaintainer> createState() => _ChatMaintainerState();
|
||||
}
|
||||
|
||||
class _ChatMaintainerState extends State<ChatMaintainer> {
|
||||
@override
|
||||
void initState() {
|
||||
Future.delayed(Duration.zero, () {
|
||||
final auth = context.read<AuthProvider>();
|
||||
final chat = context.read<ChatProvider>();
|
||||
void connect() {
|
||||
final notify = ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.connectingServer),
|
||||
duration: const Duration(days: 1),
|
||||
),
|
||||
);
|
||||
|
||||
chat.connect(auth).then((snapshot) {
|
||||
snapshot!.stream.listen((event) {
|
||||
final auth = context.read<AuthProvider>();
|
||||
final chat = context.read<ChatProvider>();
|
||||
|
||||
chat.connect(auth).then((snapshot) {
|
||||
snapshot!.stream.listen(
|
||||
(event) {
|
||||
final result = NetworkPackage.fromJson(jsonDecode(event));
|
||||
switch (result.method) {
|
||||
case 'messages.new':
|
||||
widget.onNewMessage(Message.fromJson(result.payload!));
|
||||
widget.onInsertMessage(Message.fromJson(result.payload!));
|
||||
break;
|
||||
case 'messages.update':
|
||||
widget.onUpdateMessage(Message.fromJson(result.payload!));
|
||||
break;
|
||||
case 'messages.burnt':
|
||||
widget.onDeleteMessage(Message.fromJson(result.payload!));
|
||||
break;
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
onError: (_, __) => connect(),
|
||||
);
|
||||
|
||||
notify.close();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
Future.delayed(Duration.zero, () {
|
||||
connect();
|
||||
});
|
||||
|
||||
super.initState();
|
||||
|
Reference in New Issue
Block a user