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,8 +1,10 @@
1
- package com.swmansion.enriched
1
+ package com.swmansion.enriched.textinput
2
2
 
3
3
  import com.facebook.react.bridge.Arguments
4
4
 
5
- class EnrichedTextInputViewLayoutManager(private val view: EnrichedTextInputView) {
5
+ class EnrichedTextInputViewLayoutManager(
6
+ private val view: EnrichedTextInputView,
7
+ ) {
6
8
  private var forceHeightRecalculationCounter: Int = 0
7
9
 
8
10
  fun invalidateLayout() {
@@ -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,37 +15,34 @@ 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.OnInputBlurEvent
19
- import com.swmansion.enriched.events.OnChangeHtmlEvent
20
- import com.swmansion.enriched.events.OnChangeSelectionEvent
21
- import com.swmansion.enriched.events.OnChangeStateEvent
22
- import com.swmansion.enriched.events.OnChangeTextEvent
23
- import com.swmansion.enriched.events.OnInputFocusEvent
24
- import com.swmansion.enriched.events.OnLinkDetectedEvent
25
- import com.swmansion.enriched.events.OnMentionDetectedEvent
26
- import com.swmansion.enriched.events.OnMentionEvent
27
- import com.swmansion.enriched.events.OnRequestHtmlResultEvent
28
- import com.swmansion.enriched.spans.EnrichedSpans
29
- import com.swmansion.enriched.styles.HtmlStyle
30
- 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
31
33
 
32
34
  @ReactModule(name = EnrichedTextInputViewManager.NAME)
33
- class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
35
+ class EnrichedTextInputViewManager :
36
+ SimpleViewManager<EnrichedTextInputView>(),
34
37
  EnrichedTextInputViewManagerInterface<EnrichedTextInputView> {
35
38
  private val mDelegate: ViewManagerDelegate<EnrichedTextInputView> =
36
39
  EnrichedTextInputViewManagerDelegate(this)
37
40
 
38
- override fun getDelegate(): ViewManagerDelegate<EnrichedTextInputView>? {
39
- return mDelegate
40
- }
41
+ override fun getDelegate(): ViewManagerDelegate<EnrichedTextInputView>? = mDelegate
41
42
 
42
- override fun getName(): String {
43
- return NAME
44
- }
43
+ override fun getName(): String = NAME
45
44
 
46
- public override fun createViewInstance(context: ThemedReactContext): EnrichedTextInputView {
47
- return EnrichedTextInputView(context)
48
- }
45
+ public override fun createViewInstance(context: ThemedReactContext): EnrichedTextInputView = EnrichedTextInputView(context)
49
46
 
50
47
  override fun onDropViewInstance(view: EnrichedTextInputView) {
51
48
  super.onDropViewInstance(view)
@@ -55,65 +52,91 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
55
52
  override fun updateState(
56
53
  view: EnrichedTextInputView,
57
54
  props: ReactStylesDiffMap?,
58
- stateWrapper: StateWrapper?
55
+ stateWrapper: StateWrapper?,
59
56
  ): Any? {
60
57
  view.stateWrapper = stateWrapper
61
58
  return super.updateState(view, props, stateWrapper)
62
59
  }
63
60
 
64
- override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> {
65
- val map = mutableMapOf<String, Any>()
66
- map.put(OnInputFocusEvent.EVENT_NAME, mapOf("registrationName" to OnInputFocusEvent.EVENT_NAME))
67
- map.put(OnInputBlurEvent.EVENT_NAME, mapOf("registrationName" to OnInputBlurEvent.EVENT_NAME))
68
- map.put(OnChangeTextEvent.EVENT_NAME, mapOf("registrationName" to OnChangeTextEvent.EVENT_NAME))
69
- map.put(OnChangeHtmlEvent.EVENT_NAME, mapOf("registrationName" to OnChangeHtmlEvent.EVENT_NAME))
70
- map.put(OnChangeStateEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateEvent.EVENT_NAME))
71
- map.put(OnLinkDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnLinkDetectedEvent.EVENT_NAME))
72
- map.put(OnMentionDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnMentionDetectedEvent.EVENT_NAME))
73
- map.put(OnMentionEvent.EVENT_NAME, mapOf("registrationName" to OnMentionEvent.EVENT_NAME))
74
- map.put(OnChangeSelectionEvent.EVENT_NAME, mapOf("registrationName" to OnChangeSelectionEvent.EVENT_NAME))
75
- map.put(OnRequestHtmlResultEvent.EVENT_NAME, mapOf("registrationName" to OnRequestHtmlResultEvent.EVENT_NAME))
61
+ override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Any> {
62
+ val map = mutableMapOf<String, Any>()
63
+ map.put(OnInputFocusEvent.EVENT_NAME, mapOf("registrationName" to OnInputFocusEvent.EVENT_NAME))
64
+ map.put(OnInputBlurEvent.EVENT_NAME, mapOf("registrationName" to OnInputBlurEvent.EVENT_NAME))
65
+ map.put(OnChangeTextEvent.EVENT_NAME, mapOf("registrationName" to OnChangeTextEvent.EVENT_NAME))
66
+ map.put(OnChangeHtmlEvent.EVENT_NAME, mapOf("registrationName" to OnChangeHtmlEvent.EVENT_NAME))
67
+ map.put(OnChangeStateEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateEvent.EVENT_NAME))
68
+ map.put(OnLinkDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnLinkDetectedEvent.EVENT_NAME))
69
+ map.put(OnMentionDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnMentionDetectedEvent.EVENT_NAME))
70
+ map.put(OnMentionEvent.EVENT_NAME, mapOf("registrationName" to OnMentionEvent.EVENT_NAME))
71
+ map.put(OnChangeSelectionEvent.EVENT_NAME, mapOf("registrationName" to OnChangeSelectionEvent.EVENT_NAME))
72
+ map.put(OnRequestHtmlResultEvent.EVENT_NAME, mapOf("registrationName" to OnRequestHtmlResultEvent.EVENT_NAME))
73
+ map.put(OnInputKeyPressEvent.EVENT_NAME, mapOf("registrationName" to OnInputKeyPressEvent.EVENT_NAME))
74
+ map.put(OnPasteImagesEvent.EVENT_NAME, mapOf("registrationName" to OnPasteImagesEvent.EVENT_NAME))
76
75
 
77
- return map
78
- }
76
+ return map
77
+ }
79
78
 
