src/renderer/worker/data.js

Summary

Maintainability
A
0 mins
Test Coverage

import sparkMD5 from 'spark-md5'
const isRoomContact = e => !!e && /^@@|@chatroom$/.test(e)

let curGroup = {}

// 当前重复的、聊天的人和群
let repeatList = {}

// {"Uin":0,"UserName":"@8d502ae9bd1e1b5d4480d4e846f14f5121b091bae52e42cad80da8eddc20df28","NickName":"Joe","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=601370069&username=@8d502ae9bd1e1b5d4480d4e846f14f5121b091bae52e42cad80da8eddc20df28&skey=@crypt_a397bd88_e75765433939a2e1921ae44eb491bd29","ContactFlag":3,"MemberCount":0,"MemberList":[],"RemarkName":"","HideInputBarFlag":0,"Sex":1,"Signature":"","VerifyFlag":0,"OwnerUin":0,"PYInitial":"JOE","PYQuanPin":"Joe","RemarkPYInitial":"","RemarkPYQuanPin":"","StarFriend":0,"AppAccountFlag":0,"Statues":0,"AttrStatus":103357,"Province":"广东","City":"深圳","Alias":"","SnsFlag":16,"UniFriend":0,"DisplayName":"","ChatRoomId":0,"KeyWord":"","EncryChatRoomId":"","IsOwner":0}
// 当前有效的、聊天的人和群
let chatList = {}

const getPremd5 = (UserName, NickName, RemarkName) => {
  let pre = 'M'
  if (isRoomContact(UserName)) {
    pre = 'B'
  }
  return pre + sparkMD5.hash(`${NickName}${RemarkName}`)
}

const addItem = item => {
  const premd5 = getPremd5(item.UserName, item.NickName, item.RemarkName)
  if (chatList[premd5]) {
    /* istanbul ignore else */
    if (chatList[premd5].UserName !== item.UserName) {
      // 说明两个不同的人重名了
      delete chatList[premd5]
      repeatList[premd5] = item
    }
  } else {
    chatList[premd5] = item
  }
}

const addChatListAndRepeatList = list => {
  list.filter(item => {
    return !!item.NickName
  }).forEach(addItem)
}

const getNickName = premd5 => {
  return chatList[premd5].NickName
}

const getChatListCount = () => {
  return Object.keys(chatList).length
}

const getRepeatNameList = () => {
  let list = []
  for (let key in repeatList) {
    list.push(repeatList[key].NickName)
  }
  return list
}

const pushListMB = (item, listM, listB) => {
  if (item.premd5[0] === 'M') {
    listM.push(item)
  } else {
    listB.push(item)
  }
}

const getNormalListMB = (chatList, tos) => {
  let nListM = []
  let nListB = []

  for (let premd5 in chatList) {
    const item = {
      premd5,
      NickName: chatList[premd5].NickName,
      RemarkName: chatList[premd5].RemarkName,
      status: tos[premd5] ? 1 : 2
    }

    pushListMB(item, nListM, nListB)
  }

  return { nListM, nListB }
}

const getErrListMB = (chatList, tos) => {
  let eListM = []
  let eListB = []

  for (let premd5 in tos) {
    if (!chatList[premd5]) {
      const item = {
        premd5,
        NickName: tos[premd5].NickName,
        RemarkName: tos[premd5].RemarkName,
        status: 3
      }

      pushListMB(item, eListM, eListB)
    }
  }

  return { eListM, eListB }
}

// 这里有个副作用 curGroup = group
const getListMB = group => {
  curGroup = group

  const tos = group.tos
  const { nListM, nListB } = getNormalListMB(chatList, tos)
  // 错误的
  const { eListM, eListB } = getErrListMB(chatList, tos)
  
  return {
    listM: nListM.concat(eListM),
    listB: nListB.concat(eListB)
  }
}

const setCurGroup = ({ status, premd5, NickName, RemarkName }) => {
  const isAdd = !(status === 1)

  if (isAdd) {
    curGroup.tos[premd5] = { NickName, RemarkName }
  } else {
    delete curGroup.tos[premd5]
  }

  return curGroup
}

const resetData = () => {
  curGroup = {}
  repeatList = {}
  chatList = {}
}

/*
tos: { premd5: failCount }
toList: [{
  premd5,
  ToUserName,
  failCount
}]
*/
const getToList = tos => {
  return Object.keys(tos).map(premd5 => {
    return {
      premd5,
      ToUserName: chatList[premd5] && chatList[premd5].UserName,
      failCount: tos[premd5]
    }
  })
  // .filter(item => {
  //   return !!item.ToUserName
  // })
}

const getBuf = file => {
  return new Promise(resolve => {
    const reader = new FileReader()

    reader.onload = event => {
      let buf = event.target.result
      resolve(Buffer.from(buf))
    }

    reader.readAsArrayBuffer(file)
  })
}

export default {
  addChatListAndRepeatList,
  getNickName,
  getChatListCount,
  getRepeatNameList,
  getListMB,
  setCurGroup,
  resetData,
  getToList,
  getBuf
}