feat: 新增写作画布系统

This commit is contained in:
likun committed 2026-05-15 16:22:04 +08:00
1 parent d533ddde88
commit de9f6b6711
14 files changed
+580 -217

No files matched your search

+34 -16
View File
@@ -1,9 +1,9 @@
"use client";
import { useCallback, useEffect, useState } from "react";
import { type PromptInputMessage } from "@/components/ai-elements/prompt-input";
import { ArtifactTrigger } from "@/components/workspace/artifacts";
import { useCallback, useEffect, useMemo, useState } from "react";
import { type PromptInputMessage } from "@/components/ai-elements/prompt-input";
import { ArtifactTrigger, useArtifacts } from "@/components/workspace/artifacts";
import {
ChatBox,
useSpecificChatMode,
@@ -37,9 +37,10 @@ export default function ChatPage() {
const { threadId, setThreadId, isNewThread, setIsNewThread, isMock } =
useThreadChat();
const [settings, setSettings] = useThreadSettings(threadId);
const [mounted, setMounted] = useState(false);
const { tokenUsageEnabled } = useModels();
useSpecificChatMode();
const [mounted, setMounted] = useState(false);
const { tokenUsageEnabled } = useModels();
const { selectedArtifact } = useArtifacts();
useSpecificChatMode();
useEffect(() => {
setMounted(true);
@@ -53,7 +54,7 @@ export default function ChatPage() {
const { showNotification } = useNotification();
const [thread, sendMessage, isUploading] = useThreadStream({
const [thread, sendMessage, isUploading] = useThreadStream({
threadId: isNewThread ? undefined : threadId,
context: settings.context,
isMock,
@@ -83,17 +84,34 @@ export default function ChatPage() {
showNotification(state.title, { body });
}
},
});
});
const writingArtifactPath = useMemo(() => {
const isMarkdown = (path: string | null | undefined) =>
!!path && /\.(md|markdown)(?:$|[?#])/i.test(path);
if (isMarkdown(selectedArtifact)) {
return selectedArtifact ?? undefined;
}
return [...(thread.values.artifacts ?? [])]
.reverse()
.find((path) => isMarkdown(path));
}, [selectedArtifact, thread.values.artifacts]);
const handleSubmit = useCallback(
(message: PromptInputMessage) => {
setHasStartedConversation(true);
window.dispatchEvent(
new CustomEvent("workspace:sandbox-resume-autoscroll"),
);
void sendMessage(threadId, message);
},
[sendMessage, threadId],
window.dispatchEvent(
new CustomEvent("workspace:sandbox-resume-autoscroll"),
);
void sendMessage(
threadId,
message,
settings.context.writing_mode && writingArtifactPath
? { writing_artifact_path: writingArtifactPath }
: undefined,
);
},
[sendMessage, settings.context.writing_mode, threadId, writingArtifactPath],
);
const handleClarificationSubmit = useCallback(
async (answer: string) => {