From f397b6ef1a880fc34b26d6bcc775e1344f6072e3 Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Wed, 15 Jan 2025 02:05:23 +0900 Subject: [PATCH 01/11] feat: add translate button to HypaV3 modal --- src/lib/Others/AlertComp.svelte | 6 +- src/lib/Others/HypaV3Modal.svelte | 573 ++++++++++++++++++++++-------- 2 files changed, 420 insertions(+), 159 deletions(-) diff --git a/src/lib/Others/AlertComp.svelte b/src/lib/Others/AlertComp.svelte index 1a8580d8..85a248be 100644 --- a/src/lib/Others/AlertComp.svelte +++ b/src/lib/Others/AlertComp.svelte @@ -22,9 +22,9 @@ import { ColorSchemeTypeStore } from "src/ts/gui/colorscheme"; import Help from "./Help.svelte"; import { getChatBranches } from "src/ts/gui/branches"; - import { getCurrentCharacter } from "src/ts/storage/database.svelte"; - import { message } from "@tauri-apps/plugin-dialog"; - import HypaV3Modal from './HypaV3Modal.svelte'; + import { getCurrentCharacter } from "src/ts/storage/database.svelte"; + import { message } from "@tauri-apps/plugin-dialog"; + import HypaV3Modal from './HypaV3Modal.svelte'; let btn let input = $state('') let cardExportType = $state('realm') diff --git a/src/lib/Others/HypaV3Modal.svelte b/src/lib/Others/HypaV3Modal.svelte index e6c6b34e..4aebdf7d 100644 --- a/src/lib/Others/HypaV3Modal.svelte +++ b/src/lib/Others/HypaV3Modal.svelte @@ -1,36 +1,264 @@ -
+
+
-

HypaV3 Data

+

HypaV3 Data

