react-native-enriched 0.2.1 → 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 (263) hide show
  1. package/README.md +21 -16
  2. package/android/build.gradle +77 -72
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -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/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
  8. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
  9. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
  10. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
  11. package/android/gradle.properties +5 -5
  12. package/android/lint.gradle +70 -0
  13. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
  14. package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
  15. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  16. package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
  17. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  18. package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
  19. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  20. package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
  21. package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
  22. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
  24. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  25. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
  26. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
  27. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  31. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  32. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  33. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
  34. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
  35. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  36. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +26 -0
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
  38. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
  39. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  40. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  41. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
  43. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  45. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
  46. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  47. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
  48. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
  49. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  50. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
  51. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
  52. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
  53. package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
  54. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
  55. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
  56. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
  57. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
  58. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
  59. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
  60. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
  61. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
  63. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
  64. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
  65. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  66. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
  67. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  86. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
  87. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  88. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +129 -57
  89. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
  90. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
  91. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
  92. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
  93. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
  94. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
  95. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
  96. package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
  97. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -0
  98. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  99. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  100. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
  101. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
  102. package/android/src/main/new_arch/CMakeLists.txt +7 -1
  103. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  104. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  105. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
  106. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
  107. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
  108. package/ios/EnrichedTextInputView.h +2 -1
  109. package/ios/EnrichedTextInputView.mm +603 -60
  110. package/ios/config/InputConfig.h +28 -0
  111. package/ios/config/InputConfig.mm +237 -8
  112. package/ios/extensions/ImageExtension.h +35 -0
  113. package/ios/extensions/ImageExtension.mm +156 -0
  114. package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
  115. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  116. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  117. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
  118. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
  119. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
  120. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
  121. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
  122. package/ios/inputParser/InputParser.mm +218 -18
  123. package/ios/inputTextView/InputTextView.mm +118 -0
  124. package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
  125. package/ios/interfaces/ImageAttachment.mm +46 -0
  126. package/ios/interfaces/LinkRegexConfig.h +19 -0
  127. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  128. package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
  129. package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
  130. package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
  131. package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
  132. package/ios/styles/BlockQuoteStyle.mm +5 -5
  133. package/ios/styles/BoldStyle.mm +21 -6
  134. package/ios/styles/CheckboxListStyle.mm +321 -0
  135. package/ios/styles/CodeBlockStyle.mm +5 -5
  136. package/ios/styles/H1Style.mm +3 -0
  137. package/ios/styles/H2Style.mm +3 -0
  138. package/ios/styles/H3Style.mm +3 -0
  139. package/ios/styles/H4Style.mm +20 -0
  140. package/ios/styles/H5Style.mm +20 -0
  141. package/ios/styles/H6Style.mm +20 -0
  142. package/ios/styles/HeadingStyleBase.mm +161 -72
  143. package/ios/styles/ImageStyle.mm +5 -5
  144. package/ios/styles/InlineCodeStyle.mm +30 -19
  145. package/ios/styles/ItalicStyle.mm +5 -5
  146. package/ios/styles/LinkStyle.mm +98 -40
  147. package/ios/styles/MentionStyle.mm +4 -4
  148. package/ios/styles/OrderedListStyle.mm +5 -5
  149. package/ios/styles/StrikethroughStyle.mm +5 -5
  150. package/ios/styles/UnderlineStyle.mm +5 -5
  151. package/ios/styles/UnorderedListStyle.mm +5 -5
  152. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  153. package/ios/utils/CheckboxHitTestUtils.mm +123 -0
  154. package/ios/utils/ParagraphAttributesUtils.h +4 -0
  155. package/ios/utils/ParagraphAttributesUtils.mm +142 -45
  156. package/ios/utils/ParagraphsUtils.mm +4 -4
  157. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  158. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  159. package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
  160. package/lib/module/EnrichedTextInput.js +57 -11
  161. package/lib/module/EnrichedTextInput.js.map +1 -1
  162. package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
  163. package/lib/module/types.js +4 -0
  164. package/lib/module/types.js.map +1 -0
  165. package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -0
  166. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  167. package/lib/module/utils/nullthrows.js +9 -0
  168. package/lib/module/utils/nullthrows.js.map +1 -0
  169. package/lib/module/utils/regexParser.js +46 -0
  170. package/lib/module/utils/regexParser.js.map +1 -0
  171. package/lib/typescript/src/EnrichedTextInput.d.ts +20 -51
  172. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  173. package/lib/typescript/src/index.d.ts +2 -1
  174. package/lib/typescript/src/index.d.ts.map +1 -1
  175. package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
  176. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  177. package/lib/typescript/src/types.d.ts +58 -0
  178. package/lib/typescript/src/types.d.ts.map +1 -0
  179. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  180. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  181. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  182. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  183. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  184. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  185. package/package.json +13 -9
  186. package/src/EnrichedTextInput.tsx +88 -63
  187. package/src/index.tsx +5 -1
  188. package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
  189. package/src/types.ts +59 -0
  190. package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
  191. package/src/utils/nullthrows.ts +7 -0
  192. package/src/utils/regexParser.ts +56 -0
  193. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
  194. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
  195. package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
  196. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
  197. package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
  198. package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
  199. package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
  200. package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
  201. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
  202. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
  203. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
  204. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
  205. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
  206. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
  207. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
  208. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
  209. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
  210. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
  211. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
  212. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
  213. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
  214. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
  215. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
  216. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
  217. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
  218. package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
  219. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
  220. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
  221. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
  222. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
  223. package/ios/attachments/ImageAttachment.mm +0 -34
  224. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
  225. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
  226. package/lib/module/normalizeHtmlStyle.js.map +0 -1
  227. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
  228. package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
  229. package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
  230. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  231. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  232. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  233. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  234. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
  235. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
  236. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
  237. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
  238. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
  239. /package/ios/{utils → extensions}/ColorExtension.h +0 -0
  240. /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
  241. /package/ios/{utils → extensions}/FontExtension.h +0 -0
  242. /package/ios/{utils → extensions}/FontExtension.mm +0 -0
  243. /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
  244. /package/ios/{utils → extensions}/StringExtension.h +0 -0
  245. /package/ios/{utils → extensions}/StringExtension.mm +0 -0
  246. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  247. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  248. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  249. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  250. /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
  251. /package/ios/{utils → interfaces}/ImageData.h +0 -0
  252. /package/ios/{utils → interfaces}/ImageData.mm +0 -0
  253. /package/ios/{utils → interfaces}/LinkData.h +0 -0
  254. /package/ios/{utils → interfaces}/LinkData.mm +0 -0
  255. /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
  256. /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
  257. /package/ios/{utils → interfaces}/MentionParams.h +0 -0
  258. /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
  259. /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
  260. /package/ios/{utils → interfaces}/StylePair.h +0 -0
  261. /package/ios/{utils → interfaces}/StylePair.mm +0 -0
  262. /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
  263. /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
