| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- 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<Message> get messages => friendShip.messages;
- List<ChatMessage>? _chatMessages;
- List<ChatMessage> get chatMessages => _chatMessages ?? [];
- bool _disposed = false;
- Future<void>? _listener;
- @override
- void dispose() {
- _disposed = true;
- _listener?.then((e) => super.dispose()) ?? super.dispose();
- }
- Future<void> _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<void> flushChatMessages() async {
- final _user = LoginPresenter().user;
- if (_user != null) {
- List<String>? _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 encText) {
- // Map<String, dynamic> json0 = jsonDecode(s);
- // String plaintext = json0["plaintext"];
- ChatMessage? _message;
- try {
- _message = ChatMessage.fromJson(jsonDecode(encText));
- } catch (e) {
- try {
- } catch (e) {
- }
- }
- debug('plaintext: $encText');
- return ChatMessage.fromJson(jsonDecode(plaintext));
- }
- Future<List<ChatMessage>> retrieveAllChatMessages() async {
- final list = <ChatMessage>[];
- final _user = LoginPresenter().user;
- final _to = to;
- if (_user != null && _to != null) {
- List<String>? _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<bool> 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;
- }
|