1.2.1 • Published 3 months ago

lexical-editor-easy v1.2.1

Weekly downloads
-
License
MIT
Repository
github
Last release
3 months ago

Lexical Editor Easy

A customizable Lexical editor component with Next.js, Vercel Blob and Neon.tech PostgreSQL support.

Features

  • ✅ Works with React and Next.js projects
  • ✅ Built-in Vercel Blob storage integration for images
  • ✅ Neon PostgreSQL database support for content persistence
  • ✅ Customizable toolbar and plugins
  • ✅ Server and client components support for Next.js

Installation

npm install lexical-editor-easy
# or
yarn add lexical-editor-easy

Environment Variables

Create a .env.local file (Next.js) or .env file (React) with the following variables:

# Vercel Blob Storage Configuration
BLOB_READ_WRITE_TOKEN=your_token_here
NEXT_PUBLIC_BLOB_BASE_URL=your_blob_base_url

# Neon Database Configuration
NEON_DATABASE_URL=postgres://user:password@host/database

# Editor Configuration
NEXT_PUBLIC_EDITOR_SAVE_INTERVAL=2000

Usage with Next.js

Client Component Example

'use client';

import { NextEditor } from 'lexical-editor-easy';

export default function EditorPage() {
  const handleSave = async (content) => {
    const response = await fetch('/api/editor/save', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ 
        id: 'my-document-id', 
        content 
      }),
    });
    
    return response.json();
  };

  return (
    <div className="editor-container">
      <h1>My Rich Text Editor</h1>
      <NextEditor
        editorId="my-document-id"
        onSave={handleSave}
        toolbarOptions={{
          blockType: true,
          align: true,
          fontSize: true,
          fontColor: true,
          highlights: true,
          image: true
        }}
      />
    </div>
  );
}

API Route for Saving Content

// app/api/editor/save/route.js
import { createNeonClient } from 'lexical-editor-easy';
import { NextResponse } from 'next/server';

export async function POST(request) {
  const { id, content } = await request.json();
  const neonClient = createNeonClient();
  
  await neonClient.initializeEditorTable();
  const result = await neonClient.saveEditorContent(id, content);
  
  return NextResponse.json({
    success: true,
    id: result[0].id,
    updatedAt: result[0].updated_at
  });
}

API Route for Blob Image Upload

// app/api/upload/route.js
import { BlobStorageClient } from 'lexical-editor-easy';
import { NextResponse } from 'next/server';

export async function POST(request) {
  try {
    const formData = await request.formData();
    const file = formData.get('file');
    
    if (!file) {
      return NextResponse.json(
        { error: 'No file provided' },
        { status: 400 }
      );
    }
    
    const blobClient = new BlobStorageClient();
    const result = await blobClient.uploadImage(file);
    
    if (!result.success) {
      return NextResponse.json(
        { error: result.error },
        { status: 500 }
      );
    }
    
    return NextResponse.json(result);
  } catch (error) {
    return NextResponse.json(
      { error: 'Failed to upload file' },
      { status: 500 }
    );
  }
}

Configuration Options

NextEditor Props

PropTypeDescription
editorIdstringUnique identifier for this editor instance
initialContentobjectInitial editor content state
onSavefunctionCallback for saving content (receives content object)
blobTokenstringOptional token for client-side Blob uploads
editablebooleanWhether the editor is editable
toolbarOptionsobjectConfiguration for which toolbar items to display

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.