123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- import api from '@/api'
- // 搜索mixin
- export const searchUserMixin = {
- data () {
- return {
- isSearch: false, // 搜索展示
- searchList: null // 搜索结果
- }
- },
- methods: {
- searchUser (e, originList) {
- let val = e.target.value
- if (!val) {
- this.isSearch = false
- return
- }
- this.searchList = originList.filter(item => {
- let inName, inNick
- if (item.name) {
- inName = item.name ? item.name.indexOf(val) > -1 : false
- } else {
- inName = item.user_name ? item.user_name.indexOf(val) > -1 : false
- }
- inNick = item.nick_name ? item.nick_name.indexOf(val) > -1 : false
- return inName || inNick
- })
- this.isSearch = true
- }
- }
- }
- // 群搜索mixin
- export const searchGroupUserMixin = {
- data () {
- return {
- isSearchGroup: false, // 搜索展示
- searchGroupList: [] // 搜索结果
- }
- },
- methods: {
- searchUser (e, originList) {
- let val = e.target.value
- let inviteType = this.popInviteType
- if (!val) {
- this.isSearchGroup = false
- return
- }
- if (originList.length >= this.membersNum || inviteType == 1 || inviteType == 2) {
- this.searchGroupList = originList.filter(item => {
- let inName, inNick
- inName = item.user_name ? item.user_name.indexOf(val) > -1 : false
- inNick = item.nick_name ? item.nick_name.indexOf(val) > -1 : false
- return inName || inNick
- })
- } else {
- api.group.searchMember({
- group_id: this.group.groupId,
- keyword: this.searchTxt
- }).then(({ data }) => {
- this.searchGroupList = data.data
- })
- }
- this.isSearchGroup = true
- }
- }
- }
- // @人
- export const chatAtMixin = {
- data () {
- return {
- atInd: 0 // @人索引
- }
- },
- methods: {
- atPerson (name) {
- let el = this.$refs.chatInput
- let selectionStart = el.selectionStart
- let realStart = selectionStart - this.keyAfterAt.length
- this.inputMsg = this.inputMsg.slice(0, realStart) + `${name} ` + this.inputMsg.slice(selectionStart)
- this.atInd = 0
- el.focus()
- this.$nextTick(() => {
- el.setSelectionRange(realStart + name.length + 1, realStart + name.length + 1)
- })
- this.$store.commit('updateIsNewAt', {
- isNewAt: this.group.isNewAt,
- isNewAtFound: true
- })
- this.$store.commit('updateGroupSearchList', [])
- },
- handleUp () {
- if (this.atInd > 0) {
- this.atInd--
- }
- },
- handleDown () {
- let membersLen = this.filterMembers.length
- this.atInd < membersLen - 1 ? this.atInd++ : this.atInd = 0
- }
- }
- }
- // 聊天输入框
- export const chatInputMixin = {
- data () {
- return {
- selectionAfterAt: false, // 光标在@后面
- keyAfterAt: '', // 光标后的搜索字
- lastKeyAfterAt: ''
- }
- },
- mounted () {
- document.addEventListener('click', this.handleGlobalClick)
- },
- computed: {
- filterMembers () {
- if (!this.group.groupId) return []
- let members = this.group.membersArray
- let resArr = []
- if (this.keyAfterAt !== '') {
- resArr = this.group.searchList
- } else {
- for (let k = 0; k < members.length; k++) {
- if (members[k].user_id == this.userId) continue
- resArr.push(members[k])
- }
- }
- return resArr.slice(0, 100)
- },
- atShow () {
- this.atInd = 0
- return this.selectionAfterAt && this.filterMembers.length
- }
- },
- watch: {
- keyAfterAt (val) {
- if (!this.group.groupId || val == '') return
- if (this.group.isNewAtFound) return
- if (this.group.membersArray.length < this.group.membersNum) {
- api.group.searchMember({
- group_id: this.group.groupId,
- keyword: val
- }).then(({ data }) => {
- this.$store.commit('updateGroupSearchList', data.data)
- })
- } else {
- let searchList = this.group.membersArray.filter(item => {
- let inName, inNick
- inName = item.user_name ? item.user_name.indexOf(val) > -1 : false
- inNick = item.nick_name ? item.nick_name.indexOf(val) > -1 : false
- return inName || inNick
- })
- this.$store.commit('updateGroupSearchList', searchList)
- }
- },
- inputMsg (val, newval) {
- this.fixIOS()
- this.handleSelectionChange()
- }
- },
- methods: {
- getStrBeforeSelection () {
- let el = this.$refs.chatInput
- if (!el) return ''
- let selectionStart = el.selectionStart
- let prevStr = this.inputMsg.slice(0, selectionStart)
- return prevStr
- },
- getStrAfterSelection () {
- let el = this.$refs.chatInput
- if (!el) return ''
- let selectionStart = el.selectionStart
- let prevStr = this.inputMsg.slice(selectionStart)
- return prevStr
- },
- handleLeft (event) {
- let el = this.$refs.chatInput
- let selectionStart = el.selectionStart
- if (selectionStart === 0) return
- let prevStr = this.getStrBeforeSelection()
- let members = this.group.members
- for (let k in members) {
- let name = members[k].user_name
- let reg = new RegExp(`@${name} $`)
- if (reg.test(prevStr)) {
- event.preventDefault()
- el.setSelectionRange(selectionStart - name.length - 2, selectionStart - name.length - 2)
- return
- }
- }
- },
- handleRight (event) {
- let el = this.$refs.chatInput
- let selectionStart = el.selectionStart
- let afterStr = this.getStrAfterSelection()
- let members = this.group.members
- for (let k in members) {
- let name = members[k].user_name
- let reg = new RegExp(`^@${name} `)
- if (reg.test(afterStr)) {
- event.preventDefault()
- el.setSelectionRange(selectionStart + name.length + 2, selectionStart + name.length + 2)
- return
- }
- }
- },
- handleDel (event) {
- let el = this.$refs.chatInput
- let selectionStart = el.selectionStart
- if (selectionStart === 0) return
- let prevStr = this.getStrBeforeSelection()
- let members = this.group.members
- for (let k in members) {
- let name = members[k].user_name
- let reg = new RegExp(`@${name} $`)
- if (reg.test(prevStr)) {
- event.preventDefault()
- this.inputMsg = this.inputMsg.slice(0, selectionStart - name.length - 2) + this.inputMsg.slice(selectionStart)
- this.$nextTick(() => {
- el.setSelectionRange(selectionStart - name.length - 2, selectionStart - name.length - 2)
- })
- return
- }
- }
- },
- handleKeyDown (event) {
- if (this.atShow) {
- event.preventDefault()
- let item = this.filterMembers[this.atInd]
- this.atPerson(item.user_name)
- return
- }
- if (event.altKey || event.ctrlKey) {
- // 单纯换行
- this.inputMsg = this.inputMsg + '\n'
- } else {
- event.returnValue = false
- this.handleSend(event)
- }
- return false
- },
- handleFocus () {
- this.fixIOS()
- document.addEventListener('selectionchange', this.handleSelectionChange)
- },
- handleBlur () {
- this.fixIOS(false)
- document.removeEventListener('selectionchange', this.handleSelectionChange)
- this.updateChatInputFocus(false)
- },
- handleEsc () {
- this.selectionAfterAt = false
- },
- /**
- * 监听全局点击事件
- */
- handleGlobalClick () {
- this.selectionAfterAt = false
- },
- /**
- * 监听光标位置
- */
- handleSelectionChange () {
- let el = this.$refs.chatInput
- if (!el) return
- let selectionStart = el.selectionStart
- let selectionEnd = this.$refs.chatInput.selectionEnd
- if (selectionStart !== selectionEnd) return
- let prevStr = this.getStrBeforeSelection()
- this.selectionAfterAt = /@/.test(prevStr)
- if (this.selectionAfterAt) {
- this.keyAfterAt = prevStr.slice(prevStr.lastIndexOf('@') + 1)
- let isNewAt = this.keyAfterAt.indexOf(this.lastKeyAfterAt) < 0
- this.$store.commit('updateIsNewAt', {
- isNewAt: isNewAt,
- isNewAtFound: isNewAt ? false : this.group.isNewAtFound
- })
- if (isNewAt) this.$store.commit('updateGroupSearchList', [])
- this.lastKeyAfterAt = this.keyAfterAt
- }
- },
- /**
- * @des 处理ios系统下窗体闪烁的bug
- * @param {boolean} flag {true: 激活修复状态, false: 恢复原始状态}
- */
- fixIOS (flag = true) {
- var u = navigator.userAgent
- var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
- if (isIOS) {
- let el = this.$refs.scrollWrap
- if (!el) return
- if (flag) {
- el.style.overflowY = 'hidden'
- } else {
- el.style.overflowY = 'scroll'
- }
- }
- }
- }
- }
|