import 'dart:async'; import 'dart:convert'; import 'package:dash_chat/dash_chat.dart'; import 'package:e2ee_chat/azlistview/azlistview.dart'; import 'package:e2ee_chat/common/api.dart'; import 'package:e2ee_chat/common/global.dart'; import 'package:e2ee_chat/model/contact_info.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 FriendRequestPresenter extends ChatListPresenter { FriendRequestPresenter({this.from}) { _listener = _listenFriendRequest(); } User? get user => LoginPresenter().user; User? from; List requests = []; bool _disposed = false; Future? _listener; @override void dispose() { _disposed = true; _listener?.then((e) => super.dispose()) ?? super.dispose(); } Future _listenFriendRequest() async { while (!_disposed) { if (from != null) { await flushFriendRequest(); } await Future.delayed(Duration(seconds: 1)); } } Future acceptFriend(String username) async { bool _result = await Api().acceptFriend(username); if (_result) { requests.removeWhere((r) => r.name == username); notifyListeners(); } } Future flushFriendRequest() async { final _user = user; if (_user != null) { List? _list = await Api().friendRequest(); if (_list != null && !requests.toSet().containsAll(_list)) { // TODO: 如果列表一样则不刷新 debug("flush friend request: $_list"); requests.clear(); for (final i in _list) { requests.add(ContactInfo(name: i, tag: ContactInfo.getTag(i))); } SuspensionUtil.sortListBySuspensionTag(requests); SuspensionUtil.setShowSuspensionStatus(requests); notifyListeners(); } } // messages.forEach((message) => list.add(message.chatMessage)); } }