react-native-enriched 0.3.0 → 0.4.0

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 (202) hide show
  1. package/README.md +6 -4
  2. package/android/build.gradle +3 -3
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +3 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +1 -0
  5. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  6. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  7. package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
  8. package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
  9. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
  10. package/android/gradle.properties +5 -5
  11. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +3 -2
  12. package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +40 -8
  13. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  14. package/android/src/main/java/com/swmansion/enriched/{utils → common}/EnrichedConstants.kt +1 -1
  15. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  16. package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +1 -1
  17. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  18. package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
  19. package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +126 -99
  20. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  21. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedBlockQuoteSpan.kt +9 -13
  22. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
  24. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +8 -12
  25. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  26. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  27. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  31. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +43 -38
  32. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedInlineCodeSpan.kt +7 -11
  33. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  34. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt +7 -11
  35. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt +6 -10
  36. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +12 -21
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  38. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  39. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +9 -13
  40. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedBlockSpan.kt +1 -1
  41. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedHeadingSpan.kt +1 -1
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  43. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedParagraphSpan.kt +1 -1
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  45. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -1
  46. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputConnectionWrapper.kt → textinput/EnrichedTextInputConnectionWrapper.kt} +2 -2
  47. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  48. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +87 -51
  49. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +1 -1
  50. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +24 -17
  51. package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +5 -4
  52. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +2 -2
  53. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeHtmlEvent.kt +1 -1
  54. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeStateEvent.kt +1 -1
  56. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeTextEvent.kt +2 -2
  57. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputBlurEvent.kt +1 -1
  58. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputFocusEvent.kt +1 -1
  59. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputKeyPressEvent.kt +1 -1
  60. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnLinkDetectedEvent.kt +1 -1
  61. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +1 -1
  62. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +1 -1
  63. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  64. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +1 -1
  65. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  66. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  67. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/{spans → textinput/spans}/EnrichedSpans.kt +39 -30
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  86. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +58 -43
  87. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +4 -4
  88. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt +77 -26
  89. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +11 -11
  90. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +19 -19
  91. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedEditableFactory.kt +2 -2
  92. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +15 -14
  93. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpanState.kt +15 -50
  94. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannable.kt +3 -3
  95. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannableStringBuilder.kt +2 -1
  96. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  97. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  98. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +10 -10
  99. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +3 -3
  100. package/android/src/main/new_arch/CMakeLists.txt +1 -1
  101. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  102. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  103. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
  104. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
  105. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/conversions.h +1 -1
  106. package/ios/EnrichedTextInputView.h +1 -0
  107. package/ios/EnrichedTextInputView.mm +266 -55
  108. package/ios/config/InputConfig.h +10 -0
  109. package/ios/config/InputConfig.mm +119 -0
  110. package/ios/extensions/ImageExtension.h +35 -0
  111. package/ios/extensions/ImageExtension.mm +156 -0
  112. package/ios/extensions/LayoutManagerExtension.mm +115 -95
  113. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  114. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  115. package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
  116. package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
  117. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
  118. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +21 -0
  119. package/ios/inputParser/InputParser.mm +135 -8
  120. package/ios/inputTextView/InputTextView.mm +118 -0
  121. package/ios/interfaces/ImageAttachment.h +1 -0
  122. package/ios/interfaces/ImageAttachment.mm +14 -4
  123. package/ios/interfaces/StyleHeaders.h +13 -2
  124. package/ios/interfaces/StyleTypeEnum.h +1 -0
  125. package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
  126. package/ios/styles/CheckboxListStyle.mm +321 -0
  127. package/ios/styles/H1Style.mm +3 -0
  128. package/ios/styles/H2Style.mm +3 -0
  129. package/ios/styles/H3Style.mm +3 -0
  130. package/ios/styles/H4Style.mm +3 -0
  131. package/ios/styles/H5Style.mm +3 -0
  132. package/ios/styles/H6Style.mm +3 -0
  133. package/ios/styles/HeadingStyleBase.mm +150 -78
  134. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  135. package/ios/utils/CheckboxHitTestUtils.mm +123 -0
  136. package/ios/utils/ParagraphAttributesUtils.mm +83 -53
  137. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  138. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  139. package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
  140. package/lib/module/EnrichedTextInput.js +36 -11
  141. package/lib/module/EnrichedTextInput.js.map +1 -1
  142. package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
  143. package/lib/module/types.js +4 -0
  144. package/lib/module/types.js.map +1 -0
  145. package/lib/module/utils/normalizeHtmlStyle.js +6 -0
  146. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -1
  147. package/lib/module/utils/nullthrows.js +9 -0
  148. package/lib/module/utils/nullthrows.js.map +1 -0
  149. package/lib/typescript/src/EnrichedTextInput.d.ts +9 -49
  150. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  151. package/lib/typescript/src/index.d.ts +2 -1
  152. package/lib/typescript/src/index.d.ts.map +1 -1
  153. package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +33 -8
  154. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  155. package/lib/typescript/src/types.d.ts +58 -0
  156. package/lib/typescript/src/types.d.ts.map +1 -0
  157. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +2 -2
  158. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -1
  159. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  160. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  161. package/lib/typescript/src/utils/regexParser.d.ts +1 -1
  162. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -1
  163. package/package.json +4 -4
  164. package/src/EnrichedTextInput.tsx +49 -62
  165. package/src/index.tsx +3 -1
  166. package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
  167. package/src/types.ts +59 -0
  168. package/src/utils/normalizeHtmlStyle.ts +8 -5
  169. package/src/utils/nullthrows.ts +7 -0
  170. package/src/utils/regexParser.ts +1 -1
  171. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +0 -21
  172. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -17
  173. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -24
  174. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -24
  175. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -24
  176. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +0 -24
  177. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +0 -24
  178. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +0 -24
  179. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -16
  180. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -15
  181. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -15
  182. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -3
  183. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -9
  184. package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -21
  185. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
  186. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
  187. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
  188. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
  189. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  190. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  191. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  192. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  193. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
  194. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
  195. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
  196. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
  197. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
  198. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
  199. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  200. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  201. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  202. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.spans
