automated_uniapp/uni_modules/cool-cs/pages/chat.vue
2025-01-09 16:16:11 +08:00

143 lines
2.6 KiB
Vue

<template>
<cl-page fullscreen background-color="#fff">
<view class="page">
<view class="container">
<scroll-view
:scroll-top="scroller.top"
scroll-y
:scroll-with-animation="scroller.animation"
class="scroller"
@tap="tools.close()"
@scroll="onScroll"
>
<msg-list :ref="setRefs('msgList')" />
</scroll-view>
</view>
<view class="footer">
<view class="wrap">
<!-- 输入 -->
<view class="inner">
<cl-input
v-model="content"
round
:height="76"
placeholder="输入你想要咨询的问题"
:confirm-hold="true"
:adjust-position="true"
:cursor-spacing="10"
auto-blur
@focus="onFocus"
@confirm="onConfirm"
/>
</view>
<image src="/uni_modules/cool-cs/static/emoji.png" @tap="tools.open('emoji')" />
<image src="/uni_modules/cool-cs/static/plus.png" @tap="tools.open('fn')" />
</view>
<!-- 工具 -->
<tools />
</view>
</view>
</cl-page>
</template>
<script setup lang="ts">
import { useSocket, useTools, useScroller, useSession, useMessage } from "../hooks";
import { onReady } from "@dcloudio/uni-app";
import { useCool } from "/@/cool";
import { ref } from "vue";
import Tools from "../components/tools/index.vue";
import MsgList from "../components/msg-list.vue";
const { service, refs, setRefs } = useCool();
const socket = useSocket();
const session = useSession();
const message = useMessage();
const scroller = useScroller();
const tools = useTools();
// 咨询内容
const content = ref("");
// 监听滚动
function onScroll(e: { detail: { scrollTop: number } }) {
refs.msgList?.onScroll(e.detail.scrollTop);
}
// 聚焦
function onFocus() {
scroller.scrollToBottom();
}
// 确认
async function onConfirm() {
const data = content.value;
if (data) {
content.value = "";
socket.send({
type: "text",
data,
});
}
}
onReady(() => {
service.cs.session.create().then(async (res) => {
// 设置会话
session.set(res);
// 连接 socket
socket.connect();
// 获取消息列表
await message.refresh({
sessionId: res.id,
});
// 滚动到底
scroller.scrollToBottom(false);
});
});
</script>
<style lang="scss" scoped>
.page {
display: flex;
flex-direction: column;
height: 100%;
.container {
flex: 1;
overflow: hidden;
background-color: $cl-color-bg;
.scroller {
height: 100%;
}
}
.footer {
.wrap {
display: flex;
align-items: center;
padding: 24rpx 36rpx;
background-color: #fff;
.inner {
flex: 1;
}
image {
height: 46rpx;
width: 46rpx;
margin-left: 24rpx;
}
}
}
}
</style>