Files
im-system/uni-im示例/uni_modules/uni-im/pages/contacts/notification/notification.nvue
2023-09-24 17:55:19 +08:00

276 lines
7.0 KiB
Plaintext
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>
<view class="notification-box">
<text class="tips" v-if="tips">{{tips}}</text>
<uni-list :border="false">
<template v-if="notificationDatas && notificationDatas.length">
<uni-list-chat v-for="(item,index) in notificationDatas" :key="item.id"
:avatarCircle="true" :clickable="true"
:badge-text="item.is_read?'':'dot'" badgePositon="left"
:title="item.payload.title||item.title"
:note="item.payload.content||item.content||'无'"
:avatar="item.payload.avatar_file&&item.payload.avatar_file.url ? item.payload.avatar_file.url : '/uni_modules/uni-im/static/noticeIcon/notification2.png'"
@click.native="clickHandle(index,item)" direction="column" :time="friendlyTime(item.create_time)"
>
<view class="handle-box">
<template v-if="item.payload.state">
<text class="handle done">
{{'已'+(item.payload.state == 'confirm'?item.payload.confirmText:item.payload.cancelText)}}
</text>
</template>
<template v-else>
<text class="handle"
@click.stop="doAction(index,0)"
v-if="item.payload.cancelText"
>{{item.payload.cancelText}}</text>
<text
class="handle"
@click.stop="doAction(index,1)"
v-if="item.payload.confirmText"
>{{item.payload.confirmText}}</text>
<uni-icons v-if="!item.payload.cancelText && !item.payload.confirmText && item.path"
type="right" color="#cccccc"></uni-icons>
</template>
</view>
</uni-list-chat>
</template>
<uni-list-item v-else class="load-more">
<template v-slot:body>
<uni-load-more class="tip" :status="hasMore?'loading':'noMore'"></uni-load-more>
</template>
</uni-list-item>
</uni-list>
</view>
</template>
<script>
import uniImUtils from '@/uni_modules/uni-im/common/utils.js';
import uniIm from '@/uni_modules/uni-im/lib/main.js';
import action from './action.js';
const db = uniCloud.database();
export default {
data() {
return {
filterNotice:{},
tips:"",
hasMore:true
// notificationDatas:[]
}
},
async onLoad({param}) {
// console.log(param,decodeURIComponent(param))
param = JSON.parse(decodeURIComponent(param))
// console.log(param)
this.setParam(param)
},
computed: {
//是否为pc宽屏width>960px
isWidescreen(){
return uniIm.isWidescreen
},
notificationDatas(){
let notificationDatas = uniIm.notification.get(this.filterNotice)
if(notificationDatas.length == 0){
setTimeout(()=> {
this.hasMore = false
}, 100);
}
return notificationDatas
}
},
mounted() {
this.hasMore = uniIm.notification.hasMore
},
methods: {
setParam({filterNotice,title}){
if(typeof filterNotice == 'string'){
filterNotice = JSON.parse(decodeURIComponent(filterNotice))
}
this.filterNotice = filterNotice
console.log('filterNotice',filterNotice)
uni.setNavigationBarTitle({
title
})
if(title == '新朋友' && !this.isWidescreen){
this.tips = '好友请求通知'
}
},
async setItem({_id},param){
const datas = uniIm.notification.get(this.filterNotice)
for (let i = 0; i < datas.length; i++) {
if(datas[i]._id == _id){
datas[i] = deepAssign(datas[i],param)
uniIm.notificationDatas = datas
console.log('uniIm.notificationDatas',uniIm.notificationDatas)
break;
}
}
let ares = await db.collection('uni-im-notification')
.where(`"_id" == "${_id}" && "user_id" == $cloudEnv_uid`)
.get()
// console.log(13231,ares);
let res = await db.collection('uni-im-notification')
.where(`"_id" == "${_id}" && "user_id" == $cloudEnv_uid`)
.update(param)
// console.log('res---66666',param,res.result.updated);
/**
*判断对象是否是一个纯粹的对象
*/
function isPlainObject(obj){
return typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]'
}
/**
*深度合并多个对象的方法
*/
function deepAssign( ){
let len = arguments.length, target = arguments[0]
if(!isPlainObject(target)){
target = {}
}
for (let i = 1; i < len; i++){
let source = arguments[i]
if( isPlainObject( source ) ){
for( let s in source ){
if ( s === '__proto__' || target === source[s] ) {
continue
}
if( isPlainObject( source[s] ) ){
target[s] = deepAssign(target[s], source[s])
}else{
target[s] = source[s]
}
}
}
}
return target
}
},
async clickHandle(index,item){
// console.log('index',index,item);
//如果未读,设置为已读
if(!item.is_read){
this.setItem(item,{is_read:true})
}
//存在链接就跳转
let path = item.path || item.payload.path
if(path){
uni.navigateTo({
url:path,
fail: (e) => {
console.error(e);
}
})
}
// let item = this.notificationDatas[index]
// item.data.is_read = true
// this.notificationDatas[index] = Object.assign({},item)
// console.log(this.notificationDatas);
},
doAction(index,type){
let item = this.notificationDatas[index]
let e = {
subType:item.payload.subType,
confirm:type===1,
cancel:type===0,
item
}
action(e,data=>{
console.log('doAction',data)
this.setItem(item,{
is_read:true,
payload:{
state : type===1?'confirm':'cancel'
}
})
})
// console.log(index);
},
friendlyTime(timestamp) {
return uniImUtils.toFriendlyTime(timestamp)
},
handleText(state){
switch (state){
case 0:
return '同意'
break;
case 100:
return '已同意'
break;
case -100:
return '已拒绝'
break;
default:
return '其他'
break;
}
}
}
}
</script>
<style lang="scss" scoped>
.notification-box{
/* #ifndef APP-NVUE */
height: 100vh;
// width: 750rpx;
/* #endif */
/* #ifdef APP-NVUE */
flex: 1;
/* #endif */
background-color: #f5f5f5;
}
.tips{
height: 40px;
line-height: 40px;
padding-left: 20rpx;
font-size: 26rpx;
color: #666;
}
.handle-box{
flex-direction: row;
height: 40px;
align-items: center;
}
.handle{
width: 50px;
text-align: center;
height: 25px;
line-height: 25px;
background-color: #efefef;
border-radius: 50px;
font-size: 12px;
margin:0 5px;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.done{
width: 50px;
background-color: #FFF;
color: #aaa;
/* #ifdef H5 */
cursor: default;
/* #endif */
}
.load-more{
background-color: #f5f5f5!important;
justify-content: center;
}
.tip{
position: relative;
left: -15px;
width: 750rpx;
/* #ifndef APP-NVUE */
/* pc宽屏时需要使用100vw */
width: 100vw;
/* #endif */
}
/* #ifdef MP-WEIXIN */
.load-more ::v-deep .uni-list-item{
background-color: #f5f5f5!important;
}
/* #endif */
</style>