This commit is contained in:
唐明明
2022-02-24 11:28:37 +08:00
37 changed files with 516 additions and 438 deletions

View File

@@ -323,6 +323,7 @@ export {
dismissGroup,
inviteGroupUser,
removeGroupUser,
transferGroupOwner,
setGroupAdmin,
removeGroupAdmin,
groupMakeSure, // 通过审核

View File

@@ -2,8 +2,8 @@
"name" : "ZH-HEALTH",
"appid" : "__UNI__C29473D",
"description" : "ZH-HEALTH您手上的健康管理专家",
"versionName" : "1.0.15",
"versionCode" : 113,
"versionName" : "1.0.16",
"versionCode" : 100,
"transformPx" : false,
/* 5+App */
"app-plus" : {

View File

@@ -21,8 +21,12 @@
<script>
import messagePreview from './messagePreview'
import utils from '@/utils/index.js'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
props: {
item: {
type: Object,
@@ -31,21 +35,6 @@
}
}
},
data() {
return {
avatarRpx: 84
}
},
computed: {
avatarSize() {
return utils.rpx2px(this.avatarRpx)
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
},
components: {
messagePreview
}

View File

@@ -1,23 +1,24 @@
<template>
<view>
<view v-for="(item, index) in conversations" :key="index" :class="['message', { 'is-top': item.isTop, 'is-active': pickedItem.targetId == item.targetId }]"
:data-item="item" @longpress="onLongPress" @click="toDetail(item)">
<message-cell :item="item" />
</view>
<view class="shade" @click="hidePop" v-show="showPop">
<view class="shade" @click="hidePop" @touchmove="hidePop" v-show="showPop">
<view class="pop" :style="popStyle" :class="{'show':showPop}">
<view v-for="(item, index) in popButton" :key="index" @click="pickerMenu" :data-index="index">
{{item}}
</view>
</view>
</view>
<view v-for="(item, index) in conversations" :key="index"
:class="['message', { 'is-top': item.isTop, 'is-active': pickedItem.targetId == item.targetId }]"
:data-item="item" @longpress="onLongPress" @click="toDetail(item)">
<message-cell :item="item" />
</view>
</view>
</template>
<script>
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import im from '@/utils/im/index.js'
import messageCell from './messageCell'
import messageCell from './conversation/messageCell'
export default {
props: {
@@ -142,6 +143,7 @@
position: fixed;
width: 100%;
height: 100%;
z-index: 999;
.pop {
position: fixed;

View File

@@ -1,7 +1,7 @@
<template>
<view class="apply--cell">
<view class="avatar">
<u-avatar :src="user.portraitUrl || require('@/static/user/cover.png')" shape="square" size="46" />
<u-avatar :src="user.portraitUrl || require('@/static/user/cover.png')" shape="square" :size="avatarSize" />
</view>
<view class="info">
<view class="name"> {{ user.name }}</view>
@@ -20,8 +20,12 @@
resolveFriend,
rejectFriend
} from '@/apis/interfaces/im.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase
],
props: {
message: {
type: Object,
@@ -36,7 +40,6 @@
methods: {
resolve() {
resolveFriend(this.message.sourceUserId).then(res => {
this.clearMessages()
uni.showToast({
icon: 'none',
title: '通过好友申请'
@@ -47,6 +50,8 @@
icon: 'none',
title: err.message
})
}).finally(() => {
this.clearMessages()
})
},
reject() {
@@ -70,9 +75,9 @@
clearMessages() {
RongIMLib.deleteMessages(RongIMLib.ConversationType.SYSTEM, this.message.sourceUserId)
this.$emit('success')
uni.$emit('onNewContactConversation', message)
uni.$emit('onNewContactFriends', message)
uni.$emit('onNewContactPendings', message)
uni.$emit('onNewContactConversation')
uni.$emit('onNewContactFriends')
uni.$emit('onNewContactPendings')
}
}
}

View File

@@ -3,7 +3,7 @@
<block v-for="(item, index) in lists" v-if="lists.length > 0" :key="index">
<view class="lists">
<view class="" style="width: 100rpx;height: 100rpx;">
<u-avatar :src="JSON.parse(item.latestMessage.extra).portraitUrl" shape="square" size="44" />
<u-avatar :src="JSON.parse(item.latestMessage.extra).portraitUrl" shape="square" :size="avatarSize" />
</view>
<view class="right">
<view class="title">
@@ -14,7 +14,8 @@
<span v-if="isAgree" @click="action('agree', item)">通过</span>
<span v-if="isAgree" @click="action('reject', item)">拒绝</span>
<span v-if="isApply && !item.is_friend" @click="action('apply', item)">查看</span>
<span class="isFri" v-if="isApply && item.is_friend" @click="action('isFriend', item)">已是好友</span>
<span class="isFri" v-if="isApply && item.is_friend"
@click="action('isFriend', item)">已是好友</span>
</view>
</view>
</view>
@@ -23,7 +24,12 @@
</template>
<script>
export default {
import imBase from '../mixins/imBase.js'
export default {
mixins:[
imBase
],
name: 'friend-apply-reject-agree',
props: {
lists: {
@@ -50,16 +56,23 @@ export default {
action(type, item) {
if (type === 'isFriend') {
// ,后期可以跳转到信息介绍页面,先留在这里
return uni.showToast({ title: '已是好友,无需重复添加', icon: 'none', duration:2000});
return uni.showToast({
title: '已是好友,无需重复添加',
icon: 'none',
duration: 2000
});
}
this.$emit('action', { type, item });
this.$emit('action', {
type,
item
});
}
}
};
};
</script>
<style lang="scss" scoped>
.lists {
.lists {
padding: 0 $padding;
display: flex;
flex-direction: row;
@@ -72,6 +85,7 @@ export default {
.cover {
background-color: #ffffff;
}
.right {
width: 570rpx;
margin-left: $margin - 10;
@@ -81,8 +95,10 @@ export default {
justify-content: space-between;
padding: $padding 0;
border-bottom: solid 1rpx #f9f9f9;
.title {
width: 370rpx;
.name {
width: 100%;
color: $text-color;
@@ -91,6 +107,7 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
.des {
width: 100%;
flex: 1;
@@ -102,25 +119,29 @@ export default {
color: $text-gray-m;
}
}
.agress-btn {
display: flex;
color: #fff;
font-size: $title-size-m;
span {
display: inline-block;
padding: 6rpx 14rpx;
background-color: $text-price;
border-radius: 10rpx;
}
span:nth-child(1) {
background-color: $main-color;
margin-right: 10rpx;
}
.isFri {
background-color: #f9f9f9 !important;
color: #666;
}
}
}
}
}
</style>

View File

@@ -3,7 +3,7 @@
<block v-for="(item, index) in lists" v-if="lists.length > 0" :key="index">
<view class="lists">
<view class="" style="width: 100rpx;height: 100rpx;">
<u-avatar :src="item.portraitUrl || require('@/static/user/cover.png')" shape="square" size="44" />
<u-avatar :src="item.portraitUrl || require('@/static/user/cover.png')" shape="square" :size="avatarSize" />
</view>
<view class="right">
<view class="title">
@@ -21,7 +21,12 @@
</template>
<script>
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase
],
name: 'friend-apply-reject-agree',
props: {
lists: {

View File

@@ -38,8 +38,12 @@
transferGroupOwner
} from '@/apis/interfaces/im.js'
import utils from '@/utils/index.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase
],
props: {
targetId: {
type: String,
@@ -67,13 +71,6 @@
iconSize: 14
}
},
computed: {
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
},
created() {
this.avatarSize = utils.rpx2px(84)
this.labelSize = utils.rpx2px(24)

View File

@@ -33,9 +33,12 @@
<script>
import im from '@/utils/im/index.js'
import * as CallLib from '@/uni_modules/RongCloud-CallWrapper/lib/index'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
data() {
return {
callActions: [{
@@ -64,15 +67,11 @@
default: ''
}
},
computed: {
sender() {
return this.$store.getters.sender
}
},
methods: {
singleCall(e) {
uni.navigateTo({
url: '/pages/im/private/call?targetId=' + this.targetId + '&mediaType=' + e.type + '&isCall=true'
url: '/pages/im/private/call?targetId=' + this.targetId + '&mediaType=' + e.type +
'&isCall=true'
})
},
onPopupsItem(type) {
@@ -144,6 +143,7 @@
display: flex;
flex-wrap: wrap;
flex-direction: row;
.item {
width: 150rpx;
margin: 15rpx;

View File

@@ -8,8 +8,12 @@
<script>
import im from '@/utils/im/index.js'
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
props: {
conversationType: {
type: Number,
@@ -23,9 +27,6 @@
computed: {
disabled() {
return this.inputTxt.length === 0
},
sender() {
return this.$store.getters.sender
}
},
mounted() {

View File

@@ -20,8 +20,12 @@
<script>
import im from '@/utils/im/index.js'
import permision from '@/utils/permission.js'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
props: {
conversationType: {
type: Number,
@@ -169,6 +173,7 @@
width: 500rpx;
border-radius: 10rpx;
margin-right: 15rpx;
.button {
font-size: 30rpx;
color: #333;
@@ -219,6 +224,7 @@
flex-direction: column;
align-items: center;
justify-content: center;
.icon {
width: 88rpx;
height: 88rpx;

View File

@@ -16,9 +16,9 @@
</template>
<script>
import sentText from './sentText'
import sentVoice from './sentVoice'
import sentPopups from './sentPopups'
import sentText from './sent/sentText'
import sentVoice from './sent/sentVoice'
import sentPopups from './sent/sentPopups'
export default {
props: {

View File

@@ -11,8 +11,12 @@
<script>
import utils from '@/utils/index.js'
import moment from 'moment'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
name: 'showText',
props: {
message: {
@@ -38,11 +42,6 @@
isRemote() {
return this.message.messageDirection == 2
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
},
duration() {
if (this.message.duration > 3600) {
return moment.utc(this.message.duration * 1000).format('HH:mm:ss')

View File

@@ -14,8 +14,12 @@
<script>
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import messageState from './messageState'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
name: 'showImage',
props: {
message: {
@@ -38,11 +42,6 @@
},
content() {
return this.message.content
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
},
methods: {
@@ -57,10 +56,10 @@
if (this.content.local && this.content.local.indexOf('///data/user/') < 0) {
this.showImage(this.content.local)
} else {
this.showImage(this.content.remote)
RongIMLib.downloadMediaMessage(this.message.messageId, {
success: (path) => {
this.content.local = path
this.showImage(path)
},
error: (errorCode, messageId) => {
uni.showToast({

View File

@@ -11,9 +11,13 @@
<script>
import messageState from './messageState'
import imBase from '../../mixins/imBase.js'
export default {
name: 'showText',
mixins: [
imBase,
],
props: {
message: {
type: Object,
@@ -35,11 +39,6 @@
},
content() {
return this.message.content.content
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
}
}
@@ -58,7 +57,7 @@
.text {
box-sizing: border-box;
max-width: 502rpx;
padding: 20rpx;
padding: 20rpx 24rpx;
line-height: 46rpx;
font-size: 32rpx;
color: $text-color;

View File

@@ -23,8 +23,12 @@
<script>
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import messageState from './messageState'
import imBase from '../../mixins/imBase.js'
export default {
mixins: [
imBase
],
props: {
message: {
type: Object,
@@ -54,11 +58,6 @@
isRemote() {
return this.message.messageDirection == 2
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
},
width() {
if (this.duration > 3) {
return (this.duration * 5) + 150

View File

@@ -2,8 +2,8 @@
<view class="">
<view class="notify" v-if="message.objectName === 'RC:GrpNtf'">
{{ message.content.message }}
<text class="link" @click="toAnnounce(message.content.extra)"
v-if="message.content.operation == 'ANNOUNCEMENT'">点击查看 </text>
<text class="link" @click="toAnnounce(message)" v-if="message.content.operation == 'ANNOUNCEMENT'">点击查看
</text>
</view>
<view class="notify" v-else-if="message.objectName === 'RC:RcNtf'">
{{ contact(message.senderUserId).name }} 撤回了一条消息
@@ -26,14 +26,21 @@
</template>
<script>
import {
getGroupAnnouncement
} from '@/apis/interfaces/im.js'
import * as IMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import showVoice from './show/showVoice'
import showImage from './show/showImage'
import showText from './show/showText'
import showCall from './show/showCall'
import utils from '@/utils/index.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase
],
components: {
showCall,
showVoice,
@@ -52,21 +59,6 @@
default: false
}
},
data() {
return {
avatarRpx: 84
}
},
computed: {
avatarSize() {
return utils.rpx2px(this.avatarRpx)
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
},
methods: {
toUser(item) {
if (item.messageDirection == 1) {
@@ -80,10 +72,25 @@
}
},
// 跳转群公告
toAnnounce(targetId) {
if (targetId) {
toAnnounce(message) {
if (message.content.extra) {
getGroupAnnouncement(message.targetId, message.content.extra).then(res => {
uni.navigateTo({
url: '/pages/im/group/announceCreate?targetId=' + this.targetId
url: '/pages/im/group/announceCreate?type=check&targetId=' + message
.targetId + '&aId=' + message.content.extra
})
}).catch(err => {
IMLib.deleteMessagesByIds([message.messageId], ({
code
}) => {
if (code === 0) {
uni.$emit('remove_message_' + message.targetId, message.messageId)
}
})
uni.showToast({
title: '公告不存在或已删除',
icon: 'none',
})
})
} else {
uni.showToast({
@@ -137,7 +144,7 @@
color: #666;
.link {
color: blue;
color: $main-color;
margin-left: 10rpx;
}
}

View File

@@ -12,15 +12,21 @@
</view>
<block v-if="friends.length > 0">
<u-index-item v-for="(item, fkey) in friends" :key="fkey">
<u-index-anchor :text="indexs[fkey]" bgColor="#f9f9f9" height="20" size="12" color="#666" class="anchor" />
<view v-for="(friendItem, index) in item" :key="index" class="friend-flex" @click="toFriend(friendItem.targetId)">
<u-avatar class="avatar-img" size="40" shape="square" :src="contact(friendItem.targetId).portraitUrl" />
<view class="info"> <view class="name">{{ contact(friendItem.targetId).name }}</view> </view>
<u-index-anchor :text="indexs[fkey]" bgColor="#f9f9f9" height="20" size="12" color="#666"
class="anchor" />
<view v-for="(friendItem, index) in item" :key="index" class="friend-flex"
@click="toFriend(friendItem.targetId)">
<u-avatar class="avatar-img" size="40" shape="square"
:src="contact(friendItem.targetId).portraitUrl" />
<view class="info">
<view class="name">{{ contact(friendItem.targetId).name }}</view>
</view>
</view>
</u-index-item>
</block>
<view class="no-lists" v-else>
<u-image class="cover" radius="4" width="400rpx" height="400rpx" :src=" require('@/static/imgs/no-friend.png')" :lazy-load="true" />
<u-image class="cover" radius="4" width="400rpx" height="400rpx"
:src=" require('@/static/imgs/no-friend.png')" :lazy-load="true" />
<span>暂无好友列表~</span>
</view>
</u-index-list>
@@ -28,11 +34,17 @@
</template>
<script>
import {getFriendsLetter} from '@/apis/interfaces/im';
import {
getFriendsLetter
} from '@/apis/interfaces/im';
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import im from '@/utils/im/index.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase
],
data() {
return {
indexs: [],
@@ -47,18 +59,19 @@
}
}
},
onLoad() {
uni.$on('onNewContactFriends', this.checkNewFriendPending)
},
onShow() {
this.getFriendList()
this.checkNewFriendPending()
uni.$on('onContactNotification', this.checkNewFriendPending)
},
onUnload() {
uni.$off("onContactNotification")
uni.$off("onNewContactFriends")
},
methods: {
getFriendList() {
getFriendsLetter().then(res => {
console.log(res)
this.indexs = res.indexList
this.friends = res.itemArr
})
@@ -70,10 +83,7 @@
},
toGroup() {
uni.navigateTo({
url: '/pages/im/group/index',
fail(err) {
console.log(err);
}
url: '/pages/im/group/index'
})
},
toFriend(targetId) {
@@ -85,13 +95,13 @@
toPending() {
uni.navigateTo({
url: '/pages/im/friends/pending'
});
})
}
},
onNavigationBarButtonTap(e) {
uni.navigateTo({
url: '/pages/im/friends/search'
});
})
}
};
</script>
@@ -160,6 +170,7 @@
line-height: 24px;
background-color: #fff;
}
.no-lists {
padding-top: $padding * 3;
display: flex;

View File

@@ -23,7 +23,8 @@
<script>
import {
getUserInfo
} from '@/apis/interfaces/im'
} from '@/apis/interfaces/im.js'
export default {
data() {
return {

View File

@@ -43,7 +43,7 @@
methods: {
getPendingList() {
im.getPendingList((pendings) => {
console.log(pendings,'res......')
console.log(pendings, 'res......')
if (pendings.length > 0) {
this.bg = '#f9f9f9'
} else {

View File

@@ -8,17 +8,17 @@
<template>
<view class="search">
<!-- 搜索 -->
<!-- 搜索 -->
<u-sticky>
<view class="header-search">
<u-search placeholder="输入用户账号、手机号" searchIcon="search" @custom="search" v-model="searchValue"
@search="search" bgColor="#f9f9f9" :focus="focused" />
@search="search" bgColor="#F3F6FB" :focus="focused" />
</view>
</u-sticky>
<block v-if="searchResult.length > 0">
<applyFriend :lists="searchResult" :isApply="true" @action="action" />
</block>
<view class="no-lists" v-else>
<view class="no-lists" v-if="searchResult.length === 0 && searchValue.length > 1">
<u-image class="cover" radius="4" width="400rpx" height="400rpx"
:src="require('@/static/imgs/no-search.png')" :lazy-load="true" />
<span>暂无匹配内容~</span>
@@ -32,6 +32,7 @@
pedingFriend
} from '@/apis/interfaces/im.js';
import applyFriend from '../components/friendSearchList.vue';
export default {
components: {
applyFriend
@@ -43,6 +44,20 @@
focused: true
};
},
watch: {
searchValue(value) {
console.log(value.length, 'length...')
if (value.length > 1) {
this.searchResult = []
this.search()
return
}
if(value.length === 0){
this.searchResult = []
return
}
}
},
methods: {
search() {
// friendship: '' 没有好友关系

View File

@@ -1,13 +1,15 @@
<template>
<view class="create">
<view class="create-title">公告内容</view>
<block v-if="type !== 'check'">
<block v-if="type === 'check'">
<view class="content"> {{content}} </view>
</block>
<block v-else>
<u--textarea v-model="content" count height="240" maxlength="240" placeholder="请输入公告内容" />
<u-button type="primary" text="发布" :disabled="disabled" @click="onCreate" color="#34CE98" />
</block>
<block v-if="type === 'check'">
<view class="content-a"> {{content}} </view>
</block>
</view>
</template>
@@ -16,7 +18,7 @@
createGroupAnnouncement,
getGroupAnnouncement
} from '@/apis/interfaces/im.js'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
export default {
mixins: [
@@ -27,25 +29,31 @@
targetId: '',
content: '',
aId: '',
type: '' // check ' 查看详情'
type: '' // cheack ' 查看详情'
}
},
onLoad(e) {
this.targetId = e.targetId
if (e.type) {
this.type = e.type
}
if (e.aId) {
this.type = e.type
uni.setNavigationBarTitle({
title: '群公告'
})
this.aId = e.aId
getGroupAnnouncement(this.targetId, this.aId).then(res => {
console.log(res.content)
this.content = res.content
}).catch(err => {
if (err.status_code == 404) {
this.$nextTick(() => {
uni.navigateBack()
})
} else {
uni.showToast({
title: err.message,
icon: 'none',
mask: true
})
}
})
}
},
@@ -99,7 +107,7 @@
}
}
.content-a {
.content {
color: $text-color;
font-size: $title-size;
line-height: 1.7;

View File

@@ -35,10 +35,12 @@
deleteGroupAnnouncement,
topGroupAnnouncement
} from '@/apis/interfaces/im.js'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase,
onGroupDismiss
],
data() {
@@ -76,7 +78,7 @@
onNavigationBarButtonTap() {
if (this.isAdmin) {
uni.navigateTo({
url: '/pages/im/group/announceCreate?type=check&targetId=' + this.targetId
url: '/pages/im/group/announceCreate?targetId=' + this.targetId
})
} else {
uni.showToast({
@@ -132,14 +134,6 @@
uni.$emit('updateAnnouncement')
this.initData()
})
// uni.showModal({
// title: ' 置顶该公告',
// success: (res) => {
// if (res.confirm) {
// }
// }
// })
},
// 删除公告
onDelete(aId) {
@@ -152,14 +146,6 @@
uni.$emit('updateAnnouncement')
this.initData()
})
// uni.showModal({
// title: '删除该公告',
// success: (res) => {
// if (res.confirm) {
// }
// }
// })
}
}
}
@@ -198,7 +184,8 @@
box-sizing: border-box;
font-size: $title-size-m;
color: $text-gray-m;
padding: 10rpx;
padding: 20rpx 10rpx 10rpx 10rpx;
border-top: solid 1rpx #F9F9F9;
.name {
padding-left: 10rpx;
@@ -219,8 +206,6 @@
-webkit-line-clamp: 3;
overflow: hidden;
line-height: 1.5;
border-bottom: solid 1rpx #F9F9F9;
padding-bottom: 20rpx;
span {
color: #fff;

View File

@@ -20,10 +20,12 @@
joinGroupPre,
joinGroup
} from '@/apis/interfaces/im.js'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase,
onGroupDismiss
],
data() {

View File

@@ -21,10 +21,12 @@
import sentMessageBar from '../components/sentMessageBar'
import showMessageCell from '../components/showMessageCell'
import utils from '@/utils/index.js'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase,
onGroupDismiss
],
components: {
@@ -87,22 +89,24 @@
})
// 清理聊天记录
uni.$once('cleanGroupMessage', this.getMessageList)
uni.$on('onRecallMessage', (res) => {
if (res.targetId == this.targetId) {
uni.$on('onRecallMessage_' + this.targetId, (message) => {
this.messages = this.messages.map(item => {
if (res.messageId == item.messageId) {
return res
if (message.messageId == item.messageId) {
return message
} else {
return item
}
})
}
})
uni.$on('remove_message_' + this.targetId, (messageId) => {
this.messages = this.messages.filter(item => item.messageId != messageId)
})
},
onUnload() {
uni.$off('remove_message_' + this.targetId)
uni.$off('onReceiveMessage_' + this.targetId)
uni.$off('onUpdateProfile_' + this.targetId)
uni.$off('onRecallMessage')
uni.$off('onRecallMessage_' + this.targetId)
uni.$off('onReceiptRequest')
uni.$off('onReceiptResponse')
},

View File

@@ -3,7 +3,7 @@
<block v-if="groups.length > 0">
<view class="title"> 群聊 </view>
<view v-for="(item, index) in groups" :key="index" class="friend-flex" @click="toGroup(item.targetId)">
<u-avatar size="36" shape="square" :src="item.portraitUrl !== ''?contact(item.targetId).portraitUrl :require('@/static/user/cover-s.png')" />
<u-avatar size="36" shape="square" :src="contact(item.targetId).portraitUrl" />
<view class="info">
<view class="name">{{ item.name }} <span class="total">{{ item.members }} 成员</span></view>
</view>

View File

@@ -21,9 +21,9 @@
<u-cell-group class="cells" v-if="group.is_admin" :border="false">
<u-cell :border="false" class="u-border-bottom" isLink title="修改群聊名称" :value="groupName"
@click="onGroupName" />
<u-cell :border="false" class="u-border-bottom" isLink title="修改群头像" @click="onGroupAvatar">
<!-- <u-cell :border="false" class="u-border-bottom" isLink title="修改群头像" @click="onGroupAvatar">
<u-avatar slot="value" size="25" shape="square" :src="group.cover" />
</u-cell>
</u-cell> -->
<u-cell :border="false" class="u-border-bottom" isLink v-if="group.is_owner" title="准入方式" :value="joinType" @click="onChangeJoinType" />
</u-cell-group>
@@ -57,13 +57,15 @@
} from '@/apis/interfaces/uploading'
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import groupUserList from '../components/groupUserList'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
import imBase from '../mixins/imBase.js'
export default {
components: {
groupUserList
},
mixins: [
imBase,
onGroupDismiss
],
data() {

View File

@@ -45,11 +45,13 @@
getGroupUsers
} from '@/apis/interfaces/im';
import utils from '@/utils/index.js'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase,
onGroupDismiss
],
data() {
@@ -64,13 +66,6 @@
selectValue: []
};
},
computed: {
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
},
onLoad(e) {
this.targetId = e.targetId
this.getFriendList()

View File

@@ -34,10 +34,12 @@
} from "@/apis/interfaces/im.js"
import im from '@/utils/im/message.js'
import * as RongIMLib from '@/uni_modules/RongCloud-IMWrapper/js_sdk/index'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase,
onGroupDismiss
],
data() {

View File

@@ -4,7 +4,7 @@
<script>
import groupUserList from '../components/groupUserList'
import onGroupDismiss from '@/utils/im/onGroupDismiss.js'
import onGroupDismiss from '../mixins/onGroupDismiss.js'
export default {
mixins: [

View File

@@ -46,7 +46,8 @@
return {
conversations: [], // 会话列表
connection: 0,
hasNewFriends: 0
hasNewFriends: 0,
perPage: 200
}
},
components: {
@@ -54,12 +55,17 @@
connectionStatus
},
onLoad() {
// 好友申请数量
this.checkNewFriendPending()
// 监听新的好友申请
uni.$on('onNewContactConversation', this.checkNewFriendPending)
uni.$on('onNewContactConversation', () => {
console.log('更新好友申请数量');
// 更新好友申请数量
this.checkNewFriendPending()
})
},
onShow() {
// 好友申请数量
this.checkNewFriendPending()
if (this.$store.state.token !== '') {
this.getConversationList()
}
@@ -76,7 +82,6 @@
})
},
onHide() {
// 页面隐藏的时候,不监听了,性能可能会好一点
uni.$off('onReceiveMessage')
uni.$off('onConnectionStatusChange')
},
@@ -95,11 +100,9 @@
}
return true
},
// 获取私聊的会话列表
// 获取会话列表,最新的一千条
getConversationList() {
const count = 1000
const timestamp = 0
RongIMLib.getConversationList([1, 3], count, timestamp, ({
RongIMLib.getConversationList([1, 3], this.perPage, 0, ({
code,
conversations
}) => {

17
pages/im/mixins/imBase.js Normal file
View File

@@ -0,0 +1,17 @@
import utils from '@/utils/index.js'
export default {
computed: {
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
},
avatarSize() {
return utils.rpx2px(84)
},
sender() {
return this.$store.getters.sender
}
}
}

View File

@@ -1,5 +1,5 @@
// 监听群解散的消息,直接跳转到会话列表页面
const onGroupDismiss = {
export default {
data() {
return {
currentTargetId: ''
@@ -32,5 +32,3 @@ const onGroupDismiss = {
uni.$off('onGroupRemoveYou_' + this.currentTargetId)
}
}
export default onGroupDismiss

View File

@@ -18,8 +18,12 @@
import sentMessageBar from '../components/sentMessageBar'
import showMessageCell from '../components/showMessageCell'
import utils from '@/utils/index.js'
import imBase from '../mixins/imBase.js'
export default {
mixins: [
imBase
],
components: {
sentMessageBar,
showMessageCell
@@ -45,11 +49,6 @@
sentTime: 0
}
}
},
contact() {
return function(targetId) {
return this.$store.getters.contactInfo(targetId)
}
}
},
onLoad(e) {
@@ -76,20 +75,19 @@
})
}
})
uni.$on('onRecallMessage', (res) => {
if (res.targetId == this.targetId) {
uni.$on('onRecallMessage_' + this.targetId, (message) => {
this.messages = this.messages.map(item => {
if (res.messageId == item.messageId) {
return res
if (message.messageId == item.messageId) {
return message
} else {
return item
}
})
}
})
},
onUnload() {
uni.$off('onReceiveMessage_' + this.targetId)
uni.$off('onRecallMessage_' + this.targetId)
uni.$off('onRecallMessage')
uni.$off('onReadReceiptReceived')
},

BIN
static/.DS_Store vendored

Binary file not shown.

View File

@@ -55,8 +55,7 @@ const notifyMsgTypes = [
IMLib.ObjectName.Location,
IMLib.ObjectName.Voice,
IMLib.ObjectName.HQVoice,
IMLib.ObjectName.Sight,
IMLib.ObjectName.GroupNotification
IMLib.ObjectName.Sight
]
const imLibListeners = () => {
@@ -68,7 +67,7 @@ const imLibListeners = () => {
// 添加消息监听函数
IMLib.addReceiveMessageListener((res) => {
const message = res.data.message
console.error('[收到消息]', message)
console.error('[收到消息]',IMLib.ObjectName.GroupNotification, message)
checkContactExists(message)
if (utils.inArray(message.objectName, notifyMsgTypes)) {
onReceiveMessage(message)
@@ -84,6 +83,7 @@ const imLibListeners = () => {
uni.$emit('onNewContactFriends', message)
uni.$emit('onNewContactPendings', message)
} else if (message.objectName === IMLib.ObjectName.GroupNotification) {
console.log('踢出用户',message);
// 解散群
if (message.content.operation === 'Dismiss') {
IMLib.cleanHistoryMessages(message.conversationType, message.targetId, message.sentTime,
@@ -94,6 +94,7 @@ const imLibListeners = () => {
uni.$emit('onGroupDismiss')
uni.$emit('onGroupDismiss_' + message.targetId)
} else if (message.content.operation === 'REMOVE') {
console.log('踢出', message.content);
// 要判断是否当前用户,然后把当前用户踢出到主页去, 删除聊天记录,会话列表
if (message.content.extra == store.getters.sender.userId) {
IMLib.cleanHistoryMessages(message.conversationType, message.targetId, message.sentTime,
@@ -119,10 +120,16 @@ const imLibListeners = () => {
uni.$emit('onReadReceiptReceived', data)
})
// 监听消息撤回操作
IMLib.addRecallMessageListener((res) => {
IMLib.getMessage(res.data.messageId, (res) => {
console.error("消息撤回: ", res.message);
uni.$emit('onRecallMessage', res.message)
IMLib.addRecallMessageListener(({
data
}) => {
IMLib.getMessage(data.messageId, ({
message
}) => {
console.error("消息撤回: ", message);
im.setNotifyBadge()
uni.$emit('onReceiveMessage', message)
uni.$emit('onRecallMessage_' + message.targetId, message)
})
})
// 监听需要群聊消息回执