feat: sync AI responses with message versions, increase font size

This commit is contained in:
Alexej Wolff
2026-02-11 16:43:44 +01:00
parent c9a0236be6
commit dccc94132e
3 changed files with 64 additions and 14 deletions
+2 -2
View File
@@ -296,8 +296,8 @@
.message-content { .message-content {
padding: 0.875rem 1rem; padding: 0.875rem 1rem;
border-radius: 18px; border-radius: 18px;
line-height: 1.55; line-height: 1.6;
font-size: 0.95rem; font-size: 1.05rem;
} }
.message.user .message-content { .message.user .message-content {
+61 -12
View File
@@ -24,6 +24,7 @@ import type {
GameSession, GameSession,
ChatMessage, ChatMessage,
PlayerCharacter, PlayerCharacter,
MessageVersion,
} from "../types"; } from "../types";
import "./GamePage.css"; import "./GamePage.css";
@@ -393,12 +394,26 @@ export default function GamePage() {
const message = session.messages[messageIndex]; const message = session.messages[messageIndex];
// Инициализируем версии если их нет (первая версия = оригинал) // Находим следующее сообщение ИИ (если есть)
const versions = message.versions || [{ content: message.content, timestamp: message.timestamp }]; const nextMessage = session.messages[messageIndex + 1];
const currentAiResponse = nextMessage?.role === "assistant" ? nextMessage.content : undefined;
// Добавляем новую версию // Инициализируем версии если их нет (первая версия = оригинал с текущим ответом ИИ)
const newVersion = { content: editContent.trim(), timestamp: new Date() }; const versions: MessageVersion[] = message.versions || [{
const newVersions = [...versions, newVersion]; content: message.content,
timestamp: message.timestamp,
aiResponse: currentAiResponse
}];
// Если текущая версия не имеет aiResponse, добавляем его
const currentVersionIdx = message.activeVersion || 0;
if (versions[currentVersionIdx] && !versions[currentVersionIdx].aiResponse && currentAiResponse) {
versions[currentVersionIdx] = { ...versions[currentVersionIdx], aiResponse: currentAiResponse };
}
// Добавляем новую версию (aiResponse добавится после генерации)
const newVersion: MessageVersion = { content: editContent.trim(), timestamp: new Date() };
const newVersions: MessageVersion[] = [...versions, newVersion];
const newActiveVersion = newVersions.length - 1; const newActiveVersion = newVersions.length - 1;
// Обновляем сообщение пользователя // Обновляем сообщение пользователя
@@ -437,6 +452,15 @@ export default function GamePage() {
abortControllerRef.current.signal, abortControllerRef.current.signal,
); );
// Сохраняем ответ ИИ в текущую версию
const finalVersions: MessageVersion[] = [...newVersions];
finalVersions[newActiveVersion] = { ...finalVersions[newActiveVersion], aiResponse: response };
const finalUserMessage: ChatMessage = {
...updatedUserMessage,
versions: finalVersions,
};
const assistantMessage: ChatMessage = { const assistantMessage: ChatMessage = {
id: generateId(), id: generateId(),
role: "assistant", role: "assistant",
@@ -444,7 +468,7 @@ export default function GamePage() {
timestamp: new Date(), timestamp: new Date(),
}; };
const allMessages = [...updatedMessages, assistantMessage]; const allMessages = [...messagesUpToEdit, finalUserMessage, assistantMessage];
const finalSession: GameSession = { const finalSession: GameSession = {
...session, ...session,
@@ -456,6 +480,15 @@ export default function GamePage() {
} catch (err) { } catch (err) {
if (err instanceof Error && err.name === "AbortError") { if (err instanceof Error && err.name === "AbortError") {
if (streamingContent.trim()) { if (streamingContent.trim()) {
// Сохраняем частичный ответ в версию
const finalVersions: MessageVersion[] = [...newVersions];
finalVersions[newActiveVersion] = { ...finalVersions[newActiveVersion], aiResponse: streamingContent };
const finalUserMessage: ChatMessage = {
...updatedUserMessage,
versions: finalVersions,
};
const partialMessage: ChatMessage = { const partialMessage: ChatMessage = {
id: generateId(), id: generateId(),
role: "assistant", role: "assistant",
@@ -464,7 +497,7 @@ export default function GamePage() {
}; };
const partialSession: GameSession = { const partialSession: GameSession = {
...session, ...session,
messages: [...updatedMessages, partialMessage], messages: [...messagesUpToEdit, finalUserMessage, partialMessage],
}; };
await apiSaveSession(story.id, currentSessionId, partialSession); await apiSaveSession(story.id, currentSessionId, partialSession);
setSession(partialSession); setSession(partialSession);
@@ -480,8 +513,8 @@ export default function GamePage() {
}; };
// Переключить версию сообщения // Переключить версию сообщения
const handleSwitchVersion = (messageId: string, direction: "prev" | "next") => { const handleSwitchVersion = async (messageId: string, direction: "prev" | "next") => {
if (!session) return; if (!session || !story || !currentSessionId) return;
const messageIndex = session.messages.findIndex((m) => m.id === messageId); const messageIndex = session.messages.findIndex((m) => m.id === messageId);
if (messageIndex === -1) return; if (messageIndex === -1) return;
@@ -498,16 +531,32 @@ export default function GamePage() {
newVersion = currentVersion < message.versions.length - 1 ? currentVersion + 1 : 0; newVersion = currentVersion < message.versions.length - 1 ? currentVersion + 1 : 0;
} }
const selectedVersion = message.versions[newVersion];
const updatedMessage: ChatMessage = { const updatedMessage: ChatMessage = {
...message, ...message,
content: message.versions[newVersion].content, content: selectedVersion.content,
activeVersion: newVersion, activeVersion: newVersion,
}; };
const updatedMessages = [...session.messages]; let updatedMessages = [...session.messages];
updatedMessages[messageIndex] = updatedMessage; updatedMessages[messageIndex] = updatedMessage;
setSession({ ...session, messages: updatedMessages }); // Если у версии есть сохраненный ответ ИИ, обновляем следующее сообщение
const nextMessage = session.messages[messageIndex + 1];
if (selectedVersion.aiResponse && nextMessage?.role === "assistant") {
const updatedAiMessage: ChatMessage = {
...nextMessage,
content: selectedVersion.aiResponse,
};
updatedMessages[messageIndex + 1] = updatedAiMessage;
}
const updatedSession = { ...session, messages: updatedMessages };
setSession(updatedSession);
// Сохраняем изменения
await apiSaveSession(story.id, currentSessionId, updatedSession);
}; };
// Функции управления сессиями // Функции управления сессиями
+1
View File
@@ -45,6 +45,7 @@ export interface Story {
export interface MessageVersion { export interface MessageVersion {
content: string; content: string;
timestamp: Date; timestamp: Date;
aiResponse?: string; // соответствующий ответ ИИ для этой версии
} }
export interface ChatMessage { export interface ChatMessage {