@@ -1,28 +1,37 @@
1
- package com.swmansion.enriched.styles
1
+ package com.swmansion.enriched.textinput.styles
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import android.text.SpannableStringBuilder
6
6
  import android.text.Spanned
7
- import com.swmansion.enriched.EnrichedTextInputView
8
- import com.swmansion.enriched.spans.EnrichedImageSpan
9
- import com.swmansion.enriched.spans.EnrichedLinkSpan
10
- import com.swmansion.enriched.spans.EnrichedMentionSpan
11
- import com.swmansion.enriched.spans.EnrichedSpans
12
- import com.swmansion.enriched.utils.getSafeSpanBoundaries
13
-
14
- class ParametrizedStyles(private val view: EnrichedTextInputView) {
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
9
+ import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
10
+ import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
11
+ import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
12
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
13
+ import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
14
+ import com.swmansion.enriched.textinput.utils.removeZWS
15
+
16
+ class ParametrizedStyles(
17
+ private val view: EnrichedTextInputView,
18
+ ) {
15
19
  private var mentionStart: Int? = null
16
20
  private var isSettingLinkSpan = false
17
21
 
18
22
  var mentionIndicators: Array<String> = emptyArray<String>()
19
23
 
20
- fun <T>removeSpansForRange(spannable: Spannable, start: Int, end: Int, clazz: Class<T>): Boolean {
24
+ fun <T> removeSpansForRange(
25
+ spannable: Spannable,
26
+ start: Int,
27
+ end: Int,
28
+ clazz: Class<T>,
29
+ ): Boolean {
21
30
  val ssb = spannable as SpannableStringBuilder
22
31
  val spans = ssb.getSpans(start, end, clazz)
23
32
  if (spans.isEmpty()) return false
24
33
 
25
- ssb.replace(start, end, ssb.substring(start, end).replace("\u200B", ""))
34
+ ssb.removeZWS(start, end)
26
35
 
27
36
  for (span in spans) {
28
37
  ssb.removeSpan(span)
@@ -31,11 +40,16 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
31
40
  return true
32
41
  }
33
42
 
34
- fun setLinkSpan(start: Int, end: Int, text: String, url: String) {
43
+ fun setLinkSpan(
44
+ start: Int,
45
+ end: Int,
46
+ text: String,
47
+ url: String,
48
+ ) {
35
49
  isSettingLinkSpan = true
36
50
 
37
51
  val spannable = view.text as SpannableStringBuilder
38
- val spans = spannable.getSpans(start, end, EnrichedLinkSpan::class.java)
52
+ val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
39
53
  for (span in spans) {
40
54
  spannable.removeSpan(span)
41
55
  }
@@ -47,7 +61,7 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
47
61
  }
48
62
 
49
63
  val spanEnd = start + text.length
50
- val span = EnrichedLinkSpan(url, view.htmlStyle)
64
+ val span = EnrichedInputLinkSpan(url, view.htmlStyle)
51
65
  val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
52
66
  spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
53
67
 
@@ -55,36 +69,66 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
55
69
  isSettingLinkSpan = false
56
70
  }
57
71
 
58
- fun afterTextChanged(s: Editable, endCursorPosition: Int) {
59
- val result = getWordAtIndex(s, endCursorPosition) ?: return
60
-
61
- afterTextChangedLinks(result)
62
- afterTextChangedMentions(result)
72
+ fun afterTextChanged(
73
+ s: Editable,
74
+ startCursorPosition: Int,
75
+ endCursorPosition: Int,
76
+ ) {
77
+ afterTextChangedLinks(startCursorPosition, endCursorPosition)
78
+ afterTextChangedMentions(s, startCursorPosition)
63
79
  }
64
80
 
65
- fun detectAllLinks() {
66
- val spannable = view.text as Spannable
67
-
68
- // TODO: Consider using more reliable regex, this one matches almost anything
69
- val urlPattern = android.util.Patterns.WEB_URL.matcher(spannable)
81
+ fun detectLinksInRange(
82
+ spannable: Spannable,
83
+ start: Int,
84
+ end: Int,
85
+ ) {
86
+ val regex = view.linkRegex ?: return
87
+ val contextText = spannable.subSequence(start, end).toString()
70
88
 
71
- val spans = spannable.getSpans(0, spannable.length, EnrichedLinkSpan::class.java)
89
+ val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
72
90
  for (span in spans) {
73
91
  spannable.removeSpan(span)
74
92
  }
75
93
 
76
- while (urlPattern.find()) {
77
- val word = urlPattern.group()
78
- val start = urlPattern.start()
79
- val end = urlPattern.end()
80
- val span = EnrichedLinkSpan(word, view.htmlStyle)
81
- val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
82
- spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
94
+ val wordsRegex = Regex("\\S+")
95
+ for (wordMatch in wordsRegex.findAll(contextText)) {
96
+ var word = wordMatch.value
97
+ var wordStart = wordMatch.range.first
98
+
99
+ // Do not include zero-width space in link detection
100
+ if (word.startsWith(EnrichedConstants.ZWS_STRING)) {
101
+ word = word.substring(1)
102
+ wordStart += 1
103
+ }
104
+
105
+ // Loop over words and detect links
106
+ val matcher = regex.matcher(word)
107
+ while (matcher.find()) {
108
+ val linkStart = matcher.start()
109
+ val linkEnd = matcher.end()
110
+
111
+ val spanStart = start + wordStart + linkStart
112
+ val spanEnd = start + wordStart + linkEnd
113
+
114
+ val span = EnrichedInputLinkSpan(matcher.group(), view.htmlStyle)
115
+ val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(spanStart, spanEnd)
116
+
117
+ spannable.setSpan(
118
+ span,
119
+ safeStart,
120
+ safeEnd,
121
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,
122
+ )
123
+ }
83
124
  }
84
125
  }
85
126
 
86
- private fun getWordAtIndex(s: CharSequence, index: Int): TextRange? {
87
- if (index < 0 ) return null
127
+ private fun getWordAtIndex(
128
+ s: CharSequence,
129
+ index: Int,
130
+ ): TextRange? {
131
+ if (index < 0) return null
88
132
 
89
133
  var start = index
90
134
  var end = index
@@ -102,8 +146,31 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
102
146
  return TextRange(result, start, end)
103
147
  }
104
148
 
149
+ // After editing text we want to automatically detect links in the affected range
150
+ // Affected range is range + previous word + next word
151
+ private fun getLinksAffectedRange(
152
+ s: CharSequence,
153
+ start: Int,
154
+ end: Int,
155
+ ): IntRange {
156
+ var actualStart = start
157
+ var actualEnd = end
158
+
159
+ // Expand backward to find the start of the first affected word
160
+ while (actualStart > 0 && !Character.isWhitespace(s[actualStart - 1])) {
161
+ actualStart--
162
+ }
163
+
164
+ // Expand forward to find the end of the last affected word
165
+ while (actualEnd < s.length && !Character.isWhitespace(s[actualEnd])) {
166
+ actualEnd++
167
+ }
168
+
169
+ return actualStart..actualEnd
170
+ }
171
+
105
172
  private fun canLinkBeApplied(): Boolean {
106
- val mergingConfig = EnrichedSpans.getMergingConfigForStyle(EnrichedSpans.LINK, view.htmlStyle)?: return true
173
+ val mergingConfig = EnrichedSpans.getMergingConfigForStyle(EnrichedSpans.LINK, view.htmlStyle) ?: return true
107
174
  val conflictingStyles = mergingConfig.conflictingStyles
108
175
  val blockingStyles = mergingConfig.blockingStyles
109
176
 
@@ -118,36 +185,31 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
118
185
  return true
119
186
  }
120
187
 
121
- private fun afterTextChangedLinks(result: TextRange) {
188
+ private fun afterTextChangedLinks(
189
+ editStart: Int,
190
+ editEnd: Int,
191
+ ) {
122
192
  // Do not detect link if it's applied manually
123
193
  if (isSettingLinkSpan || !canLinkBeApplied()) return
124
194
 
125
- val spannable = view.text as Spannable
126
- val (word, start, end) = result
127
-
128
- // TODO: Consider using more reliable regex, this one matches almost anything
129
- val urlPattern = android.util.Patterns.WEB_URL.matcher(word)
130
- val spans = spannable.getSpans(start, end, EnrichedLinkSpan::class.java)
131
- for (span in spans) {
132
- spannable.removeSpan(span)
133
- }
134
-
135
- if (urlPattern.matches()) {
136
- val span = EnrichedLinkSpan(word, view.htmlStyle)
137
- val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
138
- spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
139
- }
195
+ val spannable = view.text as? Spannable ?: return
196
+ val affectedRange = getLinksAffectedRange(spannable, editStart, editEnd)
197
+ detectLinksInRange(spannable, affectedRange.first, affectedRange.last)
140
198
  }
141
199
 
142
- private fun afterTextChangedMentions(currentWord: TextRange) {
200
+ private fun afterTextChangedMentions(
201
+ s: CharSequence,
202
+ endCursorPosition: Int,
203
+ ) {
143
204
  val mentionHandler = view.mentionHandler ?: return
205
+ val currentWord = getWordAtIndex(s, endCursorPosition) ?: return
144
206
  val spannable = view.text as Spannable
145
207
 
146
208
  val indicatorsPattern = mentionIndicators.joinToString("|") { Regex.escape(it) }
147
209
  val mentionIndicatorRegex = Regex("^($indicatorsPattern)")
148
- val mentionRegex= Regex("^($indicatorsPattern)\\w*")
210
+ val mentionRegex = Regex("^($indicatorsPattern)\\w*")
149
211
 
150
- val spans = spannable.getSpans(currentWord.start, currentWord.end, EnrichedMentionSpan::class.java)
212
+ val spans = spannable.getSpans(currentWord.start, currentWord.end, EnrichedInputMentionSpan::class.java)
151
213
  for (span in spans) {
152
214
  spannable.removeSpan(span)
153
215
  }
@@ -192,24 +254,28 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
192
254
  mentionHandler.onMention(indicator, text)
193
255
  }
194
256
 
195
- fun setImageSpan(src: String, width: Float, height: Float) {
257
+ fun setImageSpan(
258
+ src: String,
259
+ width: Float,
260
+ height: Float,
261
+ ) {
196
262
  if (view.selection == null) return
197
263
  val spannable = view.text as SpannableStringBuilder
198
264
  val (start, originalEnd) = view.selection.getInlineSelection()
199
265
 
200
266
  if (start == originalEnd) {
201
- spannable.insert(start, "\uFFFC")
267
+ spannable.insert(start, EnrichedConstants.ORC_STRING)
202
268
  } else {
203
- val spans = spannable.getSpans(start, originalEnd, EnrichedImageSpan::class.java)
269
+ val spans = spannable.getSpans(start, originalEnd, EnrichedInputImageSpan::class.java)
204
270
  for (s in spans) {
205
271
  spannable.removeSpan(s)
206
272
  }
207
273
 
208
- spannable.replace(start, originalEnd, "\uFFFC")
274
+ spannable.replace(start, originalEnd, EnrichedConstants.ORC_STRING)
209
275
  }
210
276
 
211
277
  val (imageStart, imageEnd) = spannable.getSafeSpanBoundaries(start, start + 1)
212
- val span = EnrichedImageSpan.createEnrichedImageSpan(src, width.toInt(), height.toInt())
278
+ val span = EnrichedInputImageSpan.createEnrichedImageSpan(src, width.toInt(), height.toInt())
213
279
  span.observeAsyncDrawableLoaded(view.text)
214
280
 
215
281
  spannable.setSpan(span, imageStart, imageEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
@@ -228,12 +294,16 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
228
294
  }
229
295
  }
230
296
 
231
- fun setMentionSpan(indicator: String, text: String, attributes: Map<String, String>) {
297
+ fun setMentionSpan(
298
+ indicator: String,
299
+ text: String,
300
+ attributes: Map<String, String>,
301
+ ) {
232
302
  val selection = view.selection ?: return
233
303
 
234
304
  val spannable = view.text as SpannableStringBuilder
235
305
  val (selectionStart, selectionEnd) = selection.getInlineSelection()
236
- val spans = spannable.getSpans(selectionStart, selectionEnd, EnrichedMentionSpan::class.java)
306
+ val spans = spannable.getSpans(selectionStart, selectionEnd, EnrichedInputMentionSpan::class.java)
237
307
 
238
308
  for (span in spans) {
239
309
  spannable.removeSpan(span)
@@ -244,7 +314,7 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
244
314
  view.runAsATransaction {
245
315
  spannable.replace(start, selectionEnd, text)
246
316
 
247
- val span = EnrichedMentionSpan(text, indicator, attributes, view.htmlStyle)
317
+ val span = EnrichedInputMentionSpan(text, indicator, attributes, view.htmlStyle)
248
318
  val spanEnd = start + text.length
249
319
  val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
250
320
  spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
@@ -259,17 +329,23 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
259
329
  view.selection.validateStyles()
260
330
  }
261
331
 
262
- fun getStyleRange(): Pair<Int, Int> {
263
- return view.selection?.getInlineSelection() ?: Pair(0, 0)
264
- }
332
+ fun getStyleRange(): Pair<Int, Int> = view.selection?.getInlineSelection() ?: Pair(0, 0)
265
333
 
266
- fun removeStyle(name: String, start: Int, end: Int): Boolean {
334
+ fun removeStyle(
335
+ name: String,
336
+ start: Int,
337
+ end: Int,
338
+ ): Boolean {
267
339
  val config = EnrichedSpans.parametrizedStyles[name] ?: return false
268
340
  val spannable = view.text as Spannable
269
341
  return removeSpansForRange(spannable, start, end, config.clazz)
270
342
  }
271
343
 
272
344
  companion object {
273
- data class TextRange(val text: String, val start: Int, val end: Int)
345
+ data class TextRange(
346
+ val text: String,
347
+ val start: Int,
348
+ val end: Int,
349
+ )
274
350
  }
275
351
  }
@@ -0,0 +1,17 @@
1
+ package com.swmansion.enriched.textinput.utils
2
+
3
+ import android.text.Editable
4
+ import android.text.Spannable
5
+ import android.text.SpannableStringBuilder
6
+ import com.swmansion.enriched.textinput.watchers.EnrichedSpanWatcher
7
+
8
+ class EnrichedEditableFactory(
9
+ private val watcher: EnrichedSpanWatcher,
10
+ ) : Editable.Factory() {
11
+ override fun newEditable(source: CharSequence): Editable {
12
+ val s = source as? SpannableStringBuilder ?: SpannableStringBuilder(source)
13
+ s.removeSpan(watcher)
14
+ s.setSpan(watcher, 0, s.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
15
+ return s
16
+ }
17
+ }
@@ -1,26 +1,32 @@
1
- package com.swmansion.enriched.utils
1
+ package com.swmansion.enriched.textinput.utils
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import com.facebook.react.bridge.ReactContext
6
6
  import com.facebook.react.uimanager.UIManagerHelper
7
- import com.swmansion.enriched.EnrichedTextInputView
8
- import com.swmansion.enriched.events.OnChangeSelectionEvent
9
- import com.swmansion.enriched.events.OnLinkDetectedEvent
10
- import com.swmansion.enriched.events.OnMentionDetectedEvent
11
- import com.swmansion.enriched.spans.EnrichedLinkSpan
12
- import com.swmansion.enriched.spans.EnrichedMentionSpan
13
- import com.swmansion.enriched.spans.EnrichedSpans
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
9
+ import com.swmansion.enriched.textinput.events.OnChangeSelectionEvent
10
+ import com.swmansion.enriched.textinput.events.OnLinkDetectedEvent
11
+ import com.swmansion.enriched.textinput.events.OnMentionDetectedEvent
12
+ import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
13
+ import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
14
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
14
15
  import org.json.JSONObject
15
16
 
16
- class EnrichedSelection(private val view: EnrichedTextInputView) {
17
+ class EnrichedSelection(
18
+ private val view: EnrichedTextInputView,
19
+ ) {
17
20
  var start: Int = 0
18
21
  var end: Int = 0
19
22
 
20
23
  private var previousLinkDetectedEvent: MutableMap<String, String> = mutableMapOf("text" to "", "url" to "")
21
24
  private var previousMentionDetectedEvent: MutableMap<String, String> = mutableMapOf("text" to "", "payload" to "")
22
25
 
23
- fun onSelection(selStart: Int, selEnd: Int) {
26
+ fun onSelection(
27
+ selStart: Int,
28
+ selEnd: Int,
29
+ ) {
24
30
  var shouldValidateStyles = false
25
31
  var newStart = start
26
32
  var newEnd = end
@@ -52,19 +58,23 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
52
58
  emitSelectionChangeEvent(view.text, finalStart, finalEnd)
53
59
  }
54
60
 
55
- private fun isZeroWidthSelection(start: Int, end: Int): Boolean {
61
+ private fun isZeroWidthSelection(
62
+ start: Int,
63
+ end: Int,
64
+ ): Boolean {
56
65
  val text = view.text ?: return false
57
66
 
58
67
  if (start != end) {
59
- return text.substring(start, end) == "\u200B"
68
+ return text.substring(start, end) == EnrichedConstants.ZWS_STRING
60
69
  }
61
70
 
62
- val isNewLine = if (start > 0 ) text.substring(start - 1, start) == "\n" else true
63
- val isNextCharacterZeroWidth = if (start < text.length) {
64
- text.substring(start, start + 1) == "\u200B"
65
- } else {
66
- false
67
- }
71
+ val isNewLine = if (start > 0) text.substring(start - 1, start) == "\n" else true
72
+ val isNextCharacterZeroWidth =
73
+ if (start < text.length) {
74
+ text.substring(start, start + 1) == EnrichedConstants.ZWS_STRING
75
+ } else {
76
+ false
77
+ }
68
78
 
69
79
  return isNewLine && isNextCharacterZeroWidth
70
80
  }
@@ -103,7 +113,7 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
103
113
  return Pair(finalStart, finalEnd)
104
114
  }
105
115
 
106
- private fun <T>getInlineStyleStart(type: Class<T>): Int? {
116
+ private fun <T> getInlineStyleStart(type: Class<T>): Int? {
107
117
  val (start, end) = getInlineSelection()
108
118
  val spannable = view.text as Spannable
109
119
  val spans = spannable.getSpans(start, end, type)
@@ -129,7 +139,7 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
129
139
  return spannable.getParagraphBounds(currentStart, currentEnd)
130
140
  }
131
141
 
132
- private fun <T>getParagraphStyleStart(type: Class<T>): Int? {
142
+ private fun <T> getParagraphStyleStart(type: Class<T>): Int? {
133
143
  val (start, end) = getParagraphSelection()
134
144
  val spannable = view.text as Spannable
135
145
  val spans = spannable.getSpans(start, end, type)
@@ -148,7 +158,7 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
148
158
  return styleStart
149
159
  }
150
160
 
151
- private fun <T>getListStyleStart(type: Class<T>): Int? {
161
+ private fun <T> getListStyleStart(type: Class<T>): Int? {
152
162
  val (start, end) = getParagraphSelection()
153
163
  val spannable = view.text as Spannable
154
164
  var styleStart: Int? = null
@@ -177,12 +187,12 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
177
187
  return styleStart
178
188
  }
179
189
 
180
- private fun <T>getParametrizedStyleStart(type: Class<T>): Int? {
190
+ private fun <T> getParametrizedStyleStart(type: Class<T>): Int? {
181
191
  val (start, end) = getInlineSelection()
182
192
  val spannable = view.text as Spannable
183
193
  val spans = spannable.getSpans(start, end, type)
184
- val isLinkType = type == EnrichedLinkSpan::class.java
185
- val isMentionType = type == EnrichedMentionSpan::class.java
194
+ val isLinkType = type == EnrichedInputLinkSpan::class.java
195
+ val isMentionType = type == EnrichedInputMentionSpan::class.java
186
196
 
187
197
  if (isLinkType && spans.isEmpty()) {
188
198
  emitLinkDetectedEvent(spannable, null, start, end)
@@ -199,9 +209,9 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
199
209
  val spanEnd = spannable.getSpanEnd(span)
200
210
 
201
211
  if (start >= spanStart && end <= spanEnd) {
202
- if (isLinkType && span is EnrichedLinkSpan) {
212
+ if (isLinkType && span is EnrichedInputLinkSpan) {
203
213
  emitLinkDetectedEvent(spannable, span, spanStart, spanEnd)
204
- } else if (isMentionType && span is EnrichedMentionSpan) {
214
+ } else if (isMentionType && span is EnrichedInputMentionSpan) {
205
215
  emitMentionDetectedEvent(spannable, span, spanStart, spanEnd)
206
216
  }
207
217
 
@@ -212,7 +222,11 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
212
222
  return null
213
223
  }
214
224
 
215
- private fun emitSelectionChangeEvent(editable: Editable?, start: Int, end: Int) {
225
+ private fun emitSelectionChangeEvent(
226
+ editable: Editable?,
227
+ start: Int,
228
+ end: Int,
229
+ ) {
216
230
  if (editable == null) return
217
231
 
218
232
  val context = view.context as ReactContext
@@ -220,17 +234,24 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
220
234
  val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
221
235
 
222
236
  val text = editable.substring(start, end)
223
- dispatcher?.dispatchEvent(OnChangeSelectionEvent(
224
- surfaceId,
225
- view.id,
226
- text,
227
- start ,
228
- end,
229
- view.experimentalSynchronousEvents,
230
- ))
237
+ dispatcher?.dispatchEvent(
238
+ OnChangeSelectionEvent(
239
+ surfaceId,
240
+ view.id,
241
+ text,
242
+ start,
243
+ end,
244
+ view.experimentalSynchronousEvents,
245
+ ),
246
+ )
231
247
  }
232
248
 
233
- private fun emitLinkDetectedEvent(spannable: Spannable, span: EnrichedLinkSpan?, start: Int, end: Int) {
249
+ private fun emitLinkDetectedEvent(
250
+ spannable: Spannable,
251
+ span: EnrichedInputLinkSpan?,
252
+ start: Int,
253
+ end: Int,
254
+ ) {
234
255
  val text = spannable.substring(start, end)
235
256
  val url = span?.getUrl() ?: ""
236
257
 
@@ -243,18 +264,25 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
243
264
  val context = view.context as ReactContext
244
265
  val surfaceId = UIManagerHelper.getSurfaceId(context)
245
266
  val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
246
- dispatcher?.dispatchEvent(OnLinkDetectedEvent(
247
- surfaceId,
248
- view.id,
249
- text,
250
- url,
251
- start,
252
- end,
253
- view.experimentalSynchronousEvents,
254
- ))
267
+ dispatcher?.dispatchEvent(
268
+ OnLinkDetectedEvent(
269
+ surfaceId,
270
+ view.id,
271
+ text,
272
+ url,
273
+ start,
274
+ end,
275
+ view.experimentalSynchronousEvents,
276
+ ),
277
+ )
255
278
  }
256
279
 
257
- private fun emitMentionDetectedEvent(spannable: Spannable, span: EnrichedMentionSpan?, start: Int, end: Int) {
280
+ private fun emitMentionDetectedEvent(
281
+ spannable: Spannable,
282
+ span: EnrichedInputMentionSpan?,
283
+ start: Int,
284
+ end: Int,
285
+ ) {
258
286
  val text = spannable.substring(start, end)
259
287
  val attributes = span?.getAttributes() ?: emptyMap()
260
288
  val indicator = span?.getIndicator() ?: ""
@@ -273,13 +301,15 @@ class EnrichedSelection(private val view: EnrichedTextInputView) {
273
301
  val context = view.context as ReactContext
274
302
  val surfaceId = UIManagerHelper.getSurfaceId(context)
275
303
  val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
276
- dispatcher?.dispatchEvent(OnMentionDetectedEvent(
277
- surfaceId,
278
- view.id,
279
- text,
280
- indicator,
281
- payload,
282
- view.experimentalSynchronousEvents,
283
- ))
304
+ dispatcher?.dispatchEvent(
305
+ OnMentionDetectedEvent(
306
+ surfaceId,
307
+ view.id,
308
+ text,
309
+ indicator,
310
+ payload,
311
+ view.experimentalSynchronousEvents,
312
+ ),
313
+ )
284
314
  }
285
315
  }