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.
- package/README.md +21 -16
- package/android/build.gradle +77 -72
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/android/gradle.properties +5 -5
- package/android/lint.gradle +70 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +129 -57
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
- package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
- package/android/src/main/new_arch/CMakeLists.txt +7 -1
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
- package/ios/EnrichedTextInputView.h +2 -1
- package/ios/EnrichedTextInputView.mm +603 -60
- package/ios/config/InputConfig.h +28 -0
- package/ios/config/InputConfig.mm +237 -8
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
- package/ios/inputParser/InputParser.mm +218 -18
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +46 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
- package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
- package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/BlockQuoteStyle.mm +5 -5
- package/ios/styles/BoldStyle.mm +21 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- package/ios/styles/CodeBlockStyle.mm +5 -5
- package/ios/styles/H1Style.mm +3 -0
- package/ios/styles/H2Style.mm +3 -0
- package/ios/styles/H3Style.mm +3 -0
- package/ios/styles/H4Style.mm +20 -0
- package/ios/styles/H5Style.mm +20 -0
- package/ios/styles/H6Style.mm +20 -0
- package/ios/styles/HeadingStyleBase.mm +161 -72
- package/ios/styles/ImageStyle.mm +5 -5
- package/ios/styles/InlineCodeStyle.mm +30 -19
- package/ios/styles/ItalicStyle.mm +5 -5
- package/ios/styles/LinkStyle.mm +98 -40
- package/ios/styles/MentionStyle.mm +4 -4
- package/ios/styles/OrderedListStyle.mm +5 -5
- package/ios/styles/StrikethroughStyle.mm +5 -5
- package/ios/styles/UnderlineStyle.mm +5 -5
- package/ios/styles/UnorderedListStyle.mm +5 -5
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.h +4 -0
- package/ios/utils/ParagraphAttributesUtils.mm +142 -45
- package/ios/utils/ParagraphsUtils.mm +4 -4
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
- package/lib/module/EnrichedTextInput.js +57 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/module/utils/regexParser.js +46 -0
- package/lib/module/utils/regexParser.js.map +1 -0
- package/lib/typescript/src/EnrichedTextInput.d.ts +20 -51
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
- package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
- package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
- package/lib/typescript/src/utils/regexParser.d.ts +3 -0
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
- package/package.json +13 -9
- package/src/EnrichedTextInput.tsx +88 -63
- package/src/index.tsx +5 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
- package/src/types.ts +59 -0
- package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
- package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
- package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
- package/ios/attachments/ImageAttachment.mm +0 -34
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
- package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
- package/lib/module/normalizeHtmlStyle.js.map +0 -1
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
- package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.h +0 -0
- /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
- /package/ios/{utils → extensions}/FontExtension.h +0 -0
- /package/ios/{utils → extensions}/FontExtension.mm +0 -0
- /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.h +0 -0
- /package/ios/{utils → extensions}/StringExtension.mm +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.h +0 -0
- /package/ios/{utils → interfaces}/ImageData.mm +0 -0
- /package/ios/{utils → interfaces}/LinkData.h +0 -0
- /package/ios/{utils → interfaces}/LinkData.mm +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
- /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
- /package/ios/{utils → interfaces}/MentionParams.h +0 -0
- /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
- /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.h +0 -0
- /package/ios/{utils → interfaces}/StylePair.mm +0 -0
- /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
- /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(
|
|
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.
|
|
19
|
-
import com.swmansion.enriched.events.
|
|
20
|
-
import com.swmansion.enriched.events.
|
|
21
|
-
import com.swmansion.enriched.events.
|
|
22
|
-
import com.swmansion.enriched.events.
|
|
23
|
-
import com.swmansion.enriched.events.OnInputFocusEvent
|
|
24
|
-
import com.swmansion.enriched.events.
|
|
25
|
-
import com.swmansion.enriched.events.
|
|
26
|
-
import com.swmansion.enriched.events.
|
|
27
|
-
import com.swmansion.enriched.events.
|
|
28
|
-
import com.swmansion.enriched.
|
|
29
|
-
import com.swmansion.enriched.
|
|
30
|
-
import com.swmansion.enriched.
|
|
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 :
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
78
|
-
|
|
76
|
+
return map
|
|
77
|
+
}
|
|
79
78
|
|
|
80
79
|
@ReactProp(name = "defaultValue")
|
|
81
|
-
override fun setDefaultValue(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
225
|
+
override fun setIsOnChangeHtmlSet(
|
|
226
|
+
view: EnrichedTextInputView?,
|
|
227
|
+
value: Boolean,
|
|
228
|
+
) {
|
|
182
229
|
view?.shouldEmitHtml = value
|
|
183
230
|
}
|
|
184
231
|
|
|
185
|
-
override fun
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
369
|
+
override fun startMention(
|
|
370
|
+
view: EnrichedTextInputView?,
|
|
371
|
+
indicator: String,
|
|
372
|
+
) {
|
|
265
373
|
view?.startMention(indicator)
|
|
266
374
|
}
|
|
267
375
|
|
|
268
|
-
override fun addMention(
|
|
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(
|
|
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.
|
|
18
|
-
import com.swmansion.enriched.
|
|
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(
|
|
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(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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(
|
|
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 =
|
|
69
|
-
.
|
|
70
|
-
|
|
71
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
150
|
-
|
|
151
|
-
|
|
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
|
}
|
package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt
RENAMED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
+
}
|