@fendent/react-native-enriched 0.5.2-fork.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +343 -0
  3. package/ReactNativeEnriched.podspec +31 -0
  4. package/android/build.gradle +106 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +197 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +72 -0
  7. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
  8. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
  9. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
  10. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
  11. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.cpp +173 -0
  12. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.h +833 -0
  13. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
  14. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
  15. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.cpp +16 -0
  16. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.h +20 -0
  17. package/android/gradle.properties +5 -0
  18. package/android/lint.gradle +70 -0
  19. package/android/src/main/AndroidManifest.xml +3 -0
  20. package/android/src/main/AndroidManifestNew.xml +2 -0
  21. package/android/src/main/java/com/swmansion/enriched/ReactNativeEnrichedPackage.kt +20 -0
  22. package/android/src/main/java/com/swmansion/enriched/common/AsyncDrawable.kt +126 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  24. package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
  25. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  26. package/android/src/main/java/com/swmansion/enriched/common/ForceRedrawSpan.kt +14 -0
  27. package/android/src/main/java/com/swmansion/enriched/common/GumboNormalizer.kt +5 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/ResourceManager.kt +26 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +956 -0
  31. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  32. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
  33. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  34. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +92 -0
  35. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCodeBlockSpan.kt +81 -0
  36. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  38. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  39. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  40. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  41. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedImageSpan.kt +184 -0
  43. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  45. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +29 -0
  46. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
  47. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedOrderedListSpan.kt +79 -0
  48. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  49. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  50. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnorderedListSpan.kt +62 -0
  51. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
  52. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
  53. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  54. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
  55. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  56. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +4 -0
  57. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
  58. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  59. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputView.kt +1120 -0
  60. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewLayoutManager.kt +27 -0
  61. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewManager.kt +478 -0
  62. package/android/src/main/java/com/swmansion/enriched/textinput/MeasurementStore.kt +225 -0
  63. package/android/src/main/java/com/swmansion/enriched/textinput/events/MentionHandler.kt +55 -0
  64. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
  65. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt +30 -0
  66. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
  67. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnContextMenuItemPressEvent.kt +35 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionDetectedEvent.kt +30 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionEvent.kt +34 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt +32 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnSubmitEditingEvent.kt +29 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  86. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  87. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  88. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  89. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  90. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  91. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +16 -0
  92. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  93. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  94. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  95. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  96. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  97. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedLineHeightSpan.kt +44 -0
  98. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
  99. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  100. package/android/src/main/java/com/swmansion/enriched/textinput/styles/HtmlStyle.kt +372 -0
  101. package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +164 -0
  102. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
  103. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParagraphStyles.kt +434 -0
  104. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt +394 -0
  105. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
  106. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSelection.kt +320 -0
  107. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +310 -0
  108. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +106 -0
  109. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +24 -0
  110. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  111. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  112. package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedSpanWatcher.kt +107 -0
  113. package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedTextWatcher.kt +74 -0
  114. package/android/src/main/new_arch/CMakeLists.txt +62 -0
  115. package/android/src/main/new_arch/GumboNormalizerJni.cpp +14 -0
  116. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  117. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  118. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputComponentDescriptor.h +35 -0
  119. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.cpp +53 -0
  120. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.h +25 -0
  121. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.cpp +35 -0
  122. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.h +53 -0
  123. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.cpp +9 -0
  124. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.h +24 -0
  125. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +27 -0
  126. package/android/src/main/res/drawable/broken_image.xml +10 -0
  127. package/cpp/CMakeLists.txt +50 -0
  128. package/cpp/GumboParser/GumboParser.h +34043 -0
  129. package/cpp/README.md +59 -0
  130. package/cpp/parser/GumboNormalizer.c +915 -0
  131. package/cpp/parser/GumboParser.cpp +16 -0
  132. package/cpp/parser/GumboParser.hpp +23 -0
  133. package/cpp/tests/GumboParserTest.cpp +457 -0
  134. package/ios/EnrichedTextInputView.h +53 -0
  135. package/ios/EnrichedTextInputView.mm +2360 -0
  136. package/ios/EnrichedTextInputViewManager.mm +13 -0
  137. package/ios/attributesManager/AttributesManager.h +17 -0
  138. package/ios/attributesManager/AttributesManager.mm +195 -0
  139. package/ios/config/InputConfig.h +104 -0
  140. package/ios/config/InputConfig.mm +664 -0
  141. package/ios/extensions/ColorExtension.h +7 -0
  142. package/ios/extensions/ColorExtension.mm +38 -0
  143. package/ios/extensions/FontExtension.h +11 -0
  144. package/ios/extensions/FontExtension.mm +72 -0
  145. package/ios/extensions/ImageExtension.h +34 -0
  146. package/ios/extensions/ImageExtension.mm +165 -0
  147. package/ios/extensions/LayoutManagerExtension.h +6 -0
  148. package/ios/extensions/LayoutManagerExtension.mm +443 -0
  149. package/ios/extensions/StringExtension.h +15 -0
  150. package/ios/extensions/StringExtension.mm +69 -0
  151. package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
  152. package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
  153. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
  154. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
  155. package/ios/generated/ReactNativeEnrichedSpec/Props.cpp +173 -0
  156. package/ios/generated/ReactNativeEnrichedSpec/Props.h +833 -0
  157. package/ios/generated/ReactNativeEnrichedSpec/RCTComponentViewHelpers.h +582 -0
  158. package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
  159. package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
  160. package/ios/generated/ReactNativeEnrichedSpec/States.cpp +16 -0
  161. package/ios/generated/ReactNativeEnrichedSpec/States.h +20 -0
  162. package/ios/inputParser/InputParser.h +11 -0
  163. package/ios/inputParser/InputParser.mm +1463 -0
  164. package/ios/inputTextView/InputTextView.h +6 -0
  165. package/ios/inputTextView/InputTextView.mm +285 -0
  166. package/ios/interfaces/AttributeEntry.h +9 -0
  167. package/ios/interfaces/AttributeEntry.mm +4 -0
  168. package/ios/interfaces/BaseStyleProtocol.h +17 -0
  169. package/ios/interfaces/ImageAttachment.h +11 -0
  170. package/ios/interfaces/ImageAttachment.mm +107 -0
  171. package/ios/interfaces/ImageData.h +10 -0
  172. package/ios/interfaces/ImageData.mm +4 -0
  173. package/ios/interfaces/LinkData.h +11 -0
  174. package/ios/interfaces/LinkData.mm +29 -0
  175. package/ios/interfaces/LinkRegexConfig.h +19 -0
  176. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  177. package/ios/interfaces/MediaAttachment.h +23 -0
  178. package/ios/interfaces/MediaAttachment.mm +31 -0
  179. package/ios/interfaces/MentionParams.h +8 -0
  180. package/ios/interfaces/MentionParams.mm +4 -0
  181. package/ios/interfaces/MentionStyleProps.h +13 -0
  182. package/ios/interfaces/MentionStyleProps.mm +63 -0
  183. package/ios/interfaces/StyleBase.h +36 -0
  184. package/ios/interfaces/StyleBase.mm +256 -0
  185. package/ios/interfaces/StyleHeaders.h +102 -0
  186. package/ios/interfaces/StylePair.h +9 -0
  187. package/ios/interfaces/StylePair.mm +4 -0
  188. package/ios/interfaces/StyleTypeEnum.h +26 -0
  189. package/ios/interfaces/TextDecorationLineEnum.h +6 -0
  190. package/ios/interfaces/TextDecorationLineEnum.mm +4 -0
  191. package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +19 -0
  192. package/ios/internals/EnrichedTextInputViewShadowNode.h +44 -0
  193. package/ios/internals/EnrichedTextInputViewShadowNode.mm +103 -0
  194. package/ios/internals/EnrichedTextInputViewState.cpp +10 -0
  195. package/ios/internals/EnrichedTextInputViewState.h +22 -0
  196. package/ios/styles/BlockQuoteStyle.mm +55 -0
  197. package/ios/styles/BoldStyle.mm +37 -0
  198. package/ios/styles/CheckboxListStyle.mm +153 -0
  199. package/ios/styles/CodeBlockStyle.mm +49 -0
  200. package/ios/styles/H1Style.mm +20 -0
  201. package/ios/styles/H2Style.mm +20 -0
  202. package/ios/styles/H3Style.mm +20 -0
  203. package/ios/styles/H4Style.mm +20 -0
  204. package/ios/styles/H5Style.mm +20 -0
  205. package/ios/styles/H6Style.mm +20 -0
  206. package/ios/styles/HeadingStyleBase.mm +65 -0
  207. package/ios/styles/ImageStyle.mm +146 -0
  208. package/ios/styles/InlineCodeStyle.mm +65 -0
  209. package/ios/styles/ItalicStyle.mm +37 -0
  210. package/ios/styles/LinkStyle.mm +532 -0
  211. package/ios/styles/MentionStyle.mm +538 -0
  212. package/ios/styles/OrderedListStyle.mm +86 -0
  213. package/ios/styles/StrikethroughStyle.mm +25 -0
  214. package/ios/styles/UnderlineStyle.mm +24 -0
  215. package/ios/styles/UnorderedListStyle.mm +86 -0
  216. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  217. package/ios/utils/CheckboxHitTestUtils.mm +122 -0
  218. package/ios/utils/DotReplacementUtils.h +10 -0
  219. package/ios/utils/DotReplacementUtils.mm +68 -0
  220. package/ios/utils/KeyboardUtils.h +7 -0
  221. package/ios/utils/KeyboardUtils.mm +31 -0
  222. package/ios/utils/OccurenceUtils.h +44 -0
  223. package/ios/utils/OccurenceUtils.mm +179 -0
  224. package/ios/utils/ParagraphAttributesUtils.h +15 -0
  225. package/ios/utils/ParagraphAttributesUtils.mm +257 -0
  226. package/ios/utils/RangeUtils.h +12 -0
  227. package/ios/utils/RangeUtils.mm +183 -0
  228. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  229. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  230. package/ios/utils/TextInsertionUtils.h +17 -0
  231. package/ios/utils/TextInsertionUtils.mm +64 -0
  232. package/ios/utils/WordsUtils.h +7 -0
  233. package/ios/utils/WordsUtils.mm +98 -0
  234. package/ios/utils/ZeroWidthSpaceUtils.h +9 -0
  235. package/ios/utils/ZeroWidthSpaceUtils.mm +270 -0
  236. package/lib/module/index.js +4 -0
  237. package/lib/module/index.js.map +1 -0
  238. package/lib/module/native/EnrichedTextInput.js +304 -0
  239. package/lib/module/native/EnrichedTextInput.js.map +1 -0
  240. package/lib/module/package.json +1 -0
  241. package/lib/module/spec/EnrichedTextInputNativeComponent.ts +517 -0
  242. package/lib/module/types.js +4 -0
  243. package/lib/module/types.js.map +1 -0
  244. package/lib/module/utils/EnrichedTextInputDefaultProps.js +12 -0
  245. package/lib/module/utils/EnrichedTextInputDefaultProps.js.map +1 -0
  246. package/lib/module/utils/normalizeHtmlStyle.js +155 -0
  247. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  248. package/lib/module/utils/nullthrows.js +9 -0
  249. package/lib/module/utils/nullthrows.js.map +1 -0
  250. package/lib/module/utils/regexParser.js +46 -0
  251. package/lib/module/utils/regexParser.js.map +1 -0
  252. package/lib/typescript/package.json +1 -0
  253. package/lib/typescript/src/index.d.ts +3 -0
  254. package/lib/typescript/src/index.d.ts.map +1 -0
  255. package/lib/typescript/src/native/EnrichedTextInput.d.ts +3 -0
  256. package/lib/typescript/src/native/EnrichedTextInput.d.ts.map +1 -0
  257. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts +397 -0
  258. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  259. package/lib/typescript/src/types.d.ts +447 -0
  260. package/lib/typescript/src/types.d.ts.map +1 -0
  261. package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts +10 -0
  262. package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts.map +1 -0
  263. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  264. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  265. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  266. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  267. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  268. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  269. package/package.json +226 -0
  270. package/react-native.config.js +13 -0
  271. package/src/index.tsx +20 -0
  272. package/src/native/EnrichedTextInput.tsx +370 -0
  273. package/src/spec/EnrichedTextInputNativeComponent.ts +517 -0
  274. package/src/types.ts +499 -0
  275. package/src/utils/EnrichedTextInputDefaultProps.ts +9 -0
  276. package/src/utils/normalizeHtmlStyle.ts +199 -0
  277. package/src/utils/nullthrows.ts +7 -0
  278. package/src/utils/regexParser.ts +56 -0
