feat: sync AI responses with message versions, increase font size
This commit is contained in:
+61
-12
@@ -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);
|
||||
};
|
||||
|
||||
// Функции управления сессиями
|
||||
|
||||
Reference in New Issue
Block a user