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', { export default defineStore('friendStore', {
state: () => { state: () => {
return { return {
friends: [], friendMap: new Map(),
timer: null timer: null
} }
}, },
actions: { actions: {
setFriends(friends) { setFriends(friends) {
friends.forEach((f) => { this.friendMap.clear();
f.online = false; friends.forEach(f => this.friendMap.set(f.id, f))
f.onlineWeb = false;
f.onlineApp = false;
})
this.friends = friends;
}, },
updateFriend(friend) { updateFriend(friend) {
let f = this.findFriend(friend.id); let f = this.findFriend(friend.id);
let copy = JSON.parse(JSON.stringify(f)); friend.online = f.online;
Object.assign(f, friend); friend.onlineWeb = f.onlineWeb;
f.online = copy.online; friend.onlineApp = f.onlineApp;
f.onlineWeb = copy.onlineWeb; this.friendMap.set(friend.id, friend)
f.onlineApp = copy.onlineApp;
}, },
removeFriend(id) { removeFriend(id) {
this.friends.filter(f => f.id == id).forEach(f => f.deleted = true); this.friendMap.get(id).deleted = true;
}, },
addFriend(friend) { addFriend(friend) {
if (this.friends.some((f) => f.id == friend.id)) { this.friendMap.set(friend.id, friend)
this.updateFriend(friend)
} else {
this.friends.unshift(friend);
}
}, },
setOnlineStatus(onlineTerminals) { setOnlineStatus(onlineTerminals) {
this.friends.forEach((f) => { this.friends.forEach((f) => {
@ -68,12 +59,11 @@ export default defineStore('friendStore', {
}, 30000) }, 30000)
}, },
setDnd(id, isDnd) { setDnd(id, isDnd) {
let friend = this.findFriend(id); this.friendMap.get(id).isDnd = isDnd;
friend.isDnd = isDnd;
}, },
clear() { clear() {
this.friendMap.clear();
clearTimeout(this.timer); clearTimeout(this.timer);
this.friends = [];
this.timer = null; this.timer = null;
}, },
loadFriend() { loadFriend() {
@ -92,11 +82,15 @@ export default defineStore('friendStore', {
} }
}, },
getters: { getters: {
isFriend: (state) => (userId) => { friends: (state) => {
return state.friends.filter((f) => !f.deleted).some((f) => f.id == userId); return Array.from(state.friendMap.values());
}, },
findFriend: (state) => (id) => { findFriend: (state) => (userId) => {
return state.friends.find((f) => f.id == id); 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', { export default defineStore('groupStore', {
state: () => { state: () => {
return { return {
groups: [] groupMap: new Map()
} }
}, },
actions: { actions: {
setGroups(groups) { setGroups(groups) {
this.groups = groups; this.groupMap.clear();
groups.forEach(g => this.groupMap.set(g.id, g))
}, },
addGroup(group) { addGroup(group) {
if (this.groups.some((g) => g.id == group.id)) { this.groupMap.set(group.id, group);
this.updateGroup(group);
} else {
this.groups.unshift(group);
}
}, },
removeGroup(id) { removeGroup(id) {
this.groups.filter(g => g.id == id).forEach(g => g.quit = true); this.groupMap.get(id).quit = true;
}, },
updateGroup(group) { updateGroup(group) {
let g = this.findGroup(group.id); this.groupMap.set(group.id, group);
Object.assign(g, group);
}, },
setDnd(id, isDnd) { setDnd(id, isDnd) {
let group = this.findGroup(id); this.groupMap.get(id).isDnd = isDnd;
group.isDnd = isDnd;
}, },
clear() { clear() {
this.groups = []; this.groupMap.clear();
}, },
loadGroup() { loadGroup() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -47,8 +42,15 @@ export default defineStore('groupStore', {
} }
}, },
getters: { getters: {
groups: (state) => {
return Array.from(state.groupMap.values());
},
findGroup: (state) => (id) => { 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