package/package.json ADDED
@@ -0,0 +1,226 @@
1
+ {
2
+ "name": "@fendent/react-native-enriched",
3
+ "version": "0.5.2-fork.1",
4
+ "description": "Rich Text Editor component for React Native",
5
+ "source": "./src/index.tsx",
6
+ "main": "./lib/module/index.js",
7
+ "types": "./lib/typescript/src/index.d.ts",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "react-native": {
12
+ "types": "./lib/typescript/src/index.d.ts",
13
+ "default": "./lib/module/index.js"
14
+ },
15
+ "types": "./lib/typescript/src/index.d.ts",
16
+ "default": "./lib/module/index.js"
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "files": [
21
+ "src",
22
+ "lib",
23
+ "android",
24
+ "ios",
25
+ "cpp",
26
+ "*.podspec",
27
+ "react-native.config.js",
28
+ "!src/web",
29
+ "!src/index.web.tsx",
30
+ "!lib/module/web",
31
+ "!lib/module/index.web.js",
32
+ "!lib/module/index.web.js.map",
33
+ "!lib/typescript/src/web",
34
+ "!lib/typescript/src/index.web.d.ts",
35
+ "!lib/typescript/src/index.web.d.ts.map",
36
+ "!ios/build",
37
+ "!android/build",
38
+ "!android/gradle",
39
+ "!android/gradlew",
40
+ "!android/gradlew.bat",
41
+ "!android/local.properties",
42
+ "!**/__tests__",
43
+ "!**/__fixtures__",
44
+ "!**/__mocks__",
45
+ "!**/.*"
46
+ ],
47
+ "scripts": {
48
+ "example": "yarn workspace react-native-enriched-example",
49
+ "example-web": "yarn workspace react-native-enriched-web-example",
50
+ "test": "jest --passWithNoTests",
51
+ "typecheck": "yarn typecheck:lib && yarn typecheck:example && yarn typecheck:example-web",
52
+ "typecheck:lib": "tsc -p tsconfig.build.json",
53
+ "typecheck:example": "tsc -p apps/example/tsconfig.json",
54
+ "typecheck:example-web": "tsc -p apps/example-web/tsconfig.app.json",
55
+ "lint": "eslint \"**/*.{js,ts,tsx}\"",
56
+ "lint:android": "cd apps/example/android && ./gradlew lintVerify",
57
+ "lint:android:fix": "cd apps/example/android && ./gradlew lintFormat",
58
+ "lint-clang:ios": "find ios/ \\( -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.mm\" \\) | grep -v -e Pods -e build -e generated | xargs npx clang-format -i -n --Werror",
59
+ "lint-clang:ios:fix": "find ios/ \\( -iname \"*.h\" -o -iname \"*.m\" -o -iname \"*.mm\" \\) | grep -v -e Pods -e build -e generated | xargs npx clang-format -i",
60
+ "lint-clang:android": "find android/ \\( -iname \"*.h\" -o -iname \"*.cpp\" \\) | grep -v -e build -e generated | xargs npx clang-format -i -n --Werror",
61
+ "lint-clang:android:fix": "find android/ \\( -iname \"*.h\" -o -iname \"*.cpp\" \\) | grep -v -e build -e generated | xargs npx clang-format -i",
62
+ "lint-clang": "yarn lint-clang:ios && yarn lint-clang:android",
63
+ "lint-clang:fix": "yarn lint-clang:ios:fix && yarn lint-clang:android:fix",
64
+ "clean": "del-cli android/build apps/example/android/build apps/example/android/app/build apps/example/ios/build lib",
65
+ "prepare": "bob build",
66
+ "release": "release-it",
67
+ "android-studio": "open -a 'Android Studio' apps/example/android",
68
+ "xcode": "open -a 'Xcode' apps/example/ios/EnrichedTextInputExample.xcworkspace",
69
+ "test:e2e:mobile": ".maestro/scripts/run-tests-all.sh",
70
+ "test:e2e:android": ".maestro/scripts/run-tests.sh --platform android",
71
+ "test:e2e:ios": ".maestro/scripts/run-tests.sh --platform ios",
72
+ "test:e2e:web": "playwright test --config .playwright/playwright.config.ts",
73
+ "test:e2e": "yarn test:e2e:mobile && yarn test:e2e:web"
74
+ },
75
+ "keywords": [
76
+ "react-native",
77
+ "ios",
78
+ "android"
79
+ ],
80
+ "repository": {
81
+ "type": "git",
82
+ "url": "git+https://github.com/software-mansion/react-native-enriched.git"
83
+ },
84
+ "author": "Software Mansion <contact@swmansion.com> (https://swmansion.com)",
85
+ "license": "MIT",
86
+ "bugs": {
87
+ "url": "https://github.com/software-mansion/react-native-enriched/issues"
88
+ },
89
+ "homepage": "https://github.com/software-mansion/react-native-enriched#readme",
90
+ "publishConfig": {
91
+ "registry": "https://registry.npmjs.org/"
92
+ },
93
+ "dependencies": {
94
+ "@tiptap/core": "3.20.4",
95
+ "@tiptap/extension-document": "3.20.4",
96
+ "@tiptap/extension-paragraph": "3.20.4",
97
+ "@tiptap/extension-text": "3.20.4",
98
+ "@tiptap/extensions": "3.20.4",
99
+ "@tiptap/pm": "3.20.4",
100
+ "@tiptap/react": "3.20.4"
101
+ },
102
+ "devDependencies": {
103
+ "@commitlint/config-conventional": "^19.6.0",
104
+ "@eslint/compat": "^1.2.7",
105
+ "@eslint/eslintrc": "^3.3.0",
106
+ "@eslint/js": "^9.22.0",
107
+ "@evilmartians/lefthook": "^1.5.0",
108
+ "@playwright/test": "1.58.2",
109
+ "@react-native-community/cli": "20.0.0",
110
+ "@react-native/eslint-config": "^0.81.0",
111
+ "@release-it/conventional-changelog": "^9.0.2",
112
+ "@types/jest": "^29.5.5",
113
+ "@types/react": "^19.1.0",
114
+ "@types/react-dom": "^19.1.0",
115
+ "clang-format": "^1.8.0",
116
+ "commitlint": "^19.6.1",
117
+ "del-cli": "^5.1.0",
118
+ "eslint": "^9.22.0",
119
+ "eslint-config-prettier": "^10.1.1",
120
+ "eslint-plugin-prettier": "^5.2.3",
121
+ "jest": "^29.7.0",
122
+ "playwright": "1.58.2",
123
+ "prettier": "^3.0.3",
124
+ "react": "19.1.0",
125
+ "react-dom": "19.1.0",
126
+ "react-native": "0.81.0",
127
+ "react-native-builder-bob": "^0.40.18",
128
+ "release-it": "^17.10.0",
129
+ "turbo": "^1.10.7",
130
+ "typescript": "^5.8.3"
131
+ },
132
+ "peerDependencies": {
133
+ "react": "*",
134
+ "react-native": "*"
135
+ },
136
+ "workspaces": [
137
+ "apps/example",
138
+ "apps/example-web"
139
+ ],
140
+ "packageManager": "yarn@3.6.1",
141
+ "jest": {
142
+ "preset": "react-native",
143
+ "modulePathIgnorePatterns": [
144
+ "<rootDir>/apps/example/node_modules",
145
+ "<rootDir>/lib/"
146
+ ],
147
+ "testPathIgnorePatterns": [
148
+ "/node_modules/",
149
+ "<rootDir>/.playwright/",
150
+ "<rootDir>/apps/example-web/"
151
+ ]
152
+ },
153
+ "commitlint": {
154
+ "extends": [
155
+ "@commitlint/config-conventional"
156
+ ]
157
+ },
158
+ "release-it": {
159
+ "git": {
160
+ "commitMessage": "chore: release ${version}",
161
+ "tagName": "v${version}"
162
+ },
163
+ "npm": {
164
+ "publish": true
165
+ },
166
+ "github": {
167
+ "release": true
168
+ },
169
+ "plugins": {
170
+ "@release-it/conventional-changelog": {
171
+ "preset": {
172
+ "name": "angular"
173
+ }
174
+ }
175
+ }
176
+ },
177
+ "prettier": {
178
+ "quoteProps": "consistent",
179
+ "singleQuote": true,
180
+ "tabWidth": 2,
181
+ "trailingComma": "es5",
182
+ "useTabs": false
183
+ },
184
+ "react-native-builder-bob": {
185
+ "source": "src",
186
+ "output": "lib",
187
+ "targets": [
188
+ "codegen",
189
+ [
190
+ "module",
191
+ {
192
+ "esm": true
193
+ }
194
+ ],
195
+ [
196
+ "typescript",
197
+ {
198
+ "project": "tsconfig.build.json"
199
+ }
200
+ ]
201
+ ]
202
+ },
203
+ "codegenConfig": {
204
+ "name": "ReactNativeEnrichedSpec",
205
+ "type": "components",
206
+ "jsSrcsDir": "src/spec",
207
+ "outputDir": {
208
+ "ios": "ios/generated",
209
+ "android": "android/generated"
210
+ },
211
+ "android": {
212
+ "javaPackageName": "com.swmansion.enriched"
213
+ },
214
+ "ios": {
215
+ "componentProvider": {
216
+ "EnrichedTextInputView": "EnrichedTextInputView"
217
+ }
218
+ },
219
+ "includesGeneratedCode": true
220
+ },
221
+ "create-react-native-library": {
222
+ "languages": "kotlin-objc",
223
+ "type": "fabric-view",
224
+ "version": "0.49.8"
225
+ }
226
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @type {import('@react-native-community/cli-types').UserDependencyConfig}
3
+ */
4
+ module.exports = {
5
+ dependency: {
6
+ platforms: {
7
+ android: {
8
+ cmakeListsPath: '../android/src/main/new_arch/CMakeLists.txt',
9
+ componentDescriptors: ['EnrichedTextInputComponentDescriptor'],
10
+ },
11
+ },
12
+ },
13
+ };
package/src/index.tsx ADDED
@@ -0,0 +1,20 @@
1
+ export { EnrichedTextInput } from './native/EnrichedTextInput';
2
+ export type {
3
+ EnrichedTextInputProps,
4
+ OnChangeTextEvent,
5
+ OnChangeHtmlEvent,
6
+ OnChangeStateEvent,
7
+ OnLinkDetected,
8
+ OnMentionDetected,
9
+ OnChangeSelectionEvent,
10
+ OnKeyPressEvent,
11
+ OnPasteImagesEvent,
12
+ OnSubmitEditing,
13
+ HtmlStyle,
14
+ MentionStyleProperties,
15
+ FocusEvent,
16
+ BlurEvent,
17
+ EnrichedTextInputInstance,
18
+ ContextMenuItem,
19
+ OnChangeMentionEvent,
20
+ } from './types';
@@ -0,0 +1,370 @@
1
+ import {
2
+ type Component,
3
+ useEffect,
4
+ useImperativeHandle,
5
+ useMemo,
6
+ useRef,
7
+ } from 'react';
8
+ import { useCallback } from 'react';
9
+ import EnrichedTextInputNativeComponent, {
10
+ Commands,
11
+ type NativeProps,
12
+ type OnContextMenuItemPressEvent,
13
+ type OnMentionEvent,
14
+ type OnMentionDetectedInternal,
15
+ type OnRequestHtmlResultEvent,
16
+ } from '../spec/EnrichedTextInputNativeComponent';
17
+ import type {
18
+ HostInstance,
19
+ MeasureInWindowOnSuccessCallback,
20
+ MeasureLayoutOnSuccessCallback,
21
+ MeasureOnSuccessCallback,
22
+ NativeMethods,
23
+ NativeSyntheticEvent,
24
+ } from 'react-native';
25
+ import { normalizeHtmlStyle } from '../utils/normalizeHtmlStyle';
26
+ import { toNativeRegexConfig } from '../utils/regexParser';
27
+ import { nullthrows } from '../utils/nullthrows';
28
+ import { ENRICHED_TEXT_INPUT_DEFAULT_PROPS } from '../utils/EnrichedTextInputDefaultProps';
29
+ import type {
30
+ ContextMenuItem,
31
+ EnrichedTextInputProps,
32
+ OnLinkDetected,
33
+ OnMentionDetected,
34
+ } from '../types';
35
+
36
+ const warnMentionIndicators = (indicator: string) => {
37
+ console.warn(
38
+ `Looks like you are trying to set a "${indicator}" but it's not in the mentionIndicators prop`
39
+ );
40
+ };
41
+
42
+ type ComponentType = (Component<NativeProps, {}, any> & NativeMethods) | null;
43
+
44
+ type HtmlRequest = {
45
+ resolve: (html: string) => void;
46
+ reject: (error: Error) => void;
47
+ };
48
+
49
+ export const EnrichedTextInput = ({
50
+ ref,
51
+ autoFocus,
52
+ editable = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.editable,
53
+ mentionIndicators = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.mentionIndicators.slice(),
54
+ defaultValue,
55
+ placeholder,
56
+ placeholderTextColor,
57
+ cursorColor,
58
+ selectionColor,
59
+ style,
60
+ autoCapitalize = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.autoCapitalize,
61
+ htmlStyle = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.htmlStyle,
62
+ linkRegex: _linkRegex,
63
+ onFocus,
64
+ onBlur,
65
+ onChangeText,
66
+ onChangeHtml,
67
+ onChangeState,
68
+ onLinkDetected,
69
+ onMentionDetected,
70
+ onStartMention,
71
+ onChangeMention,
72
+ onEndMention,
73
+ onChangeSelection,
74
+ onKeyPress,
75
+ onSubmitEditing,
76
+ returnKeyType,
77
+ returnKeyLabel,
78
+ submitBehavior,
79
+ contextMenuItems,
80
+ androidExperimentalSynchronousEvents = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.androidExperimentalSynchronousEvents,
81
+ useHtmlNormalizer = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.useHtmlNormalizer,
82
+ scrollEnabled = ENRICHED_TEXT_INPUT_DEFAULT_PROPS.scrollEnabled,
83
+ ...rest
84
+ }: EnrichedTextInputProps) => {
85
+ const nativeRef = useRef<ComponentType | null>(null);
86
+
87
+ const nextHtmlRequestId = useRef(1);
88
+ const pendingHtmlRequests = useRef(new Map<number, HtmlRequest>());
89
+
90
+ // Store onPress callbacks in a ref so native only receives serializable data
91
+ const contextMenuCallbacksRef = useRef<
92
+ Map<string, ContextMenuItem['onPress']>
93
+ >(new Map());
94
+
95
+ useEffect(() => {
96
+ const callbacksMap = new Map<string, ContextMenuItem['onPress']>();
97
+ if (contextMenuItems) {
98
+ for (const item of contextMenuItems) {
99
+ callbacksMap.set(item.text, item.onPress);
100
+ }
101
+ }
102
+ contextMenuCallbacksRef.current = callbacksMap;
103
+ }, [contextMenuItems]);
104
+
105
+ const nativeContextMenuItems = useMemo(
106
+ () =>
107
+ contextMenuItems
108
+ ?.filter((item) => item.visible !== false)
109
+ .map((item) => ({
110
+ text: item.text,
111
+ })),
112
+ [contextMenuItems]
113
+ );
114
+
115
+ const handleContextMenuItemPress = useCallback(
116
+ (e: NativeSyntheticEvent<OnContextMenuItemPressEvent>) => {
117
+ const {
118
+ itemText,
119
+ selectedText,
120
+ selectionStart,
121
+ selectionEnd,
122
+ styleState,
123
+ } = e.nativeEvent;
124
+ const callback = contextMenuCallbacksRef.current.get(itemText);
125
+ callback?.({
126
+ text: selectedText,
127
+ selection: { start: selectionStart, end: selectionEnd },
128
+ styleState,
129
+ });
130
+ },
131
+ []
132
+ );
133
+
134
+ useEffect(() => {
135
+ const pendingRequests = pendingHtmlRequests.current;
136
+ return () => {
137
+ pendingRequests.forEach(({ reject }) => {
138
+ reject(new Error('Component unmounted'));
139
+ });
140
+ pendingRequests.clear();
141
+ };
142
+ }, []);
143
+
144
+ const normalizedHtmlStyle = useMemo(
145
+ () => normalizeHtmlStyle(htmlStyle, mentionIndicators),
146
+ [htmlStyle, mentionIndicators]
147
+ );
148
+
149
+ const linkRegex = useMemo(
150
+ () => toNativeRegexConfig(_linkRegex),
151
+ [_linkRegex]
152
+ );
153
+
154
+ useImperativeHandle(ref, () => ({
155
+ measureInWindow: (callback: MeasureInWindowOnSuccessCallback) => {
156
+ nullthrows(nativeRef.current).measureInWindow(callback);
157
+ },
158
+ measure: (callback: MeasureOnSuccessCallback) => {
159
+ nullthrows(nativeRef.current).measure(callback);
160
+ },
161
+ measureLayout: (
162
+ relativeToNativeComponentRef: HostInstance | number,
163
+ onSuccess: MeasureLayoutOnSuccessCallback,
164
+ onFail?: () => void
165
+ ) => {
166
+ nullthrows(nativeRef.current).measureLayout(
167
+ relativeToNativeComponentRef,
168
+ onSuccess,
169
+ onFail
170
+ );
171
+ },
172
+ setNativeProps: (nativeProps: object) => {
173
+ nullthrows(nativeRef.current).setNativeProps(nativeProps);
174
+ },
175
+ focus: () => {
176
+ Commands.focus(nullthrows(nativeRef.current));
177
+ },
178
+ blur: () => {
179
+ Commands.blur(nullthrows(nativeRef.current));
180
+ },
181
+ setValue: (value: string) => {
182
+ Commands.setValue(nullthrows(nativeRef.current), value);
183
+ },
184
+ insertText: (text: string, start?: number, end?: number) => {
185
+ const s = start ?? -1;
186
+ const e = end ?? s;
187
+ Commands.insertText(nullthrows(nativeRef.current), text, s, e);
188
+ },
189
+ getHTML: () => {
190
+ return new Promise<string>((resolve, reject) => {
191
+ const requestId = nextHtmlRequestId.current++;
192
+ pendingHtmlRequests.current.set(requestId, { resolve, reject });
193
+ Commands.requestHTML(nullthrows(nativeRef.current), requestId);
194
+ });
195
+ },
196
+ toggleBold: () => {
197
+ Commands.toggleBold(nullthrows(nativeRef.current));
198
+ },
199
+ toggleItalic: () => {
200
+ Commands.toggleItalic(nullthrows(nativeRef.current));
201
+ },
202
+ toggleUnderline: () => {
203
+ Commands.toggleUnderline(nullthrows(nativeRef.current));
204
+ },
205
+ toggleStrikeThrough: () => {
206
+ Commands.toggleStrikeThrough(nullthrows(nativeRef.current));
207
+ },
208
+ toggleInlineCode: () => {
209
+ Commands.toggleInlineCode(nullthrows(nativeRef.current));
210
+ },
211
+ toggleH1: () => {
212
+ Commands.toggleH1(nullthrows(nativeRef.current));
213
+ },
214
+ toggleH2: () => {
215
+ Commands.toggleH2(nullthrows(nativeRef.current));
216
+ },
217
+ toggleH3: () => {
218
+ Commands.toggleH3(nullthrows(nativeRef.current));
219
+ },
220
+ toggleH4: () => {
221
+ Commands.toggleH4(nullthrows(nativeRef.current));
222
+ },
223
+ toggleH5: () => {
224
+ Commands.toggleH5(nullthrows(nativeRef.current));
225
+ },
226
+ toggleH6: () => {
227
+ Commands.toggleH6(nullthrows(nativeRef.current));
228
+ },
229
+ toggleCodeBlock: () => {
230
+ Commands.toggleCodeBlock(nullthrows(nativeRef.current));
231
+ },
232
+ toggleBlockQuote: () => {
233
+ Commands.toggleBlockQuote(nullthrows(nativeRef.current));
234
+ },
235
+ toggleOrderedList: () => {
236
+ Commands.toggleOrderedList(nullthrows(nativeRef.current));
237
+ },
238
+ toggleUnorderedList: () => {
239
+ Commands.toggleUnorderedList(nullthrows(nativeRef.current));
240
+ },
241
+ toggleCheckboxList: (checked: boolean) => {
242
+ Commands.toggleCheckboxList(nullthrows(nativeRef.current), checked);
243
+ },
244
+ setLink: (start: number, end: number, text: string, url: string) => {
245
+ Commands.addLink(nullthrows(nativeRef.current), start, end, text, url);
246
+ },
247
+ removeLink: (start: number, end: number) => {
248
+ Commands.removeLink(nullthrows(nativeRef.current), start, end);
249
+ },
250
+ setImage: (uri: string, width: number, height: number) => {
251
+ Commands.addImage(nullthrows(nativeRef.current), uri, width, height);
252
+ },
253
+ setMention: (
254
+ indicator: string,
255
+ text: string,
256
+ attributes?: Record<string, string>
257
+ ) => {
258
+ // Codegen does not support objects as Commands parameters, so we stringify attributes
259
+ const parsedAttributes = JSON.stringify(attributes ?? {});
260
+
261
+ Commands.addMention(
262
+ nullthrows(nativeRef.current),
263
+ indicator,
264
+ text,
265
+ parsedAttributes
266
+ );
267
+ },
268
+ startMention: (indicator: string) => {
269
+ if (!mentionIndicators?.includes(indicator)) {
270
+ warnMentionIndicators(indicator);
271
+ }
272
+
273
+ Commands.startMention(nullthrows(nativeRef.current), indicator);
274
+ },
275
+ setSelection: (start: number, end: number) => {
276
+ Commands.setSelection(nullthrows(nativeRef.current), start, end);
277
+ },
278
+ }));
279
+
280
+ const handleMentionEvent = (e: NativeSyntheticEvent<OnMentionEvent>) => {
281
+ const mentionText = e.nativeEvent.text;
282
+ const mentionIndicator = e.nativeEvent.indicator;
283
+
284
+ if (typeof mentionText === 'string') {
285
+ if (mentionText === '') {
286
+ onStartMention?.(mentionIndicator);
287
+ } else {
288
+ onChangeMention?.({ indicator: mentionIndicator, text: mentionText });
289
+ }
290
+ } else if (mentionText === null) {
291
+ onEndMention?.(mentionIndicator);
292
+ }
293
+ };
294
+
295
+ const handleLinkDetected = (e: NativeSyntheticEvent<OnLinkDetected>) => {
296
+ const { text, url, start, end } = e.nativeEvent;
297
+ onLinkDetected?.({ text, url, start, end });
298
+ };
299
+
300
+ const handleMentionDetected = (
301
+ e: NativeSyntheticEvent<OnMentionDetectedInternal>
302
+ ) => {
303
+ const { text, indicator, payload } = e.nativeEvent;
304
+ const attributes = JSON.parse(payload) as Record<string, string>;
305
+ onMentionDetected?.({
306
+ text,
307
+ indicator,
308
+ attributes,
309
+ } satisfies OnMentionDetected);
310
+ };
311
+
312
+ const handleRequestHtmlResult = (
313
+ e: NativeSyntheticEvent<OnRequestHtmlResultEvent>
314
+ ) => {
315
+ const { requestId, html } = e.nativeEvent;
316
+ const pending = pendingHtmlRequests.current.get(requestId);
317
+ if (!pending) return;
318
+
319
+ if (html === null || typeof html !== 'string') {
320
+ pending.reject(new Error('Failed to parse HTML'));
321
+ } else {
322
+ pending.resolve(html);
323
+ }
324
+
325
+ pendingHtmlRequests.current.delete(requestId);
326
+ };
327
+
328
+ return (
329
+ <EnrichedTextInputNativeComponent
330
+ ref={nativeRef}
331
+ mentionIndicators={mentionIndicators}
332
+ editable={editable}
333
+ autoFocus={autoFocus}
334
+ defaultValue={defaultValue}
335
+ placeholder={placeholder}
336
+ placeholderTextColor={placeholderTextColor}
337
+ cursorColor={cursorColor}
338
+ selectionColor={selectionColor}
339
+ style={style}
340
+ autoCapitalize={autoCapitalize}
341
+ htmlStyle={normalizedHtmlStyle}
342
+ linkRegex={linkRegex}
343
+ onInputFocus={onFocus}
344
+ onInputBlur={onBlur}
345
+ onChangeText={onChangeText}
346
+ onChangeHtml={onChangeHtml}
347
+ isOnChangeHtmlSet={onChangeHtml !== undefined}
348
+ isOnChangeTextSet={onChangeText !== undefined}
349
+ onChangeState={onChangeState}
350
+ onLinkDetected={handleLinkDetected}
351
+ onMentionDetected={handleMentionDetected}
352
+ onMention={handleMentionEvent}
353
+ onChangeSelection={onChangeSelection}
354
+ onRequestHtmlResult={handleRequestHtmlResult}
355
+ onInputKeyPress={onKeyPress}
356
+ contextMenuItems={nativeContextMenuItems}
357
+ onContextMenuItemPress={handleContextMenuItemPress}
358
+ onSubmitEditing={onSubmitEditing}
359
+ returnKeyType={returnKeyType}
360
+ returnKeyLabel={returnKeyLabel}
361
+ submitBehavior={submitBehavior}
362
+ androidExperimentalSynchronousEvents={
363
+ androidExperimentalSynchronousEvents
364
+ }
365
+ useHtmlNormalizer={useHtmlNormalizer}
366
+ scrollEnabled={scrollEnabled}
367
+ {...rest}
368
+ />
369
+ );
370
+ };