import { MessageBox } from 'element-ui'
import TWEEN from '@tweenjs/tween.js'
const timestampInterval = 1e3 * 60 * 3 // 3分钟的间隔时间
const cryptoKey = 'dqWt6twz6JyEy3EZ'
// 错误弹窗
export function showError (msg, title = 'Error') {
MessageBox.confirm(msg, title, {
center: true,
showCancelButton: false,
showConfirmButton: false,
callback () {}
})
}
// 确认操作弹窗
export function confirmPopup (msg, title = '提示') {
return new Promise((resolve, reject) => {
MessageBox.confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
resolve()
})
.catch(() => {})
})
}
/**
* 判断系统||浏览器中英文
* 对于不支持的浏览器 一律默认为 中文
*/
export function getLanguage () {
var language = (navigator.language || navigator.browserLanguage).toLowerCase()
var locale = 'zh'
if (language.indexOf('en') > -1) {
locale = 'en'
} else {
locale = 'zh'
}
return locale
}
/**
* 获取Url上指定参数
* @param {String} name 参数名
*/
export function getUrlParam (name) {
var reg = new RegExp('[?&]' + name + '=([^?]*)(&|#|$)')
var r = window.location.href.match(reg)
return r ? r[1] : null
}
export var Cookie = {
setCookie (name, value) {
var Days = 7
var exp = new Date()
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000)
exp.setTime(exp.getTime() + 60 * 1000)
if (
window.location.port === '8080' ||
/^test-|\.webdev2\./.test(window.location.host)
) {
document.cookie =
name + '=' + escape(value) + ';expires=' + exp.toGMTString()
} else {
document.cookie =
name +
'=' +
escape(value) +
';domain=.mee.chat;path=/;expires=' +
exp.toGMTString()
}
},
getCookie (name) {
var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
var arr = document.cookie.match(reg)
if (arr) {
return unescape(arr[2])
} else {
return null
}
},
delCookie (name) {
var str1 = name + '=;domain=.mee.chat;path=/'
str1 += ';expires=' + new Date(0).toGMTString()
document.cookie = str1
var str2 = name + '=;path=/'
str2 += ';expires=' + new Date(0).toGMTString()
document.cookie = str2
}
}
/**
* 获取聊天区域高度
* @param {String} msg
*/
export function getResizeHeight () {
let clientHeight = document.documentElement.clientHeight
let clientWidth = document.documentElement.clientWidth
let topHeight = 61
let botHeight = 181
var chatBoxHeight
if (clientHeight < 600) {
chatBoxHeight = 600 - topHeight - botHeight
}
if (clientHeight < 800 || clientWidth < 1000) {
chatBoxHeight = clientHeight - topHeight - botHeight
} else {
chatBoxHeight = clientHeight * 0.8 - topHeight - botHeight
}
return chatBoxHeight
}
function rc4 (str, key) {
var s = []
var j = 0
var x
var res = ''
for (var i = 0; i < 256; i++) {
s[i] = i
}
for (i = 0; i < 256; i++) {
j = (j + s[i] + key.charCodeAt(i % key.length)) % 256
x = s[i]
s[i] = s[j]
s[j] = x
}
i = 0
j = 0
for (var y = 0; y < str.length; y++) {
i = (i + 1) % 256
j = (j + s[i]) % 256
x = s[i]
s[i] = s[j]
s[j] = x
res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256])
}
return res
}
/**
* 加密信息
* @param {String} msg
*/
export function cryptoMsg (msg) {
let result
try {
result = btoa(rc4(encodeURIComponent(msg), cryptoKey))
} catch {
return msg
}
return result
}
/**
* 解密信息
* @param {String} msg
*/
export function decryptoMsg (msg) {
let result
try {
result = decodeURIComponent(rc4(atob(msg), cryptoKey))
} catch {
return msg
}
return result
}
/**
* 向数组添加数据
* @param {Array} data
*/
export function addSomeInArray (data) {
let lastTime = null
let linkRule = new RegExp(
'(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]'
)
let queLink = /(['"])(?:(?!\1).)*?\1/
data.forEach(item => {
// 添加timeMsg tag
if (lastTime === null) {
item.timeMsg = false
} else {
item.timeMsg = parseInt(item.timestamp) - lastTime > timestampInterval
}
lastTime = parseInt(item.timestamp)
// 添加链接标识 msg_type = 10
if (item.content && typeof item.content == 'string' && !item.content.match(queLink) &&
item.content.match(linkRule) && item.msg_type === '0') {
item.msg_type = 10
item.content = item.content.replace(linkRule, a => {
return `${a}`
})
}
})
}
/**
* 单个添加timeMsg tag
* @param {Array} data
*/
export function addTimeMsgInItem (item, arr) {
if (arr.length === 0) {
item.timeMsg = true
} else {
let lastTime = parseInt(arr[arr.length - 1].timestamp)
item.timeMsg = parseInt(item.timestamp) - lastTime > timestampInterval
}
}
/**
* 判断是否是移动端
*/
export function isMobile () {
return /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)
}
/*
* 单个添加链接 msg_type = 10
* @param {Array} data
*/
export function addLinkItem (item) {
var linkRule = new RegExp(
'(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]'
)
var queLink = /(['"])(?:(?!\1).)*?\1/
if (item.content.match(linkRule) && item.msg_type === '0' && !item.content.match(queLink)) {
item.msg_type = 10
item.content = item.content.replace(linkRule, a => {
return `${a}`
})
}
}
/**
* 移除arr2中满足callback的arr1数组元素
* @param {Array} arr1 [{hash:1}]
* @param {Array} arr2 [{hash:1},{hash:2}]
* @result arr1 => []
*/
export function removeItemIfEixt (arr1, arr2, callback) {
arr1.forEach((item, index) => {
if (arr2.some(item2 => callback(item2) == callback(item))) {
arr1.splice(index, 1)
}
})
}
/**
* 格式化置顶消息
*/
export function formatPinMsg (pinMsg, userId) {
pinMsg.name = pinMsg.nick_name
pinMsg.content = decryptoMsg(pinMsg.msg)
pinMsg.type = pinMsg.from == userId ? 'me' : 'you'
pinMsg.avatar = pinMsg.cover_photo || ''
pinMsg.userId = userId
}
/**
* @param {store} state
* @param {Number} createTime
*/
export function dealErrorMsg (state, createTime) {
state.chatList.forEach(item => {
if (item.createTime === createTime) {
item.fail = true
item.loading = false
}
})
}
/**
* 如果含有at他人的信息,格式化
* @param {String} msg @heitan@aben 123
* @param {Array} members
* @result => {@start[10,9]end}@heitan@aben 123
*/
export function encryptAtMsg (msg, members) {
let ats = []
members.forEach(user => {
let reg = new RegExp(`@${user.nick_name}`)
if (reg.test(msg)) {
ats.push(user.user_id)
}
})
if (ats.length) {
msg = `{@start[${ats.toString()}]end}${msg}`
}
return msg
}
/**
*
* @param {String} msg
* @return {Array|Null}
*/
export function decryptAtMsg (msg) {
let reg = /^{@start\[(.*)\]end}/
let ret = reg.exec(msg)
if (ret) {
return ret[0].split(',')
}
}
/**
*判断是否是at我的信息
*/
export function checkAtMe (msg, username) {
if (!username) return false
let reg = new RegExp(`@${username}`)
return reg.test(msg)
}
export function scrollIntoView (node, offsetTop) {
let distance = Math.abs(offsetTop - node.scrollTop)
let time = distance > 500 ? 1000 : distance * 2
let tw = new TWEEN.Tween(node)
.to({ scrollTop: offsetTop }, time)
.easing(TWEEN.Easing.Quadratic.Out)
return tw.start()
}
export function scrollMsgIntoView (node, offsetTop, targetNode) {
scrollIntoView(node, offsetTop)
.onComplete(() => {
targetNode.classList.toggle('active')
})
setTimeout(() => {
targetNode.classList.toggle('active')
}, 3000)
}