Files
lemon-imui/packages/components/lemon/index.vue
T
2019-05-06 20:27:53 +08:00

226 lines
5.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<el-container class="lemon-container lemon-container--center"
ref="container">
<el-aside class="lemon-sidebar"
width="240px">
<ul class="lemon-tab">
<li v-for="item in tabList"
:key="item.name"
:tab-name="item.name"
:class="['lemon-tab__item', item.name == currentTab && 'lemon-tab__item--active']"
@click="tabChange(item.name)">
<span :class="item.icon"></span>
</li>
</ul>
<div class="lemon-tabview">
<div class="lemon-tabview__item"
v-for="item in tabList"
v-show="item.name == currentTab"
:key="item.name"
:tabview-name="item.name">
<component :is="item.componentName"
@changeMessageView="_changeMessageView"></component>
</div>
</div>
</el-aside>
<el-container class="lemon-main">
<el-header class="lemon-header"
height="48px">
宜宾劲越二手车市场上江北 (500)
</el-header>
<el-main>
<lemon-message-view></lemon-message-view>
</el-main>
<el-main>工具欄</el-main>
</el-container>
</el-container>
</template>
<script>
import LemonContactList from '../contact-list'
import LemonGroupList from '../group-list'
import LemonMessageList from '../message-list'
import LemonMessageView from '../message-view'
const components = {
LemonContactList,
LemonGroupList,
LemonMessageList,
LemonMessageView
}
export default {
name: 'LemonIm',
components,
provide () {
return {
control: this
}
},
props: {
friends: {
type: Array,
default: () => []
},
groups: {
type: Array,
default: () => []
}
},
data () {
this.tabList = [{
name: 'message',
icon: 'el-icon-s-comment',
componentName: 'lemon-message-list',
}, {
name: 'contact',
icon: 'el-icon-user-solid',
componentName: 'lemon-contact-list',
}, {
name: 'group',
icon: 'el-icon-message-solid',
componentName: 'lemon-group-list',
}]
return {
//当前会话对象的ID 根据 currentTab
currentTab: 'contact',
//当前聊天用户ID 根据聊天类型不一样 代表用户ID 群组ID 讨论组ID
currentMessageId: null,
//聊天视图是否加载中
messageViewloading: true,
//群聊天记录 groupId => [message]
groupMessageData: {
},
//好友聊天记录 friendId => [message]
friendMessageData: {
}
};
},
created () {
},
mounted () {
this._initialize()
},
computed: {
//聊天窗口中的数据
messageViewData () {
return this.friendMessageData[this.currentMessageId]
}
},
watch: {},
methods: {
//左侧选项卡切换
tabChange (name) {
this.currentTab = name;
this.findNode(`.lemon-tabview`).scrollTop = '0px'
},
//打开一个群组聊天窗口
openGroupMessageView (group) {
this._changeMessageViewComplete(group.id)
},
//打开普通聊天窗口
openFriendMessageView (friend) {
if (!this.friendMessageData[friend.id]) {
this.$emit('pull-friends-message', friend, (newData) => {
this._changeMessageViewComplete(friend.id)
this.friendMessageData[friend.id] = [...newData]
})
} else {
this._changeMessageViewComplete(friend.id)
}
},
_changeMessageViewComplete (id) {
this.messageViewloading = false
this.currentMessageId = id
},
_changeMessageView (item) {
this.openFriendMessageView(item)
/**
const resolve = (newData) => {
this.messageViewloading = false
this.
}
const reject = () => {
this.messageViewloading = false
}
this.$emit('pullFriendsMessage', item, {
resolve,
reject
})
*/
},
_openMessageView () {
},
findNode (query) {
return this.$refs.container.$el.querySelector(query)
},
_initialize () {
},
//将左侧的滚动条重置到顶部
_tabviewScrollToTop () {
},
}
}
</script>
<style lang='scss'>
@import '~styles/utils/index';
body {
background: #8d9198;
}
@include b(container) {
width: 900px;
height: 700px;
@include m(center) {
@include position-center(fixed);
}
}
@include b(sidebar) {
background: #1f252d;
display: flex;
flex-direction: column;
color: #fff;
overflow: hidden;
.el-tabs--card {
.el-tabs__nav,
.el-tabs__item,
.el-tabs__header {
border: none;
}
}
}
@include b(tab) {
display: flex;
width: 100%;
@include e(item) {
cursor: pointer;
line-height: 56px;
text-align: center;
flex: 1;
transition: all ease-in-out 0.3s;
font-size: 22px;
color: #6d6d6d;
@include m(active) {
color: #11d207;
}
}
}
@include b(tabview) {
flex: 1;
overflow-y: auto;
@include scrollbar-dark();
@include e(item) {
}
}
@include b(main) {
background: #eceef1;
}
@include b(header) {
line-height: 48px;
}
</style>