import { Artifact } from '@/components/create-artifact'; import { DiffView } from '@/components/diffview'; import { DocumentSkeleton } from '@/components/document-skeleton'; import { Editor } from '@/components/text-editor'; import { ClockRewind, CopyIcon, MessageIcon, PenIcon, RedoIcon, UndoIcon, } from '@/components/icons'; import type { Suggestion } from '@/lib/db/schema'; import { toast } from 'sonner'; import { getSuggestions } from '../actions'; interface TextArtifactMetadata { suggestions: Array; } 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, setMetadata }) => { 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.', }, ], }); }, }, ], });