Commit ea5788bb authored by chenqikuai's avatar chenqikuai

feat: 处理好删除老消息时,页面停留在原处

parent 47bfc0e5
...@@ -76,7 +76,8 @@ export default defineComponent({ ...@@ -76,7 +76,8 @@ export default defineComponent({
masterId: getMasterIdFromDisplayMsg(displayMsg), masterId: getMasterIdFromDisplayMsg(displayMsg),
isChattingWithTargetId: isChattingWith(getMasterIdFromDisplayMsg(displayMsg), getTargetIdFromDisplayMsg(displayMsg)) isChattingWithTargetId: isChattingWith(getMasterIdFromDisplayMsg(displayMsg), getTargetIdFromDisplayMsg(displayMsg))
})).then(() => { })).then(() => {
chatCardTimeStamp.value = new Date().getTime() console.log(displayMsg);
chatCardTimeStamp.value = new Date().getTime() + (Math.ceil(Math.random() * 1000))
}); });
}; };
......
...@@ -17,7 +17,7 @@ export default class ChatDBService { ...@@ -17,7 +17,7 @@ export default class ChatDBService {
}) { }) {
const { msg, masterId, isChattingWithTargetId } = data const { msg, masterId, isChattingWithTargetId } = data
ChatMessageDB.getInstance().saveMsg(msg, masterId) await ChatMessageDB.getInstance().saveMsg(msg, masterId)
const thePersonAlreadyInChatList = await ChatListCardDB.getInstance().thePersonAlreadyInChatList( const thePersonAlreadyInChatList = await ChatListCardDB.getInstance().thePersonAlreadyInChatList(
getTargetIdFromDisplayMsg(msg), getTargetIdFromDisplayMsg(msg),
......
import { reactive, ref } from "vue";
export const fffList = reactive<any[]>([])
\ No newline at end of file
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
> >
<q-spinner color="primary" size="3rem" :thickness="5" /> <q-spinner color="primary" size="3rem" :thickness="5" />
</div> </div>
<div class="flex flex-col flex-grow" style="flex-basis: 0px"> <div class="flex flex-col flex-grow overflow-hidden" style="flex-basis: 0px">
<ChatContentVue /> <ChatContentVue />
<ServiceRating :setSelectedRate="handleSelect" :selected="selected" v-if="showServiceRating" /> <ServiceRating :setSelectedRate="handleSelect" :selected="selected" v-if="showServiceRating" />
<ChatOption :selected="selectedChatOption" :setSelected="handleSelectChatOption" /> <ChatOption :selected="selectedChatOption" :setSelected="handleSelectChatOption" />
...@@ -28,7 +28,6 @@ import { defineComponent, onBeforeUnmount, onMounted, reactive, ref, watch } fro ...@@ -28,7 +28,6 @@ import { defineComponent, onBeforeUnmount, onMounted, reactive, ref, watch } fro
import ChatContentVue from "./ChatContent.vue"; import ChatContentVue from "./ChatContent.vue";
import ChatInputVue from "./ChatInput.vue"; import ChatInputVue from "./ChatInput.vue";
import { connectionState } from "@/store/connectionStore"; import { connectionState } from "@/store/connectionStore";
import FzmMessageProtocol from "@/utils/fzm-message-protocol";
import { privateKey, publicKey, target } from "@/store/appCallerStore"; import { privateKey, publicKey, target } from "@/store/appCallerStore";
import { token, from, orderid } from "@/store/appCallerStore"; import { token, from, orderid } from "@/store/appCallerStore";
import { generateToken } from "@/utils/generateToken/generate-token"; import { generateToken } from "@/utils/generateToken/generate-token";
...@@ -42,6 +41,7 @@ import { chatCardTimeStamp } from "@/store/chatCardStore"; ...@@ -42,6 +41,7 @@ import { chatCardTimeStamp } from "@/store/chatCardStore";
import ChatListCardDB from "@/db/ChatListCardDB"; import ChatListCardDB from "@/db/ChatListCardDB";
import { v4 as uuidv4 } from 'uuid' import { v4 as uuidv4 } from 'uuid'
import { ChatMessageTypes } from "@/types/chatMessageTypes"; import { ChatMessageTypes } from "@/types/chatMessageTypes";
import { fffList } from "@/store/test";
export default defineComponent({ export default defineComponent({
components: { components: {
...@@ -86,14 +86,13 @@ export default defineComponent({ ...@@ -86,14 +86,13 @@ export default defineComponent({
}) })
watch(chatCardTimeStamp, async () => { watch(chatCardTimeStamp, async () => {
messageStore.messages.splice(0, messageStore.messages.length);
const messageList = await ChatMessageDB.getInstance().getMessage(from, target); const messageList = await ChatMessageDB.getInstance().getMessage(from, target);
messageStore.messages.splice(0, messageStore.messages.length);
messageStore.messages.push(...messageList); messageStore.messages.push(...messageList);
// console.log(messageList[messageList.length - 1]);
}) })
return { return {
connectionState, connectionState,
selected, selected,
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
{{ isMobile ? '下滑加载更多' : '按住鼠标向下拖拽以加载更多' }} {{ isMobile ? '下滑加载更多' : '按住鼠标向下拖拽以加载更多' }}
</div> </div>
</div>--> </div>-->
<!-- <div class="flex-grow overflow-hidden"> -->
<!-- <div class="h-full overflow-auto"> -->
<ChatContentMessageVue <ChatContentMessageVue
v-for="message in messages" v-for="message in messages"
:key="message.uuid" :key="message.uuid"
...@@ -22,11 +24,14 @@ ...@@ -22,11 +24,14 @@
:fromMyself="myid == message.from" :fromMyself="myid == message.from"
:time="formatDate(message.datetime, 'MM月DD日 HH:mm')" :time="formatDate(message.datetime, 'MM月DD日 HH:mm')"
:uuid="message.uuid" :uuid="message.uuid"
:logid="message.logid"
:type="message.type" :type="message.type"
:state="message.state" :state="message.state"
:hideDatetime="message.hideDatetime" :hideDatetime="message.hideDatetime"
:uploadProgress="message.uploadProgress" :uploadProgress="message.uploadProgress"
/> />
<!-- </div> -->
<!-- </div> -->
<!-- </q-pull-to-refresh> --> <!-- </q-pull-to-refresh> -->
</q-scroll-area> </q-scroll-area>
</template> </template>
...@@ -38,7 +43,7 @@ import { DisplayMessage, messageStore } from "@/store/messagesStore"; ...@@ -38,7 +43,7 @@ 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";
import ChatMessageDB from "@/db/ChatMessageDB"; import { fffList } from "@/store/test";
export default defineComponent({ export default defineComponent({
components: { ChatContentMessageVue }, components: { ChatContentMessageVue },
...@@ -48,6 +53,7 @@ export default defineComponent({ ...@@ -48,6 +53,7 @@ export default defineComponent({
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) => {
...@@ -64,16 +70,18 @@ export default defineComponent({ ...@@ -64,16 +70,18 @@ export default defineComponent({
// 收到新消息时滚动至底部 // 收到新消息时滚动至底部
const { scrollToBottom, scrollArea, scrollToElement } = useScrollTo(); const { scrollToBottom, scrollArea, scrollToElement } = useScrollTo();
watch(messageStore.messages, () => { watch(messageStore.messages, () => {
nextTick(() => { nextTick(() => {
if (messageStore.appendingNewMessage.value) { if (messageStore.appendingNewMessage.value) {
scrollToBottom(); scrollToBottom();
} else { } else {
scrollToElement(document.getElementById(firstMessageSnapshot.uuid)); firstMessageSnapshot && firstMessageSnapshot.uuid && scrollToElement(document.getElementById(firstMessageSnapshot.uuid));
} }
}); });
}); });
return { return {
scrollToBottom, scrollToBottom,
scrollArea, scrollArea,
......
...@@ -25,12 +25,24 @@ ...@@ -25,12 +25,24 @@
: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"
> >
<!-- 文本消息 --> <div
<ChatContentMessageTextVue v-touch-hold:300="handleTouchHoldItem"
@click.capture.stop="clickItem"
v-if="type === 1 || type === ChatMessageTypes.robot" v-if="type === 1 || type === ChatMessageTypes.robot"
:from-myself="fromMyself" >
:content="content" <div @click.capture="stop">
/> <van-popover
@select="onTextMsgSelect"
:actions="textMsgActions"
v-model:show="showPopOver"
>
<template #reference>
<!-- 文本消息 -->
<ChatContentMessageTextVue :from-myself="fromMyself" :content="content" />
</template>
</van-popover>
</div>
</div>
<!-- 图片消息 --> <!-- 图片消息 -->
<ChatContentMessageImageVue <ChatContentMessageImageVue
...@@ -88,7 +100,7 @@ ...@@ -88,7 +100,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent } from "vue"; import { computed, defineComponent, ref } from "vue";
import default_avatar_url from "@/assets/user_avatar.png"; import default_avatar_url from "@/assets/user_avatar.png";
import { messageStore } from "@/store/messagesStore"; import { messageStore } from "@/store/messagesStore";
import ChatContentMessageTextVue from "./ChatContentMessageText.vue"; import ChatContentMessageTextVue from "./ChatContentMessageText.vue";
...@@ -97,6 +109,10 @@ import ChatContentMessageImageVue from "./ChatContentMessageImage.vue"; ...@@ -97,6 +109,10 @@ import ChatContentMessageImageVue from "./ChatContentMessageImage.vue";
import { ChatMessageTypes } from "@/types/chatMessageTypes"; import { ChatMessageTypes } from "@/types/chatMessageTypes";
import ChatContentMessageVideoVue from "./ChatContentMessageVideo.vue"; import ChatContentMessageVideoVue from "./ChatContentMessageVideo.vue";
import { target } from "@/store/appCallerStore"; import { target } from "@/store/appCallerStore";
import { copyToClipboard } from 'quasar'
import { Toast } from "vant";
import ChatMessageDB from "@/db/ChatMessageDB";
import { chatCardTimeStamp } from "@/store/chatCardStore";
export default defineComponent({ export default defineComponent({
...@@ -116,6 +132,7 @@ export default defineComponent({ ...@@ -116,6 +132,7 @@ export default defineComponent({
uuid: { type: String, required: true }, uuid: { type: String, required: true },
hideDatetime: Boolean, hideDatetime: Boolean,
uploadProgress: Object, uploadProgress: Object,
logid: { type: String, required: false, },
}, },
setup(props) { setup(props) {
...@@ -138,7 +155,51 @@ export default defineComponent({ ...@@ -138,7 +155,51 @@ export default defineComponent({
); );
}); });
return { default_avatar_url, resend, isMedia, abort, ChatMessageTypes };
const textMsgActions = [
{
text: '删除', cb(data: { content: any, uuid: string, logid?: string }) {
ChatMessageDB.getInstance().deleteMsg({ uuid: data.uuid, logid: data.logid });
const index = messageStore.messages.findIndex(i => {
return i.uuid === data.uuid
})
messageStore.appendingNewMessage.value = false;
messageStore.messages.splice(index, 1);
}
},
{
text: '复制', cb(data: { content: any, uuid: string, logid: string }) {
copyToClipboard(data.content.content).then(() => {
Toast.success('复制成功')
}).catch(() => {
Toast.fail("复制失败")
})
}
}
]
const onTextMsgSelect = (action: typeof textMsgActions[0]) => {
action.cb({
content: props.content,
uuid: props.uuid,
logid: props.logid
})
};
const showPopOver = ref(false);
const handleTouchHoldItem = () => {
showPopOver.value = true;
}
const clickItem = () => {
showPopOver.value = false;
}
return {
default_avatar_url, resend, isMedia, abort, ChatMessageTypes, handleTouchHoldItem,
onTextMsgSelect,
textMsgActions,
showPopOver,
clickItem
};
}, },
}); });
</script> </script>
\ No newline at end of file
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