staff/pagesA/chat/index.vue

266 lines
6.5 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>
<view class="chat-page">
<view class="message-wrap">
<scroll-view scroll-y enable-flex class="scroll-list" @scrolltolower="loadHistory" :scroll-top="scrollTop">
<view class="message-item-wrap">
<view v-for="(item, index) in messageList" :key="item.id" @click="onClick(index)">
<MessageItem :detail="item"></MessageItem>
</view>
</view>
<view class="loading-wrap" :style="{ display: loadingStatus?'':'none' }">
<uni-load-more :iconSize="18" :status="loadingStatus" />
</view>
</scroll-view>
</view>
<!-- 键盘弹起占位 -->
<view :style="{height: inputBottomValue}" :class="isKeyboardHidden"></view>
</view>
<!-- 消息输入 -->
<view class="textarea-wrap" :class="isKeyboardHidden" :style="{ bottom: inputBottomValue}">
<!-- #ifdef MP-WEIXIN -->
<textarea :show-confirm-bar='false' class="textarea" confirm-type="send" :auto-height="true"
v-model="inputValue" :adjust-position="false" type="text" @confirm="sendMessage" confirm-hold />
<!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<textarea :show-confirm-bar='false' class="textarea" confirm-type="send" :auto-height="true"
v-model="inputValue" :adjust-position="platform=='ios'?true:false" type="text" @confirm="sendMessage"
confirm-hold />
<!-- #endif -->
<view class="send-btn" @tap="sendMessage">
<image src="@/static/chat/enter_n.png" mode=""></image>
</view>
</view>
<!-- <view class="textarea-wrap" :style="{ bottom: inputBottomValue}">
<textarea :show-confirm-bar='false' class="textarea" confirm-type="send" :auto-height="true"
v-model="inputValue" :cursor-spacing="10" type="text" @confirm="sendMessage" confirm-hold />
<view class="send-btn" @tap="sendMessage">
<image src="@/static/chat/enter_n.png" mode=""></image>
</view>
</view> -->
</template>
<script setup>
import {
ref,
nextTick,
computed
} from 'vue';
import {
onHide,
onShow,
onLoad
} from '@dcloudio/uni-app';
import MessageItem from './components/messageItem.vue';
const inputValue = ref('');
const scrollTop = ref();
const platform = ref('')
onLoad(() => {
uni.getSystemInfo({
success: (res) => {
platform.value = res.platform
console.log(platform.value);
}
});
});
// 发送消息
const sendMessage = () => {
if ((inputValue.value ?? '') === '') return
let newMessage = {
id: messageList.value.length + 1,
isRobotMessage: false,
message: inputValue.value,
}
messageList.value.push(newMessage)
inputValue.value = '';
// 滚动到底部
scrollTop.value = 0;
nextTick(() => {
scrollTop.value = undefined;
})
}
const messageList = ref([]); //消息列表
const getMessageList = (num = 10) => {
const messageData = new Array(num).fill(0).map((v, i) => {
const id = messageList.value.length + i
const random = Math.random();
if (random < 0.33) {
return {
id: id,
isRobotMessage: true,
message: `(${id}):您好,我是您的专属客服达达,请问有什么可以帮您?`,
}
} else if (random >= 0.33 && random < 0.66) {
return {
id: id,
isRobotMessage: true,
message: `(${id}): 结果查询中...`,
}
} else {
return {
id: id,
isRobotMessage: false,
message: `(${id}): test english and digital messages. ahsdfhaksjdhfalspwqejhglaksjdf 4236784623847623423423487234234`,
}
}
});
messageList.value.unshift(...messageData.reverse());
}
getMessageList(5)
const loadingStatus = ref(); //'more' | 'loading' | 'no-more'
const loadHistory = (e) => {
if (loadingStatus.value && loadingStatus.value !== 'more') return
loadingStatus.value = 'loading';
setTimeout(() => {
getMessageList()
loadingStatus.value = 'more';
}, 1000)
}
const inputBottomValue = ref('0'); //输入框距离底部距离
// 计算属性判断是否应用keyboard-hidden类
const isKeyboardHidden = computed(() => {
return inputBottomValue.value === '0' && platform.value === 'ios' ? 'keyboard-hidden' : '';
});
// 监听键盘高度变化
const keyboardChange = (res) => {
// #ifdef MP-WEIXIN
// res.height 为键盘高度
if (res.height) { //展开
inputBottomValue.value = res.height + 'px';
} else { //收起
// 键盘收起时,只需要很小的安全区域
inputBottomValue.value = '0'
}
// #endif
// #ifndef MP-WEIXIN
// res.height 为键盘高度
if (res.height) { //展开
if (platform.value === 'ios') {
// iOS平台上要立即设置底部距离避免出现空隙
inputBottomValue.value = '0px';
// 关键:用定时器来设置最终值,这样可以避免闪烁和空隙
setTimeout(() => {
inputBottomValue.value = '0px';
}, 0);
} else {
// 非iOS平台保持原来逻辑
inputBottomValue.value = res.height + 'px';
}
} else { //收起
// 键盘收起时
inputBottomValue.value = '0';
}
// #endif
}
onHide(() => {
uni.offKeyboardHeightChange(keyboardChange);
})
onShow(() => {
uni.onKeyboardHeightChange(keyboardChange);
})
</script>
<style lang="scss" scoped>
.chat-page {
height: calc(100vh - 160rpx);
display: flex;
flex-direction: column;
background-color: rgb(240, 242, 247);
position: relative;
overflow: hidden;
.message-wrap {
height: 0;
flex: 1;
.scroll-list {
height: 100%;
transform: scaleY(-1);
}
.message-item-wrap {
min-height: 100%;
transform: scaleY(-1);
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.loading-wrap {
transform: scaleY(-1);
display: flex;
align-items: center;
justify-content: center;
padding: 10rpx;
}
}
}
.textarea-wrap {
background-color: #fff;
width: 100%;
padding: 25rpx 48rpx;
display: flex;
align-items: center;
position: fixed;
left: 0;
transition: all 0.1s ease-out;
.textarea {
flex: 1;
border-radius: 20rpx;
background-color: #F1F7FB;
padding: 15rpx 35rpx;
min-height: 50rpx;
position: relative;
z-index: 1;
}
.send-btn {
height: 80rpx;
width: 80rpx;
padding: 16rpx;
border-radius: 50%;
background-color: #0070F0;
margin-left: 32rpx;
transition: transform 0.2s ease;
position: relative;
z-index: 1;
&:active {
transform: scale(0.95);
}
image {
height: 100%;
width: 100%;
}
}
}
.keyboard-hidden {
/* #ifdef APP-PLUS || MP-WEIXIN */
padding-bottom: calc(env(safe-area-inset-bottom) - 20rpx);
/* #endif */
}
</style>
<style>
view {
box-sizing: border-box;
}
page {
background-color: rgb(240, 242, 247);
}
</style>