123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- import Vue from 'vue'
- import API from '@/api'
- import _ from 'lodash'
- import Session from '@/store/db/Session.js'
- import User from '@/store/db/User.js'
- import { initChatData } from '@/store/state'
- import {
- decryptoMsg
- } from '@/util/util.js'
- const state = initChatData()
- const objSession = new Session()
- const mutations = {
- setSessionList (state, data) {
- data.forEach(value => {
- let lastMsg = value['last_msg']
- value.cont = lastMsg ? decryptoMsg(lastMsg.content) : ''
- })
- // 按is_pin(是否置顶) 属性排序
- state.sessionList = data
- },
- addSession (state, data) {
- state.sessionList.push(data)
- },
- chatAppLogin (state, flag) {
- state.isLogin = flag
- },
- toApp (state, flag) {
- state.toApp = flag
- },
- addSessionItem (state, data) {
- let pinSession = state.sessionList.filter(item => {
- return item.is_pin === 1
- })
- let dataPos = pinSession.length || 0
- state.sessionList.splice(dataPos, 0, data)
- objSession.recover(data.session_id)
- },
- // 会话列表未读消息设置
- setSessionItemUnread (state, data) {
- let itemIndex = 0
- state.sessionList.forEach((item, index) => {
- if (item.session_id == `${data.session_id}`) {
- let unread = item.unread
- if (data.unread && data.curSession != data.session_id) {
- unread += data.unread
- } else {
- unread = 0
- }
- Vue.set(item, 'unread', unread)
- objSession.setUnread(item.session_id, unread)
- itemIndex = index
- }
- })
- // 重新排序 非pin的会话
- let temp = state.sessionList[itemIndex]
- if (itemIndex && !temp.is_pin && data.cont) {
- state.sessionList.splice(itemIndex, 1)
- mutations.addSessionItem(state, temp)
- }
- },
- setFriendList (state, data) {
- state.friendList = data
- },
- // 左侧会话撤回-用于私聊主动撤回
- setSessionRepeal (state, data) {
- state.sessionList.forEach((item) => {
- if (item.session_id == (data.sessionId || data.group_id)) {
- Vue.set(item.last_msg, 'msg_type', -1)
- Vue.set(item, 'update_time_int', data.timestamp)
- }
- })
- },
- setSessionItem (state, data) {
- state.sessionList.forEach(item => {
- if (item.session_id == data.session_id) {
- item = data
- }
- })
- },
- /**
- * @des 根据置顶目标更新会话列表顺序
- * @param {Object} state
- * @param {String} sessionId 待置顶的会话
- */
- updateSessionListByPin (state, data) {
- objSession.setPin(data.session_id, 1)
- state.sessionList.forEach((item, index) => {
- if (item.session_id == data.session_id) {
- item.is_pin = data.is_pin
- item.pin_time_int = data.pin_time_int
- state.sessionList.unshift(state.sessionList.splice(index, 1)[0])
- }
- })
- },
- /**
- * @des 根据取消置顶目标更新会话列表顺序
- * @param {Object} state
- * @param {String} sessionId 待取消置顶的会话
- */
- cancelSessionListByPin (state, data) {
- objSession.setPin(data.session_id, 0)
- let targetItem = null
- state.sessionList.forEach((item, index) => {
- if (item.session_id == data.session_id) {
- item.is_pin = data.is_pin
- item.pin_time_int = data.pin_time_int
- targetItem = state.sessionList.splice(index, 1)[0]
- } else if (targetItem && item.is_pin < 1) {
- // 插入到合适的位置
- state.sessionList.splice(index, 0, targetItem)
- targetItem = null
- }
- })
- // state.sessionList.push(targetItem)
- },
- /**
- * @des 根据免打扰更新会话列表
- * @param {Object} state
- * @param {String} sessionId 免打扰的会话
- */
- updateSessionListByMute (state, sessionId) {
- objSession.setMute(sessionId, 1)
- state.sessionList.forEach((item, index) => {
- if (item.session_id == sessionId) {
- item.is_mute = 1
- }
- })
- },
- /**
- * @des 根据免打扰置顶目标更新会话列表
- * @param {Object} state
- * @param {String} sessionId 待取消免打扰的会话
- */
- cancelSessionListByMute (state, sessionId) {
- objSession.setMute(sessionId, 0)
- state.sessionList.forEach((item, index) => {
- if (item.session_id == sessionId) {
- item.is_mute = 0
- }
- })
- },
- /**
- * @des 根据群id删除会话列表item
- * @param {Object} state
- * @param {String} sessionId 待取消免打扰的会话
- */
- removeSessionListById (state, sessionId) {
- objSession.remove(sessionId)
- state.sessionList = _.filter(state.sessionList, (item, index) => {
- return item.session_id != sessionId
- })
- },
- /**
- * @des 更新用户群主列表中的last_msg内容
- * @param {String} params.sessionId 待更新的sessionId
- * @param {Object} params.data 待更新的内容
- */
- updateSessionLastmsg (state, params) {
- let targetObj = state.sessionList.find(n => {
- return n.session_id == (params.group_id || params.sessionId || params.session_id)
- })
- if (targetObj) {
- mutations.setSessionLastmsg(state, targetObj, params)
- }
- },
- updateSessionLastMsgNoDecode (state, params) {
- mutations.updateSessionLastmsg(state, Object.assign(params, { noDecryptoMsg: true }))
- },
- setSessionLastmsg (state, targetObj, params) {
- if (!targetObj.last_msg) {
- Vue.set(targetObj, 'last_msg', {})
- }
- let lastMsg = targetObj.last_msg
- Vue.set(lastMsg, 'content', params.content)
- Vue.set(lastMsg, 'from', params.from)
- Vue.set(lastMsg, 'msg_type', params.msg_type)
- Vue.set(lastMsg, 'name', params.name)
- Vue.set(lastMsg, 'nick_name', params.nick_name)
- Vue.set(lastMsg, 'time', params.timestamp)
- Vue.set(targetObj, 'cont', params.noDecryptoMsg ? params.content : decryptoMsg(params.content))
- },
- initChatData (state) {
- let data = initChatData()
- for (let i in state) {
- if (data.hasOwnProperty(i)) state[i] = data[i]
- }
- }
- }
- const actions = {
- async refreshSessionList ({ commit, state }, params) {
- let list = await objSession.getSortList()
- if (list && list.length) {
- // 从indexDB拿数据
- commit('setSessionList', list)
- }
- },
- async getSessionList ({ dispatch, commit, state }, params) {
- // 本地刷新缓存
- dispatch('refreshSessionList')
- // 从接口读取缓存数据
- API.session.sessionList(async ({ data }) => {
- if (data && data.data) {
- // 清空老数据
- await objSession.clearData()
- // 存储到indexDB,用过滤过的数据来渲染
- let list = await objSession.replaceSession(data.data)
- commit('setSessionList', list)
- }
- })
- },
- async getUserInfo ({ commit, state, rootState }) {
- try {
- let userId = rootState.userId || localStorage.getItem('user_id')
- let { data } = await API.user.getInfo({
- target_id: userId
- })
- commit('setUserInfo', data.data)
- commit('setGroupUserInfo', data.data)
- if (data.data.user_id) {
- // 更新自己的信息
- let objUser = new User()
- let newData = {
- cover_photo: data.data.cover_photo,
- nick_name: data.data.nick_name,
- user_name: data.data.user_name
- }
- objUser.updateObject(newData, { user_id: data.data.user_id })
- }
- } catch (error) {}
- },
- /**
- * @des 更新用户群组列表中指定sessionId的内容
- * @param {String} params.sessionId 待更新的sessionId
- * @param {Object} params.data 待更新的内容
- */
- updateSessionItem ({ commit, state }, params) {
- let targetObj = state.sessionList.find(n => {
- return n.session_id == params.sessionId
- })
- targetObj = Object.assign(targetObj, params.data)
- commit('setSessionItem', targetObj)
- },
- /**
- * 撤回消息
- * @param {Object} params
- * {index:number, session_id:string, hash:string}
- */
- async doRepealPersonMsg ({ dispatch, commit, state, rootState }, params = {}) {
- try {
- await API.person.repealPersonMsg({
- session_id: rootState.curSession,
- hash: params.hash
- })
- } catch (error) {}
- },
- async getFriendList ({ commit, state }) {
- try {
- let { data } = await API.group.getFriends()
- commit('setFriendList', data.data)
- } catch (error) {}
- }
- }
- const getters = {
- muteList: state => {
- // 免打扰
- return state.sessionList.filter(v => {
- if (v.is_mute == '1') {
- return v.session_id
- }
- })
- }
- }
- export default {
- state,
- mutations,
- actions,
- getters
- }
|