import 'dart:async'; import 'dart:convert'; import 'package:dash_chat/dash_chat.dart'; import 'package:e2ee_chat/common/api.dart'; import 'package:e2ee_chat/common/global.dart'; import 'package:e2ee_chat/model/friendship.dart'; import 'package:e2ee_chat/model/message.dart'; import 'package:e2ee_chat/model/user.dart'; import 'package:e2ee_chat/objectbox.g.dart'; import 'package:e2ee_chat/presenter/login.dart'; import 'package:flutter/material.dart'; import 'package:objectbox/objectbox.dart'; import 'package:rxdart/rxdart.dart'; import 'chat_list.dart'; class UserChatPresenter extends ChatListPresenter { UserChatPresenter({this.to}) { _listener = _listenUserChat(); } User? get from => LoginPresenter().user; User? to; FriendShip get friendShip => FriendShip() ..user0.target = from ..user1.target = to; ToMany get messages => friendShip.messages; List? _chatMessages; List get chatMessages => _chatMessages ?? []; bool _disposed = false; Future? _listener; @override void dispose() { _disposed = true; _listener?.then((e) => super.dispose()) ?? super.dispose(); } Future _listenUserChat() async { while (!_disposed) { if (to != null) { if (_chatMessages == null) { debug("init chatMessages"); _chatMessages = await retrieveAllChatMessages(); notifyListeners(); } else { await flushChatMessages(); } } await Future.delayed(Duration(seconds: 1)); } } Future flushChatMessages() async { final _user = LoginPresenter().user; if (_user != null) { List? _list = await Api().getLastMessages(_user.username); if (_list != null) { debug("flush chat message"); for (final i in _list) { chatMessages.add(chatMessageFromMessagePackage(i)); } notifyListeners(); } } // messages.forEach((message) => list.add(message.chatMessage)); } ChatMessage chatMessageFromMessagePackage(String plaintext) { // Map json0 = jsonDecode(s); // String plaintext = json0["plaintext"]; debug('plaintext: $plaintext'); return ChatMessage.fromJson(jsonDecode(plaintext)); } Future> retrieveAllChatMessages() async { final list = []; final _user = LoginPresenter().user; final _to = to; if (_user != null && _to != null) { List? _list = await Api().getFilterMessages(_to.username); if (_list != null) { for (final i in _list) { list.add(chatMessageFromMessagePackage(i)); } } } return list; // messages.forEach((message) => list.add(message.chatMessage)); } Future sendMessage(ChatMessage chatMessage) async { debug('user chat presenter send msg begin'); bool _result = true; chatMessages.add(chatMessage); notifyListeners(); try { final plaintext = json.encode(chatMessage); var message = Message(); message.from.target = from!; message.to.target = to!; message.plaintext = plaintext; _result = await Api().sendMessage(to!.username, json.encode(chatMessage)); } catch (e) { debug(e); _result = false; } if (!_result) { debug('user chat presenter send msg failed'); } return _result; } /// 消息体 Message? get lastMessage { Message? message; try { message = messages.last; } catch (e) { debug("no message"); } return message; } /// 未读数量 int get unReadCount { // TODO: 未读消息数量 return 0; } get chatName => to?.username; /// 单聊 get isSingle => true; /// 群聊信息 get isGroup => false; /// 消息免打扰 get isDND => to?.isDND; /// 是否为置顶 get isStick => to?.isStick; /// 特别关注 get isSpecialAttention => to?.isSpecialAttention; // TODO: 是否 @ 你 get isAtYou => false; // TODO: 是否 @ 全部 get isAtAll => false; // TODO: user avatar get avatar => Global.defaultAvatar; }