Browse Source

提升拉取离线消息性能

master
xsx 7 months ago
parent
commit
b1d331ee3e
  1. 44
      im-uniapp/store/friendStore.js
  2. 30
      im-uniapp/store/groupStore.js

44
im-uniapp/store/friendStore.js

@ -5,36 +5,27 @@ import { TERMINAL_TYPE } from '../common/enums.js'
export default defineStore('friendStore', {
state: () => {
return {
friends: [],
friendMap: new Map(),
timer: null
}
},
actions: {
setFriends(friends) {
friends.forEach((f) => {
f.online = false;
f.onlineWeb = false;
f.onlineApp = false;
})
this.friends = friends;
this.friendMap.clear();
friends.forEach(f => this.friendMap.set(f.id, f))
},
updateFriend(friend) {
let f = this.findFriend(friend.id);
let copy = JSON.parse(JSON.stringify(f));
Object.assign(f, friend);
f.online = copy.online;
f.onlineWeb = copy.onlineWeb;
f.onlineApp = copy.onlineApp;
friend.online = f.online;
friend.onlineWeb = f.onlineWeb;
friend.onlineApp = f.onlineApp;
this.friendMap.set(friend.id, friend)
},
removeFriend(id) {
this.friends.filter(f => f.id == id).forEach(f => f.deleted = true);
this.friendMap.get(id).deleted = true;
},
addFriend(friend) {
if (this.friends.some((f) => f.id == friend.id)) {
this.updateFriend(friend)
} else {
this.friends.unshift(friend);
}
this.friendMap.set(friend.id, friend)
},
setOnlineStatus(onlineTerminals) {
this.friends.forEach((f) => {
@ -68,12 +59,11 @@ export default defineStore('friendStore', {
}, 30000)
},
setDnd(id, isDnd) {
let friend = this.findFriend(id);
friend.isDnd = isDnd;
this.friendMap.get(id).isDnd = isDnd;
},
clear() {
this.friendMap.clear();
clearTimeout(this.timer);
this.friends = [];
this.timer = null;
},
loadFriend() {
@ -92,11 +82,15 @@ export default defineStore('friendStore', {
}
},
getters: {
isFriend: (state) => (userId) => {
return state.friends.filter((f) => !f.deleted).some((f) => f.id == userId);
friends: (state) => {
return Array.from(state.friendMap.values());
},
findFriend: (state) => (id) => {
return state.friends.find((f) => f.id == id);
findFriend: (state) => (userId) => {
return state.friendMap.get(userId);
},
isFriend: (state) => (userId) => {
let f = state.findFriend(userId)
return f && !f.deleted
}
}
})

30
im-uniapp/store/groupStore.js

@ -4,33 +4,28 @@ import http from '@/common/request';
export default defineStore('groupStore', {
state: () => {
return {
groups: []
groupMap: new Map()
}
},
actions: {
setGroups(groups) {
this.groups = groups;
this.groupMap.clear();
groups.forEach(g => this.groupMap.set(g.id, g))
},
addGroup(group) {
if (this.groups.some((g) => g.id == group.id)) {
this.updateGroup(group);
} else {
this.groups.unshift(group);
}
this.groupMap.set(group.id, group);
},
removeGroup(id) {
this.groups.filter(g => g.id == id).forEach(g => g.quit = true);
this.groupMap.get(id).quit = true;
},
updateGroup(group) {
let g = this.findGroup(group.id);
Object.assign(g, group);
this.groupMap.set(group.id, group);
},
setDnd(id, isDnd) {
let group = this.findGroup(id);
group.isDnd = isDnd;
this.groupMap.get(id).isDnd = isDnd;
},
clear() {
this.groups = [];
this.groupMap.clear();
},
loadGroup() {
return new Promise((resolve, reject) => {
@ -47,8 +42,15 @@ export default defineStore('groupStore', {
}
},
getters: {
groups: (state) => {
return Array.from(state.groupMap.values());
},
findGroup: (state) => (id) => {
return state.groups.find((g) => g.id == id);
return state.groupMap.get(id);
},
isGroup: (state) => (id) => {
let group = state.findGroup(id);
return group && !group.quit
}
}
})
Loading…
Cancel
Save