diff --git a/src/pages/GamePage.css b/src/pages/GamePage.css index d20c4f7..94c3f7d 100644 --- a/src/pages/GamePage.css +++ b/src/pages/GamePage.css @@ -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 { diff --git a/src/pages/GamePage.tsx b/src/pages/GamePage.tsx index e338d18..d35bc7b 100644 --- a/src/pages/GamePage.tsx +++ b/src/pages/GamePage.tsx @@ -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); }; // Функции управления сессиями diff --git a/src/types/index.ts b/src/types/index.ts index de01d88..82e9f98 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -45,6 +45,7 @@ export interface Story { export interface MessageVersion { content: string; timestamp: Date; + aiResponse?: string; // соответствующий ответ ИИ для этой версии } export interface ChatMessage {