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 {
padding: 0.875rem 1rem;
border-radius: 18px;
line-height: 1.55;
font-size: 0.95rem;
line-height: 1.6;
font-size: 1.05rem;
}
.message.user .message-content {
+61 -12
View File
@@ -24,6 +24,7 @@ import type {
GameSession,
ChatMessage,
PlayerCharacter,
MessageVersion,
} from "../types";
import "./GamePage.css";
@@ -393,12 +394,26 @@ export default function GamePage() {
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 newVersions = [...versions, newVersion];
// Инициализируем версии если их нет (первая версия = оригинал с текущим ответом ИИ)
const versions: MessageVersion[] = message.versions || [{
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;
// Обновляем сообщение пользователя
@@ -437,6 +452,15 @@ export default function GamePage() {
abortControllerRef.current.signal,
);
// Сохраняем ответ ИИ в текущую версию
const finalVersions: MessageVersion[] = [...newVersions];
finalVersions[newActiveVersion] = { ...finalVersions[newActiveVersion], aiResponse: response };
const finalUserMessage: ChatMessage = {
...updatedUserMessage,
versions: finalVersions,
};
const assistantMessage: ChatMessage = {
id: generateId(),
role: "assistant",
@@ -444,7 +468,7 @@ export default function GamePage() {
timestamp: new Date(),
};
const allMessages = [...updatedMessages, assistantMessage];
const allMessages = [...messagesUpToEdit, finalUserMessage, assistantMessage];
const finalSession: GameSession = {
...session,
@@ -456,6 +480,15 @@ export default function GamePage() {
} catch (err) {
if (err instanceof Error && err.name === "AbortError") {
if (streamingContent.trim()) {
// Сохраняем частичный ответ в версию
const finalVersions: MessageVersion[] = [...newVersions];
finalVersions[newActiveVersion] = { ...finalVersions[newActiveVersion], aiResponse: streamingContent };
const finalUserMessage: ChatMessage = {
...updatedUserMessage,
versions: finalVersions,
};
const partialMessage: ChatMessage = {
id: generateId(),
role: "assistant",
@@ -464,7 +497,7 @@ export default function GamePage() {
};
const partialSession: GameSession = {
...session,
messages: [...updatedMessages, partialMessage],
messages: [...messagesUpToEdit, finalUserMessage, partialMessage],
};
await apiSaveSession(story.id, currentSessionId, partialSession);
setSession(partialSession);
@@ -480,8 +513,8 @@ export default function GamePage() {
};
// Переключить версию сообщения
const handleSwitchVersion = (messageId: string, direction: "prev" | "next") => {
if (!session) return;
const handleSwitchVersion = async (messageId: string, direction: "prev" | "next") => {
if (!session || !story || !currentSessionId) return;
const messageIndex = session.messages.findIndex((m) => m.id === messageId);
if (messageIndex === -1) return;
@@ -498,16 +531,32 @@ export default function GamePage() {
newVersion = currentVersion < message.versions.length - 1 ? currentVersion + 1 : 0;
}
const selectedVersion = message.versions[newVersion];
const updatedMessage: ChatMessage = {
...message,
content: message.versions[newVersion].content,
content: selectedVersion.content,
activeVersion: newVersion,
};
const updatedMessages = [...session.messages];
let updatedMessages = [...session.messages];
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);
};
// Функции управления сессиями