friendStore.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import http from '../api/httpRequest.js'
  2. import {TERMINAL_TYPE} from "../api/enums.js"
  3. export default {
  4. state: {
  5. friends: [],
  6. activeFriend: null,
  7. timer: null
  8. },
  9. mutations: {
  10. setFriends(state, friends) {
  11. friends.forEach((f)=>{
  12. f.online = false;
  13. f.onlineWeb = false;
  14. f.onlineApp = false;
  15. })
  16. state.friends = friends;
  17. },
  18. updateFriend(state,friend){
  19. state.friends.forEach((f,index)=>{
  20. if(f.id==friend.id){
  21. // 拷贝属性
  22. let online = state.friends[index].online;
  23. Object.assign(state.friends[index], friend);
  24. state.friends[index].online =online;
  25. }
  26. })
  27. },
  28. activeFriend(state, idx) {
  29. state.activeFriend = state.friends[idx];
  30. },
  31. removeFriend(state, idx) {
  32. if (state.friends[idx] == state.activeFriend) {
  33. state.activeFriend = null;
  34. }
  35. state.friends.splice(idx, 1);
  36. },
  37. addFriend(state, friend) {
  38. state.friends.push(friend);
  39. },
  40. refreshOnlineStatus(state){
  41. let userIds = [];
  42. if(state.friends.length ==0){
  43. return;
  44. }
  45. state.friends.forEach((f)=>{userIds.push(f.id)});
  46. http({
  47. url: '/user/terminal/online',
  48. method: 'get',
  49. params: {userIds: userIds.join(',')}
  50. }).then((onlineTerminals) => {
  51. this.commit("setOnlineStatus",onlineTerminals);
  52. })
  53. // 30s后重新拉取
  54. state.timer && clearTimeout(state.timer);
  55. state.timer = setTimeout(()=>{
  56. this.commit("refreshOnlineStatus");
  57. },30000)
  58. },
  59. setOnlineStatus(state,onlineTerminals){
  60. state.friends.forEach((f)=>{
  61. let userTerminal = onlineTerminals.find((o)=> f.id==o.userId);
  62. if(userTerminal){
  63. f.online = true;
  64. f.onlineWeb = userTerminal.terminals.indexOf(TERMINAL_TYPE.WEB)>=0
  65. f.onlineApp = userTerminal.terminals.indexOf(TERMINAL_TYPE.APP)>=0
  66. }else{
  67. f.online = false;
  68. f.onlineWeb = false;
  69. f.onlineApp = false;
  70. }
  71. });
  72. // 在线的在前面
  73. state.friends.sort((f1,f2)=>{
  74. if(f1.online&&!f2.online){
  75. return -1;
  76. }
  77. if(f2.online&&!f1.online){
  78. return 1;
  79. }
  80. return 0;
  81. });
  82. },
  83. clear(state) {
  84. state.timer && clearTimeout(state.timer);
  85. state.friends = [];
  86. state.timer = null;
  87. state.activeFriend = [];
  88. }
  89. },
  90. actions: {
  91. loadFriend(context) {
  92. return new Promise((resolve, reject) => {
  93. http({
  94. url: '/friend/list',
  95. method: 'GET'
  96. }).then((friends) => {
  97. context.commit("setFriends", friends);
  98. context.commit("refreshOnlineStatus");
  99. resolve()
  100. }).catch((res) => {
  101. reject();
  102. })
  103. });
  104. }
  105. }
  106. }