friendStore.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import http from '../common/request';
  2. export default {
  3. state: {
  4. friends: [],
  5. timer: null
  6. },
  7. mutations: {
  8. setFriends(state, friends) {
  9. state.friends = friends;
  10. },
  11. updateFriend(state, friend) {
  12. state.friends.forEach((f, index) => {
  13. if (f.id == friend.id) {
  14. // 拷贝属性
  15. let online = state.friends[index].online;
  16. Object.assign(state.friends[index], friend);
  17. state.friends[index].online = online;
  18. }
  19. })
  20. },
  21. removeFriend(state, id) {
  22. state.friends.forEach((f,idx) => {
  23. if(f.id == id){
  24. state.friends.splice(idx, 1)
  25. }
  26. });
  27. },
  28. addFriend(state, friend) {
  29. state.friends.push(friend);
  30. },
  31. setOnlineStatus(state, onlineIds) {
  32. state.friends.forEach((f) => {
  33. let onlineFriend = onlineIds.find((id) => f.id == id);
  34. f.online = onlineFriend != undefined;
  35. });
  36. state.friends.sort((f1, f2) => {
  37. if (f1.online && !f2.online) {
  38. return -1;
  39. }
  40. if (f2.online && !f1.online) {
  41. return 1;
  42. }
  43. return 0;
  44. });
  45. },
  46. refreshOnlineStatus(state) {
  47. if (state.friends.length > 0 ) {
  48. let userIds = [];
  49. state.friends.forEach((f) => {
  50. userIds.push(f.id)
  51. });
  52. http({
  53. url: '/user/online?userIds='+ userIds.join(','),
  54. method: 'GET'
  55. }).then((onlineIds) => {
  56. this.commit("setOnlineStatus", onlineIds);
  57. })
  58. }
  59. // 30s后重新拉取
  60. clearTimeout(state.timer);
  61. state.timer = setTimeout(() => {
  62. this.commit("refreshOnlineStatus");
  63. }, 30000)
  64. },
  65. clear(state){
  66. clearTimeout(state.timer);
  67. state.friends = [];
  68. state.timer = null;
  69. }
  70. },
  71. actions: {
  72. loadFriend(context) {
  73. return new Promise((resolve, reject) => {
  74. http({
  75. url: '/friend/list',
  76. method: 'GET'
  77. }).then((friends) => {
  78. context.commit("setFriends", friends);
  79. context.commit("refreshOnlineStatus");
  80. resolve()
  81. }).catch((res) => {
  82. reject();
  83. })
  84. });
  85. }
  86. }
  87. }