通话详情页

This commit is contained in:
小李 2026-05-27 16:14:34 +08:00
parent 1d4fd42cbb
commit 86434ab815
55 changed files with 2888 additions and 164 deletions

View File

@ -3,9 +3,10 @@
<view v-for="(item, index) in list" :key="index" class="item" @touchstart="touchStart($event, index)" <view v-for="(item, index) in list" :key="index" class="item" @touchstart="touchStart($event, index)"
@touchmove="touchMove($event, index)" @touchend="touchEnd($event, index)" @touchmove="touchMove($event, index)" @touchend="touchEnd($event, index)"
:style="{ 'transform': 'translateX(' + swiperList[index] + 'px)', 'transition': swiperList[index] == 0 ? 'all 0.3s' : '' }"> :style="{ 'transform': 'translateX(' + swiperList[index] + 'px)', 'transition': swiperList[index] == 0 ? 'all 0.3s' : '' }">
<view class="avatar" v-if="type != 'xiaomi'"> <view class="avatar" v-if="type != 'xiaomi'" @click="goDetail(item,index)">
<!-- 显示文字头像 --> <!-- 显示文字头像 -->
<view v-if="type == 'ios' && item.name && item.avatarType === 'text'" class="text-avatar" :class="{'text-avatar-18':getAvatarLength(item.name)==2}"> <view v-if="type == 'ios' && item.name && item.avatarType === 'text'" class="text-avatar"
:class="{'text-avatar-18':getAvatarLength(item.name)==2}">
{{ getAvatarText(item.name) }} {{ getAvatarText(item.name) }}
</view> </view>
<!-- 显示图片头像 --> <!-- 显示图片头像 -->
@ -30,7 +31,7 @@
<image v-else-if="type == 'vivo'&&(item.status==1||item.status==2)" <image v-else-if="type == 'vivo'&&(item.status==1||item.status==2)"
:src="`/static/image/call/vivoStatusIcon1.png`" mode="widthFix"> </image> :src="`/static/image/call/vivoStatusIcon1.png`" mode="widthFix"> </image>
</view> </view>
<view class="infoBox"> <view class="infoBox" @click="goDetail(item,index)">
<view class="left-box"> <view class="left-box">
<view class="leftInfo"> <view class="leftInfo">
<view class="title" :class="{ 'title-red': item.status == 3 }"> <view class="title" :class="{ 'title-red': item.status == 3 }">
@ -133,7 +134,7 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">运营商</text> <text class="form-label">运营商</text>
<uni-data-select class="form-select" v-model="editForm.yys" :localdata="yysOptions" @change="onYysChange" <uni-data-select class="form-select" v-model="editForm.yys" :localdata="yysOptions" @change="onYysChange"
:clear="false"></uni-data-select> :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
@ -148,14 +149,14 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">卡几</text> <text class="form-label">卡几</text>
<uni-data-select class="form-select" v-model="editForm.kj" :localdata="kjOptions" @change="onKjChange" <uni-data-select class="form-select" v-model="editForm.kj" :localdata="kjOptions" @change="onKjChange"
:clear="false"></uni-data-select> :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">状态</text> <text class="form-label">状态</text>
<uni-data-select class="form-select" v-model="editForm.status" :localdata="statusOptions" @change="onStatusChange" <uni-data-select class="form-select" v-model="editForm.status" :localdata="statusOptions"
:clear="false"></uni-data-select> @change="onStatusChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">电话备注</text> <text class="form-label">电话备注</text>
@ -163,8 +164,8 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像类型</text> <text class="form-label">头像类型</text>
<uni-data-select class="form-select" v-model="editForm.avatarType" :localdata="avatarTypeOptions" @change="onAvatarTypeChange" <uni-data-select class="form-select" v-model="editForm.avatarType" :localdata="avatarTypeOptions"
:clear="false"></uni-data-select> @change="onAvatarTypeChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像</text> <text class="form-label">头像</text>
@ -216,7 +217,7 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">运营商 <text>*</text></text> <text class="form-label">运营商 <text>*</text></text>
<uni-data-select class="form-select" v-model="addForm.yys" :localdata="yysOptions" @change="onAddYysChange" <uni-data-select class="form-select" v-model="addForm.yys" :localdata="yysOptions" @change="onAddYysChange"
:clear="false"></uni-data-select> :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
@ -227,12 +228,12 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">状态 <text>*</text></text> <text class="form-label">状态 <text>*</text></text>
<uni-data-select class="form-select" v-model="addForm.status" :localdata="statusOptions" @change="onAddStatusChange" <uni-data-select class="form-select" v-model="addForm.status" :localdata="statusOptions"
:clear="false"></uni-data-select> @change="onAddStatusChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">卡几</text> <text class="form-label">卡几</text>
<uni-data-select class="form-select" v-model="addForm.kj" :localdata="kjOptions" @change="onAddKjChange" <uni-data-select class="form-select" v-model="addForm.kj" :localdata="kjOptions" @change="onAddKjChange"
:clear="false"></uni-data-select> :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
@ -249,8 +250,8 @@
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像类型</text> <text class="form-label">头像类型</text>
<uni-data-select class="form-select" v-model="addForm.avatarType" :localdata="avatarTypeOptions" @change="onAddAvatarTypeChange" <uni-data-select class="form-select" v-model="addForm.avatarType" :localdata="avatarTypeOptions"
:clear="false"></uni-data-select> @change="onAddAvatarTypeChange" :clear="false"></uni-data-select>
</view> </view>
<view class="form-item"> <view class="form-item">
<text class="form-label">头像</text> <text class="form-label">头像</text>
@ -304,8 +305,12 @@
import { import {
onUnload onUnload
} from "@dcloudio/uni-app"; } from "@dcloudio/uni-app";
import DateTimePicker from '@/components/dengrq-datetime-picker/dateTimePicker/index.vue'; import DateTimePicker from '@/components/dengrq-datetime-picker/dateTimePicker/index.vue'; import {
useStore
} from '@/store/index.js'
const {
setCallDetail
} = useStore()
const props = defineProps({ const props = defineProps({
isHuise: { isHuise: {
type: Boolean, type: Boolean,
@ -691,6 +696,12 @@
} }
]); ]);
const goDetail = (value,index) => {
setCallDetail(value)
uni.navigateTo({
url:'/pages/call-log/detail/callDetail?type='+props.type+'&index='+index
})
};
// //
const getKjText = (value) => { const getKjText = (value) => {
return value || '请选择'; return value || '请选择';
@ -795,7 +806,7 @@
editForm.kj = item.kj || '1'; editForm.kj = item.kj || '1';
editForm.address = item.address || ''; editForm.address = item.address || '';
editForm.time = item.time || ''; editForm.time = item.time || '';
editForm.status = item.status ||0; editForm.status = item.status || 0;
editForm.notes = item.notes || ''; editForm.notes = item.notes || '';
showEditModal.value = true; showEditModal.value = true;
}; };
@ -1093,7 +1104,7 @@
// //
const cleanStr = str.replace(/\s+/g, ''); const cleanStr = str.replace(/\s+/g, '');
if (cleanStr.length <= 3) { if (cleanStr.length !=11) {
return cleanStr; return cleanStr;
} }
@ -1121,54 +1132,54 @@
} }
function choose() { function choose() {
uni.chooseImage({ uni.chooseImage({
count: 1, count: 1,
sourceType: [ 'album' , 'camera'], sourceType: ['album', 'camera'],
maxDuration: 30, maxDuration: 30,
camera: 'back', camera: 'back',
success(res) { success(res) {
let tempFilePath = res.tempFiles[0].path let tempFilePath = res.tempFiles[0].path
// //
uni.saveFile({ uni.saveFile({
tempFilePath: tempFilePath, tempFilePath: tempFilePath,
success: function(ress) { success: function(ress) {
// 使 // 使
const localPath = ress.savedFilePath; const localPath = ress.savedFilePath;
if (showEditModal.value) { if (showEditModal.value) {
editForm.avatar = localPath; editForm.avatar = localPath;
} else if (showAddModal.value) { } else if (showAddModal.value) {
addForm.avatar = localPath; addForm.avatar = localPath;
}
//
uni.showToast({
title: '图片保存成功',
icon: 'success'
});
},
fail: function(err) {
console.log('保存文件失败:', err);
// 使
if (showEditModal.value) {
editForm.avatar = tempFilePath;
} else if (showAddModal.value) {
addForm.avatar = tempFilePath;
}
uni.showToast({
title: '图片保存失败,使用临时路径',
icon: 'none'
});
} }
// });
uni.showToast({ },
title: '图片保存成功', fail(err) {
icon: 'success' console.log('选择图片失败:', err);
}); uni.showToast({
}, title: '选择图片失败',
fail: function(err) { icon: 'none'
console.log('保存文件失败:', err); });
// 使 }
if (showEditModal.value) { })
editForm.avatar = tempFilePath; }
} else if (showAddModal.value) {
addForm.avatar = tempFilePath;
}
uni.showToast({
title: '图片保存失败,使用临时路径',
icon: 'none'
});
}
});
},
fail(err) {
console.log('选择图片失败:', err);
uni.showToast({
title: '选择图片失败',
icon: 'none'
});
}
})
}
// //
const getAvatarText = (name) => { const getAvatarText = (name) => {
@ -1429,7 +1440,8 @@
padding: 24rpx 32rpx 24rpx 0; padding: 24rpx 32rpx 24rpx 0;
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 -0.3px 0 0 #C2C2C2; box-shadow: 0 -0.3px 0 0 #C2C2C2;
.left-box { .left-box {
.title { .title {
font-weight: 400; font-weight: 400;
@ -1528,10 +1540,11 @@
} }
.call-list-oppo { .call-list-oppo {
.kj{ .kj {
width: 20rpx !important; width: 20rpx !important;
height: 24rpx !important; height: 24rpx !important;
} }
.item { .item {
padding: 32rpx 36rpx 0 36rpx !important; padding: 32rpx 36rpx 0 36rpx !important;
justify-content: space-between; justify-content: space-between;
@ -1543,7 +1556,7 @@
padding-bottom: 36rpx; padding-bottom: 36rpx;
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 0.3px 0 0 #C2C2C2; box-shadow: 0 0.3px 0 0 #C2C2C2;
.title { .title {
font-weight: 400; font-weight: 400;
@ -1603,7 +1616,7 @@
padding-bottom: 32rpx; padding-bottom: 32rpx;
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 0.3px 0 0 #C2C2C2; box-shadow: 0 0.3px 0 0 #C2C2C2;
.title { .title {
font-weight: 400; font-weight: 400;
@ -1645,10 +1658,11 @@
} }
.call-list-huawei { .call-list-huawei {
.kj{ .kj {
width: 18rpx !important; width: 18rpx !important;
height: 22rpx !important; height: 22rpx !important;
} }
.item { .item {
padding: 24rpx 32rpx 0 32rpx !important; padding: 24rpx 32rpx 0 32rpx !important;
justify-content: space-between; justify-content: space-between;
@ -1660,7 +1674,7 @@
padding-bottom: 24rpx; padding-bottom: 24rpx;
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 0.3px 0 0 #C2C2C2; box-shadow: 0 0.3px 0 0 #C2C2C2;
.title { .title {
font-weight: 400; font-weight: 400;
@ -1757,7 +1771,8 @@
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #666;
margin-bottom: 16rpx; margin-bottom: 16rpx;
text{
text {
color: red; color: red;
} }
} }
@ -1772,18 +1787,22 @@
box-sizing: border-box; box-sizing: border-box;
color: #1A1A1A; color: #1A1A1A;
} }
.form-select{
.form-select {
width: 364rpx !important; width: 364rpx !important;
flex: none; flex: none;
} }
.form-avatar-container { .form-avatar-container {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.suiji{
.suiji {
width: 50rpx; width: 50rpx;
height: 50rpx; height: 50rpx;
} }
.form-avatar { .form-avatar {
width: 80px; width: 80px;
height: 80px; height: 80px;
@ -1828,9 +1847,11 @@
font-weight: bold; font-weight: bold;
background: linear-gradient(180deg, #A1A8B8 0%, #878B94 100%); background: linear-gradient(180deg, #A1A8B8 0%, #878B94 100%);
} }
.text-avatar-18{
font-size: 36rpx !important; .text-avatar-18 {
} font-size: 36rpx !important;
}
.form-input-time { .form-input-time {
line-height: 40px; line-height: 40px;
} }

View File

@ -6,10 +6,7 @@
</view> </view>
</view> </view>
<view class="footer footerZhangwei" :class="['footer_'+type]"> <view class="footer footerZhangwei" :class="['footer_'+type]">
<view class="item" v-for="(item,index) in list" :key="index">
<image :src="`/static/image/call/${type}TabbarImg${index+1}.png`" mode=""></image>
<text>{{item}}</text>
</view>
</view> </view>
</template> </template>
@ -86,10 +83,7 @@
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.footerZhangwei{
position: relative !important;
opacity: 0 !important;
}
.footer { .footer {
position: fixed; position: fixed;
left: 0; left: 0;
@ -98,7 +92,7 @@
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
background: #f7f7f7; background: #f7f7f7;
padding-top: 2px;
.item { .item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -118,7 +112,6 @@
} }
.footer_ios { .footer_ios {
padding-top: 2px;
padding-bottom: constant(safe-area-inset-bottom) !important; // IOS<11.2 padding-bottom: constant(safe-area-inset-bottom) !important; // IOS<11.2
padding-bottom: env(safe-area-inset-bottom) !important; // IOS>11.2 padding-bottom: env(safe-area-inset-bottom) !important; // IOS>11.2
.item:nth-child(2) { .item:nth-child(2) {
@ -127,6 +120,13 @@
} }
} }
} }
.footerZhangwei{
position: relative !important;
opacity: 0 !important;
padding-top: 0 !important;
height: 47px;
background-color: rgba(0, 0, 0, 0) !important;
}
.footer_huawei { .footer_huawei {
background: #FAFAFA !important; background: #FAFAFA !important;
padding-top: 3px; padding-top: 3px;

View File

@ -60,7 +60,7 @@ export default {
justify-content: center; justify-content: center;
z-index: 99 !important; z-index: 99 !important;
background-image: url('/static/image/watermarkBG.png'); background-image: url('/static/image/watermarkBG.png');
background-size: 125px 125px; background-size: 500rpx 500rpx;
.watermarkBox { .watermarkBox {
width: 200px; width: 200px;

View File

@ -17,6 +17,12 @@
"navigationBarTitleText": "通话记录页面", "navigationBarTitleText": "通话记录页面",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},{
"path": "detail/callDetail",
"style": {
"navigationBarTitleText": "通话记录详情",
"navigationStyle": "custom"
}
}] }]
}, },
{ {

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,108 +1,127 @@
import { reactive, ref, watch } from 'vue'; import {
import { storage } from '../utils/storage'; reactive,
ref,
watch
} from 'vue';
import {
storage
} from '../utils/storage';
// 防抖函数 // 防抖函数
const debounce = (fn, delay = 300) => { const debounce = (fn, delay = 300) => {
let timer = null let timer = null
return function (...args) { return function(...args) {
if (timer) clearTimeout(timer) if (timer) clearTimeout(timer)
timer = setTimeout(() => { timer = setTimeout(() => {
fn.apply(this, args) fn.apply(this, args)
}, delay) }, delay)
} }
} }
// 定义应用的全局状态 // 定义应用的全局状态
export const store = reactive({ export const store = reactive({
// 用户信息 // 用户信息
userInfo: storage.get('userInfo') || null, userInfo: storage.get('userInfo') || null,
// 应用设置 // 应用设置
settings: storage.get('settings') || { settings: storage.get('settings') || {
theme: 'light', theme: 'light',
language: 'zh-CN', language: 'zh-CN',
notifications: true notifications: true
}, },
// 系统信息(从缓存读取,避免重复调用) // 系统信息(从缓存读取,避免重复调用)
systemInfo: uni.getStorageSync('systemInfo') || { systemInfo: uni.getStorageSync('systemInfo') || {
statusBarHeight: 0, statusBarHeight: 0,
windowHeight: 0, windowHeight: 0,
windowWidth: 0, windowWidth: 0,
platform: '' platform: ''
}, },
// 账单列表 // 账单列表
billList: JSON.parse(JSON.stringify(storage.get('bill_list') || [])), billList: JSON.parse(JSON.stringify(storage.get('bill_list') || [])),
callInfo: {}
}); });
// 定义操作方法 // 定义操作方法
export const useStore = () => { export const useStore = () => {
// 账单相关操作 // 账单相关操作
const addBill = (bill) => { const addBill = (bill) => {
store.billList.unshift(bill); store.billList.unshift(bill);
return bill; return bill;
}; };
const updateBill = (id, updates) => { const updateBill = (id, updates) => {
const index = store.billList.findIndex(bill => bill.id === id); const index = store.billList.findIndex(bill => bill.id === id);
if (index !== -1) { if (index !== -1) {
store.billList[index] = { ...store.billList[index], ...updates }; store.billList[index] = {
return store.billList[index]; ...store.billList[index],
} ...updates
return null; };
}; return store.billList[index];
}
return null;
};
const deleteBill = (id) => { const deleteBill = (id) => {
const index = store.billList.findIndex(bill => bill.id === id); const index = store.billList.findIndex(bill => bill.id === id);
if (index !== -1) { if (index !== -1) {
store.billList.splice(index, 1); store.billList.splice(index, 1);
return true; return true;
} }
return false; return false;
}; };
const getBillList = () => { const getBillList = () => {
return JSON.parse(JSON.stringify(store.billList)) return JSON.parse(JSON.stringify(store.billList))
} }
const getCallDetail = () => {
return { return JSON.parse(JSON.stringify(store.callInfo))
store, }
addBill, const setCallDetail = (info) => {
updateBill, return store.callInfo = info
deleteBill, };
getBillList return {
}; store,
addBill,
updateBill,
deleteBill,
getBillList,
setCallDetail,
getCallDetail
};
}; };
// 优化后的监听:使用防抖减少存储频率 // 优化后的监听:使用防抖减少存储频率
const debouncedSaveSettings = debounce((newValue) => { const debouncedSaveSettings = debounce((newValue) => {
storage.set('settings', newValue) storage.set('settings', newValue)
}, 500) }, 500)
watch( watch(
() => store.userInfo, () => store.userInfo,
(newValue) => storage.set('userInfo', newValue), (newValue) => storage.set('userInfo', newValue), {
{ deep: true } deep: true
}
); );
watch( watch(
() => store.settings, () => store.settings,
(newValue) => debouncedSaveSettings(newValue), (newValue) => debouncedSaveSettings(newValue), {
{ deep: true } deep: true
}
); );
// 监听billList改变自动保存 // 监听billList改变自动保存
watch( watch(
() => store.billList, () => store.billList,
(newValue) => { (newValue) => {
console.log("store.billList changed, saving...") console.log("store.billList changed, saving...")
storage.set('bill_list', newValue) storage.set('bill_list', newValue)
}, }, {
{ deep: true } deep: true
}
); );