import { toast } from "sonner"; import { Artifact } from "@/components/create-artifact"; import { DiffView } from "@/components/diffview"; import { DocumentSkeleton } from "@/components/document-skeleton"; import { ClockRewind, CopyIcon, MessageIcon, PenIcon, RedoIcon, UndoIcon, } from "@/components/icons"; import { Editor } from "@/components/text-editor"; import type { Suggestion } from "@/lib/db/schema"; import { getSuggestions } from "../actions"; type TextArtifactMetadata = { suggestions: Suggestion[]; }; export const textArtifact = new Artifact<"text", TextArtifactMetadata>({ kind: "text", description: "Useful for text content, like drafting essays and emails.", initialize: async ({ documentId, setMetadata }) => { const suggestions = await getSuggestions({ documentId }); setMetadata({ suggestions, }); }, onStreamPart: ({ streamPart, setMetadata, setArtifact }) => { if (streamPart.type === "data-suggestion") { setMetadata((metadata) => { return { suggestions: [...metadata.suggestions, streamPart.data], }; }); } if (streamPart.type === "data-textDelta") { setArtifact((draftArtifact) => { return { ...draftArtifact, content: draftArtifact.content + streamPart.data, isVisible: draftArtifact.status === "streaming" && draftArtifact.content.length > 400 && draftArtifact.content.length < 450 ? true : draftArtifact.isVisible, status: "streaming", }; }); } }, content: ({ mode, status, content, isCurrentVersion, currentVersionIndex, onSaveContent, getDocumentContentById, isLoading, metadata, }) => { if (isLoading) { return ; } if (mode === "diff") { const oldContent = getDocumentContentById(currentVersionIndex - 1); const newContent = getDocumentContentById(currentVersionIndex); return ; } return (
{metadata?.suggestions && metadata.suggestions.length > 0 ? (
) : null}
); }, actions: [ { icon: , description: "View changes", onClick: ({ handleVersionChange }) => { handleVersionChange("toggle"); }, isDisabled: ({ currentVersionIndex }) => { if (currentVersionIndex === 0) { return true; } return false; }, }, { icon: , description: "View Previous version", onClick: ({ handleVersionChange }) => { handleVersionChange("prev"); }, isDisabled: ({ currentVersionIndex }) => { if (currentVersionIndex === 0) { return true; } return false; }, }, { icon: , description: "View Next version", onClick: ({ handleVersionChange }) => { handleVersionChange("next"); }, isDisabled: ({ isCurrentVersion }) => { if (isCurrentVersion) { return true; } return false; }, }, { icon: , description: "Copy to clipboard", onClick: ({ content }) => { navigator.clipboard.writeText(content); toast.success("Copied to clipboard!"); }, }, ], toolbar: [ { icon: , description: "Add final polish", onClick: ({ sendMessage }) => { sendMessage({ role: "user", parts: [ { type: "text", text: "Please add final polish and check for grammar, add section titles for better structure, and ensure everything reads smoothly.", }, ], }); }, }, { icon: , description: "Request suggestions", onClick: ({ sendMessage }) => { sendMessage({ role: "user", parts: [ { type: "text", text: "Please add suggestions you have that could improve the writing.", }, ], }); }, }, ], });