80
79
  @ReactProp(name = "defaultValue")
81
- override fun setDefaultValue(view: EnrichedTextInputView?, value: String?) {
80
+ override fun setDefaultValue(
81
+ view: EnrichedTextInputView?,
82
+ value: String?,
83
+ ) {
82
84
  view?.setDefaultValue(value)
83
85
  }
84
86
 
85
87
  @ReactProp(name = "placeholder")
86
- override fun setPlaceholder(view: EnrichedTextInputView?, value: String?) {
88
+ override fun setPlaceholder(
89
+ view: EnrichedTextInputView?,
90
+ value: String?,
91
+ ) {
87
92
  view?.setPlaceholder(value)
88
93
  }
89
94
 
90
95
  @ReactProp(name = "placeholderTextColor", customType = "Color")
91
- override fun setPlaceholderTextColor(view: EnrichedTextInputView?, color: Int?) {
96
+ override fun setPlaceholderTextColor(
97
+ view: EnrichedTextInputView?,
98
+ color: Int?,
99
+ ) {
92
100
  view?.setPlaceholderTextColor(color)
93
101
  }
94
102
 
95
103
  @ReactProp(name = "cursorColor", customType = "Color")
96
- override fun setCursorColor(view: EnrichedTextInputView?, color: Int?) {
104
+ override fun setCursorColor(
105
+ view: EnrichedTextInputView?,
106
+ color: Int?,
107
+ ) {
97
108
  view?.setCursorColor(color)
98
109
  }
99
110
 
100
111
  @ReactProp(name = "selectionColor", customType = "Color")
101
- override fun setSelectionColor(view: EnrichedTextInputView?, color: Int?) {
112
+ override fun setSelectionColor(
113
+ view: EnrichedTextInputView?,
114
+ color: Int?,
115
+ ) {
102
116
  view?.setSelectionColor(color)
103
117
  }
104
118
 
105
119
  @ReactProp(name = "autoFocus", defaultBoolean = false)
106
- override fun setAutoFocus(view: EnrichedTextInputView?, autoFocus: Boolean) {
120
+ override fun setAutoFocus(
121
+ view: EnrichedTextInputView?,
122
+ autoFocus: Boolean,
123
+ ) {
107
124
  view?.setAutoFocus(autoFocus)
108
125
  }
109
126
 
110
127
  @ReactProp(name = "editable", defaultBoolean = true)
111
- override fun setEditable(view: EnrichedTextInputView?, editable: Boolean) {
128
+ override fun setEditable(
129
+ view: EnrichedTextInputView?,
130
+ editable: Boolean,
131
+ ) {
112
132
  view?.isEnabled = editable
113
133
  }
114
134
 
115
135
  @ReactProp(name = "mentionIndicators")
116
- override fun setMentionIndicators(view: EnrichedTextInputView?, indicators: ReadableArray?) {
136
+ override fun setMentionIndicators(
137
+ view: EnrichedTextInputView?,
138
+ indicators: ReadableArray?,
139
+ ) {
117
140
  if (indicators == null) return
118
141
 
119
142
  val indicatorsList = mutableListOf<String>()
@@ -127,37 +150,58 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
127
150
  }
128
151
 
129
152
  @ReactProp(name = "htmlStyle")
130
- override fun setHtmlStyle(view: EnrichedTextInputView?, style: ReadableMap?) {
153
+ override fun setHtmlStyle(
154
+ view: EnrichedTextInputView?,
155
+ style: ReadableMap?,
156
+ ) {
131
157
  view?.htmlStyle = HtmlStyle(view, style)
132
158
  }
133
159
 
134
160
  @ReactProp(name = ViewProps.COLOR, customType = "Color")
135
- override fun setColor(view: EnrichedTextInputView?, color: Int?) {
161
+ override fun setColor(
162
+ view: EnrichedTextInputView?,
163
+ color: Int?,
164
+ ) {
136
165
  view?.setColor(color)
137
166
  }
138
167
 
139
168
  @ReactProp(name = "fontSize", defaultFloat = ViewDefaults.FONT_SIZE_SP)
140
- override fun setFontSize(view: EnrichedTextInputView?, size: Float) {
169
+ override fun setFontSize(
170
+ view: EnrichedTextInputView?,
171
+ size: Float,
172
+ ) {
141
173
  view?.setFontSize(size)
142
174
  }
143
175
 
144
176
  @ReactProp(name = "fontFamily")
145
- override fun setFontFamily(view: EnrichedTextInputView?, family: String?) {
177
+ override fun setFontFamily(
178
+ view: EnrichedTextInputView?,
179
+ family: String?,
180
+ ) {
146
181
  view?.setFontFamily(family)
147
182
  }
148
183
 
149
184
  @ReactProp(name = "fontWeight")
150
- override fun setFontWeight(view: EnrichedTextInputView?, weight: String?) {
185
+ override fun setFontWeight(
186
+ view: EnrichedTextInputView?,
187
+ weight: String?,
188
+ ) {
151
189
  view?.setFontWeight(weight)
152
190
  }
153
191
 
154
192
  @ReactProp(name = "fontStyle")
155
- override fun setFontStyle(view: EnrichedTextInputView?, style: String?) {
193
+ override fun setFontStyle(
194
+ view: EnrichedTextInputView?,
195
+ style: String?,
196
+ ) {
156
197
  view?.setFontStyle(style)
157
198
  }
158
199
 
159
200
  @ReactProp(name = "scrollEnabled")
160
- override fun setScrollEnabled(view: EnrichedTextInputView, scrollEnabled: Boolean) {
201
+ override fun setScrollEnabled(
202
+ view: EnrichedTextInputView,
203
+ scrollEnabled: Boolean,
204
+ ) {
161
205
  view.scrollEnabled = scrollEnabled
162
206
  }
163
207
 
@@ -171,24 +215,44 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
171
215
  left: Int,
172
216
  top: Int,
173
217
  right: Int,
174
- bottom: Int
218
+ bottom: Int,
175
219
  ) {
176
220
  super.setPadding(view, left, top, right, bottom)
177
221
 
178
222
  view?.setPadding(left, top, right, bottom)
179
223
  }
180
224
 
181
- override fun setIsOnChangeHtmlSet(view: EnrichedTextInputView?, value: Boolean) {
225
+ override fun setIsOnChangeHtmlSet(
226
+ view: EnrichedTextInputView?,
227
+ value: Boolean,
228
+ ) {
182
229
  view?.shouldEmitHtml = value
183
230
  }
184
231
 
185
- override fun setAutoCapitalize(view: EnrichedTextInputView?, flag: String?) {
232
+ override fun setIsOnChangeTextSet(
233
+ view: EnrichedTextInputView?,
234
+ value: Boolean,
235
+ ) {
236
+ view?.shouldEmitOnChangeText = value
237
+ }
238
+
239
+ override fun setAutoCapitalize(
240
+ view: EnrichedTextInputView?,
241
+ flag: String?,
242
+ ) {
186
243
  view?.setAutoCapitalize(flag)
187
244
  }
188
245
 
246
+ override fun setLinkRegex(
247
+ view: EnrichedTextInputView?,
248
+ config: ReadableMap?,
249
+ ) {
250
+ view?.setLinkRegex(config)
251
+ }
252
+
189
253
  override fun setAndroidExperimentalSynchronousEvents(
190
254
  view: EnrichedTextInputView?,
191
- value: Boolean
255
+ value: Boolean,
192
256
  ) {
193
257
  view?.experimentalSynchronousEvents = value
194
258
  }
@@ -201,10 +265,21 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
201
265
  view?.clearFocus()
202
266
  }
203
267
 
204
- override fun setValue(view: EnrichedTextInputView?, text: String) {
268
+ override fun setValue(
269
+ view: EnrichedTextInputView?,
270
+ text: String,
271
+ ) {
205
272
  view?.setValue(text)
206
273
  }
207
274
 
275
+ override fun setSelection(
276
+ view: EnrichedTextInputView?,
277
+ start: Int,
278
+ end: Int,
279
+ ) {
280
+ view?.setCustomSelection(start, end)
281
+ }
282
+
208
283
  override fun toggleBold(view: EnrichedTextInputView?) {
209
284
  view?.verifyAndToggleStyle(EnrichedSpans.BOLD)
210
285
  }
@@ -237,6 +312,18 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
237
312
  view?.verifyAndToggleStyle(EnrichedSpans.H3)
238
313
  }
239
314
 
315
+ override fun toggleH4(view: EnrichedTextInputView?) {
316
+ view?.verifyAndToggleStyle(EnrichedSpans.H4)
317
+ }
318
+
319
+ override fun toggleH5(view: EnrichedTextInputView?) {
320
+ view?.verifyAndToggleStyle(EnrichedSpans.H5)
321
+ }
322
+
323
+ override fun toggleH6(view: EnrichedTextInputView?) {
324
+ view?.verifyAndToggleStyle(EnrichedSpans.H6)
325
+ }
326
+
240
327
  override fun toggleCodeBlock(view: EnrichedTextInputView?) {
241
328
  view?.verifyAndToggleStyle(EnrichedSpans.CODE_BLOCK)
242
329
  }
@@ -253,24 +340,53 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
253
340
  view?.verifyAndToggleStyle(EnrichedSpans.UNORDERED_LIST)
254
341
  }
255
342
 
256
- override fun addLink(view: EnrichedTextInputView?, start: Int, end: Int, text: String, url: String) {
343
+ override fun toggleCheckboxList(
344
+ view: EnrichedTextInputView?,
345
+ isChecked: Boolean,
346
+ ) {
347
+ view?.toggleCheckboxListItem(isChecked)
348
+ }
349
+
350
+ override fun addLink(
351
+ view: EnrichedTextInputView?,
352
+ start: Int,
353
+ end: Int,
354
+ text: String,
355
+ url: String,
356
+ ) {
257
357
  view?.addLink(start, end, text, url)
258
358
  }
259
359
 
260
- override fun addImage(view: EnrichedTextInputView?, src: String, width: Float, height: Float) {
360
+ override fun addImage(
361
+ view: EnrichedTextInputView?,
362
+ src: String,
363
+ width: Float,
364
+ height: Float,
365
+ ) {
261
366
  view?.addImage(src, width, height)
262
367
  }
263
368
 
264
- override fun startMention(view: EnrichedTextInputView?, indicator: String) {
369
+ override fun startMention(
370
+ view: EnrichedTextInputView?,
371
+ indicator: String,
372
+ ) {
265
373
  view?.startMention(indicator)
266
374
  }
267
375
 
268
- override fun addMention(view: EnrichedTextInputView?, indicator: String, text: String, payload: String) {
376
+ override fun addMention(
377
+ view: EnrichedTextInputView?,
378
+ indicator: String,
379
+ text: String,
380
+ payload: String,
381
+ ) {
269
382
  val attributes = jsonStringToStringMap(payload)
270
383
  view?.addMention(text, indicator, attributes)
271
384
  }
272
385
 
273
- override fun requestHTML(view: EnrichedTextInputView?, requestId: Int) {
386
+ override fun requestHTML(
387
+ view: EnrichedTextInputView?,
388
+ requestId: Int,
389
+ ) {
274
390
  view?.requestHTML(requestId)
275
391
  }
276
392
 
@@ -283,10 +399,10 @@ class EnrichedTextInputViewManager : SimpleViewManager<EnrichedTextInputView>(),
283
399
  widthMode: YogaMeasureMode?,
284
400
  height: Float,
285
401
  heightMode: YogaMeasureMode?,
286
- attachmentsPositions: FloatArray?
402
+ attachmentsPositions: FloatArray?,
287
403
  ): Long {
288
404
  val id = localData?.getInt("viewTag")
289
- return MeasurementStore.getMeasureById(context, id, width, props)
405
+ return MeasurementStore.getMeasureById(context, id, width, height, heightMode, props)
290
406
  }
291
407
 
292
408
  companion object {
@@ -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
@@ -13,9 +13,10 @@ import com.facebook.react.uimanager.PixelUtil
13
13
  import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
14
14
  import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
15
15
  import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
16
+ import com.facebook.yoga.YogaMeasureMode
16
17
  import com.facebook.yoga.YogaMeasureOutput
17
- import com.swmansion.enriched.styles.HtmlStyle
18
- import com.swmansion.enriched.utils.EnrichedParser
18
+ import com.swmansion.enriched.common.parser.EnrichedParser
19
+ import com.swmansion.enriched.textinput.styles.HtmlStyle
19
20
  import java.util.concurrent.ConcurrentHashMap
20
21
  import kotlin.math.ceil
21
22
 
@@ -27,17 +28,19 @@ object MeasurementStore {
27
28
 
28
29
  data class MeasurementParams(
29
30
  val initialized: Boolean,
30
-
31
31
  val cachedWidth: Float,
32
32
  val cachedSize: Long,
33
-
34
33
  val spannable: CharSequence?,
35
34
  val paintParams: PaintParams,
36
35
  )
37
36
 
38
37
  private val data = ConcurrentHashMap<Int, MeasurementParams>()
39
38
 
40
- fun store(id: Int, spannable: Spannable?, paint: TextPaint): Boolean {
39
+ fun store(
40
+ id: Int,
41
+ spannable: Spannable?,
42
+ paint: TextPaint,
43
+ ): Boolean {
41
44
  val cachedWidth = data[id]?.cachedWidth ?: 0f
42
45
  val cachedSize = data[id]?.cachedSize ?: 0L
43
46
  val initialized = data[id]?.initialized ?: true
@@ -53,22 +56,32 @@ object MeasurementStore {
53
56
  data.remove(id)
54
57
  }
55
58
 
56
- private fun measure(maxWidth: Float, spannable: CharSequence?, paintParams: PaintParams): Long {
57
- val paint = TextPaint().apply {
58
- typeface = paintParams.typeface
59
- textSize = paintParams.fontSize
60
- }
59
+ private fun measure(
60
+ maxWidth: Float,
61
+ spannable: CharSequence?,
62
+ paintParams: PaintParams,
63
+ ): Long {
64
+ val paint =
65
+ TextPaint().apply {
66
+ typeface = paintParams.typeface
67
+ textSize = paintParams.fontSize
68
+ }
61
69
 
62
70
  return measure(maxWidth, spannable, paint)
63
71
  }
64
72
 
65
- private fun measure(maxWidth: Float, spannable: CharSequence?, paint: TextPaint): Long {
73
+ private fun measure(
74
+ maxWidth: Float,
75
+ spannable: CharSequence?,
76
+ paint: TextPaint,
77
+ ): Long {
66
78
  val text = spannable ?: ""
67
79
  val textLength = text.length
68
- val builder = StaticLayout.Builder
69
- .obtain(text, 0, textLength, paint, maxWidth.toInt())
70
- .setIncludePad(true)
71
- .setLineSpacing(0f, 1f)
80
+ val builder =
81
+ StaticLayout.Builder
82
+ .obtain(text, 0, textLength, paint, maxWidth.toInt())
83
+ .setIncludePad(true)
84
+ .setLineSpacing(0f, 1f)
72
85
 
73
86
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
74
87
  builder.setBreakStrategy(LineBreaker.BREAK_STRATEGY_HIGH_QUALITY)
@@ -85,7 +98,10 @@ object MeasurementStore {
85
98
  }
86
99
 
87
100
  // Returns either: Spannable parsed from HTML defaultValue, or plain text defaultValue, or "I" if no defaultValue
88
- private fun getInitialText(defaultView: EnrichedTextInputView, props: ReadableMap?): CharSequence {
101
+ private fun getInitialText(
102
+ defaultView: EnrichedTextInputView,
103
+ props: ReadableMap?,
104
+ ): CharSequence {
89
105
  val defaultValue = props?.getString("defaultValue")
90
106
 
91
107
  // If there is no default value, assume text is one line, "I" is a good approximation of height
@@ -96,7 +112,8 @@ object MeasurementStore {
96
112
 
97
113
  try {
98
114
  val htmlStyle = HtmlStyle(defaultView, props.getMap("htmlStyle"))
99
- val parsed = EnrichedParser.fromHtml(defaultValue, htmlStyle, null)
115
+ val factory = EnrichedTextInputSpannableFactory()
116
+ val parsed = EnrichedParser.fromHtml(defaultValue, htmlStyle, factory)
100
117
  return parsed.trimEnd('\n')
101
118
  } catch (e: Exception) {
102
119
  Log.w("MeasurementStore", "Error parsing initial HTML text: ${e.message}")
@@ -104,7 +121,10 @@ object MeasurementStore {
104
121
  }
105
122
  }
106
123
 
107
- private fun getInitialFontSize(defaultView: EnrichedTextInputView, props: ReadableMap?): Float {
124
+ private fun getInitialFontSize(
125
+ defaultView: EnrichedTextInputView,
126
+ props: ReadableMap?,
127
+ ): Float {
108
128
  val propsFontSize = props?.getDouble("fontSize")?.toFloat()
109
129
  if (propsFontSize == null) return defaultView.textSize
110
130
 
@@ -113,7 +133,12 @@ object MeasurementStore {
113
133
 
114
134
  // Called when view measurements are not available in the store
115
135
  // Most likely first measurement, we can use defaultValue, as no native state is set yet
116
- private fun initialMeasure(context: Context, id: Int?, width: Float, props: ReadableMap?): Long {
136
+ private fun initialMeasure(
137
+ context: Context,
138
+ id: Int?,
139
+ width: Float,
140
+ props: ReadableMap?,
141
+ ): Long {
117
142
  val defaultView = EnrichedTextInputView(context)
118
143
 
119
144
  val text = getInitialText(defaultView, props)
@@ -134,7 +159,12 @@ object MeasurementStore {
134
159
  return size
135
160
  }
136
161
 
137
- fun getMeasureById(context: Context, id: Int?, width: Float, props: ReadableMap?): Long {
162
+ private fun getMeasureById(
163
+ context: Context,
164
+ id: Int?,
165
+ width: Float,
166
+ props: ReadableMap?,
167
+ ): Long {
138
168
  val id = id ?: return initialMeasure(context, id, width, props)
139
169
  val value = data[id] ?: return initialMeasure(context, id, width, props)
140
170
 
@@ -146,13 +176,33 @@ object MeasurementStore {
146
176
  return value.cachedSize
147
177
  }
148
178
 
149
- val paint = TextPaint().apply {
150
- typeface = value.paintParams.typeface
151
- textSize = value.paintParams.fontSize
152
- }
179
+ val paint =
180
+ TextPaint().apply {
181
+ typeface = value.paintParams.typeface
182
+ textSize = value.paintParams.fontSize
183
+ }
153
184
 
154
185
  val size = measure(width, value.spannable, paint)
155
186
  data[id] = MeasurementParams(true, width, size, value.spannable, value.paintParams)
156
187
  return size
157
188
  }
189
+
190
+ fun getMeasureById(
191
+ context: Context,
192
+ id: Int?,
193
+ width: Float,
194
+ height: Float,
195
+ heightMode: YogaMeasureMode?,
196
+ props: ReadableMap?,
197
+ ): Long {
198
+ val size = getMeasureById(context, id, width, props)
199
+ if (heightMode !== YogaMeasureMode.AT_MOST) {
200
+ return size
201
+ }
202
+
203
+ val calculatedHeight = YogaMeasureOutput.getHeight(size)
204
+ val atMostHeight = PixelUtil.toDIPFromPixel(height)
205
+ val finalHeight = calculatedHeight.coerceAtMost(atMostHeight)
206
+ return YogaMeasureOutput.make(YogaMeasureOutput.getWidth(size), finalHeight)
207
+ }
158
208
  }
@@ -1,10 +1,12 @@
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
- class MentionHandler(private val view: EnrichedTextInputView) {
7
+ class MentionHandler(
8
+ private val view: EnrichedTextInputView,
9
+ ) {
8
10
  private var previousText: String? = null
9
11
  private var previousIndicator: String? = null
10
12
 
@@ -21,12 +23,18 @@ class MentionHandler(private val view: EnrichedTextInputView) {
21
23
  previousIndicator = null
22
24
  }
23
25
 
24
- fun onMention(indicator: String, text: String?) {
26
+ fun onMention(
27
+ indicator: String,
28
+ text: String?,
29
+ ) {
25
30
  emitEvent(indicator, text)
26
31
  previousIndicator = indicator
27
32
  }
28
33
 
29
- private fun emitEvent(indicator: String, text: String?) {
34
+ private fun emitEvent(
35
+ indicator: String,
36
+ text: String?,
37
+ ) {
30
38
  // Do not emit events too often
31
39
  if (previousText == text) return
32
40
 
@@ -34,12 +42,14 @@ class MentionHandler(private val view: EnrichedTextInputView) {
34
42
  val context = view.context as ReactContext
35
43
  val surfaceId = UIManagerHelper.getSurfaceId(context)
36
44
  val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
37
- dispatcher?.dispatchEvent(OnMentionEvent(
38
- surfaceId,
39
- view.id,
40
- indicator,
41
- text,
42
- view.experimentalSynchronousEvents,
43
- ))
45
+ dispatcher?.dispatchEvent(
46
+ OnMentionEvent(
47
+ surfaceId,
48
+ view.id,
49
+ indicator,
50
+ text,
51
+ view.experimentalSynchronousEvents,
52
+ ),
53
+ )
44
54
  }
45
55
  }
@@ -0,0 +1,27 @@
1
+ package com.swmansion.enriched.textinput.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class OnChangeHtmlEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val html: String,
11
+ private val experimentalSynchronousEvents: Boolean,
12
+ ) : Event<OnChangeHtmlEvent>(surfaceId, viewId) {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap {
16
+ val eventData: WritableMap = Arguments.createMap()
17
+ eventData.putString("value", html)
18
+
19
+ return eventData
20
+ }
21
+
22
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
23
+
24
+ companion object {
25
+ const val EVENT_NAME: String = "onChangeHtml"
26
+ }
27
+ }