From 32f477de34dafbed11d89681e1d65da53594dcb8 Mon Sep 17 00:00:00 2001 From: Igor Furgala Date: Wed, 14 Jan 2026 16:30:24 +0100 Subject: [PATCH 01/14] chore: move EnrichedTextInput spec to src/spec --- apps/example/ios/Podfile.lock | 2 +- package.json | 8 +++++--- src/EnrichedTextInput.tsx | 2 +- src/index.tsx | 2 +- src/{ => spec}/EnrichedTextInputNativeComponent.ts | 0 src/utils/normalizeHtmlStyle.ts | 2 +- src/utils/regexParser.ts | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) rename src/{ => spec}/EnrichedTextInputNativeComponent.ts (100%) diff --git a/apps/example/ios/Podfile.lock b/apps/example/ios/Podfile.lock index aed2934b9..5f399d7f1 100644 --- a/apps/example/ios/Podfile.lock +++ b/apps/example/ios/Podfile.lock @@ -2763,7 +2763,7 @@ SPEC CHECKSUMS: FBLazyVector: a293a88992c4c33f0aee184acab0b64a08ff9458 fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 - hermes-engine: b45e3b4b9d7f8227a6c11c8342f81742829b8af8 + hermes-engine: 0552e8a1c46c773b6888e9fe198c2272cc097193 RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f RCTDeprecation: 2b70c6e3abe00396cefd8913efbf6a2db01a2b36 RCTRequired: f3540eee8094231581d40c5c6d41b0f170237a81 diff --git a/package.json b/package.json index bf3be065d..169cb8779 100644 --- a/package.json +++ b/package.json @@ -164,7 +164,7 @@ "codegenConfig": { "name": "RNEnrichedTextInputViewSpec", "type": "components", - "jsSrcsDir": "src", + "jsSrcsDir": "src/spec", "outputDir": { "ios": "ios/generated", "android": "android/generated" @@ -173,8 +173,10 @@ "javaPackageName": "com.swmansion.enriched" }, "ios": { - "componentProvider": { - "EnrichedTextInputView": "EnrichedTextInputView" + "components": { + "EnrichedTextInputView": { + "className": "EnrichedTextInputView" + } } }, "includesGeneratedCode": true diff --git a/src/EnrichedTextInput.tsx b/src/EnrichedTextInput.tsx index 4be2fa179..018e8adab 100644 --- a/src/EnrichedTextInput.tsx +++ b/src/EnrichedTextInput.tsx @@ -21,7 +21,7 @@ import EnrichedTextInputNativeComponent, { type MentionStyleProperties, type OnChangeStateDeprecatedEvent, type OnKeyPressEvent, -} from './EnrichedTextInputNativeComponent'; +} from './spec/EnrichedTextInputNativeComponent'; import type { ColorValue, HostInstance, diff --git a/src/index.tsx b/src/index.tsx index 4750fe81d..15fd10fa5 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,4 +7,4 @@ export type { OnMentionDetected, OnChangeSelectionEvent, OnKeyPressEvent, -} from './EnrichedTextInputNativeComponent'; +} from './spec/EnrichedTextInputNativeComponent'; diff --git a/src/EnrichedTextInputNativeComponent.ts b/src/spec/EnrichedTextInputNativeComponent.ts similarity index 100% rename from src/EnrichedTextInputNativeComponent.ts rename to src/spec/EnrichedTextInputNativeComponent.ts diff --git a/src/utils/normalizeHtmlStyle.ts b/src/utils/normalizeHtmlStyle.ts index 46562973e..4a35d4dc3 100644 --- a/src/utils/normalizeHtmlStyle.ts +++ b/src/utils/normalizeHtmlStyle.ts @@ -3,7 +3,7 @@ import { type ColorValue, processColor } from 'react-native'; import type { MentionStyleProperties, HtmlStyleInternal, -} from '../EnrichedTextInputNativeComponent'; +} from '../spec/EnrichedTextInputNativeComponent'; const defaultStyle: Required = { h1: { diff --git a/src/utils/regexParser.ts b/src/utils/regexParser.ts index e4d224b97..75430cabb 100644 --- a/src/utils/regexParser.ts +++ b/src/utils/regexParser.ts @@ -1,4 +1,4 @@ -import type { LinkNativeRegex } from '../EnrichedTextInputNativeComponent'; +import type { LinkNativeRegex } from '../spec/EnrichedTextInputNativeComponent'; const DISABLED_REGEX: LinkNativeRegex = { pattern: '', From be16853d9fec38f73655310ab174360e41ca8032 Mon Sep 17 00:00:00 2001 From: Igor Furgala Date: Wed, 14 Jan 2026 17:33:24 +0100 Subject: [PATCH 02/14] chore: setup for native android text view --- .../enriched/EnrichedTextInputViewPackage.kt | 2 + .../enriched/text/EnrichedTextView.kt | 27 ++++++ .../enriched/text/EnrichedTextViewManager.kt | 33 ++++++++ apps/example/src/App.tsx | 5 ++ src/EnrichedText.tsx | 82 +++++++++++++++++++ src/index.tsx | 1 + src/spec/EnrichedTextNativeComponent.ts | 10 +++ 7 files changed, 160 insertions(+) create mode 100644 android/src/main/java/com/swmansion/enriched/text/EnrichedTextView.kt create mode 100644 android/src/main/java/com/swmansion/enriched/text/EnrichedTextViewManager.kt create mode 100644 src/EnrichedText.tsx create mode 100644 src/spec/EnrichedTextNativeComponent.ts diff --git a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewPackage.kt b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewPackage.kt index c1da80817..5aa8af458 100644 --- a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewPackage.kt +++ b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewPackage.kt @@ -4,6 +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.text.EnrichedTextViewManager import com.swmansion.enriched.utils.ResourceManager import java.util.ArrayList @@ -12,6 +13,7 @@ class EnrichedTextInputViewPackage : ReactPackage { ResourceManager.init(reactContext.applicationContext) val viewManagers: MutableList> = ArrayList() viewManagers.add(EnrichedTextInputViewManager()) + viewManagers.add(EnrichedTextViewManager()) return viewManagers } diff --git a/android/src/main/java/com/swmansion/enriched/text/EnrichedTextView.kt b/android/src/main/java/com/swmansion/enriched/text/EnrichedTextView.kt new file mode 100644 index 000000000..e18a7f6d0 --- /dev/null +++ b/android/src/main/java/com/swmansion/enriched/text/EnrichedTextView.kt @@ -0,0 +1,27 @@ +package com.swmansion.enriched.text + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView + +class EnrichedTextView : AppCompatTextView { + constructor(context: Context) : super(context) { + prepareComponent() + } + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + prepareComponent() + } + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr, + ) { + prepareComponent() + } + + private fun prepareComponent() { + // Any initialization code can go here + } +} diff --git a/android/src/main/java/com/swmansion/enriched/text/EnrichedTextViewManager.kt b/android/src/main/java/com/swmansion/enriched/text/EnrichedTextViewManager.kt new file mode 100644 index 000000000..3187f5b2c --- /dev/null +++ b/android/src/main/java/com/swmansion/enriched/text/EnrichedTextViewManager.kt @@ -0,0 +1,33 @@ +package com.swmansion.enriched.text + +import com.facebook.react.module.annotations.ReactModule +import com.facebook.react.uimanager.SimpleViewManager +import com.facebook.react.uimanager.ThemedReactContext +import com.facebook.react.uimanager.ViewManagerDelegate +import com.facebook.react.viewmanagers.EnrichedTextViewManagerDelegate +import com.facebook.react.viewmanagers.EnrichedTextViewManagerInterface + +@ReactModule(name = EnrichedTextViewManager.NAME) +class EnrichedTextViewManager : + SimpleViewManager(), + EnrichedTextViewManagerInterface { + private val mDelegate: ViewManagerDelegate = + EnrichedTextViewManagerDelegate(this) + + override fun getDelegate(): ViewManagerDelegate? = mDelegate + + override fun getName(): String = NAME + + public override fun createViewInstance(context: ThemedReactContext): EnrichedTextView = EnrichedTextView(context) + + override fun setText( + view: EnrichedTextView?, + value: String?, + ) { + view?.text = value + } + + companion object { + const val NAME = "EnrichedTextView" + } +} diff --git a/apps/example/src/App.tsx b/apps/example/src/App.tsx index 6edefc174..5fd660844 100644 --- a/apps/example/src/App.tsx +++ b/apps/example/src/App.tsx @@ -10,6 +10,7 @@ import { type OnChangeSelectionEvent, type HtmlStyle, type OnKeyPressEvent, + EnrichedText, } from 'react-native-enriched'; import { useRef, useState } from 'react'; import { Button } from './components/Button'; @@ -340,6 +341,10 @@ export default function App() { onSelectImage={openImageModal} /> +