+
-
- {#each DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].hypaV3Data.summaries as summary, i} + + +
+ {#each modalState.summaries as summary, i}
- -
-
- Summary #{i + 1} -
- - - - - try { - const char = DBState.db.characters[$selectedCharID]; - const chat = - char.chats[ - DBState.db.characters[$selectedCharID].chatPage - ]; - const firstMessage = - chat.fmIndex === -1 - ? char.firstMessage - : char.alternateGreetings?.[chat.fmIndex ?? 0]; - const toSummarize = summary.chatMemos.map( - (chatMemo) => { - if (chatMemo == null) { - return { - role: "assistant", - data: firstMessage, - }; - } + + - const msg = chat.message.find( - (m) => m.chatId === chatMemo - ); - return msg - ? { - role: - msg.role === "char" - ? "assistant" - : msg.role, - data: msg.data, - } - : null; - } - ); - const stringifiedChats = toSummarize - .map((m) => `${m.role}: ${m.data}`) - .join("\n"); - const summarizeResult = - await summarize(stringifiedChats); - - if (summarizeResult.success) { - summary.text = summarizeResult.data; - } - } finally { - hypaV3IsResummarizing = false; - } - }} - disabled={hypaV3IsResummarizing} - > - - -
+ +
- -
- -
- - Connected Messages ({summary.chatMemos.length}) - -
- -
- {#each summary.chatMemos as chatMemo} + + + + + {#if summary.state.translation} +
+ Translation +
+ {summary.state.translation} +
+
+ {/if} + + + {#if summary.state.rerolledText} +
+
+ Rerolled Summary +
+ + + + - {/each} -
- - {#if hypaV3ExpandedChatMemo.summaryChatMemos === summary.chatMemos && hypaV3ExpandedChatMemo.summaryChatMemo !== ""} -
-
+ +
+
+ - if (targetMessage) { - const displayRole = - targetMessage.role === "char" - ? char.name - : targetMessage.role; - return `${displayRole}:\n${targetMessage.data}`; - } - - return "Message not found"; - })()} + + {#if summary.state.rerolledTranslation} +
+ Rerolled Translation +
+ {summary.state.rerolledTranslation}
{/if}
+ {/if} + + +
+
+ + Connected Messages ({summary.chatMemos.length}) + + + +
+ + +
+ {#each summary.chatMemos as chatMemo} + + {/each} +
+ + + {#if modalState.expandedMessage?.summaryChatMemos === summary.chatMemos} + {@const messageData = getMessageData()} +
+ {#if messageData} + +
+ {messageData.role}: +
+ +
+ {messageData.data} +
+ {:else} +
Message not found
+ {/if} + + + {#if modalState.expandedMessage.translation} +
+ Translation +
+ {modalState.expandedMessage.translation} +
+
+ {/if} +
+ {/if}
{/each} - {#if DBState.db.characters[$selectedCharID].chats[DBState.db.characters[$selectedCharID].chatPage].hypaV3Data.summaries.length === 0} + + {#if modalState.summaries.length === 0} No summaries yet {/if}
From 3e234dcb157fc7f049a38b064066325f3af4a8fe Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Wed, 15 Jan 2025 13:45:34 +0900 Subject: [PATCH 02/11] feat: add dual-action translation (cached/regenerate) in HypaV3 modal Implements shift+click (desktop) and double tap (mobile) for regenerating translations while maintaining regular click/tap for cached translations. --- src/lib/Others/HypaV3Modal.svelte | 106 ++++++++++++++++++++++++++---- src/ts/process/memory/hypav3.ts | 4 +- 2 files changed, 96 insertions(+), 14 deletions(-) diff --git a/src/lib/Others/HypaV3Modal.svelte b/src/lib/Others/HypaV3Modal.svelte index 4aebdf7d..89faa2df 100644 --- a/src/lib/Others/HypaV3Modal.svelte +++ b/src/lib/Others/HypaV3Modal.svelte @@ -61,7 +61,10 @@ expandedMessage: null, }); - async function toggleTranslate(summary: ExtendedSummary): Promise { + async function toggleTranslate( + summary: ExtendedSummary, + regenerate?: boolean + ): Promise { if (summary.state.isTranslating) return; if (summary.state.translation) { @@ -72,7 +75,7 @@ summary.state.isTranslating = true; summary.state.translation = "Loading..."; - const result = await translate(summary.text); + const result = await translate(summary.text, regenerate); summary.state.translation = result; summary.state.isTranslating = false; @@ -144,7 +147,8 @@ } async function toggleTranslateRerolled( - summary: ExtendedSummary + summary: ExtendedSummary, + regenerate?: boolean ): Promise { if (summary.state.isRerolledTranslating) return; @@ -158,13 +162,15 @@ summary.state.isRerolledTranslating = true; summary.state.rerolledTranslation = "Loading..."; - const result = await translate(summary.state.rerolledText); + const result = await translate(summary.state.rerolledText, regenerate); summary.state.rerolledTranslation = result; summary.state.isRerolledTranslating = false; } - async function toggleTranslateExpandedMessage(): Promise { + async function toggleTranslateExpandedMessage( + regenerate?: boolean + ): Promise { if (!modalState.expandedMessage || modalState.expandedMessage.isTranslating) return; @@ -180,7 +186,7 @@ modalState.expandedMessage.isTranslating = true; modalState.expandedMessage.translation = "Loading..."; - const result = await translate(messageData.data); + const result = await translate(messageData.data, regenerate); modalState.expandedMessage.translation = result; modalState.expandedMessage.isTranslating = false; @@ -235,13 +241,78 @@ }; } - async function translate(text) { + async function translate( + text: string, + regenerate?: boolean + ): Promise { try { - return await translateHTML(text, false, "", -1); + return await translateHTML(text, false, "", -1, regenerate); } catch (error) { return `Translation failed: ${error}`; } } + + type DualActionParams = { + onMainAction?: () => void; + onAlternativeAction?: () => void; + }; + + function handleDualAction(node: HTMLElement, params: DualActionParams = {}) { + const state = { + lastTap: 0, + tapTimeout: null as any, + }; + + const DOUBLE_TAP_DELAY = 300; + + function handleInteraction(event: Event) { + if ("ontouchend" in window) { + // Mobile environment + const currentTime = new Date().getTime(); + const tapLength = currentTime - state.lastTap; + + if (tapLength < DOUBLE_TAP_DELAY && tapLength > 0) { + // Double tap detected + event.preventDefault(); + clearTimeout(state.tapTimeout); // Cancel the first tap timeout + params.onAlternativeAction?.(); + state.lastTap = 0; // Reset state + } else { + // First tap + state.lastTap = currentTime; + + // Delayed single tap execution + state.tapTimeout = setTimeout(() => { + if (state.lastTap === currentTime) { + // If no double tap occurred + params.onMainAction?.(); + } + }, DOUBLE_TAP_DELAY); + } + } else { + // Desktop environment + if ((event as MouseEvent).shiftKey) { + params.onAlternativeAction?.(); + } else { + params.onMainAction?.(); + } + } + } + + node.addEventListener("click", handleInteraction); + node.addEventListener("touchend", handleInteraction); + + return { + destroy() { + node.removeEventListener("click", handleInteraction); + node.removeEventListener("touchend", handleInteraction); + clearTimeout(state.tapTimeout); // Cleanup timeout + }, + update(newParams: DualActionParams) { + params = newParams; + }, + }; + }
@@ -310,7 +381,10 @@ @@ -367,8 +441,12 @@ @@ -427,7 +505,11 @@ diff --git a/src/ts/process/memory/hypav3.ts b/src/ts/process/memory/hypav3.ts index 4786c1bf..25d7d83f 100644 --- a/src/ts/process/memory/hypav3.ts +++ b/src/ts/process/memory/hypav3.ts @@ -854,7 +854,7 @@ class HypaProcesserEx extends HypaProcesser { summaryChunkVectors: SummaryChunkVector[] = []; // Calculate dot product similarity between two vectors - similarity(a: VectorArray, b: VectorArray) { + similarity(a: VectorArray, b: VectorArray): number { let dot = 0; for (let i = 0; i < a.length; i++) { @@ -864,7 +864,7 @@ class HypaProcesserEx extends HypaProcesser { return dot; } - async addSummaryChunks(chunks: SummaryChunk[]) { + async addSummaryChunks(chunks: SummaryChunk[]): Promise { // Maintain the superclass's caching structure by adding texts const texts = chunks.map((chunk) => chunk.text); From d59cc1a29cd35f11e6e7ec4e21cd23296bbcc878 Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:56:07 +0900 Subject: [PATCH 03/11] refactor: update UI management to index-based approach --- src/lib/Others/HypaV3Modal.svelte | 312 ++++++++++++++---------------- 1 file changed, 148 insertions(+), 164 deletions(-) diff --git a/src/lib/Others/HypaV3Modal.svelte b/src/lib/Others/HypaV3Modal.svelte index 89faa2df..582236c9 100644 --- a/src/lib/Others/HypaV3Modal.svelte +++ b/src/lib/Others/HypaV3Modal.svelte @@ -10,78 +10,94 @@ import TextAreaInput from "../UI/GUI/TextAreaInput.svelte"; import { alertConfirm } from "../../ts/alert"; import { DBState, alertStore, selectedCharID } from "src/ts/stores.svelte"; - import { - type SerializableHypaV3Data, - summarize, - } from "src/ts/process/memory/hypav3"; + import { summarize } from "src/ts/process/memory/hypav3"; import { translateHTML } from "src/ts/translator/translator"; - import PersonaSettings from "../Setting/Pages/PersonaSettings.svelte"; - type Summary = SerializableHypaV3Data["summaries"][number]; - - interface ExtendedSummary extends Summary { - state: { - isTranslating: boolean; - translation?: string | null; - isRerolling: boolean; - rerolledText?: string | null; - isRerolledTranslating: boolean; - rerolledTranslation?: string | null; - }; + interface SummaryUI { + isTranslating: boolean; + translation: string | null; + isRerolling: boolean; + rerolledText: string | null; + isRerolledTranslating: boolean; + rerolledTranslation: string | null; } - interface HypaV3ModalState { - summaries: ExtendedSummary[]; - expandedMessage: { - summaryChatMemos: string[]; - selectedChatMemo: string; - isTranslating: boolean; - translation?: string | null; - } | null; + interface ExpandedMessageUI { + summaryIndex: number; + selectedChatMemo: string; + isTranslating: boolean; + translation?: string | null; } - // Initialize modal state - let modalState = $state({ - summaries: DBState.db.characters[$selectedCharID].chats[ + const hypaV3DataState = $state( + DBState.db.characters[$selectedCharID].chats[ DBState.db.characters[$selectedCharID].chatPage - ].hypaV3Data.summaries.map((s) => { - const summary = s as ExtendedSummary; + ].hypaV3Data + ); + const summaryUIStates = $state( + hypaV3DataState.summaries.map(() => ({ + isTranslating: false, + translation: null, + isRerolling: false, + rerolledText: null, + isRerolledTranslating: false, + rerolledTranslation: null, + })) + ); + let expandedMessageUIState = $state(null); - summary.state = { - isTranslating: false, - translation: null, - isRerolling: false, - rerolledText: null, - isRerolledTranslating: false, - rerolledTranslation: null, - }; - - return summary; - }), - expandedMessage: null, + $effect(() => { + // Detects changes in all nested properties including summaries + hypaV3DataState.summaries; + expandedMessageUIState = null; }); + function getMessageFromChatMemo( + chatMemo: string | null + ): { role: string; data: string } | null { + const char = DBState.db.characters[$selectedCharID]; + const chat = char.chats[DBState.db.characters[$selectedCharID].chatPage]; + const firstMessage = + chat.fmIndex === -1 + ? char.firstMessage + : char.alternateGreetings?.[chat.fmIndex ?? 0]; + + const targetMessage = + chatMemo == null + ? { role: "char", data: firstMessage } + : chat.message.find((m) => m.chatId === chatMemo); + + return targetMessage; + } + async function toggleTranslate( - summary: ExtendedSummary, + summaryIndex: number, regenerate?: boolean ): Promise { - if (summary.state.isTranslating) return; + const summaryUIState = summaryUIStates[summaryIndex]; - if (summary.state.translation) { - summary.state.translation = null; + if (summaryUIState.isTranslating) return; + + if (summaryUIState.translation) { + summaryUIState.translation = null; return; } - summary.state.isTranslating = true; - summary.state.translation = "Loading..."; + summaryUIState.isTranslating = true; + summaryUIState.translation = "Loading..."; - const result = await translate(summary.text, regenerate); + const result = await translate( + hypaV3DataState.summaries[summaryIndex].text, + regenerate + ); - summary.state.translation = result; - summary.state.isTranslating = false; + summaryUIState.translation = result; + summaryUIState.isTranslating = false; } - function isRerollable(summary: ExtendedSummary): boolean { + function isRerollable(summaryIndex: number): boolean { + const summary = hypaV3DataState.summaries[summaryIndex]; + for (const chatMemo of summary.chatMemos) { if (typeof chatMemo === "string") { const char = DBState.db.characters[$selectedCharID]; @@ -93,154 +109,121 @@ } } } - return true; } - async function toggleReroll(summary: ExtendedSummary): Promise { - if (summary.state.isRerolling) return; - if (!isRerollable(summary)) return; + async function toggleReroll(summaryIndex: number): Promise { + const summaryUIState = summaryUIStates[summaryIndex]; - summary.state.isRerolling = true; - summary.state.rerolledText = "Loading..."; + if (summaryUIState.isRerolling) return; + if (!isRerollable(summaryIndex)) return; + + summaryUIState.isRerolling = true; + summaryUIState.rerolledText = "Loading..."; try { - const char = DBState.db.characters[$selectedCharID]; - const chat = char.chats[DBState.db.characters[$selectedCharID].chatPage]; - const firstMessage = - chat.fmIndex === -1 - ? char.firstMessage - : char.alternateGreetings?.[chat.fmIndex ?? 0]; - + const summary = hypaV3DataState.summaries[summaryIndex]; const toSummarize = summary.chatMemos.map((chatMemo) => { - if (chatMemo == null) { - return { - role: "assistant", - data: firstMessage, - }; - } + const message = getMessageFromChatMemo(chatMemo); - const msg = chat.message.find((m) => m.chatId === chatMemo); - - return msg - ? { - role: msg.role === "char" ? "assistant" : msg.role, - data: msg.data, - } - : null; + return { + ...message, + role: message.role === "char" ? "assistant" : message.role, + }; }); const stringifiedChats = toSummarize .map((m) => `${m.role}: ${m.data}`) .join("\n"); - const summarizeResult = await summarize(stringifiedChats); if (summarizeResult.success) { - summary.state.rerolledText = summarizeResult.data; + summaryUIState.rerolledText = summarizeResult.data; } } catch (error) { - summary.state.rerolledText = "Reroll failed"; + summaryUIState.rerolledText = "Reroll failed"; } finally { - summary.state.isRerolling = false; + summaryUIState.isRerolling = false; } } async function toggleTranslateRerolled( - summary: ExtendedSummary, + summaryIndex: number, regenerate?: boolean ): Promise { - if (summary.state.isRerolledTranslating) return; + const summaryUIState = summaryUIStates[summaryIndex]; - if (summary.state.rerolledTranslation) { - summary.state.rerolledTranslation = null; + if (summaryUIState.isRerolledTranslating) return; + + if (summaryUIState.rerolledTranslation) { + summaryUIState.rerolledTranslation = null; return; } - if (!summary.state.rerolledText) return; + if (!summaryUIState.rerolledText) return; - summary.state.isRerolledTranslating = true; - summary.state.rerolledTranslation = "Loading..."; + summaryUIState.isRerolledTranslating = true; + summaryUIState.rerolledTranslation = "Loading..."; - const result = await translate(summary.state.rerolledText, regenerate); + const result = await translate(summaryUIState.rerolledText, regenerate); - summary.state.rerolledTranslation = result; - summary.state.isRerolledTranslating = false; + summaryUIState.rerolledTranslation = result; + summaryUIState.isRerolledTranslating = false; } async function toggleTranslateExpandedMessage( regenerate?: boolean ): Promise { - if (!modalState.expandedMessage || modalState.expandedMessage.isTranslating) - return; + if (!expandedMessageUIState || expandedMessageUIState.isTranslating) return; - if (modalState.expandedMessage.translation) { - modalState.expandedMessage.translation = null; + if (expandedMessageUIState.translation) { + expandedMessageUIState.translation = null; return; } - const messageData = getMessageData(); + const message = getMessageFromChatMemo( + expandedMessageUIState.selectedChatMemo + ); - if (!messageData) return; + if (!message) return; - modalState.expandedMessage.isTranslating = true; - modalState.expandedMessage.translation = "Loading..."; + expandedMessageUIState.isTranslating = true; + expandedMessageUIState.translation = "Loading..."; - const result = await translate(messageData.data, regenerate); + const result = await translate(message.data, regenerate); - modalState.expandedMessage.translation = result; - modalState.expandedMessage.isTranslating = false; + expandedMessageUIState.translation = result; + expandedMessageUIState.isTranslating = false; } function isMessageExpanded( - summary: ExtendedSummary, + summaryIndex: number, chatMemo: string | null ): boolean { + if (!expandedMessageUIState) return false; + + const summary = hypaV3DataState.summaries[summaryIndex]; + return ( - modalState.expandedMessage?.summaryChatMemos === summary.chatMemos && - modalState.expandedMessage?.selectedChatMemo === chatMemo + expandedMessageUIState.summaryIndex === summaryIndex && + expandedMessageUIState.selectedChatMemo === chatMemo ); } function toggleExpandMessage( - summary: ExtendedSummary, + summaryIndex: number, chatMemo: string | null ): void { - modalState.expandedMessage = isMessageExpanded(summary, chatMemo) + expandedMessageUIState = isMessageExpanded(summaryIndex, chatMemo) ? null : { - summaryChatMemos: summary.chatMemos, + summaryIndex, selectedChatMemo: chatMemo, isTranslating: false, translation: null, }; } - function getMessageData(): { role: string; data: string } | null { - const char = DBState.db.characters[$selectedCharID]; - const chat = char.chats[DBState.db.characters[$selectedCharID].chatPage]; - const firstMessage = - chat.fmIndex === -1 - ? char.firstMessage - : char.alternateGreetings?.[chat.fmIndex ?? 0]; - - const targetMessage = - modalState.expandedMessage?.selectedChatMemo == null - ? { role: "char", data: firstMessage } - : chat.message.find( - (m) => m.chatId === modalState.expandedMessage!.selectedChatMemo - ); - - if (!targetMessage) { - return null; - } - - return { - ...targetMessage, - role: targetMessage.role === "char" ? char.name : targetMessage.role, - }; - } - async function translate( text: string, regenerate?: boolean @@ -318,7 +301,7 @@
- {#each modalState.summaries as summary, i} + {#each hypaV3DataState.summaries as summary, i}
@@ -382,8 +365,8 @@ @@ -419,7 +402,7 @@ /> - {#if summary.state.translation} + {#if summaryUIStates[i].translation}
Translation - {summary.state.translation} + {summaryUIStates[i].translation}
{/if} - {#if summary.state.rerolledText} + {#if summaryUIStates[i].rerolledText}
Rerolled Summary @@ -442,10 +425,9 @@
- {#if summary.state.rerolledTranslation} + {#if summaryUIStates[i].rerolledTranslation}
Rerolled Translation - {summary.state.rerolledTranslation} + {summaryUIStates[i].rerolledTranslation}
{/if} @@ -520,12 +502,12 @@ {#each summary.chatMemos as chatMemo} @@ -533,26 +515,28 @@
- {#if modalState.expandedMessage?.summaryChatMemos === summary.chatMemos} - {@const messageData = getMessageData()} + {#if expandedMessageUIState?.summaryIndex === i} + {@const message = getMessageFromChatMemo( + expandedMessageUIState.selectedChatMemo + )}
- {#if messageData} + {#if message}
- {messageData.role}: + {message.role}'s Message
- {messageData.data} + {message.data}
{:else}
Message not found
{/if} - {#if modalState.expandedMessage.translation} + {#if expandedMessageUIState.translation}
Translation - {modalState.expandedMessage.translation} + {expandedMessageUIState.translation}
{/if} @@ -570,7 +554,7 @@
{/each} - {#if modalState.summaries.length === 0} + {#if hypaV3DataState.summaries.length === 0} No summaries yet {/if}
From c57c2561901622b3344453cb9d4588409271a127 Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:23:02 +0900 Subject: [PATCH 04/11] fix: reactive declarations --- src/lib/Others/HypaV3Modal.svelte | 383 ++++++++++++++++-------------- 1 file changed, 200 insertions(+), 183 deletions(-) diff --git a/src/lib/Others/HypaV3Modal.svelte b/src/lib/Others/HypaV3Modal.svelte index 582236c9..099e669c 100644 --- a/src/lib/Others/HypaV3Modal.svelte +++ b/src/lib/Others/HypaV3Modal.svelte @@ -29,13 +29,16 @@ translation?: string | null; } - const hypaV3DataState = $state( + const hypaV3DataState = $derived( DBState.db.characters[$selectedCharID].chats[ DBState.db.characters[$selectedCharID].chatPage ].hypaV3Data ); - const summaryUIStates = $state( - hypaV3DataState.summaries.map(() => ({ + + let summaryUIStates = $state( + DBState.db.characters[$selectedCharID].chats[ + DBState.db.characters[$selectedCharID].chatPage + ].hypaV3Data.summaries.map(() => ({ isTranslating: false, translation: null, isRerolling: false, @@ -47,8 +50,18 @@ let expandedMessageUIState = $state(null); $effect(() => { - // Detects changes in all nested properties including summaries hypaV3DataState.summaries; + hypaV3DataState.summaries.length; + + summaryUIStates = hypaV3DataState.summaries.map(() => ({ + isTranslating: false, + translation: null, + isRerolling: false, + rerolledText: null, + isRerolledTranslating: false, + rerolledTranslation: null, + })); + expandedMessageUIState = null; }); @@ -354,204 +367,208 @@
{#each hypaV3DataState.summaries as summary, i} -
- -
- Summary #{i + 1} -
- - - - - - - - -
-
- - - - - - {#if summaryUIStates[i].translation} -
- Translation -
- {summaryUIStates[i].translation} -
-
- {/if} - - - {#if summaryUIStates[i].rerolledText} -
-
- Rerolled Summary -
- - - - - - - - -
-
- - - - {#if summaryUIStates[i].rerolledTranslation} -
- Rerolled Translation -
- {summaryUIStates[i].rerolledTranslation} -
-
- {/if} -
- {/if} - - -
+ {#if summaryUIStates[i]} +
+
- - Connected Messages ({summary.chatMemos.length}) - - - -
- - -
- {#each summary.chatMemos as chatMemo} + Summary #{i + 1} +
+ - {/each} + + + + + + +
- - {#if expandedMessageUIState?.summaryIndex === i} - {@const message = getMessageFromChatMemo( - expandedMessageUIState.selectedChatMemo - )} -
- {#if message} - -
- {message.role}'s Message -
- -
- {message.data} -
- {:else} -
Message not found
- {/if} + + - - {#if expandedMessageUIState.translation} + + {#if summaryUIStates[i].translation} +
+ Translation +
+ {summaryUIStates[i].translation} +
+
+ {/if} + + + {#if summaryUIStates[i].rerolledText} +
+
+ Rerolled Summary +
+ + + + + + + + +
+
+ + + + {#if summaryUIStates[i].rerolledTranslation}
TranslationRerolled Translation
- {expandedMessageUIState.translation} + {summaryUIStates[i].rerolledTranslation}
{/if}
{/if} + + +
+
+ + Connected Messages ({summary.chatMemos.length}) + + + +
+ + +
+ {#each summary.chatMemos as chatMemo} + + {/each} +
+ + + {#if expandedMessageUIState?.summaryIndex === i} + {@const message = getMessageFromChatMemo( + expandedMessageUIState.selectedChatMemo + )} +
+ {#if message} + +
+ {message.role}'s Message +
+ +
+ {message.data} +
+ {:else} +
Message not found
+ {/if} + + + {#if expandedMessageUIState.translation} +
+ Translation +
+ {expandedMessageUIState.translation} +
+
+ {/if} +
+ {/if} +
-
+ {/if} {/each} {#if hypaV3DataState.summaries.length === 0} From 682f536c5a39aa53eaef76a7277e131fc0b105d9 Mon Sep 17 00:00:00 2001 From: Bo26fhmC5M <88071760+Bo26fhmC5M@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:36:29 +0900 Subject: [PATCH 05/11] refactor: extract double confirmation logic into reusable function --- src/lib/Others/HypaV3Modal.svelte | 44 ++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/lib/Others/HypaV3Modal.svelte b/src/lib/Others/HypaV3Modal.svelte index 099e669c..690b8e61 100644 --- a/src/lib/Others/HypaV3Modal.svelte +++ b/src/lib/Others/HypaV3Modal.svelte @@ -8,7 +8,7 @@ CheckIcon, } from "lucide-svelte"; import TextAreaInput from "../UI/GUI/TextAreaInput.svelte"; - import { alertConfirm } from "../../ts/alert"; + import { alertConfirm, showHypaV3Alert } from "../../ts/alert"; import { DBState, alertStore, selectedCharID } from "src/ts/stores.svelte"; import { summarize } from "src/ts/process/memory/hypav3"; import { translateHTML } from "src/ts/translator/translator"; @@ -65,6 +65,21 @@ expandedMessageUIState = null; }); + async function confirmTwice( + firstMessage: string, + secondMessage: string + ): Promise { + let confirmed = await alertConfirm(firstMessage); + + if (confirmed) { + confirmed = await alertConfirm(secondMessage); + + if (confirmed) { + return true; + } + } + } + function getMessageFromChatMemo( chatMemo: string | null ): { role: string; data: string } | null { @@ -327,22 +342,19 @@