Skip to content

Export Editor State Plugin (components/Editor/plugins/exportEditorStatePlugin.tsx)

Overview

A Lexical editor plugin that handles the export and persistence of editor state, managing the conversion of editor content to HTML and saving it to the server with associated metadata.

Features

  • HTML state export
  • Session storage integration
  • API state persistence
  • User authentication
  • Document metadata handling
  • Error handling
  • State change tracking
  • Request count management

Implementation

Props Interface

export type ExportInformation = {
  shouldExport?: boolean | null;
  stateID?: string | null;
  editedState?: boolean | null;
  n_requests?: number | null;
};

Plugin Component

export function ExportEditorStatePlugin({ 
  shouldExport, 
  stateID, 
  editedState, 
  n_requests 
}: ExportInformation) {
  const [editor] = useLexicalComposerContext();
  const { data } = useSession();
  const userID = data?.user?.userID;

  useEffect(() => {
    if (typeof window !== 'undefined') {
      const clientName = sessionStorage?.getItem('inputtedClientName');
      const documentName = sessionStorage?.getItem('inputtedDocumentName');
      const status = sessionStorage?.getItem('inputtedStatus');

      if (shouldExport && editedState) {
        editor.update(async () => {
          try {
            const html = $generateHtmlFromNodes(editor, null);
            await fetch('/app/api/editor/saveState', {
              method: 'POST',
              headers: {
                'Content-Type': 'application/json',
              },
              body: JSON.stringify({
                documentID: stateID,
                status,
                userID,
                clientName,
                documentName,
                state: html,
                editedState: editor.__editedState,
                n_requests,
              })
            });
          } catch (error) {
            console.error('Failed to save state:', error);
          }
        });
      }
    }
  }, [shouldExport, stateID, editedState, n_requests]);
}

Dependencies

import { useEffect } from 'react'
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
import { useSession } from 'next-auth/react'
import { $generateHtmlFromNodes } from '@lexical/html'

Components Using This

State Management

  • Tracks export state
  • Manages document metadata
  • Handles user session
  • Controls request count
  • Monitors edit state
  • Maintains document state

Integration Points

  • Lexical editor context
  • Session storage
  • Next.js authentication
  • API endpoints
  • HTML generation
  • State persistence

Usage Example

<LexicalComposer initialConfig={editorConfig}>
  <ExportEditorStatePlugin
    shouldExport={true}
    stateID="doc-123"
    editedState={true}
    n_requests={5}
  />
  {/* Other plugins */}
</LexicalComposer>

Notes

  • Handles HTML state generation
  • Manages document metadata
  • Integrates with authentication
  • Provides error handling
  • Supports state persistence
  • Tracks edit status
  • Manages request counts
  • Uses session storage