Commit 0f5069c2 authored by chenqikuai's avatar chenqikuai

update

parent b1a9feea
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
const colors = { const colors = {
primary: '#1888FA', primary: '#1888FA',
secondary: '#E8F3FF', secondary: '#3E4FAF',
'secondary-focus': '#D6E3F0', 'secondary-focus': '#D6E3F0',
dark: '#24374E', dark: '#24374E',
negative: '#db394c', negative: '#db394c',
......
<template> <template>
<div class="flex flex-col flex-nowrap h-full text-base bg-gray-50 h-screen"> <div class="flex flex-col flex-nowrap text-base bg-gray-50 h-screen">
<!-- 没连上时界面上只有一个返回按钮 --> <!-- 没连上时界面上只有一个返回按钮 -->
<!-- 👇是返回按钮 --> <!-- 👇是返回按钮 -->
<!-- <div <!-- <div
...@@ -134,7 +134,8 @@ export default defineComponent({ ...@@ -134,7 +134,8 @@ export default defineComponent({
// 收到的非本笔订单的消息不处理 // 收到的非本笔订单的消息不处理
// if (msg.orderid !== orderid) return; // if (msg.orderid !== orderid) return;
msg && messageStore.displayNewMessage({ msg &&
messageStore.displayNewMessage({
content: msg.content, content: msg.content,
from: msg.from, from: msg.from,
uuid: msg.uuid, uuid: msg.uuid,
......
<template> <template>
<!-- style="flex-basis: 0px" 是为了兼容 iOS 和 macOS 下的 Safari 浏览器,如果没有这个样式,整个聊天列表无法显示 --> <!-- style="flex-basis: 0px" 是为了兼容 iOS 和 macOS 下的 Safari 浏览器,如果没有这个样式,整个聊天列表无法显示 -->
<q-scroll-area ref="scrollArea" class="flex-grow" style="flex-basis: 0px" :visible="false"> <q-scroll-area
<q-pull-to-refresh ref="scrollArea"
class="flex-grow"
style="flex-basis: 0px"
:visible="false"
>
<!-- <q-pull-to-refresh
v-if="messages.length" v-if="messages.length"
@refresh="loadMore" @refresh="loadMore"
:disable="noMoreMessages || messages.length === 0" :disable="noMoreMessages || messages.length === 0"
icon="history" icon="history"
class="h-full w-full absolute" class="h-full w-full absolute"
> > -->
<div class="text-center py-2.5 text-xs font-medium text-subtle"> <!-- <div class="text-center py-2.5 text-xs font-medium text-subtle">
<div v-if="noMoreMessages && messages.length >= 10">没有更多消息</div> <div v-if="noMoreMessages && messages.length >= 10">没有更多消息</div>
<div v-else-if="!noMoreMessages && messages.length >= 10"> <div v-else-if="!noMoreMessages && messages.length >= 10">
{{ isMobile ? '下滑加载更多' : '按住鼠标向下拖拽以加载更多' }} {{ isMobile ? '下滑加载更多' : '按住鼠标向下拖拽以加载更多' }}
</div> </div>
</div> </div> -->
<ChatContentMessageVue <ChatContentMessageVue
v-for="message in messages" v-for="message in messages"
:key="message.uuid" :key="message.uuid"
...@@ -27,54 +32,63 @@ ...@@ -27,54 +32,63 @@
:hideDatetime="message.hideDatetime" :hideDatetime="message.hideDatetime"
:uploadProgress="message.uploadProgress" :uploadProgress="message.uploadProgress"
/> />
</q-pull-to-refresh> <!-- </q-pull-to-refresh> -->
</q-scroll-area> </q-scroll-area>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, nextTick, watch } from 'vue' import { defineComponent, nextTick, watch } from "vue";
import { from } from '@/store/appCallerStore' import { from } from "@/store/appCallerStore";
import { DisplayMessage, messageStore } from '@/store/messagesStore' import { DisplayMessage, messageStore } from "@/store/messagesStore";
import useScrollTo from '@/composables/useScrollTo' import useScrollTo from "@/composables/useScrollTo";
import ChatContentMessageVue from './ChatContentMessage.vue' import ChatContentMessageVue from "./ChatContentMessage.vue";
import { date, Platform } from 'quasar' import { date, Platform } from "quasar";
export default defineComponent({ export default defineComponent({
components: { ChatContentMessageVue }, components: { ChatContentMessageVue },
setup() { setup() {
const messages = messageStore.messages const messages = messageStore.messages;
const noMoreMessages = messageStore.noMoreHistoryMessages const noMoreMessages = messageStore.noMoreHistoryMessages;
const myid = from const myid = from;
const formatDate = date.formatDate const formatDate = date.formatDate;
const isMobile = Platform.is.mobile const isMobile = Platform.is.mobile;
// 监听「下拉加载更多」操作,记录当前的第一条消息 id // 监听「下拉加载更多」操作,记录当前的第一条消息 id
let firstMessageSnapshot: DisplayMessage let firstMessageSnapshot: DisplayMessage;
const loadMore = (done?: () => void) => { const loadMore = (done?: () => void) => {
firstMessageSnapshot = messages[0] firstMessageSnapshot = messages[0];
retrieveMessages().then(() => done && done()) retrieveMessages().then(() => done && done());
} };
const retrieveMessages = (): Promise<void> => { const retrieveMessages = (): Promise<void> => {
return new Promise((resolve) => { return new Promise((resolve) => {
messageStore.retrieveMessages().then(() => resolve()) messageStore.retrieveMessages().then(() => resolve());
}) });
} };
retrieveMessages() // retrieveMessages();
// 收到新消息时滚动至底部 // 收到新消息时滚动至底部
const { scrollToBottom, scrollArea, scrollToElement } = useScrollTo() const { scrollToBottom, scrollArea, scrollToElement } = useScrollTo();
watch(messages, () => { watch(messages, () => {
nextTick(() => { nextTick(() => {
if (messageStore.appendingNewMessage.value) { if (messageStore.appendingNewMessage.value) {
scrollToBottom() scrollToBottom();
} else { } else {
scrollToElement(document.getElementById(firstMessageSnapshot.uuid)) scrollToElement(document.getElementById(firstMessageSnapshot.uuid));
} }
}) });
}) });
return { scrollToBottom, scrollArea, messages, noMoreMessages, isMobile, myid, formatDate, loadMore } return {
scrollToBottom,
scrollArea,
messages,
noMoreMessages,
isMobile,
myid,
formatDate,
loadMore,
};
}, },
}) });
</script> </script>
...@@ -17,13 +17,25 @@ ...@@ -17,13 +17,25 @@
min-w-chat-msg-avatar min-w-chat-msg-avatar
w-chat-msg-avatar w-chat-msg-avatar
h-chat-msg-avatar h-chat-msg-avatar
rounded-lg !rounded-md
" "
> >
<img :src="default_avatar_url" /> <img :src="default_avatar_url" />
</q-avatar> </q-avatar>
<!-- 消息气泡 --> <!-- 消息气泡 -->
<div :class="[{ 'flex-row-reverse': fromMyself }]">
<div
class="text-right"
style="
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #adadad;
"
>
15990184793
</div>
<div <div
:class="[{ 'flex-row-reverse': fromMyself }]" :class="[{ 'flex-row-reverse': fromMyself }]"
class="flex items-center max-w-chat-msg-bubble" class="flex items-center max-w-chat-msg-bubble"
...@@ -89,6 +101,7 @@ ...@@ -89,6 +101,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
......
<template> <template>
<div <div
:class="[ :class="[
fromMyself ? 'bg-secondary' : 'bg-white', fromMyself ? 'bg-secondary text-white' : 'bg-white',
fromMyself ? 'rounded-chat-msg-bubble-myself' : 'rounded-chat-msg-bubble-opposite', fromMyself ? 'message-box-self' : 'message-box-other',
]" ]"
class="py-3 px-4 max-w-chat-msg-text break-all" class="py-3 px-4 max-w-chat-msg-text break-all message-box rounded-md"
> >
<a <a
v-if="isUrlMessage" v-if="isUrlMessage"
...@@ -20,20 +20,46 @@ ...@@ -20,20 +20,46 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent } from 'vue' import { computed, defineComponent } from "vue";
import isUrl from '@/utils/is-url' import isUrl from "@/utils/is-url";
import prependHttp from 'prepend-http' import prependHttp from "prepend-http";
export default defineComponent({ export default defineComponent({
props: { fromMyself: Boolean, content: Object }, props: { fromMyself: Boolean, content: Object },
setup(props) { setup(props) {
const textMessage = computed(() => props.content?.content) const textMessage = computed(() => props.content?.content);
const isUrlMessage = computed(() => isUrl(textMessage.value)) const isUrlMessage = computed(() => isUrl(textMessage.value));
return { isUrlMessage, prependHttp, textMessage } return { isUrlMessage, prependHttp, textMessage };
}, },
}) });
</script> </script>
<style scoped></style> <style scoped>
.message-box {
position: relative;
}
.message-box-self::after {
content: "";
position: absolute;
right: 0;
top: 0px;
transform: translate(100%, 15px);
border-top: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid transparent;
border-left: 6px solid #3e4faf;
}
.message-box-other::after {
content: "";
position: absolute;
left: 0;
top: 0px;
transform: translate(-100%, 15px);
border-top: 6px solid transparent;
border-right: 6px solid white;
border-bottom: 6px solid transparent;
border-left: 6px solid transparent;
}
</style>
...@@ -78,6 +78,7 @@ module.exports = { ...@@ -78,6 +78,7 @@ module.exports = {
extend: {}, extend: {},
padding: ['responsive', 'important'], padding: ['responsive', 'important'],
backgroundColor: ['responsive', 'important'], backgroundColor: ['responsive', 'important'],
borderRadius: ['responsive', 'important'],
}, },
plugins: [ plugins: [
plugin(function ({ addVariant }) { plugin(function ({ addVariant }) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment