This repository has been archived on 2026-02-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
shared/editor/src/index.jsx
giles 668d9c7df8 feat: initial shared library extraction
Contains shared infrastructure for all coop services:
- shared/ (factory, urls, user_loader, context, internal_api, jinja_setup)
- models/ (User, Order, Calendar, Ticket, Product, Ghost CMS)
- db/ (SQLAlchemy async session, base)
- suma_browser/app/ (csrf, middleware, errors, authz, redis_cacher, payments, filters, utils)
- suma_browser/templates/ (shared base layouts, macros, error pages)
- static/ (CSS, JS, fonts, images)
- alembic/ (database migrations)
- config/ (app-config.yaml)
- editor/ (Lexical editor Node.js build)
- requirements.txt

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 23:11:36 +00:00

50 lines
1.6 KiB
JavaScript

import React from "react";
import { createRoot } from "react-dom/client";
import Editor from "./Editor";
/**
* Mount the Koenig editor into the given DOM element.
*
* @param {string} elementId - ID of the container element
* @param {object} opts
* @param {string} [opts.initialJson] - Serialised Lexical JSON (from Ghost)
* @param {string} [opts.csrfToken] - CSRF token for API calls
* @param {object} [opts.uploadUrls] - { image, media, file } upload endpoint URLs
* @param {string} [opts.oembedUrl] - oEmbed proxy endpoint URL
* @param {string} [opts.unsplashApiKey] - Unsplash API key for image search
*/
window.mountEditor = function mountEditor(elementId, opts = {}) {
const container = document.getElementById(elementId);
if (!container) {
console.error(`[editor] Element #${elementId} not found`);
return;
}
let currentJson = opts.initialJson || null;
function handleChange(json) {
currentJson = json;
// Stash the latest JSON in a hidden input for form submission
const hidden = document.getElementById("lexical-json-input");
if (hidden) hidden.value = json;
}
const root = createRoot(container);
root.render(
<Editor
initialState={opts.initialJson || null}
onChange={handleChange}
csrfToken={opts.csrfToken || ""}
uploadUrls={opts.uploadUrls || ""}
oembedUrl={opts.oembedUrl || "/editor-api/oembed/"}
unsplashApiKey={opts.unsplashApiKey || ""}
snippetsUrl={opts.snippetsUrl || ""}
/>
);
// Return handle for programmatic access
return {
getJson: () => currentJson,
};
};