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