import { Block } from '@/components/create-block'; import { DiffView } from '@/components/diffview'; import { DocumentSkeleton } from '@/components/document-skeleton'; import { Editor } from '@/components/editor'; import { ClockRewind, CopyIcon, MessageIcon, PenIcon, RedoIcon, UndoIcon, } from '@/components/icons'; import { Suggestion } from '@/lib/db/schema'; import { toast } from 'sonner'; import { getSuggestions } from './actions'; interface TextBlockMetadata { suggestions: Array; } export const textBlock = new Block<'text', TextBlockMetadata>({ 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, setBlock }) => { if (streamPart.type === 'suggestion') { setMetadata((metadata) => { return { suggestions: [ ...metadata.suggestions, streamPart.content as Suggestion, ], }; }); } if (streamPart.type === 'text-delta') { setBlock((draftBlock) => { return { ...draftBlock, content: draftBlock.content + (streamPart.content as string), isVisible: draftBlock.status === 'streaming' && draftBlock.content.length > 400 && draftBlock.content.length < 450 ? true : draftBlock.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 && 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: ({ appendMessage }) => { appendMessage({ role: 'user', content: 'Please add final polish and check for grammar, add section titles for better structure, and ensure everything reads smoothly.', }); }, }, { icon: , description: 'Request suggestions', onClick: ({ appendMessage }) => { appendMessage({ role: 'user', content: 'Please add suggestions you have that could improve the writing.', }); }, }, ], });