friendStore.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { defineStore } from 'pinia';
  2. import http from '../common/request'
  3. import { TERMINAL_TYPE } from '../common/enums.js'
  4. export default defineStore('friendStore', {
  5. state: () => {
  6. return {
  7. friendMap: new Map(),
  8. timer: null
  9. }
  10. },
  11. actions: {
  12. setFriends(friends) {
  13. this.friendMap.clear();
  14. friends.forEach(f => this.friendMap.set(f.id, f))
  15. },
  16. updateFriend(friend) {
  17. let f = this.findFriend(friend.id);
  18. friend.online = f.online;
  19. friend.onlineWeb = f.onlineWeb;
  20. friend.onlineApp = f.onlineApp;
  21. this.friendMap.set(friend.id, friend)
  22. },
  23. removeFriend(id) {
  24. this.friendMap.get(id).deleted = true;
  25. },
  26. addFriend(friend) {
  27. this.friendMap.set(friend.id, friend)
  28. },
  29. setOnlineStatus(onlineTerminals) {
  30. this.friends.forEach((f) => {
  31. let userTerminal = onlineTerminals.find((o) => f.id == o.userId);
  32. if (userTerminal) {
  33. f.online = true;
  34. f.onlineWeb = userTerminal.terminals.indexOf(TERMINAL_TYPE.WEB) >= 0
  35. f.onlineApp = userTerminal.terminals.indexOf(TERMINAL_TYPE.APP) >= 0
  36. } else {
  37. f.online = false;
  38. f.onlineWeb = false;
  39. f.onlineApp = false;
  40. }
  41. });
  42. },
  43. refreshOnlineStatus() {
  44. let userIds = this.friends.filter((f) => !f.deleted).map((f) => f.id);
  45. if (userIds.length == 0) {
  46. return;
  47. }
  48. http({
  49. url: '/user/terminal/online?userIds=' + userIds.join(','),
  50. method: 'GET'
  51. }).then((onlineTerminals) => {
  52. this.setOnlineStatus(onlineTerminals);
  53. })
  54. // 30s后重新拉取
  55. clearTimeout(this.timer);
  56. this.timer = setTimeout(() => {
  57. this.refreshOnlineStatus();
  58. }, 30000)
  59. },
  60. setDnd(id, isDnd) {
  61. this.friendMap.get(id).isDnd = isDnd;
  62. },
  63. clear() {
  64. this.friendMap.clear();
  65. clearTimeout(this.timer);
  66. this.timer = null;
  67. },
  68. loadFriend() {
  69. return new Promise((resolve, reject) => {
  70. http({
  71. url: '/friend/list',
  72. method: 'GET'
  73. }).then((friends) => {
  74. this.setFriends(friends);
  75. this.refreshOnlineStatus();
  76. resolve()
  77. }).catch((res) => {
  78. reject();
  79. })
  80. });
  81. }
  82. },
  83. getters: {
  84. friends: (state) => {
  85. return Array.from(state.friendMap.values());
  86. },
  87. findFriend: (state) => (userId) => {
  88. return state.friendMap.get(userId);
  89. },
  90. isFriend: (state) => (userId) => {
  91. let f = state.findFriend(userId)
  92. return f && !f.deleted
  93. }
  94. }
  95. })