Add event handler for message deletion to sync tracker state and update UI to reflect the new most-recent message in chat
This commit is contained in:
@@ -151,6 +151,7 @@ import {
|
|||||||
onMessageReceived,
|
onMessageReceived,
|
||||||
onCharacterChanged,
|
onCharacterChanged,
|
||||||
onMessageSwiped,
|
onMessageSwiped,
|
||||||
|
onMessageDeleted,
|
||||||
updatePersonaAvatar,
|
updatePersonaAvatar,
|
||||||
clearExtensionPrompts,
|
clearExtensionPrompts,
|
||||||
onGenerationEnded,
|
onGenerationEnded,
|
||||||
@@ -1354,6 +1355,7 @@ jQuery(async () => {
|
|||||||
[event_types.GENERATION_ENDED]: onGenerationEnded,
|
[event_types.GENERATION_ENDED]: onGenerationEnded,
|
||||||
[event_types.CHAT_CHANGED]: [onCharacterChanged, updatePersonaAvatar, restoreCheckpointOnLoad, clearSessionAvatarPrompts],
|
[event_types.CHAT_CHANGED]: [onCharacterChanged, updatePersonaAvatar, restoreCheckpointOnLoad, clearSessionAvatarPrompts],
|
||||||
[event_types.MESSAGE_SWIPED]: onMessageSwiped,
|
[event_types.MESSAGE_SWIPED]: onMessageSwiped,
|
||||||
|
[event_types.MESSAGE_DELETED]: onMessageDeleted,
|
||||||
[event_types.USER_MESSAGE_RENDERED]: updatePersonaAvatar,
|
[event_types.USER_MESSAGE_RENDERED]: updatePersonaAvatar,
|
||||||
[event_types.SETTINGS_UPDATED]: updatePersonaAvatar
|
[event_types.SETTINGS_UPDATED]: updatePersonaAvatar
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -428,6 +428,88 @@ export function onMessageSwiped(messageIndex) {
|
|||||||
updateChatThoughts();
|
updateChatThoughts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler for when a message is deleted.
|
||||||
|
* Re-syncs lastGeneratedData, committedTrackerData, and all UI panels to the
|
||||||
|
* new last assistant message's active swipe — or clears everything if no
|
||||||
|
* assistant messages remain.
|
||||||
|
*/
|
||||||
|
export function onMessageDeleted() {
|
||||||
|
if (!extensionSettings.enabled) return;
|
||||||
|
|
||||||
|
// console.log('[RPG Companion] 🗑️ EVENT: onMessageDeleted');
|
||||||
|
|
||||||
|
const currentChat = getContext().chat;
|
||||||
|
|
||||||
|
// Walk backward to find the new last assistant message.
|
||||||
|
let lastAssistantIndex = -1;
|
||||||
|
for (let i = currentChat.length - 1; i >= 0; i--) {
|
||||||
|
if (!currentChat[i].is_user && !currentChat[i].is_system) {
|
||||||
|
lastAssistantIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastAssistantIndex === -1) {
|
||||||
|
// No assistant messages remain — clear all state.
|
||||||
|
lastGeneratedData.userStats = null;
|
||||||
|
lastGeneratedData.infoBox = null;
|
||||||
|
lastGeneratedData.characterThoughts = null;
|
||||||
|
committedTrackerData.userStats = null;
|
||||||
|
committedTrackerData.infoBox = null;
|
||||||
|
committedTrackerData.characterThoughts = null;
|
||||||
|
// console.log('[RPG Companion] 🗑️ No assistant messages remain — cleared all tracker state.');
|
||||||
|
} else {
|
||||||
|
const message = currentChat[lastAssistantIndex];
|
||||||
|
const swipeId = message.swipe_id || 0;
|
||||||
|
const swipeData = getSwipeData(message, swipeId);
|
||||||
|
|
||||||
|
if (swipeData) {
|
||||||
|
// Restore display state from the new tail message's active swipe.
|
||||||
|
lastGeneratedData.userStats = swipeData.userStats || null;
|
||||||
|
lastGeneratedData.infoBox = swipeData.infoBox || null;
|
||||||
|
// Normalise characterThoughts to string (backward compat with old object format).
|
||||||
|
if (swipeData.characterThoughts && typeof swipeData.characterThoughts === 'object') {
|
||||||
|
lastGeneratedData.characterThoughts = JSON.stringify(swipeData.characterThoughts, null, 2);
|
||||||
|
} else {
|
||||||
|
lastGeneratedData.characterThoughts = swipeData.characterThoughts || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sync stat bars.
|
||||||
|
if (swipeData.userStats) {
|
||||||
|
parseUserStats(swipeData.userStats);
|
||||||
|
}
|
||||||
|
|
||||||
|
// console.log('[RPG Companion] 🗑️ Restored display state from assistant message at index', lastAssistantIndex, 'swipe', swipeId);
|
||||||
|
} else {
|
||||||
|
// No swipe data for this message — clear display state.
|
||||||
|
lastGeneratedData.userStats = null;
|
||||||
|
lastGeneratedData.infoBox = null;
|
||||||
|
lastGeneratedData.characterThoughts = null;
|
||||||
|
// console.log('[RPG Companion] 🗑️ No swipe data for last assistant message — cleared display state.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commit context from the message *before* the new tail assistant message,
|
||||||
|
// so any subsequent generation uses the correct N-1 world state.
|
||||||
|
commitTrackerDataFromPriorMessage(lastAssistantIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-render all panels.
|
||||||
|
renderUserStats();
|
||||||
|
renderInfoBox();
|
||||||
|
renderThoughts();
|
||||||
|
renderInventory();
|
||||||
|
renderQuests();
|
||||||
|
renderMusicPlayer($musicPlayerContainer[0]);
|
||||||
|
|
||||||
|
// Update widget strips.
|
||||||
|
updateFabWidgets();
|
||||||
|
updateStripWidgets();
|
||||||
|
|
||||||
|
// Persist updated state.
|
||||||
|
saveChatData();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the persona avatar image when user switches personas
|
* Update the persona avatar image when user switches personas
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user