|
|
|
|
|
// 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
|