1
+ package com.swmansion.enriched.common.spans
2
2
 
3
3
  import android.graphics.Canvas
4
4
  import android.graphics.Paint
@@ -7,17 +7,15 @@ import android.text.Spanned
7
7
  import android.text.TextPaint
8
8
  import android.text.style.LeadingMarginSpan
9
9
  import android.text.style.MetricAffectingSpan
10
- import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan
11
- import com.swmansion.enriched.styles.HtmlStyle
10
+ import com.swmansion.enriched.common.EnrichedStyle
11
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
12
12
 
13
13
  // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/BulletSpan.java
14
- class EnrichedUnorderedListSpan(
15
- private val htmlStyle: HtmlStyle,
14
+ open class EnrichedUnorderedListSpan(
15
+ private val enrichedStyle: EnrichedStyle,
16
16
  ) : MetricAffectingSpan(),
17
17
  LeadingMarginSpan,
18
18
  EnrichedParagraphSpan {
19
- override val dependsOnHtmlStyle: Boolean = true
20
-
21
19
  override fun updateMeasureState(p0: TextPaint) {
22
20
  // Do nothing, but inform layout that this span affects text metrics
23
21
  }
@@ -26,7 +24,7 @@ class EnrichedUnorderedListSpan(
26
24
  // Do nothing, but inform layout that this span affects text metrics
27
25
  }
28
26
 
29
- override fun getLeadingMargin(p0: Boolean): Int = htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
27
+ override fun getLeadingMargin(p0: Boolean): Int = enrichedStyle.ulBulletSize + enrichedStyle.ulGapWidth + enrichedStyle.ulMarginLeft
30
28
 
31
29
  override fun drawLeadingMargin(
32
30
  canvas: Canvas,
@@ -47,12 +45,12 @@ class EnrichedUnorderedListSpan(
47
45
  if (spannedText.getSpanStart(this) == start) {
48
46
  val style = paint.style
49
47
  val oldColor = paint.color
50
- paint.color = htmlStyle.ulBulletColor
48
+ paint.color = enrichedStyle.ulBulletColor
51
49
  paint.style = Paint.Style.FILL
52
50
 
53
- val bulletRadius = htmlStyle.ulBulletSize / 2f
51
+ val bulletRadius = enrichedStyle.ulBulletSize / 2f
54
52
  val yPosition = (top + bottom) / 2f
55
- val xPosition = x + dir * bulletRadius + htmlStyle.ulMarginLeft
53
+ val xPosition = x + dir * bulletRadius + enrichedStyle.ulMarginLeft
56
54
 
57
55
  canvas.drawCircle(xPosition, yPosition, bulletRadius, paint)
58
56
 
@@ -60,6 +58,4 @@ class EnrichedUnorderedListSpan(
60
58
  paint.style = style
61
59
  }
62
60
  }
63
-
64
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan = EnrichedUnorderedListSpan(htmlStyle)
65
61
  }
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.spans.interfaces
1
+ package com.swmansion.enriched.common.spans.interfaces
2
2
 
3
3
  interface EnrichedBlockSpan :
4
4
  EnrichedSpan,
@@ -1,3 +1,3 @@
1
- package com.swmansion.enriched.spans.interfaces
1
+ package com.swmansion.enriched.common.spans.interfaces
2
2
 
3
3
  interface EnrichedHeadingSpan : EnrichedParagraphSpan
@@ -0,0 +1,3 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedInlineSpan : EnrichedSpan
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.spans.interfaces
1
+ package com.swmansion.enriched.common.spans.interfaces
2
2
 
3
3
  interface EnrichedParagraphSpan :
4
4
  EnrichedSpan,
@@ -0,0 +1,3 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedSpan
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.spans.interfaces
1
+ package com.swmansion.enriched.common.spans.interfaces
2
2
 
3
3
  // Spans that are prefixed with zero-width space (\u200B) to ensure that they are visible even when empty.
4
4
  interface EnrichedZeroWidthSpaceSpan
@@ -1,11 +1,11 @@
1
- package com.swmansion.enriched
1
+ package com.swmansion.enriched.textinput
2
2
 
3
3
  import android.view.KeyEvent
4
4
  import android.view.inputmethod.InputConnection
5
5
  import android.view.inputmethod.InputConnectionWrapper
6
6
  import com.facebook.react.bridge.ReactContext
7
7
  import com.facebook.react.uimanager.UIManagerHelper
8
- import com.swmansion.enriched.events.OnInputKeyPressEvent
8
+ import com.swmansion.enriched.textinput.events.OnInputKeyPressEvent
9
9
 
10
10
  // This class is based on the implementation from Facebook React Native to provide 'onKeyPress' API on android.
11
11
  // Original source:
@@ -0,0 +1,83 @@
1
+ package com.swmansion.enriched.textinput
2
+
3
+ import com.swmansion.enriched.common.parser.EnrichedSpanFactory
4
+ import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
5
+ import com.swmansion.enriched.common.spans.EnrichedImageSpan
6
+ import com.swmansion.enriched.textinput.spans.EnrichedInputBlockQuoteSpan
7
+ import com.swmansion.enriched.textinput.spans.EnrichedInputBoldSpan
8
+ import com.swmansion.enriched.textinput.spans.EnrichedInputCheckboxListSpan
9
+ import com.swmansion.enriched.textinput.spans.EnrichedInputCodeBlockSpan
10
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH1Span
11
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH2Span
12
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH3Span
13
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH4Span
14
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH5Span
15
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH6Span
16
+ import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
17
+ import com.swmansion.enriched.textinput.spans.EnrichedInputInlineCodeSpan
18
+ import com.swmansion.enriched.textinput.spans.EnrichedInputItalicSpan
19
+ import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
20
+ import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
21
+ import com.swmansion.enriched.textinput.spans.EnrichedInputOrderedListSpan
22
+ import com.swmansion.enriched.textinput.spans.EnrichedInputStrikeThroughSpan
23
+ import com.swmansion.enriched.textinput.spans.EnrichedInputUnderlineSpan
24
+ import com.swmansion.enriched.textinput.spans.EnrichedInputUnorderedListSpan
25
+ import com.swmansion.enriched.textinput.styles.HtmlStyle
26
+
27
+ class EnrichedTextInputSpannableFactory : EnrichedSpanFactory<HtmlStyle> {
28
+ override fun createBoldSpan(style: HtmlStyle) = EnrichedInputBoldSpan(style)
29
+
30
+ override fun createItalicSpan(style: HtmlStyle) = EnrichedInputItalicSpan(style)
31
+
32
+ override fun createUnderlineSpan(style: HtmlStyle) = EnrichedInputUnderlineSpan(style)
33
+
34
+ override fun createStrikeThroughSpan(style: HtmlStyle) = EnrichedInputStrikeThroughSpan(style)
35
+
36
+ override fun createInlineCodeSpan(style: HtmlStyle) = EnrichedInputInlineCodeSpan(style)
37
+
38
+ override fun createLinkSpan(
39
+ url: String,
40
+ style: HtmlStyle,
41
+ ) = EnrichedInputLinkSpan(url, style)
42
+
43
+ override fun createMentionSpan(
44
+ text: String,
45
+ indicator: String,
46
+ attributes: Map<String, String>,
47
+ style: HtmlStyle,
48
+ ) = EnrichedInputMentionSpan(text, indicator, attributes, style)
49
+
50
+ override fun createImageSpan(
51
+ source: String,
52
+ width: Int,
53
+ height: Int,
54
+ ): EnrichedImageSpan = EnrichedInputImageSpan.createEnrichedImageSpan(source, width, height)
55
+
56
+ override fun createH1Span(style: HtmlStyle) = EnrichedInputH1Span(style)
57
+
58
+ override fun createH2Span(style: HtmlStyle) = EnrichedInputH2Span(style)
59
+
60
+ override fun createH3Span(style: HtmlStyle) = EnrichedInputH3Span(style)
61
+
62
+ override fun createH4Span(style: HtmlStyle) = EnrichedInputH4Span(style)
63
+
64
+ override fun createH5Span(style: HtmlStyle) = EnrichedInputH5Span(style)
65
+
66
+ override fun createH6Span(style: HtmlStyle) = EnrichedInputH6Span(style)
67
+
68
+ override fun createOrderedListSpan(
69
+ index: Int,
70
+ style: HtmlStyle,
71
+ ) = EnrichedInputOrderedListSpan(index, style)
72
+
73
+ override fun createUnorderedListSpan(style: HtmlStyle) = EnrichedInputUnorderedListSpan(style)
74
+
75
+ override fun createCheckboxListSpan(
76
+ isChecked: Boolean,
77
+ style: HtmlStyle,
78
+ ) = EnrichedInputCheckboxListSpan(isChecked, style)
79
+
80
+ override fun createBlockQuoteSpan(style: HtmlStyle) = EnrichedInputBlockQuoteSpan(style)
81
+
82
+ override fun createCodeBlockSpan(style: HtmlStyle) = EnrichedInputCodeBlockSpan(style)
83
+ }
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched
1
+ package com.swmansion.enriched.textinput
2
2
 
3
3
  import android.content.ClipData
4
4
  import android.content.ClipboardManager
@@ -21,6 +21,9 @@ import android.view.inputmethod.EditorInfo
21
21
  import android.view.inputmethod.InputConnection
22
22
  import android.view.inputmethod.InputMethodManager
23
23
  import androidx.appcompat.widget.AppCompatEditText
24
+ import androidx.core.view.ViewCompat
25
+ import androidx.core.view.inputmethod.EditorInfoCompat
26
+ import androidx.core.view.inputmethod.InputConnectionCompat
24
27
  import com.facebook.react.bridge.ReactContext
25
28
  import com.facebook.react.bridge.ReadableMap
26
29
  import com.facebook.react.common.ReactConstants
@@ -30,29 +33,34 @@ import com.facebook.react.uimanager.UIManagerHelper
30
33
  import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
31
34
  import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
32
35
  import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
33
- import com.swmansion.enriched.events.MentionHandler
34
- import com.swmansion.enriched.events.OnInputBlurEvent
35
- import com.swmansion.enriched.events.OnInputFocusEvent
36
- import com.swmansion.enriched.events.OnRequestHtmlResultEvent
37
- import com.swmansion.enriched.spans.EnrichedH1Span
38
- import com.swmansion.enriched.spans.EnrichedH2Span
39
- import com.swmansion.enriched.spans.EnrichedH3Span
40
- import com.swmansion.enriched.spans.EnrichedImageSpan
41
- import com.swmansion.enriched.spans.EnrichedSpans
42
- import com.swmansion.enriched.spans.interfaces.EnrichedSpan
43
- import com.swmansion.enriched.styles.HtmlStyle
44
- import com.swmansion.enriched.styles.InlineStyles
45
- import com.swmansion.enriched.styles.ListStyles
46
- import com.swmansion.enriched.styles.ParagraphStyles
47
- import com.swmansion.enriched.styles.ParametrizedStyles
48
- import com.swmansion.enriched.utils.EnrichedConstants
49
- import com.swmansion.enriched.utils.EnrichedEditableFactory
50
- import com.swmansion.enriched.utils.EnrichedParser
51
- import com.swmansion.enriched.utils.EnrichedSelection
52
- import com.swmansion.enriched.utils.EnrichedSpanState
53
- import com.swmansion.enriched.utils.mergeSpannables
54
- import com.swmansion.enriched.watchers.EnrichedSpanWatcher
55
- import com.swmansion.enriched.watchers.EnrichedTextWatcher
36
+ import com.swmansion.enriched.common.EnrichedConstants
37
+ import com.swmansion.enriched.common.parser.EnrichedParser
38
+ import com.swmansion.enriched.textinput.events.MentionHandler
39
+ import com.swmansion.enriched.textinput.events.OnInputBlurEvent
40
+ import com.swmansion.enriched.textinput.events.OnInputFocusEvent
41
+ import com.swmansion.enriched.textinput.events.OnRequestHtmlResultEvent
42
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH1Span
43
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH2Span
44
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH3Span
45
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH4Span
46
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH5Span
47
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH6Span
48
+ import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
49
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
50
+ import com.swmansion.enriched.textinput.spans.interfaces.EnrichedInputSpan
51
+ import com.swmansion.enriched.textinput.styles.HtmlStyle
52
+ import com.swmansion.enriched.textinput.styles.InlineStyles
53
+ import com.swmansion.enriched.textinput.styles.ListStyles
54
+ import com.swmansion.enriched.textinput.styles.ParagraphStyles
55
+ import com.swmansion.enriched.textinput.styles.ParametrizedStyles
56
+ import com.swmansion.enriched.textinput.utils.EnrichedEditableFactory
57
+ import com.swmansion.enriched.textinput.utils.EnrichedSelection
58
+ import com.swmansion.enriched.textinput.utils.EnrichedSpanState
59
+ import com.swmansion.enriched.textinput.utils.RichContentReceiver
60
+ import com.swmansion.enriched.textinput.utils.mergeSpannables
61
+ import com.swmansion.enriched.textinput.utils.setCheckboxClickListener
62
+ import com.swmansion.enriched.textinput.watchers.EnrichedSpanWatcher
63
+ import com.swmansion.enriched.textinput.watchers.EnrichedTextWatcher
56
64
  import java.util.regex.Pattern
57
65
  import java.util.regex.PatternSyntaxException
58
66
  import kotlin.math.ceil
@@ -99,6 +107,7 @@ class EnrichedTextInputView : AppCompatEditText {
99
107
  private var defaultValueDirty: Boolean = false
100
108
 
101
109
  private var inputMethodManager: InputMethodManager? = null
110
+ private val spannableFactory = EnrichedTextInputSpannableFactory()
102
111
 
103
112
  constructor(context: Context) : super(context) {
104
113
  prepareComponent()
@@ -133,6 +142,11 @@ class EnrichedTextInputView : AppCompatEditText {
133
142
 
134
143
  init {
135
144
  inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
145
+ ViewCompat.setOnReceiveContentListener(
146
+ this,
147
+ RichContentReceiver.MIME_TYPES,
148
+ RichContentReceiver(this, context as ReactContext),
149
+ )
136
150
  }
137
151
 
138
152
  private fun prepareComponent() {
@@ -152,9 +166,12 @@ class EnrichedTextInputView : AppCompatEditText {
152
166
  // Ensure that every time new editable is created, it has EnrichedSpanWatcher attached
153
167
  val spanWatcher = EnrichedSpanWatcher(this)
154
168
  this.spanWatcher = spanWatcher
155
- setEditableFactory(EnrichedEditableFactory(spanWatcher))
156
169
 
170
+ setEditableFactory(EnrichedEditableFactory(spanWatcher))
157
171
  addTextChangedListener(EnrichedTextWatcher(this))
172
+
173
+ // Handle checkbox list item clicks
174
+ this.setCheckboxClickListener()
158
175
  }
159
176
 
160
177
  // https://github.com/facebook/react-native/blob/36df97f500aa0aa8031098caf7526db358b6ddc1/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt#L295C1-L296C1
@@ -225,11 +242,6 @@ class EnrichedTextInputView : AppCompatEditText {
225
242
  handleCustomCopy()
226
243
  return true
227
244
  }
228
-
229
- android.R.id.paste -> {
230
- handleCustomPaste()
231
- return true
232
- }
233
245
  }
234
246
  return super.onTextContextMenuItem(id)
235
247
  }
@@ -249,16 +261,11 @@ class EnrichedTextInputView : AppCompatEditText {
249
261
  }
250
262
  }
251
263
 
252
- private fun handleCustomPaste() {
253
- val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
254
- if (!clipboard.hasPrimaryClip()) return
255
-
256
- val clip = clipboard.primaryClip
257
- val item = clip?.getItemAt(0)
258
- val htmlText = item?.htmlText
264
+ fun handleTextPaste(item: ClipData.Item) {
265
+ val htmlText = item.htmlText
259
266
  val currentText = text as Spannable
260
- val start = selection?.start ?: 0
261
- val end = selection?.end ?: 0
267
+ val start = selectionStart.coerceAtLeast(0)
268
+ val end = selectionEnd.coerceAtLeast(0)
262
269
 
263
270
  if (htmlText != null) {
264
271
  val parsedText = parseText(htmlText)
@@ -269,8 +276,7 @@ class EnrichedTextInputView : AppCompatEditText {
269
276
  }
270
277
  }
271
278
 
272
- // Currently, we do not support pasting images
273
- if (item?.text == null) return
279
+ if (item.text == null) return
274
280
  val lengthBefore = currentText.length
275
281
  val finalText = currentText.mergeSpannables(start, end, item.text.toString())
276
282
  setValue(finalText)
@@ -291,7 +297,7 @@ class EnrichedTextInputView : AppCompatEditText {
291
297
  if (!isHtml) return text
292
298
 
293
299
  try {
294
- val parsed = EnrichedParser.fromHtml(text.toString(), htmlStyle, null)
300
+ val parsed = EnrichedParser.fromHtml(text.toString(), htmlStyle, spannableFactory)
295
301
  val withoutLastNewLine = parsed.trimEnd('\n')
296
302
  return withoutLastNewLine
297
303
  } catch (e: Exception) {
@@ -352,7 +358,7 @@ class EnrichedTextInputView : AppCompatEditText {
352
358
  private fun observeAsyncImages() {
353
359
  val liveText = text ?: return
354
360
 
355
- val spans = liveText.getSpans(0, liveText.length, EnrichedImageSpan::class.java)
361
+ val spans = liveText.getSpans(0, liveText.length, EnrichedInputImageSpan::class.java)
356
362
 
357
363
  for (span in spans) {
358
364
  span.observeAsyncDrawableLoaded(liveText)
@@ -543,6 +549,7 @@ class EnrichedTextInputView : AppCompatEditText {
543
549
  EnrichedSpans.BLOCK_QUOTE -> paragraphStyles?.toggleStyle(EnrichedSpans.BLOCK_QUOTE)
544
550
  EnrichedSpans.ORDERED_LIST -> listStyles?.toggleStyle(EnrichedSpans.ORDERED_LIST)
545
551
  EnrichedSpans.UNORDERED_LIST -> listStyles?.toggleStyle(EnrichedSpans.UNORDERED_LIST)
552
+ EnrichedSpans.CHECKBOX_LIST -> listStyles?.toggleStyle(EnrichedSpans.CHECKBOX_LIST)
546
553
  else -> Log.w("EnrichedTextInputView", "Unknown style: $name")
547
554
  }
548
555
 
@@ -571,6 +578,7 @@ class EnrichedTextInputView : AppCompatEditText {
571
578
  EnrichedSpans.BLOCK_QUOTE -> paragraphStyles?.removeStyle(EnrichedSpans.BLOCK_QUOTE, start, end)
572
579
  EnrichedSpans.ORDERED_LIST -> listStyles?.removeStyle(EnrichedSpans.ORDERED_LIST, start, end)
573
580
  EnrichedSpans.UNORDERED_LIST -> listStyles?.removeStyle(EnrichedSpans.UNORDERED_LIST, start, end)
581
+ EnrichedSpans.CHECKBOX_LIST -> listStyles?.removeStyle(EnrichedSpans.CHECKBOX_LIST, start, end)
574
582
  EnrichedSpans.LINK -> parametrizedStyles?.removeStyle(EnrichedSpans.LINK, start, end)
575
583
  EnrichedSpans.IMAGE -> parametrizedStyles?.removeStyle(EnrichedSpans.IMAGE, start, end)
576
584
  EnrichedSpans.MENTION -> parametrizedStyles?.removeStyle(EnrichedSpans.MENTION, start, end)
@@ -598,6 +606,7 @@ class EnrichedTextInputView : AppCompatEditText {
598
606
  EnrichedSpans.BLOCK_QUOTE -> paragraphStyles?.getStyleRange()
599
607
  EnrichedSpans.ORDERED_LIST -> listStyles?.getStyleRange()
600
608
  EnrichedSpans.UNORDERED_LIST -> listStyles?.getStyleRange()
609
+ EnrichedSpans.CHECKBOX_LIST -> listStyles?.getStyleRange()
601
610
  EnrichedSpans.LINK -> parametrizedStyles?.getStyleRange()
602
611
  EnrichedSpans.IMAGE -> parametrizedStyles?.getStyleRange()
603
612
  EnrichedSpans.MENTION -> parametrizedStyles?.getStyleRange()
@@ -657,6 +666,13 @@ class EnrichedTextInputView : AppCompatEditText {
657
666
  toggleStyle(name)
658
667
  }
659
668
 
669
+ fun toggleCheckboxListItem(checked: Boolean) {
670
+ val isValid = verifyStyle(EnrichedSpans.CHECKBOX_LIST)
671
+ if (!isValid) return
672
+
673
+ listStyles?.toggleCheckboxListStyle(checked)
674
+ }
675
+
660
676
  fun addLink(
661
677
  start: Int,
662
678
  end: Int,
@@ -752,21 +768,42 @@ class EnrichedTextInputView : AppCompatEditText {
752
768
  scrollTo(scrollX, targetScrollY)
753
769
  }
754
770
 
771
+ private fun isHeadingBold(
772
+ style: HtmlStyle,
773
+ span: EnrichedInputSpan,
774
+ ): Boolean =
775
+ when (span) {
776
+ is EnrichedInputH1Span -> style.h1Bold
777
+ is EnrichedInputH2Span -> style.h2Bold
778
+ is EnrichedInputH3Span -> style.h3Bold
779
+ is EnrichedInputH4Span -> style.h4Bold
780
+ is EnrichedInputH5Span -> style.h5Bold
781
+ is EnrichedInputH6Span -> style.h6Bold
782
+ else -> false
783
+ }
784
+
785
+ private fun shouldRemoveBoldFromHeading(
786
+ span: EnrichedInputSpan,
787
+ prevStyle: HtmlStyle,
788
+ nextStyle: HtmlStyle,
789
+ ): Boolean {
790
+ val wasBold = isHeadingBold(prevStyle, span)
791
+ val isNowBold = isHeadingBold(nextStyle, span)
792
+
793
+ return !wasBold && isNowBold
794
+ }
795
+
755
796
  private fun reApplyHtmlStyleForSpans(
756
797
  previousHtmlStyle: HtmlStyle,
757
798
  nextHtmlStyle: HtmlStyle,
758
799
  ) {
759
- val shouldRemoveBoldSpanFromH1Span = !previousHtmlStyle.h1Bold && nextHtmlStyle.h1Bold
760
- val shouldRemoveBoldSpanFromH2Span = !previousHtmlStyle.h2Bold && nextHtmlStyle.h2Bold
761
- val shouldRemoveBoldSpanFromH3Span = !previousHtmlStyle.h3Bold && nextHtmlStyle.h3Bold
762
-
763
800
  val spannable = text as? Spannable ?: return
764
801
  if (spannable.isEmpty()) return
765
802
 
766
803
  var shouldEmitStateChange = false
767
804
 
768
805
  runAsATransaction {
769
- val spans = spannable.getSpans(0, spannable.length, EnrichedSpan::class.java)
806
+ val spans = spannable.getSpans(0, spannable.length, EnrichedInputSpan::class.java)
770
807
  for (span in spans) {
771
808
  if (!span.dependsOnHtmlStyle) continue
772
809
 
@@ -776,9 +813,8 @@ class EnrichedTextInputView : AppCompatEditText {
776
813
 
777
814
  if (start == -1 || end == -1) continue
778
815
 
779
- if ((span is EnrichedH1Span && shouldRemoveBoldSpanFromH1Span) || (span is EnrichedH2Span && shouldRemoveBoldSpanFromH2Span) ||
780
- (span is EnrichedH3Span && shouldRemoveBoldSpanFromH3Span)
781
- ) {
816
+ // Check if we need to remove explicit bold spans
817
+ if (shouldRemoveBoldFromHeading(span, previousHtmlStyle, nextHtmlStyle)) {
782
818
  val isRemoved = removeStyle(EnrichedSpans.BOLD, start, end)
783
819
  if (isRemoved) shouldEmitStateChange = true
784
820
  }
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched
1
+ package com.swmansion.enriched.textinput
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
 
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched
1
+ package com.swmansion.enriched.textinput
2
2
 
3
3
  import android.content.Context
4
4
  import com.facebook.react.bridge.ReadableArray
@@ -15,21 +15,21 @@ import com.facebook.react.uimanager.annotations.ReactProp
15
15
  import com.facebook.react.viewmanagers.EnrichedTextInputViewManagerDelegate
16
16
  import com.facebook.react.viewmanagers.EnrichedTextInputViewManagerInterface
17
17
  import com.facebook.yoga.YogaMeasureMode
18
- import com.swmansion.enriched.events.OnChangeHtmlEvent
19
- import com.swmansion.enriched.events.OnChangeSelectionEvent
20
- import com.swmansion.enriched.events.OnChangeStateDeprecatedEvent
21
- import com.swmansion.enriched.events.OnChangeStateEvent
22
- import com.swmansion.enriched.events.OnChangeTextEvent
23
- import com.swmansion.enriched.events.OnInputBlurEvent
24
- import com.swmansion.enriched.events.OnInputFocusEvent
25
- import com.swmansion.enriched.events.OnInputKeyPressEvent
26
- import com.swmansion.enriched.events.OnLinkDetectedEvent
27
- import com.swmansion.enriched.events.OnMentionDetectedEvent
28
- import com.swmansion.enriched.events.OnMentionEvent
29
- import com.swmansion.enriched.events.OnRequestHtmlResultEvent
30
- import com.swmansion.enriched.spans.EnrichedSpans
31
- import com.swmansion.enriched.styles.HtmlStyle
32
- import com.swmansion.enriched.utils.jsonStringToStringMap
18
+ import com.swmansion.enriched.textinput.events.OnChangeHtmlEvent
19
+ import com.swmansion.enriched.textinput.events.OnChangeSelectionEvent
20
+ import com.swmansion.enriched.textinput.events.OnChangeStateEvent
21
+ import com.swmansion.enriched.textinput.events.OnChangeTextEvent
22
+ import com.swmansion.enriched.textinput.events.OnInputBlurEvent
23
+ import com.swmansion.enriched.textinput.events.OnInputFocusEvent
24
+ import com.swmansion.enriched.textinput.events.OnInputKeyPressEvent
25
+ import com.swmansion.enriched.textinput.events.OnLinkDetectedEvent
26
+ import com.swmansion.enriched.textinput.events.OnMentionDetectedEvent
27
+ import com.swmansion.enriched.textinput.events.OnMentionEvent
28
+ import com.swmansion.enriched.textinput.events.OnPasteImagesEvent
29
+ import com.swmansion.enriched.textinput.events.OnRequestHtmlResultEvent
30
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
31
+ import com.swmansion.enriched.textinput.styles.HtmlStyle
32
+ import com.swmansion.enriched.textinput.utils.jsonStringToStringMap
33
33
 
34
34
  @ReactModule(name = EnrichedTextInputViewManager.NAME)
35
35
  class EnrichedTextInputViewManager :
@@ -65,13 +65,13 @@ class EnrichedTextInputViewManager :
65
65
  map.put(OnChangeTextEvent.EVENT_NAME, mapOf("registrationName" to OnChangeTextEvent.EVENT_NAME))
66
66
  map.put(OnChangeHtmlEvent.EVENT_NAME, mapOf("registrationName" to OnChangeHtmlEvent.EVENT_NAME))
67
67
  map.put(OnChangeStateEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateEvent.EVENT_NAME))
68
- map.put(OnChangeStateDeprecatedEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateDeprecatedEvent.EVENT_NAME))
69
68
  map.put(OnLinkDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnLinkDetectedEvent.EVENT_NAME))
70
69
  map.put(OnMentionDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnMentionDetectedEvent.EVENT_NAME))
71
70
  map.put(OnMentionEvent.EVENT_NAME, mapOf("registrationName" to OnMentionEvent.EVENT_NAME))
72
71
  map.put(OnChangeSelectionEvent.EVENT_NAME, mapOf("registrationName" to OnChangeSelectionEvent.EVENT_NAME))
73
72
  map.put(OnRequestHtmlResultEvent.EVENT_NAME, mapOf("registrationName" to OnRequestHtmlResultEvent.EVENT_NAME))
74
73
  map.put(OnInputKeyPressEvent.EVENT_NAME, mapOf("registrationName" to OnInputKeyPressEvent.EVENT_NAME))
74
+ map.put(OnPasteImagesEvent.EVENT_NAME, mapOf("registrationName" to OnPasteImagesEvent.EVENT_NAME))
75
75
 
76
76
  return map
77
77
  }
@@ -340,6 +340,13 @@ class EnrichedTextInputViewManager :
340
340
  view?.verifyAndToggleStyle(EnrichedSpans.UNORDERED_LIST)
341
341
  }
342
342
 
343
+ override fun toggleCheckboxList(
344
+ view: EnrichedTextInputView?,
345
+ isChecked: Boolean,
346
+ ) {
347
+ view?.toggleCheckboxListItem(isChecked)
348
+ }
349
+
343
350
  override fun addLink(
344
351
  view: EnrichedTextInputView?,
345
352
  start: Int,
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched
1
+ package com.swmansion.enriched.textinput
2
2
 
3
3
  import android.content.Context
4
4
  import android.graphics.Typeface
@@ -15,8 +15,8 @@ import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
15
15
  import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
16
16
  import com.facebook.yoga.YogaMeasureMode
17
17
  import com.facebook.yoga.YogaMeasureOutput
18
- import com.swmansion.enriched.styles.HtmlStyle
19
- import com.swmansion.enriched.utils.EnrichedParser
18
+ import com.swmansion.enriched.common.parser.EnrichedParser
19
+ import com.swmansion.enriched.textinput.styles.HtmlStyle
20
20
  import java.util.concurrent.ConcurrentHashMap
21
21
  import kotlin.math.ceil
22
22
 
@@ -112,7 +112,8 @@ object MeasurementStore {
112
112
 
113
113
  try {
114
114
  val htmlStyle = HtmlStyle(defaultView, props.getMap("htmlStyle"))
115
- val parsed = EnrichedParser.fromHtml(defaultValue, htmlStyle, null)
115
+ val factory = EnrichedTextInputSpannableFactory()
116
+ val parsed = EnrichedParser.fromHtml(defaultValue, htmlStyle, factory)
116
117
  return parsed.trimEnd('\n')
117
118
  } catch (e: Exception) {
118
119
  Log.w("MeasurementStore", "Error parsing initial HTML text: ${e.message}")
@@ -1,8 +1,8 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.ReactContext
4
4
  import com.facebook.react.uimanager.UIManagerHelper
5
- import com.swmansion.enriched.EnrichedTextInputView
5
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
6
6
 
7
7
  class MentionHandler(
8
8
  private val view: EnrichedTextInputView,
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.WritableMap
4
4
  import com.facebook.react.uimanager.events.Event
@@ -1,10 +1,10 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import android.text.Editable
4
4
  import com.facebook.react.bridge.Arguments
5
5
  import com.facebook.react.bridge.WritableMap
6
6
  import com.facebook.react.uimanager.events.Event
7
- import com.swmansion.enriched.utils.EnrichedConstants
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
8
 
9
9
  class OnChangeTextEvent(
10
10
  surfaceId: Int,
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.events
1
+ package com.swmansion.enriched.textinput.events
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap