friend_request.dart 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:dash_chat/dash_chat.dart';
  4. import 'package:e2ee_chat/azlistview/azlistview.dart';
  5. import 'package:e2ee_chat/common/api.dart';
  6. import 'package:e2ee_chat/common/global.dart';
  7. import 'package:e2ee_chat/model/contact_info.dart';
  8. import 'package:e2ee_chat/model/friendship.dart';
  9. import 'package:e2ee_chat/model/message.dart';
  10. import 'package:e2ee_chat/model/user.dart';
  11. import 'package:e2ee_chat/presenter/login.dart';
  12. import 'package:flutter/material.dart';
  13. import 'package:rxdart/rxdart.dart';
  14. import 'chat_list.dart';
  15. class FriendRequestPresenter extends ChatListPresenter {
  16. FriendRequestPresenter({this.from}) {
  17. _listener = _listenFriendRequest();
  18. }
  19. User? get user => LoginPresenter().user;
  20. User? from;
  21. List<ContactInfo> requests = [];
  22. bool _disposed = false;
  23. Future<void>? _listener;
  24. @override
  25. void dispose() {
  26. _disposed = true;
  27. _listener?.then((e) => super.dispose()) ?? super.dispose();
  28. }
  29. Future<void> _listenFriendRequest() async {
  30. while (!_disposed) {
  31. if (from != null) {
  32. await flushFriendRequest();
  33. }
  34. await Future.delayed(Duration(seconds: 1));
  35. }
  36. }
  37. Future<void> acceptFriend(String username) async {
  38. bool _result = await Api().acceptFriend(username);
  39. if (_result) {
  40. requests.removeWhere((r) => r.name == username);
  41. notifyListeners();
  42. }
  43. }
  44. Future<void> refuseFriend(String username) async {
  45. bool _result = await Api().refuseFriend(username);
  46. if (_result) {
  47. requests.removeWhere((r) => r.name == username);
  48. notifyListeners();
  49. }
  50. }
  51. Future<void> flushFriendRequest() async {
  52. final _user = user;
  53. if (_user != null) {
  54. List<String>? _list = await Api().friendRequest();
  55. if (_list != null && !requests.toSet().containsAll(_list)) {
  56. // TODO: 如果列表一样则不刷新
  57. debug("flush friend request: $_list");
  58. requests.clear();
  59. for (final i in _list) {
  60. requests.add(ContactInfo(name: i, tag: ContactInfo.getTag(i)));
  61. }
  62. SuspensionUtil.sortListBySuspensionTag(requests);
  63. SuspensionUtil.setShowSuspensionStatus(requests);
  64. notifyListeners();
  65. }
  66. }
  67. // messages.forEach((message) => list.add(message.chatMessage));
  68. }
  69. }