You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// store/friendStore.js
import { TERMINAL_TYPE } from '../common/enums.js'
const friendModule = {
namespaced: true,
state: () => ({
friends: [],
timer: null
}),
mutations: {
SET_FRIENDS(state, friends) {
friends.forEach(f => {
f.online = false
f.onlineWeb = false
f.onlineApp = false
})
state.friends = friends
},
UPDATE_FRIEND(state, friend) {
const f = state.friends.find(item => item.id === friend.id)
if (f) {
const copy = JSON.parse(JSON.stringify(f))
Object.assign(f, friend)
f.online = copy.online
f.onlineWeb = copy.onlineWeb
f.onlineApp = copy.onlineApp
}
},
REMOVE_FRIEND(state, id) {
state.friends.filter(f => f.id === id).forEach(f => f.deleted = true)
},
ADD_FRIEND(state, friend) {
state.friends.unshift(friend)
},
SET_ONLINE_STATUS(state, onlineTerminals) {
state.friends.forEach(f => {
const userTerminal = onlineTerminals.find(o => o.userId === f.id)
if (userTerminal) {
f.online = true
f.onlineWeb = userTerminal.terminals.indexOf(TERMINAL_TYPE.WEB) >= 0
f.onlineApp = userTerminal.terminals.indexOf(TERMINAL_TYPE.APP) >= 0
} else {
f.online = false
f.onlineWeb = false
f.onlineApp = false
}
})
},
SET_TIMER(state, timer) {
state.timer = timer
},
CLEAR(state) {
if (state.timer) {
clearTimeout(state.timer)
state.timer = null
}
state.friends = []
}
},
actions: {
setFriends({ commit }, friends) {
commit('SET_FRIENDS', friends)
},
updateFriend({ commit }, friend) {
commit('UPDATE_FRIEND', friend)
},
removeFriend({ commit }, id) {
commit('REMOVE_FRIEND', id)
},
addFriend({ commit, state }, friend) {
const exists = state.friends.some(f => f.id === friend.id)
if (exists) {
commit('UPDATE_FRIEND', friend)
} else {
commit('ADD_FRIEND', friend)
}
},
setOnlineStatus({ commit }, onlineTerminals) {
commit('SET_ONLINE_STATUS', onlineTerminals)
},
// 异步刷新在线状态(使用 await uni.$http.get
async refreshOnlineStatus({ state, commit, dispatch }) {
const userIds = state.friends.filter(f => !f.deleted).map(f => f.id)
if (userIds.length === 0) return
// 调用接口GET /user/terminal/online?userIds=xxx
const onlineTerminals = await uni.$http.get('/api/friend/terminal/online', {
userIds: userIds.join(',')
})
dispatch('setOnlineStatus', onlineTerminals.data.data)
// 清除旧定时器
if (state.timer) {
clearTimeout(state.timer)
}
// 设置新定时器30s后再次刷新
const timer = setTimeout(() => {
dispatch('refreshOnlineStatus')
}, 30000)
commit('SET_TIMER', timer)
},
// 清空
clear({ commit, state }) {
if (state.timer) {
clearTimeout(state.timer)
}
commit('CLEAR')
},
// 加载好友列表
async loadFriend({ dispatch }) {
try {
const friends = await uni.$http.get('/api/friend/list')
if (friends.data.data.all){
dispatch('setFriends', friends.data.data.all)
dispatch('refreshOnlineStatus')
}
} catch (error) {
// 可在此处理错误,原代码 reject此处转为 throw
throw error
}
}
},
getters: {
isFriend: (state) => (userId) => {
return state.friends.filter(f => !f.deleted).some(f => f.id === userId)
},
findFriend: (state) => (id) => {
return state.friends.find(f => f.id === id)
}
}
}
export default friendModule