From 34e0d7438665e5a18dc483094db44339ca2eba6b Mon Sep 17 00:00:00 2001 From: Gregory Moskaliuk Date: Tue, 21 Apr 2026 15:44:32 +0200 Subject: [PATCH] refactor: rename EnrichedMarkdownInput to EnrichedMarkdownTextInput --- README.md | 16 +-- .../markdown/EnrichedMarkdownTextPackage.kt | 4 +- ...kt => EnrichedMarkdownTextInputManager.kt} | 99 ++++++++++--------- ...ew.kt => EnrichedMarkdownTextInputView.kt} | 2 +- .../input/editing/InputConnectionWrapper.kt | 4 +- .../input/editing/MarkdownEditableFactory.kt | 4 +- .../input/editing/MarkdownTextWatcher.kt | 4 +- .../input/layout/InputEventEmitter.kt | 4 +- .../input/layout/InputLayoutManager.kt | 4 +- .../input/toolbar/InputContextMenu.kt | 4 +- .../ComponentDescriptors.h | 4 +- .../MarkdownInputMeasurementManager.cpp | 5 +- .../MarkdownInputMeasurementManager.h | 2 +- .../MarkdownInputShadowNode.cpp | 2 +- .../MarkdownInputShadowNode.h | 4 +- .../EnrichedMarkdownTextSpec/conversions.h | 2 +- apps/example/ios/Podfile.lock | 6 +- apps/example/src/InputScreen.tsx | 8 +- apps/macos-example/src/InputScreen.tsx | 8 +- docs/API_REFERENCE.md | 8 +- docs/INPUT.md | 34 +++---- docs/MACOS.md | 2 +- docs/WEB.md | 2 +- ios/input/ENRMInputTextView.h | 4 +- ios/input/ENRMInputTextView.mm | 4 +- ios/input/ENRMLinkRegexConfig.mm | 2 +- ... EnrichedMarkdownTextInput+ContextMenu.mm} | 8 +- ...h => EnrichedMarkdownTextInput+Internal.h} | 4 +- ...ownInput.h => EnrichedMarkdownTextInput.h} | 6 +- ...nInput.mm => EnrichedMarkdownTextInput.mm} | 42 ++++---- ...hedMarkdownTextInputComponentDescriptor.h} | 8 +- ... => EnrichedMarkdownTextInputShadowNode.h} | 16 +-- ...=> EnrichedMarkdownTextInputShadowNode.mm} | 31 +++--- ...ate.h => EnrichedMarkdownTextInputState.h} | 6 +- package.json | 4 +- react-native.config.js | 2 +- ...nput.tsx => EnrichedMarkdownTextInput.tsx} | 30 +++--- ...richedMarkdownTextInputNativeComponent.ts} | 15 +-- src/index.tsx | 10 +- ....ts => normalizeMarkdownTextInputStyle.ts} | 18 ++-- src/utils/regexParser.ts | 2 +- 41 files changed, 225 insertions(+), 219 deletions(-) rename android/src/main/java/com/swmansion/enriched/markdown/input/{EnrichedMarkdownInputManager.kt => EnrichedMarkdownTextInputManager.kt} (77%) rename android/src/main/java/com/swmansion/enriched/markdown/input/{EnrichedMarkdownInputView.kt => EnrichedMarkdownTextInputView.kt} (99%) rename ios/input/{EnrichedMarkdownInput+ContextMenu.mm => EnrichedMarkdownTextInput+ContextMenu.mm} (96%) rename ios/input/{EnrichedMarkdownInput+Internal.h => EnrichedMarkdownTextInput+Internal.h} (88%) rename ios/input/{EnrichedMarkdownInput.h => EnrichedMarkdownTextInput.h} (72%) rename ios/input/{EnrichedMarkdownInput.mm => EnrichedMarkdownTextInput.mm} (96%) rename ios/input/internals/{EnrichedMarkdownInputComponentDescriptor.h => EnrichedMarkdownTextInputComponentDescriptor.h} (57%) rename ios/input/internals/{EnrichedMarkdownInputShadowNode.h => EnrichedMarkdownTextInputShadowNode.h} (56%) rename ios/input/internals/{EnrichedMarkdownInputShadowNode.mm => EnrichedMarkdownTextInputShadowNode.mm} (61%) rename ios/input/internals/{EnrichedMarkdownInputState.h => EnrichedMarkdownTextInputState.h} (62%) rename src/{EnrichedMarkdownInput.tsx => EnrichedMarkdownTextInput.tsx} (92%) rename src/{EnrichedMarkdownInputNativeComponent.ts => EnrichedMarkdownTextInputNativeComponent.ts} (96%) rename src/{normalizeMarkdownInputStyle.ts => normalizeMarkdownTextInputStyle.ts} (76%) diff --git a/README.md b/README.md index decb605b..3f39a56a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ - đŸ—Ŗī¸ Accessibility support (VoiceOver on iOS, TalkBack on Android, semantic HTML on web) - 🔄 Full RTL (right-to-left) support including text, lists, blockquotes, tables, and task lists -### EnrichedMarkdownInput +### EnrichedMarkdownTextInput - âœī¸ Rich text input with Markdown output - đŸ•šī¸ Imperative API for toggling styles and managing links @@ -51,14 +51,14 @@ We can help you build your next dream product – - [LaTeX Math](docs/LATEX_MATH.md) - [Image Caching](docs/IMAGE_CACHING.md) - [Markdown Streaming](docs/MARKDOWN_STREAMING.md) -- [EnrichedMarkdownInput](#enrichedmarkdowninput-1) +- [EnrichedMarkdownTextInput](#enrichedmarkdowntextinput-1) - [Usage](docs/INPUT.md#usage) - [Inline Styles](docs/INPUT.md#inline-styles) - [Links](docs/INPUT.md#links) - [Auto-Link Detection](docs/INPUT.md#auto-link-detection) - [Style Detection](docs/INPUT.md#style-detection) - [Other Events](docs/INPUT.md#other-events) - - [Customizing Styles](docs/INPUT.md#customizing-enrichedmarkdowninput--styles) + - [Customizing Styles](docs/INPUT.md#customizing-enrichedmarkdowntextinput--styles) - [API Reference](#api-reference) - [Web Support](docs/WEB.md) - [macOS Support](docs/MACOS.md) @@ -78,7 +78,7 @@ We can help you build your next dream product – - Requires [`react-native-web`](https://necolas.github.io/react-native-web/) and Metro (or another bundler with `.web.tsx` platform resolution) - No New Architecture requirement — the web renderer runs entirely in JavaScript via WebAssembly -- Only `EnrichedMarkdownText` is supported on web (`EnrichedMarkdownInput` is native-only) +- Only `EnrichedMarkdownText` is supported on web (`EnrichedMarkdownTextInput` is native-only) - LaTeX math requires the optional [`katex`](https://katex.org/) peer dependency ## Installation @@ -157,9 +157,9 @@ npx expo prebuild See [EnrichedMarkdownText](docs/TEXT.md) for detailed documentation on usage examples, GFM tables, task lists, link handling, supported elements, copy options, accessibility, RTL support, and customizing styles. -## EnrichedMarkdownInput +## EnrichedMarkdownTextInput -See [EnrichedMarkdownInput](docs/INPUT.md) for detailed documentation on usage examples, inline styles, links, style detection, events, and customizing styles. +See [EnrichedMarkdownTextInput](docs/INPUT.md) for detailed documentation on usage examples, inline styles, links, style detection, events, and customizing styles. ## API Reference @@ -177,8 +177,8 @@ See [Web Support](docs/WEB.md) for details on supported features, web-specific p We're actively working on expanding the capabilities of `react-native-enriched-markdown`. Here's what's on the roadmap: -- `EnrichedMarkdownInput`: headings, lists, blockquotes, code blocks, mentions, inline images -- `EnrichedMarkdownInput` web support +- `EnrichedMarkdownTextInput`: headings, lists, blockquotes, code blocks, mentions, inline images +- `EnrichedMarkdownTextInput` web support - macOS: block math rendering, VoiceOver accessibility, tail fade-in animation - Web: spoiler text, streaming animation, configurable link `target`, copy options (Copy as Markdown, multi-format clipboard) diff --git a/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt b/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt index efdb1752..42c245c4 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt @@ -4,7 +4,7 @@ import com.facebook.react.ReactPackage import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputManager +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputManager import java.util.ArrayList class EnrichedMarkdownTextPackage : ReactPackage { @@ -12,7 +12,7 @@ class EnrichedMarkdownTextPackage : ReactPackage { val viewManagers: MutableList> = ArrayList() viewManagers.add(EnrichedMarkdownTextManager()) viewManagers.add(EnrichedMarkdownManager()) - viewManagers.add(EnrichedMarkdownInputManager()) + viewManagers.add(EnrichedMarkdownTextInputManager()) return viewManagers } diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownInputManager.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt similarity index 77% rename from android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownInputManager.kt rename to android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt index 56f326da..e68e580e 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownInputManager.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt @@ -11,8 +11,8 @@ import com.facebook.react.uimanager.StateWrapper import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.ViewManagerDelegate import com.facebook.react.uimanager.annotations.ReactProp -import com.facebook.react.viewmanagers.EnrichedMarkdownInputManagerDelegate -import com.facebook.react.viewmanagers.EnrichedMarkdownInputManagerInterface +import com.facebook.react.viewmanagers.EnrichedMarkdownTextInputManagerDelegate +import com.facebook.react.viewmanagers.EnrichedMarkdownTextInputManagerInterface import com.facebook.yoga.YogaMeasureMode import com.swmansion.enriched.markdown.input.autolink.LinkRegexConfig import com.swmansion.enriched.markdown.input.events.OnCaretRectChangeEvent @@ -31,21 +31,22 @@ import com.swmansion.enriched.markdown.input.model.StyleType import com.swmansion.enriched.markdown.utils.input.BorderPropsApplicator import com.swmansion.enriched.markdown.utils.input.MarkdownStyleParser -@ReactModule(name = EnrichedMarkdownInputManager.NAME) -class EnrichedMarkdownInputManager : - SimpleViewManager(), - EnrichedMarkdownInputManagerInterface { - private val delegate: ViewManagerDelegate = - EnrichedMarkdownInputManagerDelegate(this) +@ReactModule(name = EnrichedMarkdownTextInputManager.NAME) +class EnrichedMarkdownTextInputManager : + SimpleViewManager(), + EnrichedMarkdownTextInputManagerInterface { + private val delegate: ViewManagerDelegate = + EnrichedMarkdownTextInputManagerDelegate(this) - override fun getDelegate(): ViewManagerDelegate = delegate + override fun getDelegate(): ViewManagerDelegate = delegate override fun getName(): String = NAME - override fun createViewInstance(reactContext: ThemedReactContext): EnrichedMarkdownInputView = EnrichedMarkdownInputView(reactContext) + override fun createViewInstance(reactContext: ThemedReactContext): EnrichedMarkdownTextInputView = + EnrichedMarkdownTextInputView(reactContext) override fun updateState( - view: EnrichedMarkdownInputView, + view: EnrichedMarkdownTextInputView, props: ReactStylesDiffMap?, stateWrapper: StateWrapper?, ): Any? { @@ -53,12 +54,12 @@ class EnrichedMarkdownInputManager : return super.updateState(view, props, stateWrapper) } - override fun onAfterUpdateTransaction(view: EnrichedMarkdownInputView) { + override fun onAfterUpdateTransaction(view: EnrichedMarkdownTextInputView) { super.onAfterUpdateTransaction(view) view.afterUpdateTransaction() } - override fun onDropViewInstance(view: EnrichedMarkdownInputView) { + override fun onDropViewInstance(view: EnrichedMarkdownTextInputView) { super.onDropViewInstance(view) view.layoutManager.release() } @@ -97,7 +98,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "defaultValue") override fun setDefaultValue( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: String?, ) { if (value != null && view?.text?.isEmpty() == true) { @@ -107,7 +108,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "placeholder") override fun setPlaceholder( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: String?, ) { view?.hint = value @@ -115,7 +116,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "placeholderTextColor", customType = "Color") override fun setPlaceholderTextColor( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Int?, ) { view?.setHintTextColor(value ?: Color.GRAY) @@ -123,7 +124,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "editable", defaultBoolean = true) override fun setEditable( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Boolean, ) { view?.isEnabled = value @@ -131,7 +132,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "autoFocus", defaultBoolean = false) override fun setAutoFocus( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Boolean, ) { view?.autoFocusRequested = value @@ -139,7 +140,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "scrollEnabled", defaultBoolean = true) override fun setScrollEnabled( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Boolean, ) { view?.scrollEnabled = value @@ -148,7 +149,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "autoCapitalize") override fun setAutoCapitalize( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: String?, ) { view?.setAutoCapitalize(value) @@ -156,7 +157,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "multiline", defaultBoolean = true) override fun setMultiline( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Boolean, ) { view?.isSingleLine = !value @@ -164,7 +165,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "cursorColor", customType = "Color") override fun setCursorColor( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Int?, ) { view?.setCursorColorFromProps(value) @@ -172,7 +173,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "selectionColor", customType = "Color") override fun setSelectionColor( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Int?, ) { if (value != null) { @@ -182,7 +183,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "markdownStyle") override fun setMarkdownStyle( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: ReadableMap?, ) { if (view == null || value == null) return @@ -197,7 +198,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "color", customType = "Color") override fun setColor( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Int?, ) { view?.setColorFromProps(value) @@ -205,7 +206,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "fontSize", defaultFloat = 16f) override fun setFontSize( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Float, ) { view?.setFontSizeFromProps(value) @@ -213,7 +214,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "lineHeight", defaultFloat = 0f) override fun setLineHeight( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Float, ) { if (value > 0 && view != null) { @@ -223,7 +224,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "fontFamily") override fun setFontFamily( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: String?, ) { view?.setFontFamily(value) @@ -231,7 +232,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "fontWeight") override fun setFontWeight( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: String?, ) { view?.setFontWeight(value) @@ -239,7 +240,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "isOnChangeMarkdownSet", defaultBoolean = false) override fun setIsOnChangeMarkdownSet( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: Boolean, ) { view?.emitMarkdown = value @@ -247,7 +248,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "contextMenuItems") override fun setContextMenuItems( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: ReadableArray?, ) { if (view == null) return @@ -257,7 +258,7 @@ class EnrichedMarkdownInputManager : @ReactProp(name = "linkRegex") override fun setLinkRegex( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, value: ReadableMap?, ) { if (view == null) return @@ -277,7 +278,7 @@ class EnrichedMarkdownInputManager : } override fun updateProperties( - view: EnrichedMarkdownInputView, + view: EnrichedMarkdownTextInputView, props: ReactStylesDiffMap, ) { BorderPropsApplicator.apply(view, props) @@ -285,7 +286,7 @@ class EnrichedMarkdownInputManager : } override fun setPadding( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, left: Int, top: Int, right: Int, @@ -297,16 +298,16 @@ class EnrichedMarkdownInputManager : // Commands - override fun focus(view: EnrichedMarkdownInputView?) { + override fun focus(view: EnrichedMarkdownTextInputView?) { view?.requestFocusProgrammatically() } - override fun blur(view: EnrichedMarkdownInputView?) { + override fun blur(view: EnrichedMarkdownTextInputView?) { view?.clearFocus() } override fun setValue( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, markdown: String?, ) { if (markdown != null) { @@ -315,7 +316,7 @@ class EnrichedMarkdownInputManager : } override fun setSelection( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, start: Int, end: Int, ) { @@ -325,28 +326,28 @@ class EnrichedMarkdownInputManager : view?.setSelection(clampedStart, clampedEnd) } - override fun toggleBold(view: EnrichedMarkdownInputView?) { + override fun toggleBold(view: EnrichedMarkdownTextInputView?) { view?.toggleInlineStyle(StyleType.BOLD) } - override fun toggleItalic(view: EnrichedMarkdownInputView?) { + override fun toggleItalic(view: EnrichedMarkdownTextInputView?) { view?.toggleInlineStyle(StyleType.ITALIC) } - override fun toggleUnderline(view: EnrichedMarkdownInputView?) { + override fun toggleUnderline(view: EnrichedMarkdownTextInputView?) { view?.toggleInlineStyle(StyleType.UNDERLINE) } - override fun toggleStrikethrough(view: EnrichedMarkdownInputView?) { + override fun toggleStrikethrough(view: EnrichedMarkdownTextInputView?) { view?.toggleInlineStyle(StyleType.STRIKETHROUGH) } - override fun toggleSpoiler(view: EnrichedMarkdownInputView?) { + override fun toggleSpoiler(view: EnrichedMarkdownTextInputView?) { view?.toggleInlineStyle(StyleType.SPOILER) } override fun setLink( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, url: String?, ) { if (url != null) { @@ -355,7 +356,7 @@ class EnrichedMarkdownInputManager : } override fun insertLink( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, text: String?, url: String?, ) { @@ -364,25 +365,25 @@ class EnrichedMarkdownInputManager : } } - override fun removeLink(view: EnrichedMarkdownInputView?) { + override fun removeLink(view: EnrichedMarkdownTextInputView?) { view?.removeLinkAtCursor() } override fun requestMarkdown( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, requestId: Int, ) { view?.eventEmitter?.emitRequestMarkdownResult(requestId) } override fun requestCaretRect( - view: EnrichedMarkdownInputView?, + view: EnrichedMarkdownTextInputView?, requestId: Int, ) { view?.eventEmitter?.emitRequestCaretRectResult(requestId) } companion object { - const val NAME = "EnrichedMarkdownInput" + const val NAME = "EnrichedMarkdownTextInput" } } diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownInputView.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt similarity index 99% rename from android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownInputView.kt rename to android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt index 0a0ace3f..b0fe9acd 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownInputView.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt @@ -38,7 +38,7 @@ import com.swmansion.enriched.markdown.input.toolbar.InputContextMenu import com.swmansion.enriched.markdown.utils.input.AutoCapitalizeUtils import kotlin.math.ceil -class EnrichedMarkdownInputView( +class EnrichedMarkdownTextInputView( context: Context, ) : AppCompatEditText(context) { private var isComponentReady = false diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt index d8501031..a7166470 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt @@ -2,12 +2,12 @@ package com.swmansion.enriched.markdown.input.editing import android.view.KeyEvent import android.view.inputmethod.InputConnection -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputView +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputView import android.view.inputmethod.InputConnectionWrapper as AndroidInputConnectionWrapper class InputConnectionWrapper( target: InputConnection, - private val editText: EnrichedMarkdownInputView, + private val editText: EnrichedMarkdownTextInputView, ) : AndroidInputConnectionWrapper(target, false) { var isBatchEdit = false private set diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownEditableFactory.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownEditableFactory.kt index 5b1de0a4..790bdff5 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownEditableFactory.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownEditableFactory.kt @@ -2,10 +2,10 @@ package com.swmansion.enriched.markdown.input.editing import android.text.Editable import android.text.SpannableStringBuilder -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputView +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputView class MarkdownEditableFactory( - private val view: EnrichedMarkdownInputView, + private val view: EnrichedMarkdownTextInputView, ) : Editable.Factory() { override fun newEditable(source: CharSequence): Editable { val builder = (source as? SpannableStringBuilder) ?: SpannableStringBuilder(source) diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt index c70ccd21..605cbac8 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt @@ -2,10 +2,10 @@ package com.swmansion.enriched.markdown.input.editing import android.text.Editable import android.text.TextWatcher -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputView +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputView class MarkdownTextWatcher( - private val view: EnrichedMarkdownInputView, + private val view: EnrichedMarkdownTextInputView, ) : TextWatcher { private var editStart = 0 private var deletedLength = 0 diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt index 9ec6a358..cb5e6cd8 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt @@ -3,7 +3,7 @@ package com.swmansion.enriched.markdown.input.layout import com.facebook.react.bridge.ReactContext import com.facebook.react.uimanager.UIManagerHelper import com.facebook.react.uimanager.events.Event -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputView +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputView import com.swmansion.enriched.markdown.input.events.OnCaretRectChangeEvent import com.swmansion.enriched.markdown.input.events.OnChangeMarkdownEvent import com.swmansion.enriched.markdown.input.events.OnChangeSelectionEvent @@ -20,7 +20,7 @@ import com.swmansion.enriched.markdown.input.model.CaretRect import com.swmansion.enriched.markdown.input.model.StyleType class InputEventEmitter( - private val view: EnrichedMarkdownInputView, + private val view: EnrichedMarkdownTextInputView, ) { private var prevState: Map = emptyMap() private var prevCaretRect: CaretRect? = null diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputLayoutManager.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputLayoutManager.kt index 3ba7b875..4e96cb73 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputLayoutManager.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputLayoutManager.kt @@ -1,10 +1,10 @@ package com.swmansion.enriched.markdown.input.layout import com.facebook.react.bridge.Arguments -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputView +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputView class InputLayoutManager( - private val view: EnrichedMarkdownInputView, + private val view: EnrichedMarkdownTextInputView, ) { private var forceHeightRecalculationCounter = 0 diff --git a/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt b/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt index 39b54578..81b872cd 100644 --- a/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +++ b/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt @@ -9,7 +9,7 @@ import android.view.Menu import android.view.MenuItem import android.widget.EditText import androidx.appcompat.app.AlertDialog -import com.swmansion.enriched.markdown.input.EnrichedMarkdownInputView +import com.swmansion.enriched.markdown.input.EnrichedMarkdownTextInputView import com.swmansion.enriched.markdown.input.formatting.MarkdownSerializer import com.swmansion.enriched.markdown.input.model.FormattingRange import com.swmansion.enriched.markdown.input.model.StyleType @@ -17,7 +17,7 @@ import com.swmansion.enriched.markdown.input.model.StyleType // TODO: Wrap all user-facing strings for localization support. class InputContextMenu( - private val view: EnrichedMarkdownInputView, + private val view: EnrichedMarkdownTextInputView, ) { private var customItemTexts: List = emptyList() diff --git a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h index 4cdcd6a9..faa1bb6a 100644 --- a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h +++ b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h @@ -44,9 +44,9 @@ class EnrichedMarkdownTextComponentDescriptor final : public ConcreteComponentDe const std::shared_ptr measurementsManager_; }; -class EnrichedMarkdownInputComponentDescriptor final : public ConcreteComponentDescriptor { +class EnrichedMarkdownTextInputComponentDescriptor final : public ConcreteComponentDescriptor { public: - EnrichedMarkdownInputComponentDescriptor(const ComponentDescriptorParameters ¶meters) + EnrichedMarkdownTextInputComponentDescriptor(const ComponentDescriptorParameters ¶meters) : ConcreteComponentDescriptor(parameters), measurementsManager_(std::make_shared(contextContainer_)) {} diff --git a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.cpp b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.cpp index a1488303..760e0e0c 100644 --- a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.cpp +++ b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.cpp @@ -9,7 +9,8 @@ using namespace facebook::jni; namespace facebook::react { -Size MarkdownInputMeasurementManager::measure(SurfaceId surfaceId, int viewTag, const EnrichedMarkdownInputProps &props, +Size MarkdownInputMeasurementManager::measure(SurfaceId surfaceId, int viewTag, + const EnrichedMarkdownTextInputProps &props, LayoutConstraints layoutConstraints) const { const jni::global_ref &fabricUIManager = contextContainer_->at>("FabricUIManager"); @@ -21,7 +22,7 @@ Size MarkdownInputMeasurementManager::measure(SurfaceId surfaceId, int viewTag, auto minimumSize = layoutConstraints.minimumSize; auto maximumSize = layoutConstraints.maximumSize; - local_ref componentName = make_jstring("EnrichedMarkdownInput"); + local_ref componentName = make_jstring("EnrichedMarkdownTextInput"); folly::dynamic extraData = folly::dynamic::object(); extraData["viewTag"] = viewTag; diff --git a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.h b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.h index bb6ace52..117b949e 100644 --- a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.h +++ b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputMeasurementManager.h @@ -11,7 +11,7 @@ class MarkdownInputMeasurementManager { MarkdownInputMeasurementManager(const std::shared_ptr &contextContainer) : contextContainer_(contextContainer) {} - Size measure(SurfaceId surfaceId, int viewTag, const EnrichedMarkdownInputProps &props, + Size measure(SurfaceId surfaceId, int viewTag, const EnrichedMarkdownTextInputProps &props, LayoutConstraints layoutConstraints) const; private: diff --git a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.cpp b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.cpp index 54130508..c00291b6 100644 --- a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.cpp +++ b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.cpp @@ -4,7 +4,7 @@ namespace facebook::react { -extern const char MarkdownInputComponentName[] = "EnrichedMarkdownInput"; +extern const char MarkdownInputComponentName[] = "EnrichedMarkdownTextInput"; void MarkdownInputShadowNode::setMeasurementsManager( const std::shared_ptr &measurementsManager) { diff --git a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.h b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.h index f8dabff6..9068a317 100644 --- a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.h +++ b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownInputShadowNode.h @@ -12,8 +12,8 @@ namespace facebook::react { JSI_EXPORT extern const char MarkdownInputComponentName[]; class MarkdownInputShadowNode final - : public ConcreteViewShadowNode { + : public ConcreteViewShadowNode { public: using ConcreteViewShadowNode::ConcreteViewShadowNode; diff --git a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h index e9cb6bd2..f74b7abd 100644 --- a/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +++ b/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h @@ -27,7 +27,7 @@ inline folly::dynamic toDynamic(const EnrichedMarkdownProps &props) { return serializedProps; } -inline folly::dynamic toDynamic(const EnrichedMarkdownInputProps &props) { +inline folly::dynamic toDynamic(const EnrichedMarkdownTextInputProps &props) { folly::dynamic serializedProps = folly::dynamic::object(); serializedProps["defaultValue"] = props.defaultValue; serializedProps["placeholder"] = props.placeholder; diff --git a/apps/example/ios/Podfile.lock b/apps/example/ios/Podfile.lock index 6b240433..b2737490 100644 --- a/apps/example/ios/Podfile.lock +++ b/apps/example/ios/Podfile.lock @@ -2117,7 +2117,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBLazyVector: e97c19a5a442429d1988f182a1940fb08df514da - hermes-engine: 40811a005e96e04818cff405ec04a5b4c4411c1c + hermes-engine: b0f9c82a51be8e938eb979ada628323e1e093f1d iosMath: f7a6cbadf9d836d2149c2a84c435b1effc244cba RCTDeprecation: af44b104091a34482596cd9bd7e8d90c4e9b4bd7 RCTRequired: bb77b070f75f53398ce43c0aaaa58337cebe2bf6 @@ -2127,7 +2127,7 @@ SPEC CHECKSUMS: React: 1ba7d364ade7d883a1ec055bfc3606f35fdee17b React-callinvoker: bc2a26f8d84fb01f003fc6de6c9337b64715f95b React-Core: 7840d3a80b43a95c5e80ef75146bd70925ebab0f - React-Core-prebuilt: 7965d06a81dcc544164f8e98b26d35ae2a4eb36e + React-Core-prebuilt: 3dc04e91547fc0f260f4b84c12da0f672b813862 React-CoreModules: 2eb010400b63b89e53a324ffb3c112e4c7c3ce42 React-cxxreact: a558e92199d26f145afa9e62c4233cf8e7950efe React-debug: 755200a6e7f5e6e0a40ff8d215493d43cce285fc @@ -2189,7 +2189,7 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: e96e93b493d8d86eeaee3e590ba0be53f6abe46f ReactCodegen: 797de5178718324c6eba3327b07f9a423fbd5787 ReactCommon: 07572bf9e687c8a52fbe4a3641e9e3a1a477c78e - ReactNativeDependencies: 0811b43c669e637a9f3c485fdb106f187fa88398 + ReactNativeDependencies: 44f7326a697de7f6c8629036b1a4689f0e64c684 ReactNativeEnrichedMarkdown: 1daba1851810704ba2f5c6e5fff638a94661e317 Yoga: c0b3f2c7e8d3e327e450223a2414ca3fa296b9a2 diff --git a/apps/example/src/InputScreen.tsx b/apps/example/src/InputScreen.tsx index 278a2377..71a10bbc 100644 --- a/apps/example/src/InputScreen.tsx +++ b/apps/example/src/InputScreen.tsx @@ -11,9 +11,9 @@ import { } from 'react-native'; import type { HostInstance } from 'react-native'; import { - EnrichedMarkdownInput, + EnrichedMarkdownTextInput, EnrichedMarkdownText, - type EnrichedMarkdownInputInstance, + type EnrichedMarkdownTextInputInstance, type StyleState, } from 'react-native-enriched-markdown'; import { LinkModal } from './LinkModal'; @@ -69,7 +69,7 @@ const MARKDOWN_STYLE = { let nextId = 6; export default function InputScreen() { - const inputRef = useRef(null); + const inputRef = useRef(null); const scrollRef = useRef>(null); const [state, setState] = useState(null); const [messages, setMessages] = useState(INITIAL_MESSAGES); @@ -302,7 +302,7 @@ export default function InputScreen() { - (null); + const inputRef = useRef(null); const scrollRef = useRef(null); const [state, setState] = useState(null); const [messages, setMessages] = useState(INITIAL_MESSAGES); @@ -267,7 +267,7 @@ export default function InputScreen() { {/* Input row */} - { console.log('Caret at:', rect.x, rect.y); @@ -499,7 +499,7 @@ interface ContextMenuItem { **Example:** ```tsx -(null); + const ref = useRef(null); const [state, setState] = useState(null); return ( - ``` @@ -101,7 +101,7 @@ You can provide a custom regex pattern to control which text is detected as a li Pass `null` to disable auto-link detection entirely: ```tsx - + ``` ### Listening for detections @@ -109,7 +109,7 @@ Pass `null` to disable auto-link detection entirely: Use the `onLinkDetected` callback to be notified when a new link is detected: ```tsx - { console.log(`Detected link: ${text} -> ${url} at [${start}, ${end}]`); }} @@ -124,14 +124,14 @@ When a manual link is applied (via `setLink` or `insertLink`) over an auto-detec ## Caret Position Tracking -`EnrichedMarkdownInput` can report the caret's pixel position relative to the input, which is useful when the input is embedded in a scrollable container with `scrollEnabled={false}` and you need to keep the caret visible. +`EnrichedMarkdownTextInput` can report the caret's pixel position relative to the input, which is useful when the input is embedded in a scrollable container with `scrollEnabled={false}` and you need to keep the caret visible. ### `onCaretRectChange` A push-based callback that fires whenever the caret moves (typing, selection change, content reflow). The native side diffs the caret rect before emitting, so redundant events are suppressed automatically. ```tsx - { console.log(rect); @@ -155,7 +155,7 @@ You can find some examples in the [usage section](#usage) or in the example app. ## Other Events -`EnrichedMarkdownInput` emits a few more events that may be of use: +`EnrichedMarkdownTextInput` emits a few more events that may be of use: - [onFocus](API_REFERENCE.md#onfocus-1) - emits whenever input focuses. - [onBlur](API_REFERENCE.md#onblur) - emits whenever input blurs. @@ -163,12 +163,12 @@ You can find some examples in the [usage section](#usage) or in the example app. - [onChangeMarkdown](API_REFERENCE.md#onchangemarkdown) - returns the Markdown string parsed from current input text and styles anytime it would change. As parsing the Markdown on each input change can be expensive, not assigning the event's callback will skip the serialization for better performance. - [onChangeSelection](API_REFERENCE.md#onchangeselection) - returns `{ start, end }` of the current selection, useful for working with [links](#links). -## Customizing \ Styles +## Customizing \ Styles -`EnrichedMarkdownInput` accepts a `markdownStyle` prop for customizing how formatted text appears in the input: +`EnrichedMarkdownTextInput` accepts a `markdownStyle` prop for customizing how formatted text appears in the input: ```tsx - *customItems = ENRMBuildContextMenuItems([self contextMenuItemTexts], [self contextMenuItemIcons], textView, ^(NSString *itemText, NSString *_, NSUInteger __, NSUInteger ___) { diff --git a/ios/input/EnrichedMarkdownInput+Internal.h b/ios/input/EnrichedMarkdownTextInput+Internal.h similarity index 88% rename from ios/input/EnrichedMarkdownInput+Internal.h rename to ios/input/EnrichedMarkdownTextInput+Internal.h index 9aeecc50..f02ae612 100644 --- a/ios/input/EnrichedMarkdownInput+Internal.h +++ b/ios/input/EnrichedMarkdownTextInput+Internal.h @@ -1,11 +1,11 @@ #pragma once #import "ENRMInputStyledRange.h" -#import "EnrichedMarkdownInput.h" +#import "EnrichedMarkdownTextInput.h" NS_ASSUME_NONNULL_BEGIN -@interface EnrichedMarkdownInput (Internal) +@interface EnrichedMarkdownTextInput (Internal) - (void)toggleBold; - (void)toggleItalic; diff --git a/ios/input/EnrichedMarkdownInput.h b/ios/input/EnrichedMarkdownTextInput.h similarity index 72% rename from ios/input/EnrichedMarkdownInput.h rename to ios/input/EnrichedMarkdownTextInput.h index 393f6cb2..b8c6e3ca 100644 --- a/ios/input/EnrichedMarkdownInput.h +++ b/ios/input/EnrichedMarkdownTextInput.h @@ -1,12 +1,12 @@ #import "ENRMUIKit.h" #import -#ifndef EnrichedMarkdownInput_h -#define EnrichedMarkdownInput_h +#ifndef EnrichedMarkdownTextInput_h +#define EnrichedMarkdownTextInput_h NS_ASSUME_NONNULL_BEGIN -@interface EnrichedMarkdownInput : RCTViewComponentView +@interface EnrichedMarkdownTextInput : RCTViewComponentView @property (nonatomic, assign) BOOL blockEmitting; - (CGSize)measureSize:(CGFloat)maxWidth; - (nullable NSString *)markdownForSelectedRange; diff --git a/ios/input/EnrichedMarkdownInput.mm b/ios/input/EnrichedMarkdownTextInput.mm similarity index 96% rename from ios/input/EnrichedMarkdownInput.mm rename to ios/input/EnrichedMarkdownTextInput.mm index b2e187b5..016d341e 100644 --- a/ios/input/EnrichedMarkdownInput.mm +++ b/ios/input/EnrichedMarkdownTextInput.mm @@ -1,4 +1,4 @@ -#import "EnrichedMarkdownInput.h" +#import "EnrichedMarkdownTextInput.h" #import "ContextMenuUtils.h" #import "ENRMAutoLinkDetector.h" #import "ENRMDetectorPipeline.h" @@ -19,12 +19,12 @@ #import #endif -#import +#import #import #import #import -#import "EnrichedMarkdownInputShadowNode.h" +#import "EnrichedMarkdownTextInputShadowNode.h" #import "RCTFabricComponentsPlugins.h" #import #import @@ -32,9 +32,9 @@ using namespace facebook::react; #if !TARGET_OS_OSX -@interface EnrichedMarkdownInput () +@interface EnrichedMarkdownTextInput () #else -@interface EnrichedMarkdownInput () +@interface EnrichedMarkdownTextInput () #endif - (void)setupTextView; - (void)applyFormatting; @@ -43,10 +43,10 @@ - (void)resetBaseTypingAttributes; - (void)replaceSelectedTextWith:(NSString *)text formattingRanges:(NSArray *)ranges; @end -@implementation EnrichedMarkdownInput { +@implementation EnrichedMarkdownTextInput { ENRMPlatformTextView *_textView; ENRMInputLayoutManager *_layoutManager; - EnrichedMarkdownInputShadowNode::ConcreteState::Shared _state; + EnrichedMarkdownTextInputShadowNode::ConcreteState::Shared _state; int _heightUpdateCounter; ENRMInputFormatter *_formatter; ENRMInputFormatterStyle *_formatterStyle; @@ -84,7 +84,7 @@ @implementation EnrichedMarkdownInput { + (ComponentDescriptorProvider)componentDescriptorProvider { - return concreteComponentDescriptorProvider(); + return concreteComponentDescriptorProvider(); } + (BOOL)shouldBeRecycled @@ -95,7 +95,7 @@ + (BOOL)shouldBeRecycled - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { - static const auto defaultProps = std::make_shared(); + static const auto defaultProps = std::make_shared(); _props = defaultProps; self.backgroundColor = [RCTUIColor clearColor]; @@ -122,7 +122,7 @@ - (void)setupDetectorPipeline formattingStore:_formattingStore style:_formatterStyle]; - __weak EnrichedMarkdownInput *weakSelf = self; + __weak EnrichedMarkdownTextInput *weakSelf = self; _autoLinkDetector.onLinkDetected = ^(NSString *text, NSString *url, NSRange range) { [weakSelf emitOnLinkDetectedWithText:text url:url range:range]; }; @@ -191,7 +191,7 @@ - (void)setupTextView - (void)updateState:(const facebook::react::State::Shared &)state oldState:(const facebook::react::State::Shared &)oldState { - _state = std::static_pointer_cast(state); + _state = std::static_pointer_cast(state); if (oldState == nullptr) { [self requestHeightUpdate]; @@ -206,7 +206,7 @@ - (void)requestHeightUpdate _heightUpdateCounter++; auto selfRef = wrapManagedObjectWeakly(self); - _state->updateState(EnrichedMarkdownInputState(_heightUpdateCounter, selfRef)); + _state->updateState(EnrichedMarkdownTextInputState(_heightUpdateCounter, selfRef)); } #pragma mark - Measurement @@ -245,8 +245,8 @@ - (CGSize)measureSize:(CGFloat)maxWidth - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps { - const auto &oldViewProps = *std::static_pointer_cast(_props); - const auto &newViewProps = *std::static_pointer_cast(props); + const auto &oldViewProps = *std::static_pointer_cast(_props); + const auto &newViewProps = *std::static_pointer_cast(props); if (newViewProps.editable != oldViewProps.editable) { _textView.editable = newViewProps.editable; @@ -385,7 +385,7 @@ - (void)didMoveToWindow [self updatePlaceholderVisibility]; [self requestHeightUpdate]; - const auto &viewProps = *std::static_pointer_cast(_props); + const auto &viewProps = *std::static_pointer_cast(_props); if (viewProps.autoFocus) { ENRMFocusTextView(_textView); } @@ -715,7 +715,7 @@ - (void)showLinkPrompt ENRMFormattingRange *activeLink = [_formattingStore rangeOfType:ENRMInputStyleTypeLink containingPosition:cursor]; NSString *existingURL = activeLink != nil ? activeLink.url : nil; - __weak EnrichedMarkdownInput *weakSelf = self; + __weak EnrichedMarkdownTextInput *weakSelf = self; ENRMShowLinkPrompt(self, existingURL, ^(NSString *url) { [weakSelf setLink:url]; }); } @@ -803,7 +803,7 @@ - (void)requestCaretRect:(NSInteger)requestId - (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args { - RCTEnrichedMarkdownInputHandleCommand(self, commandName, args); + RCTEnrichedMarkdownTextInputHandleCommand(self, commandName, args); } #pragma mark - Style state query @@ -831,12 +831,12 @@ - (void)emitFormattingChanged } } -- (std::shared_ptr)getEventEmitter +- (std::shared_ptr)getEventEmitter { if (_eventEmitter == nullptr || _blockEmitting) { return nullptr; } - return std::static_pointer_cast(_eventEmitter); + return std::static_pointer_cast(_eventEmitter); } - (NSArray *)allRangesIncludingTransient @@ -1343,7 +1343,7 @@ - (void)submitOnKeyDownIfNeeded:(NSEvent *)event @end -Class EnrichedMarkdownInputCls(void) +Class EnrichedMarkdownTextInputCls(void) { - return EnrichedMarkdownInput.class; + return EnrichedMarkdownTextInput.class; } diff --git a/ios/input/internals/EnrichedMarkdownInputComponentDescriptor.h b/ios/input/internals/EnrichedMarkdownTextInputComponentDescriptor.h similarity index 57% rename from ios/input/internals/EnrichedMarkdownInputComponentDescriptor.h rename to ios/input/internals/EnrichedMarkdownTextInputComponentDescriptor.h index 09155d04..7d1d6e61 100644 --- a/ios/input/internals/EnrichedMarkdownInputComponentDescriptor.h +++ b/ios/input/internals/EnrichedMarkdownTextInputComponentDescriptor.h @@ -1,17 +1,17 @@ #pragma once -#include "EnrichedMarkdownInputShadowNode.h" +#include "EnrichedMarkdownTextInputShadowNode.h" #include #include namespace facebook::react { -class EnrichedMarkdownInputComponentDescriptor final - : public ConcreteComponentDescriptor { +class EnrichedMarkdownTextInputComponentDescriptor final + : public ConcreteComponentDescriptor { public: using ConcreteComponentDescriptor::ConcreteComponentDescriptor; void adopt(ShadowNode &shadowNode) const override { - react_native_assert(dynamic_cast(&shadowNode)); + react_native_assert(dynamic_cast(&shadowNode)); ConcreteComponentDescriptor::adopt(shadowNode); } }; diff --git a/ios/input/internals/EnrichedMarkdownInputShadowNode.h b/ios/input/internals/EnrichedMarkdownTextInputShadowNode.h similarity index 56% rename from ios/input/internals/EnrichedMarkdownInputShadowNode.h rename to ios/input/internals/EnrichedMarkdownTextInputShadowNode.h index 013b9de9..1488126f 100644 --- a/ios/input/internals/EnrichedMarkdownInputShadowNode.h +++ b/ios/input/internals/EnrichedMarkdownTextInputShadowNode.h @@ -1,5 +1,5 @@ #pragma once -#include "EnrichedMarkdownInputState.h" +#include "EnrichedMarkdownTextInputState.h" #include #include #include @@ -7,18 +7,18 @@ namespace facebook::react { -JSI_EXPORT extern const char EnrichedMarkdownInputComponentName[]; +JSI_EXPORT extern const char EnrichedMarkdownTextInputComponentName[]; -class EnrichedMarkdownInputShadowNode - : public ConcreteViewShadowNode { +class EnrichedMarkdownTextInputShadowNode + : public ConcreteViewShadowNode { public: using ConcreteViewShadowNode::ConcreteViewShadowNode; - EnrichedMarkdownInputShadowNode(const ShadowNodeFragment &fragment, const ShadowNodeFamily::Shared &family, - ShadowNodeTraits traits); + EnrichedMarkdownTextInputShadowNode(const ShadowNodeFragment &fragment, const ShadowNodeFamily::Shared &family, + ShadowNodeTraits traits); - EnrichedMarkdownInputShadowNode(const ShadowNode &sourceShadowNode, const ShadowNodeFragment &fragment); + EnrichedMarkdownTextInputShadowNode(const ShadowNode &sourceShadowNode, const ShadowNodeFragment &fragment); void dirtyLayoutIfNeeded(); diff --git a/ios/input/internals/EnrichedMarkdownInputShadowNode.mm b/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm similarity index 61% rename from ios/input/internals/EnrichedMarkdownInputShadowNode.mm rename to ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm index 4b5da9be..694dc2b7 100644 --- a/ios/input/internals/EnrichedMarkdownInputShadowNode.mm +++ b/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm @@ -1,27 +1,27 @@ -#import "EnrichedMarkdownInputShadowNode.h" -#import "EnrichedMarkdownInput.h" +#import "EnrichedMarkdownTextInputShadowNode.h" +#import "EnrichedMarkdownTextInput.h" #import #import namespace facebook::react { -extern const char EnrichedMarkdownInputComponentName[] = "EnrichedMarkdownInput"; +extern const char EnrichedMarkdownTextInputComponentName[] = "EnrichedMarkdownTextInput"; -EnrichedMarkdownInputShadowNode::EnrichedMarkdownInputShadowNode(const ShadowNodeFragment &fragment, - const ShadowNodeFamily::Shared &family, - ShadowNodeTraits traits) +EnrichedMarkdownTextInputShadowNode::EnrichedMarkdownTextInputShadowNode(const ShadowNodeFragment &fragment, + const ShadowNodeFamily::Shared &family, + ShadowNodeTraits traits) : ConcreteViewShadowNode(fragment, family, traits) { } -EnrichedMarkdownInputShadowNode::EnrichedMarkdownInputShadowNode(const ShadowNode &sourceShadowNode, - const ShadowNodeFragment &fragment) +EnrichedMarkdownTextInputShadowNode::EnrichedMarkdownTextInputShadowNode(const ShadowNode &sourceShadowNode, + const ShadowNodeFragment &fragment) : ConcreteViewShadowNode(sourceShadowNode, fragment) { dirtyLayoutIfNeeded(); } -void EnrichedMarkdownInputShadowNode::dirtyLayoutIfNeeded() +void EnrichedMarkdownTextInputShadowNode::dirtyLayoutIfNeeded() { const auto state = this->getStateData(); const int receivedCounter = state.getHeightRecalculationCounter(); @@ -32,9 +32,10 @@ } } -id EnrichedMarkdownInputShadowNode::setupMockInputView_(CGFloat width) const +id EnrichedMarkdownTextInputShadowNode::setupMockInputView_(CGFloat width) const { - EnrichedMarkdownInput *mockView = [[EnrichedMarkdownInput alloc] initWithFrame:CGRectMake(20000, 20000, width, 1000)]; + EnrichedMarkdownTextInput *mockView = + [[EnrichedMarkdownTextInput alloc] initWithFrame:CGRectMake(20000, 20000, width, 1000)]; mockView.blockEmitting = YES; @@ -44,14 +45,14 @@ return mockView; } -Size EnrichedMarkdownInputShadowNode::measureContent(const LayoutContext &layoutContext, - const LayoutConstraints &layoutConstraints) const +Size EnrichedMarkdownTextInputShadowNode::measureContent(const LayoutContext &layoutContext, + const LayoutConstraints &layoutConstraints) const { CGFloat maxWidth = layoutConstraints.maximumSize.width; RCTInternalGenericWeakWrapper *weakWrapper = (RCTInternalGenericWeakWrapper *)unwrapManagedObject(getStateData().getComponentViewRef()); - EnrichedMarkdownInput *view = weakWrapper ? (EnrichedMarkdownInput *)weakWrapper.object : nil; + EnrichedMarkdownTextInput *view = weakWrapper ? (EnrichedMarkdownTextInput *)weakWrapper.object : nil; __block CGSize size; @@ -59,7 +60,7 @@ if (view) { size = [view measureSize:maxWidth]; } else { - EnrichedMarkdownInput *mockView = setupMockInputView_(maxWidth); + EnrichedMarkdownTextInput *mockView = setupMockInputView_(maxWidth); size = [mockView measureSize:maxWidth]; } }; diff --git a/ios/input/internals/EnrichedMarkdownInputState.h b/ios/input/internals/EnrichedMarkdownTextInputState.h similarity index 62% rename from ios/input/internals/EnrichedMarkdownInputState.h rename to ios/input/internals/EnrichedMarkdownTextInputState.h index cb9ab4c7..2b517afd 100644 --- a/ios/input/internals/EnrichedMarkdownInputState.h +++ b/ios/input/internals/EnrichedMarkdownTextInputState.h @@ -3,10 +3,10 @@ namespace facebook::react { -class EnrichedMarkdownInputState { +class EnrichedMarkdownTextInputState { public: - EnrichedMarkdownInputState() = default; - EnrichedMarkdownInputState(int counter, std::shared_ptr ref) : counter_(counter), viewRef_(ref) {} + EnrichedMarkdownTextInputState() = default; + EnrichedMarkdownTextInputState(int counter, std::shared_ptr ref) : counter_(counter), viewRef_(ref) {} int getHeightRecalculationCounter() const { return counter_; diff --git a/package.json b/package.json index e3fd41ed..a7e5a4f6 100644 --- a/package.json +++ b/package.json @@ -193,8 +193,8 @@ "EnrichedMarkdown": { "className": "EnrichedMarkdown" }, - "EnrichedMarkdownInput": { - "className": "EnrichedMarkdownInput" + "EnrichedMarkdownTextInput": { + "className": "EnrichedMarkdownTextInput" } } }, diff --git a/react-native.config.js b/react-native.config.js index 8ede722a..67ea7a1e 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -9,7 +9,7 @@ module.exports = { componentDescriptors: [ 'EnrichedMarkdownTextComponentDescriptor', 'EnrichedMarkdownComponentDescriptor', - 'EnrichedMarkdownInputComponentDescriptor', + 'EnrichedMarkdownTextInputComponentDescriptor', ], }, }, diff --git a/src/EnrichedMarkdownInput.tsx b/src/EnrichedMarkdownTextInput.tsx similarity index 92% rename from src/EnrichedMarkdownInput.tsx rename to src/EnrichedMarkdownTextInput.tsx index a79b14b5..6ea44db8 100644 --- a/src/EnrichedMarkdownInput.tsx +++ b/src/EnrichedMarkdownTextInput.tsx @@ -6,7 +6,7 @@ import { useRef, } from 'react'; import type React from 'react'; -import EnrichedMarkdownInputNativeComponent, { +import EnrichedMarkdownTextInputNativeComponent, { Commands, type NativeProps, type OnChangeTextEvent, @@ -18,8 +18,8 @@ import EnrichedMarkdownInputNativeComponent, { type OnCaretRectChangeEvent, type OnContextMenuItemPressEvent, type OnLinkDetected, -} from './EnrichedMarkdownInputNativeComponent'; -export type { OnLinkDetected } from './EnrichedMarkdownInputNativeComponent'; +} from './EnrichedMarkdownTextInputNativeComponent'; +export type { OnLinkDetected } from './EnrichedMarkdownTextInputNativeComponent'; import type { HostInstance, NativeSyntheticEvent, @@ -27,13 +27,13 @@ import type { TextStyle, ColorValue, } from 'react-native'; -import { normalizeMarkdownInputStyle } from './normalizeMarkdownInputStyle'; +import { normalizeMarkdownTextInputStyle } from './normalizeMarkdownTextInputStyle'; import { toNativeRegexConfig } from './utils/regexParser'; import type { RefObject } from 'react'; type NativeRef = HostInstance; -export interface MarkdownInputStyle { +export interface MarkdownTextInputStyle { strong?: { color?: string; }; @@ -77,7 +77,7 @@ export interface CaretRect { height: number; } -export interface EnrichedMarkdownInputInstance { +export interface EnrichedMarkdownTextInputInstance { focus: () => void; blur: () => void; measure: HostInstance['measure']; @@ -97,8 +97,8 @@ export interface EnrichedMarkdownInputInstance { getCaretRect: () => Promise; } -export interface EnrichedMarkdownInputProps { - ref?: RefObject; +export interface EnrichedMarkdownTextInputProps { + ref?: RefObject; defaultValue?: string; placeholder?: string; placeholderTextColor?: ColorValue; @@ -109,7 +109,7 @@ export interface EnrichedMarkdownInputProps { multiline?: boolean; cursorColor?: ColorValue; selectionColor?: ColorValue; - markdownStyle?: MarkdownInputStyle; + markdownStyle?: MarkdownTextInputStyle; style?: ViewStyle | TextStyle; onChangeText?: (text: string) => void; onChangeMarkdown?: (markdown: string) => void; @@ -131,13 +131,13 @@ type PendingRequest = { function getNativeRef(ref: React.RefObject): NativeRef { if (ref.current == null) { throw new Error( - 'EnrichedMarkdownInput: native ref is not attached. Ensure the component is mounted.' + 'EnrichedMarkdownTextInput: native ref is not attached. Ensure the component is mounted.' ); } return ref.current; } -export const EnrichedMarkdownInput = ({ +export const EnrichedMarkdownTextInput = ({ ref, markdownStyle, style, @@ -161,7 +161,7 @@ export const EnrichedMarkdownInput = ({ onBlur, contextMenuItems, linkRegex: _linkRegex, -}: EnrichedMarkdownInputProps) => { +}: EnrichedMarkdownTextInputProps) => { const nativeRef = useRef(null); const nextRequestId = useRef(1); @@ -204,7 +204,7 @@ export const EnrichedMarkdownInput = ({ }; }, []); - const normalizedStyle = normalizeMarkdownInputStyle(markdownStyle); + const normalizedStyle = normalizeMarkdownTextInputStyle(markdownStyle); const linkRegex = useMemo( () => toNativeRegexConfig(_linkRegex), @@ -358,7 +358,7 @@ export const EnrichedMarkdownInput = ({ }); return ( - ({ ], }); -export default codegenNativeComponent('EnrichedMarkdownInput', { - interfaceOnly: true, -}) as HostComponent; +export default codegenNativeComponent( + 'EnrichedMarkdownTextInput', + { + interfaceOnly: true, + } +) as HostComponent; diff --git a/src/index.tsx b/src/index.tsx index 4ff26c42..8c5be706 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -11,13 +11,13 @@ export type { TaskListItemPressEvent, } from './types/events'; -export { EnrichedMarkdownInput } from './EnrichedMarkdownInput'; +export { EnrichedMarkdownTextInput } from './EnrichedMarkdownTextInput'; export type { - EnrichedMarkdownInputProps, - EnrichedMarkdownInputInstance, - MarkdownInputStyle, + EnrichedMarkdownTextInputProps, + EnrichedMarkdownTextInputInstance, + MarkdownTextInputStyle, StyleState, ContextMenuItem, OnLinkDetected, CaretRect, -} from './EnrichedMarkdownInput'; +} from './EnrichedMarkdownTextInput'; diff --git a/src/normalizeMarkdownInputStyle.ts b/src/normalizeMarkdownTextInputStyle.ts similarity index 76% rename from src/normalizeMarkdownInputStyle.ts rename to src/normalizeMarkdownTextInputStyle.ts index 9cea7729..5fd79f8b 100644 --- a/src/normalizeMarkdownInputStyle.ts +++ b/src/normalizeMarkdownTextInputStyle.ts @@ -1,8 +1,8 @@ import { processColor, type ColorValue } from 'react-native'; -import type { MarkdownInputStyle } from './EnrichedMarkdownInput'; +import type { MarkdownTextInputStyle } from './EnrichedMarkdownTextInput'; import { normalizeColor } from './styleUtils'; -interface MarkdownInputStyleInternal { +interface MarkdownTextInputStyleInternal { strong: { color?: ColorValue; }; @@ -23,7 +23,7 @@ const DEFAULT_LINK_COLOR = '#2563EB'; const DEFAULT_SPOILER_COLOR = '#374151'; const DEFAULT_SPOILER_BG_COLOR = '#E5E7EB'; -const defaultInternal: MarkdownInputStyleInternal = Object.freeze({ +const defaultInternal: MarkdownTextInputStyleInternal = Object.freeze({ strong: { color: undefined, }, @@ -40,12 +40,12 @@ const defaultInternal: MarkdownInputStyleInternal = Object.freeze({ }, }); -let cachedInput: MarkdownInputStyle | undefined; -let cachedResult: MarkdownInputStyleInternal | undefined; +let cachedInput: MarkdownTextInputStyle | undefined; +let cachedResult: MarkdownTextInputStyleInternal | undefined; -export const normalizeMarkdownInputStyle = ( - style?: MarkdownInputStyle -): MarkdownInputStyleInternal => { +export const normalizeMarkdownTextInputStyle = ( + style?: MarkdownTextInputStyle +): MarkdownTextInputStyleInternal => { if (!style || Object.keys(style).length === 0) { return defaultInternal; } @@ -54,7 +54,7 @@ export const normalizeMarkdownInputStyle = ( return cachedResult; } - const result: MarkdownInputStyleInternal = { + const result: MarkdownTextInputStyleInternal = { strong: { color: normalizeColor(style.strong?.color), }, diff --git a/src/utils/regexParser.ts b/src/utils/regexParser.ts index 0622ef9c..cee4b2c6 100644 --- a/src/utils/regexParser.ts +++ b/src/utils/regexParser.ts @@ -1,4 +1,4 @@ -import type { LinkNativeRegex } from '../EnrichedMarkdownInputNativeComponent'; +import type { LinkNativeRegex } from '../EnrichedMarkdownTextInputNativeComponent'; const DISABLED_REGEX: LinkNativeRegex = { pattern: '',