`refactor/perf-printMessages` #4: Renamed `newMessage` to `messageElement` and `newMessageId` to `messageId`. (#4985) * If insert is false, `newMessage` may not be new, so I renamed `newMessage` to `messageElement` and `newMessageId` to `messageId`. I also rearranged some constants to improve readability. * Accept 0 as valid insertAfter/insertBefore targets * Yeah whatever --------- Co-authored-by: user <user@exmaple.com> Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Signed| @@ -2441,7 +2441,7 @@ function getMessageTextHTML(message, { messageId = chat.indexOf(message) }) { | ||
| 2441 | 2441 | */ |
| 2442 | 2442 | export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll = true, insertBefore = null, forceId = null, showSwipes = true, insert = true } = {}) { |
| 2443 | 2443 | // Callers push the new message to chat before calling addOneMessage |
| 2444 | 2444 | const newMessageIdmessageId = (() => { |
| 2445 | 2445 | if (typeof forceId === 'number') { |
| 2446 | 2446 | return forceId; |
| 2447 | 2447 | } |
| @@ -2458,8 +2458,6 @@ export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll | ||
| 2458 | 2458 | return chat.length - 1; |
| 2459 | 2459 | })(); |
| 2460 | 2460 | |
| 2461 | - const momentDate = timestampToMoment(mes.send_date); | |
| 2462 | - const timestamp = momentDate.isValid() ? momentDate.format('LL LT') : ''; | |
| 2463 | 2461 | |
| 2464 | 2462 | let avatarImg = getThumbnailUrl('persona', user_avatar); |
| 2465 | 2463 | |
| @@ -2469,13 +2467,11 @@ export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll | ||
| 2469 | 2467 | avatarImg = mes.force_avatar; |
| 2470 | 2468 | } else if (this_chid === undefined) { |
| 2471 | 2469 | avatarImg = system_avatar; |
| 2472 | - } else { | |
| 2470 | + } else if (characters[this_chid] && characters[this_chid].avatar !== 'none') { | |
| 2473 | - if (characters[this_chid].avatar !== 'none') { | |
| 2474 | 2471 | avatarImg = getThumbnailUrl('avatar', characters[this_chid].avatar); |
| 2475 | 2472 | } else { |
| 2476 | 2473 | avatarImg = default_avatar; |
| 2477 | 2474 | } |
| 2478 | - } | |
| 2479 | 2475 | //old processing: |
| 2480 | 2476 | //if message is from system, use the name provided in the message JSONL to proceed, |
| 2481 | 2477 | //if not system message, use name2 (char's name) to proceed |
| @@ -2484,9 +2480,14 @@ export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll | ||
| 2484 | 2480 | // Special case for persona images. |
| 2485 | 2481 | avatarImg = mes.force_avatar; |
| 2486 | 2482 | } |
| 2483 | + const momentDate = timestampToMoment(mes.send_date); | |
| 2484 | + const timestamp = momentDate.isValid() ? momentDate.format('LL LT') : ''; | |
| 2485 | + const messageHTML = getMessageTextHTML(mes, { messageId }); | |
| 2486 | + const bookmarkLink = mes?.extra?.bookmark_link; | |
| 2487 | + const tokenCount = mes.extra?.token_count; | |
| 2488 | + const { timerValue, timerTitle } = formatGenerationTimer(mes.gen_started, mes.gen_finished, mes.extra?.token_count, mes.extra?.reasoning_duration, mes.extra?.time_to_first_token); | |
| 2487 | 2489 | |
| 2488 | - const messageHTML = getMessageTextHTML(mes, { messageId: newMessageId }); | |
| 2490 | + let messageElement; | |
| 2489 | - let newMessage; | |
| 2490 | 2491 | |
| 2491 | 2492 | if (type === 'swipe') { |
| 2492 | 2493 | // Forbidden black magic |
| @@ -2494,17 +2495,13 @@ export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll | ||
| 2494 | 2495 | mes.swipe_id ??= 0; |
| 2495 | 2496 | mes.swipes ??= [mes.mes]; |
| 2496 | 2497 | //This keeps listeners intact. |
| 2497 | 2498 | newMessagemessageElement = chatElement.find(`[mesid="${newMessageIdmessageId}"]`); |
| 2498 | 2499 | } else { |
| 2499 | 2500 | newMessagemessageElement = messageTemplate.clone(); |
| 2500 | 2501 | } |
| 2501 | 2502 | |
| 2502 | - const { timerValue, timerTitle } = formatGenerationTimer(mes.gen_started, mes.gen_finished, mes.extra?.token_count, mes.extra?.reasoning_duration, mes.extra?.time_to_first_token); | |
| 2503 | + messageElement.attr({ | |
| 2503 | - const tokenCount = mes.extra?.token_count; | |
| 2504 | + 'mesid': messageId, | |
| 2504 | - const bookmarkLink = mes?.extra?.bookmark_link; | |
| 2505 | - | |
| 2506 | - newMessage.attr({ | |
| 2507 | - 'mesid': newMessageId, | |
| 2508 | 2505 | 'swipeid': mes.swipe_id ?? 0, |
| 2509 | 2506 | 'ch_name': mes.name, |
| 2510 | 2507 | 'is_user': mes.is_user, |
| @@ -2516,68 +2513,65 @@ export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll | ||
| 2516 | 2513 | 'type': mes.extra?.type ?? '', |
| 2517 | 2514 | }); |
| 2518 | 2515 | |
| 2519 | 2516 | newMessagemessageElement.find('.avatar img').attr('src', avatarImg); |
| 2520 | 2517 | newMessagemessageElement.find('.ch_name .name_text').text(mes.name); |
| 2521 | 2518 | newMessagemessageElement.find('.timestamp').text(timestamp).attr('title', `${mes.extra?.api ? mes.extra.api + ' - ' : ''}${mes.extra?.model ?? ''}`); |
| 2522 | 2519 | newMessagemessageElement.find('.mesIDDisplay').text(`#${newMessageIdmessageId}`); |
| 2523 | 2520 | tokenCount && newMessagemessageElement.find('.tokenCounterDisplay').text(`${tokenCount}t`); |
| 2524 | 2521 | mes.title && newMessagemessageElement.attr('title', mes.title); |
| 2525 | 2522 | timerValue && newMessagemessageElement.find('.mes_timer').attr('title', timerTitle).text(timerValue); |
| 2526 | 2523 | bookmarkLink && updateBookmarkDisplay(newMessagemessageElement); |
| 2527 | 2524 | |
| 2528 | 2525 | if (mes.extra?.bias !== '') { |
| 2529 | 2526 | const bias = messageFormatting(mes.extra?.bias, '', false, false, -1, {}, false); |
| 2530 | 2527 | newMessagemessageElement.find('.mes_bias').html(bias); |
| 2531 | 2528 | } |
| 2532 | 2529 | |
| 2533 | 2530 | updateReasoningUI(newMessagemessageElement); |
| 2534 | 2531 | |
| 2535 | 2532 | if (power_user.timestamp_model_icon && mes.extra?.api) { |
| 2536 | 2533 | insertSVGIcon(newMessagemessageElement, mes.extra); |
| 2537 | 2534 | } |
| 2538 | 2535 | |
| 2539 | 2536 | if (type !== 'swipe' && insert) { |
| 2540 | 2537 | if (!typeof insertAfter === 'number' && !insertBeforeinsertAfter >= 0) { |
| 2541 | - chatElement.append(newMessage); | |
| 2542 | - } | |
| 2543 | - else if (insertAfter) { | |
| 2544 | 2538 | const target = chatElement.find(`.mes[mesid="${insertAfter}"]`); |
| 2545 | 2539 | $(newMessagemessageElement).insertAfter(target); |
| 2546 | - } else { | |
| 2540 | + } else if (typeof insertBefore === 'number' && insertBefore >= 0) { | |
| 2547 | 2541 | const target = chatElement.find(`.mes[mesid="${insertBefore}"]`); |
| 2548 | 2542 | $(newMessagemessageElement).insertBefore(target); |
| 2543 | + } else { | |
| 2544 | + chatElement.append(messageElement); | |
| 2549 | 2545 | } |
| 2550 | 2546 | } |
| 2551 | 2547 | |
| 2552 | 2548 | const isSmallSys =if (mes?.extra?.isSmallSys; === true) { |
| 2553 | - | |
| 2549 | + messageElement.addClass('smallSysMes'); | |
| 2554 | - if (isSmallSys === true) { | |
| 2555 | - newMessage.addClass('smallSysMes'); | |
| 2556 | 2550 | } |
| 2557 | 2551 | |
| 2558 | 2552 | if (Array.isArray(mes?.extra?.tool_invocations)) { |
| 2559 | 2553 | newMessagemessageElement.addClass('toolCall'); |
| 2560 | 2554 | } |
| 2561 | 2555 | |
| 2562 | 2556 | updateMessageItemizedPromptButton(mes, { messageId: newMessageId, messageElement: newMessage }); |
| 2563 | 2557 | |
| 2564 | 2558 | newMessagemessageElement.find('.avatar img').on('error', function () { |
| 2565 | 2559 | $(this).hide(); |
| 2566 | 2560 | $(this).parent().html('<div class="missing-avatar fa-solid fa-user-slash"></div>'); |
| 2567 | 2561 | }); |
| 2568 | 2562 | |
| 2569 | 2563 | appendMediaToMessage(mes, newMessagemessageElement, scroll ? SCROLL_BEHAVIOR.ADJUST : SCROLL_BEHAVIOR.NONE); |
| 2570 | 2564 | newMessagemessageElement.find('.mes_text').html(messageHTML); |
| 2571 | 2565 | addCopyToCodeBlocks(newMessagemessageElement); |
| 2572 | 2566 | |
| 2573 | 2567 | // Set the swipes counter for all non-user messages. |
| 2574 | 2568 | if (!mes.is_user) { |
| 2575 | 2569 | updateSwipeCounter(newMessageIdmessageId, { messageElementmessage: newMessagemes, messageElement }); |
| 2576 | 2570 | } |
| 2577 | 2571 | |
| 2578 | 2572 | // The caller should handle the rest after adding a message to DOM. |
| 2579 | 2573 | if (!insert) { |
| 2580 | 2574 | return newMessagemessageElement; |
| 2581 | 2575 | } |
| 2582 | 2576 | |
| 2583 | 2577 | //last_mes should always be updated. |
| @@ -2592,10 +2586,10 @@ export function addOneMessage(mes, { type = 'normal', insertAfter = null, scroll | ||
| 2592 | 2586 | scrollChatToBottom({ waitForFrame: true }); |
| 2593 | 2587 | } |
| 2594 | 2588 | |
| 2595 | 2589 | applyCharacterTagsToMessageDivs({ mesIds: newMessageIdmessageId }); |
| 2596 | 2590 | updateEditArrowClasses(); |
| 2597 | 2591 | |
| 2598 | 2592 | return newMessagemessageElement; |
| 2599 | 2593 | } |
| 2600 | 2594 | |
| 2601 | 2595 | /** |