feat: goto message
This commit is contained in:
@@ -107,6 +107,47 @@
|
||||
}
|
||||
};
|
||||
|
||||
const gotoMessage = async (message, idx) => {
|
||||
// Determine the correct sibling list (either parent's children or root messages)
|
||||
let siblings;
|
||||
if (message.parentId !== null) {
|
||||
siblings = history.messages[message.parentId].childrenIds;
|
||||
} else {
|
||||
siblings = Object.values(history.messages)
|
||||
.filter((msg) => msg.parentId === null)
|
||||
.map((msg) => msg.id);
|
||||
}
|
||||
|
||||
// Clamp index to a valid range
|
||||
idx = Math.max(0, Math.min(idx, siblings.length - 1));
|
||||
|
||||
let messageId = siblings[idx];
|
||||
|
||||
// If we're navigating to a different message
|
||||
if (message.id !== messageId) {
|
||||
// Drill down to the deepest child of that branch
|
||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
while (messageChildrenIds.length !== 0) {
|
||||
messageId = messageChildrenIds.at(-1);
|
||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||
}
|
||||
|
||||
history.currentId = messageId;
|
||||
}
|
||||
|
||||
await tick();
|
||||
|
||||
// Optional auto-scroll
|
||||
if ($settings?.scrollOnBranchChange ?? true) {
|
||||
const element = document.getElementById('messages-container');
|
||||
autoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
|
||||
|
||||
setTimeout(() => {
|
||||
scrollToBottom();
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
|
||||
const showPreviousMessage = async (message) => {
|
||||
if (message.parentId !== null) {
|
||||
let messageId =
|
||||
@@ -408,6 +449,7 @@
|
||||
messageId={message.id}
|
||||
idx={messageIdx}
|
||||
{user}
|
||||
{gotoMessage}
|
||||
{showPreviousMessage}
|
||||
{showNextMessage}
|
||||
{updateChat}
|
||||
|
||||
Reference in New Issue
Block a user