From d1c0261721c80e0917d70cea817f80955897759e Mon Sep 17 00:00:00 2001 From: Brian Richter Date: Tue, 20 May 2025 23:36:23 -0700 Subject: [PATCH] Add HTML composition step --- packages/ordinals-plus-explorer/src/App.tsx | 3 + .../components/create/GenericOrdinalForm.tsx | 1 + .../components/create/HtmlCompositionForm.tsx | 71 +++++++++++++++++++ .../create/ResourceCreationForm.tsx | 1 + .../inscription/ContentSelectionStep.tsx | 1 + .../inscription/ResourceInscriptionWizard.tsx | 22 ++++-- .../ResourceInscriptionWizardContainer.tsx | 11 ++- .../src/pages/CreateHtmlPage.tsx | 32 +++++++++ .../tests/create-html-page.test.tsx | 13 ++++ 9 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 packages/ordinals-plus-explorer/src/components/create/HtmlCompositionForm.tsx create mode 100644 packages/ordinals-plus-explorer/src/pages/CreateHtmlPage.tsx create mode 100644 packages/ordinals-plus-explorer/tests/create-html-page.test.tsx diff --git a/packages/ordinals-plus-explorer/src/App.tsx b/packages/ordinals-plus-explorer/src/App.tsx index 7f14f97..7f6c772 100644 --- a/packages/ordinals-plus-explorer/src/App.tsx +++ b/packages/ordinals-plus-explorer/src/App.tsx @@ -3,6 +3,7 @@ import ExplorerPage from './pages/ExplorerPage'; import LinkedResourcesPage from './pages/LinkedResourcesPage'; import SettingsPage from './pages/SettingsPage'; import CreatePage from './pages/CreatePage'; +import CreateHtmlPage from './pages/CreateHtmlPage'; import CreateCollectionPage from './pages/CreateCollectionPage'; import CollectionsListPage from './pages/CollectionsListPage'; import CollectionDetailPage from './pages/CollectionDetailPage'; @@ -27,6 +28,7 @@ function App() { Explorer Resources Create + Create HTML
Collections @@ -53,6 +55,7 @@ function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/packages/ordinals-plus-explorer/src/components/create/GenericOrdinalForm.tsx b/packages/ordinals-plus-explorer/src/components/create/GenericOrdinalForm.tsx index 3b5416c..649354f 100644 --- a/packages/ordinals-plus-explorer/src/components/create/GenericOrdinalForm.tsx +++ b/packages/ordinals-plus-explorer/src/components/create/GenericOrdinalForm.tsx @@ -16,6 +16,7 @@ bitcoin.initEccLib(ecc); const supportedContentTypes = [ { mime: 'text/plain', label: 'Text', isText: true }, { mime: 'application/json', label: 'JSON', isText: true }, + { mime: 'text/html', label: 'HTML', isText: true }, { mime: 'image/png', label: 'PNG Image', isText: false }, { mime: 'image/jpeg', label: 'JPEG Image', isText: false }, { mime: 'image/svg+xml', label: 'SVG Image', isText: false }, diff --git a/packages/ordinals-plus-explorer/src/components/create/HtmlCompositionForm.tsx b/packages/ordinals-plus-explorer/src/components/create/HtmlCompositionForm.tsx new file mode 100644 index 0000000..eabf11c --- /dev/null +++ b/packages/ordinals-plus-explorer/src/components/create/HtmlCompositionForm.tsx @@ -0,0 +1,71 @@ +import React, { useRef } from 'react'; +import LinkedResourceList from '../LinkedResourceList'; +import { LinkedResource } from 'ordinalsplus'; + +interface HtmlCompositionFormProps { + html: string; + onChange: (value: string) => void; + onSubmit: () => void; +} + +const HtmlCompositionForm: React.FC = ({ html, onChange, onSubmit }) => { + const textareaRef = useRef(null); + + const insertAtCursor = (text: string) => { + const textarea = textareaRef.current; + if (!textarea) { + onChange(html + text); + return; + } + const start = textarea.selectionStart ?? html.length; + const end = textarea.selectionEnd ?? html.length; + const newValue = html.slice(0, start) + text + html.slice(end); + onChange(newValue); + // Set cursor after inserted text + requestAnimationFrame(() => { + textarea.focus(); + const pos = start + text.length; + textarea.selectionStart = textarea.selectionEnd = pos; + }); + }; + + const handleResourceSelect = (resource: LinkedResource) => { + const placeholder = `
`; + insertAtCursor(placeholder); + }; + + return ( +
{ + e.preventDefault(); + onSubmit(); + }} + > +
+ +