From bbbfd3d1f9fad0e911cd93d15e9fd315068621f0 Mon Sep 17 00:00:00 2001 From: omgate234 Date: Wed, 24 Sep 2025 18:24:10 +0530 Subject: [PATCH 1/4] custom canvas handling with accurate scroll to bottom --- src/components/chat/ChatInterface.vue | 32 ++++++++++++++++---- src/components/chat/ChatMessage.vue | 7 ++++- src/components/chat/ChatMessageContainer.vue | 6 ++-- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/components/chat/ChatInterface.vue b/src/components/chat/ChatInterface.vue index a082cd3..b43a19f 100644 --- a/src/components/chat/ChatInterface.vue +++ b/src/components/chat/ChatInterface.vue @@ -472,6 +472,10 @@ const props = defineProps({ type: Boolean, default: true, }, + customCanvasHandlers: { + type: Array, + default: () => [], + }, }); const emit = defineEmits([]); @@ -579,6 +583,14 @@ registerMessageHandler("meeting_recorder", MeetingRecorder); registerCanvasHandler("meeting_recorder", MeetingRecorderCanvas); +if (Array.isArray(props.customCanvasHandlers)) { + for (const handler of props.customCanvasHandlers) { + if (handler && handler.type && handler.component) { + registerCanvasHandler(handler.type, handler.component); + } + } +} + const isStaticPage = ref(false); const chatWindowRef = ref(null); const headerRef = ref(null); @@ -729,20 +741,28 @@ watch( { immediate: true }, ); -const scrollToBottom = () => { +const scrollToLatestUserMessage = () => { const chatWindow = chatWindowRef.value; if (!chatWindow) return; + nextTick(() => { - chatWindow.scroll({ - top: chatWindow.scrollHeight, - behavior: "smooth", - }); + const userMessages = chatWindow.querySelectorAll('[data-msg-type="input"]'); + + if (userMessages.length > 0) { + const latestUserMessage = userMessages[userMessages.length - 1]; + + latestUserMessage.scrollIntoView({ + behavior: "smooth", + block: "start", + inline: "nearest", + }); + } }); }; watch(chatLoading, (val) => { if (val) { - scrollToBottom(); + scrollToLatestUserMessage(); } }); diff --git a/src/components/chat/ChatMessage.vue b/src/components/chat/ChatMessage.vue index 090969c..4e70979 100644 --- a/src/components/chat/ChatMessage.vue +++ b/src/components/chat/ChatMessage.vue @@ -4,7 +4,8 @@ :class="[ 'vdb-c-flex vdb-c-h-auto vdb-c-w-full vdb-c-justify-start vdb-c-py-8 md:vdb-c-py-12', { - 'vdb-c-border-b vdb-c-border-kilvish-300 vdb-c-bg-white': isUser, + 'user-message vdb-c-border-b vdb-c-border-kilvish-300 vdb-c-bg-white': + isUser, }, ]" > @@ -105,6 +106,10 @@ const isUser = computed(() => props.message.msg_type === "input"); const isAssistant = computed(() => props.message.msg_type === "output"); const isSystem = computed(() => props.message.msg_type === "system"); +if (props.isLastConv) { + console.log("last message!", props.message); +} + const finalStatus = computed(() => { if (props.message.status === "error") { return "error"; diff --git a/src/components/chat/ChatMessageContainer.vue b/src/components/chat/ChatMessageContainer.vue index 6b46b15..97539dd 100644 --- a/src/components/chat/ChatMessageContainer.vue +++ b/src/components/chat/ChatMessageContainer.vue @@ -1,11 +1,11 @@