@fendent/react-native-enriched 0.5.2-fork.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +343 -0
- package/ReactNativeEnriched.podspec +31 -0
- package/android/build.gradle +106 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +197 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +72 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.cpp +173 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.h +833 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.cpp +16 -0
- package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.h +20 -0
- package/android/gradle.properties +5 -0
- package/android/lint.gradle +70 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/swmansion/enriched/ReactNativeEnrichedPackage.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/AsyncDrawable.kt +126 -0
- 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/common/ForceRedrawSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/common/GumboNormalizer.kt +5 -0
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/common/ResourceManager.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +956 -0
- 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 +92 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCodeBlockSpan.kt +81 -0
- 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/common/spans/EnrichedImageSpan.kt +184 -0
- 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 +29 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedOrderedListSpan.kt +79 -0
- 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/common/spans/EnrichedUnorderedListSpan.kt +62 -0
- 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/common/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +4 -0
- 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/textinput/EnrichedTextInputView.kt +1120 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewLayoutManager.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewManager.kt +478 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/MeasurementStore.kt +225 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/MentionHandler.kt +55 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt +30 -0
- 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/OnContextMenuItemPressEvent.kt +35 -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/textinput/events/OnMentionDetectedEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionEvent.kt +34 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnSubmitEditingEvent.kt +29 -0
- 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 +16 -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/EnrichedLineHeightSpan.kt +44 -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/textinput/styles/HtmlStyle.kt +372 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +164 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParagraphStyles.kt +434 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt +394 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSelection.kt +320 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +310 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +24 -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/textinput/watchers/EnrichedSpanWatcher.kt +107 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedTextWatcher.kt +74 -0
- package/android/src/main/new_arch/CMakeLists.txt +62 -0
- package/android/src/main/new_arch/GumboNormalizerJni.cpp +14 -0
- 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/ReactNativeEnrichedSpec/EnrichedTextInputComponentDescriptor.h +35 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.cpp +53 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.h +25 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.cpp +35 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.h +53 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.cpp +9 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.h +24 -0
- package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +27 -0
- package/android/src/main/res/drawable/broken_image.xml +10 -0
- package/cpp/CMakeLists.txt +50 -0
- package/cpp/GumboParser/GumboParser.h +34043 -0
- package/cpp/README.md +59 -0
- package/cpp/parser/GumboNormalizer.c +915 -0
- package/cpp/parser/GumboParser.cpp +16 -0
- package/cpp/parser/GumboParser.hpp +23 -0
- package/cpp/tests/GumboParserTest.cpp +457 -0
- package/ios/EnrichedTextInputView.h +53 -0
- package/ios/EnrichedTextInputView.mm +2360 -0
- package/ios/EnrichedTextInputViewManager.mm +13 -0
- package/ios/attributesManager/AttributesManager.h +17 -0
- package/ios/attributesManager/AttributesManager.mm +195 -0
- package/ios/config/InputConfig.h +104 -0
- package/ios/config/InputConfig.mm +664 -0
- package/ios/extensions/ColorExtension.h +7 -0
- package/ios/extensions/ColorExtension.mm +38 -0
- package/ios/extensions/FontExtension.h +11 -0
- package/ios/extensions/FontExtension.mm +72 -0
- package/ios/extensions/ImageExtension.h +34 -0
- package/ios/extensions/ImageExtension.mm +165 -0
- package/ios/extensions/LayoutManagerExtension.h +6 -0
- package/ios/extensions/LayoutManagerExtension.mm +443 -0
- package/ios/extensions/StringExtension.h +15 -0
- package/ios/extensions/StringExtension.mm +69 -0
- package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
- package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
- package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
- package/ios/generated/ReactNativeEnrichedSpec/Props.cpp +173 -0
- package/ios/generated/ReactNativeEnrichedSpec/Props.h +833 -0
- package/ios/generated/ReactNativeEnrichedSpec/RCTComponentViewHelpers.h +582 -0
- package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
- package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
- package/ios/generated/ReactNativeEnrichedSpec/States.cpp +16 -0
- package/ios/generated/ReactNativeEnrichedSpec/States.h +20 -0
- package/ios/inputParser/InputParser.h +11 -0
- package/ios/inputParser/InputParser.mm +1463 -0
- package/ios/inputTextView/InputTextView.h +6 -0
- package/ios/inputTextView/InputTextView.mm +285 -0
- package/ios/interfaces/AttributeEntry.h +9 -0
- package/ios/interfaces/AttributeEntry.mm +4 -0
- package/ios/interfaces/BaseStyleProtocol.h +17 -0
- package/ios/interfaces/ImageAttachment.h +11 -0
- package/ios/interfaces/ImageAttachment.mm +107 -0
- package/ios/interfaces/ImageData.h +10 -0
- package/ios/interfaces/ImageData.mm +4 -0
- package/ios/interfaces/LinkData.h +11 -0
- package/ios/interfaces/LinkData.mm +29 -0
- package/ios/interfaces/LinkRegexConfig.h +19 -0
- package/ios/interfaces/LinkRegexConfig.mm +37 -0
- package/ios/interfaces/MediaAttachment.h +23 -0
- package/ios/interfaces/MediaAttachment.mm +31 -0
- package/ios/interfaces/MentionParams.h +8 -0
- package/ios/interfaces/MentionParams.mm +4 -0
- package/ios/interfaces/MentionStyleProps.h +13 -0
- package/ios/interfaces/MentionStyleProps.mm +63 -0
- package/ios/interfaces/StyleBase.h +36 -0
- package/ios/interfaces/StyleBase.mm +256 -0
- package/ios/interfaces/StyleHeaders.h +102 -0
- package/ios/interfaces/StylePair.h +9 -0
- package/ios/interfaces/StylePair.mm +4 -0
- package/ios/interfaces/StyleTypeEnum.h +26 -0
- package/ios/interfaces/TextDecorationLineEnum.h +6 -0
- package/ios/interfaces/TextDecorationLineEnum.mm +4 -0
- package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +19 -0
- package/ios/internals/EnrichedTextInputViewShadowNode.h +44 -0
- package/ios/internals/EnrichedTextInputViewShadowNode.mm +103 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +10 -0
- package/ios/internals/EnrichedTextInputViewState.h +22 -0
- package/ios/styles/BlockQuoteStyle.mm +55 -0
- package/ios/styles/BoldStyle.mm +37 -0
- package/ios/styles/CheckboxListStyle.mm +153 -0
- package/ios/styles/CodeBlockStyle.mm +49 -0
- package/ios/styles/H1Style.mm +20 -0
- package/ios/styles/H2Style.mm +20 -0
- package/ios/styles/H3Style.mm +20 -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 +65 -0
- package/ios/styles/ImageStyle.mm +146 -0
- package/ios/styles/InlineCodeStyle.mm +65 -0
- package/ios/styles/ItalicStyle.mm +37 -0
- package/ios/styles/LinkStyle.mm +532 -0
- package/ios/styles/MentionStyle.mm +538 -0
- package/ios/styles/OrderedListStyle.mm +86 -0
- package/ios/styles/StrikethroughStyle.mm +25 -0
- package/ios/styles/UnderlineStyle.mm +24 -0
- package/ios/styles/UnorderedListStyle.mm +86 -0
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +122 -0
- package/ios/utils/DotReplacementUtils.h +10 -0
- package/ios/utils/DotReplacementUtils.mm +68 -0
- package/ios/utils/KeyboardUtils.h +7 -0
- package/ios/utils/KeyboardUtils.mm +31 -0
- package/ios/utils/OccurenceUtils.h +44 -0
- package/ios/utils/OccurenceUtils.mm +179 -0
- package/ios/utils/ParagraphAttributesUtils.h +15 -0
- package/ios/utils/ParagraphAttributesUtils.mm +257 -0
- package/ios/utils/RangeUtils.h +12 -0
- package/ios/utils/RangeUtils.mm +183 -0
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/TextInsertionUtils.h +17 -0
- package/ios/utils/TextInsertionUtils.mm +64 -0
- package/ios/utils/WordsUtils.h +7 -0
- package/ios/utils/WordsUtils.mm +98 -0
- package/ios/utils/ZeroWidthSpaceUtils.h +9 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +270 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/EnrichedTextInput.js +304 -0
- package/lib/module/native/EnrichedTextInput.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/spec/EnrichedTextInputNativeComponent.ts +517 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/EnrichedTextInputDefaultProps.js +12 -0
- package/lib/module/utils/EnrichedTextInputDefaultProps.js.map +1 -0
- package/lib/module/utils/normalizeHtmlStyle.js +155 -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/package.json +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/native/EnrichedTextInput.d.ts +3 -0
- package/lib/typescript/src/native/EnrichedTextInput.d.ts.map +1 -0
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts +397 -0
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +447 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts +10 -0
- package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.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 +226 -0
- package/react-native.config.js +13 -0
- package/src/index.tsx +20 -0
- package/src/native/EnrichedTextInput.tsx +370 -0
- package/src/spec/EnrichedTextInputNativeComponent.ts +517 -0
- package/src/types.ts +499 -0
- package/src/utils/EnrichedTextInputDefaultProps.ts +9 -0
- package/src/utils/normalizeHtmlStyle.ts +199 -0
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +56 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Typeface
|
|
5
|
+
import android.graphics.text.LineBreaker
|
|
6
|
+
import android.os.Build
|
|
7
|
+
import android.text.Spannable
|
|
8
|
+
import android.text.SpannableString
|
|
9
|
+
import android.text.StaticLayout
|
|
10
|
+
import android.text.TextPaint
|
|
11
|
+
import android.util.Log
|
|
12
|
+
import com.facebook.react.bridge.ReadableMap
|
|
13
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
14
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
15
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
|
|
16
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
17
|
+
import com.facebook.yoga.YogaMeasureMode
|
|
18
|
+
import com.facebook.yoga.YogaMeasureOutput
|
|
19
|
+
import com.swmansion.enriched.common.parser.EnrichedParser
|
|
20
|
+
import com.swmansion.enriched.textinput.spans.EnrichedLineHeightSpan
|
|
21
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
22
|
+
import java.util.concurrent.ConcurrentHashMap
|
|
23
|
+
import kotlin.math.ceil
|
|
24
|
+
|
|
25
|
+
object MeasurementStore {
|
|
26
|
+
data class PaintParams(
|
|
27
|
+
val typeface: Typeface,
|
|
28
|
+
val fontSize: Float,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
data class MeasurementParams(
|
|
32
|
+
val initialized: Boolean,
|
|
33
|
+
val cachedWidth: Float,
|
|
34
|
+
val cachedSize: Long,
|
|
35
|
+
val spannable: CharSequence?,
|
|
36
|
+
val paintParams: PaintParams,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
private val data = ConcurrentHashMap<Int, MeasurementParams>()
|
|
40
|
+
|
|
41
|
+
fun store(
|
|
42
|
+
id: Int,
|
|
43
|
+
spannable: Spannable?,
|
|
44
|
+
paint: TextPaint,
|
|
45
|
+
): Boolean {
|
|
46
|
+
val cachedWidth = data[id]?.cachedWidth ?: 0f
|
|
47
|
+
val cachedSize = data[id]?.cachedSize ?: 0L
|
|
48
|
+
val initialized = data[id]?.initialized ?: true
|
|
49
|
+
|
|
50
|
+
val size = measure(cachedWidth, spannable, paint)
|
|
51
|
+
val paintParams = PaintParams(paint.typeface, paint.textSize)
|
|
52
|
+
|
|
53
|
+
data[id] = MeasurementParams(initialized, cachedWidth, size, spannable, paintParams)
|
|
54
|
+
return cachedSize != size
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
fun release(id: Int) {
|
|
58
|
+
data.remove(id)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private fun measure(
|
|
62
|
+
maxWidth: Float,
|
|
63
|
+
spannable: CharSequence?,
|
|
64
|
+
paintParams: PaintParams,
|
|
65
|
+
): Long {
|
|
66
|
+
val paint =
|
|
67
|
+
TextPaint().apply {
|
|
68
|
+
typeface = paintParams.typeface
|
|
69
|
+
textSize = paintParams.fontSize
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return measure(maxWidth, spannable, paint)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private fun measure(
|
|
76
|
+
maxWidth: Float,
|
|
77
|
+
spannable: CharSequence?,
|
|
78
|
+
paint: TextPaint,
|
|
79
|
+
): Long {
|
|
80
|
+
val text = spannable ?: ""
|
|
81
|
+
val textLength = text.length
|
|
82
|
+
val builder =
|
|
83
|
+
StaticLayout.Builder
|
|
84
|
+
.obtain(text, 0, textLength, paint, maxWidth.toInt())
|
|
85
|
+
.setIncludePad(true)
|
|
86
|
+
.setLineSpacing(0f, 1f)
|
|
87
|
+
|
|
88
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
89
|
+
builder.setBreakStrategy(LineBreaker.BREAK_STRATEGY_HIGH_QUALITY)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
93
|
+
builder.setUseLineSpacingFromFallbacks(true)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
val staticLayout = builder.build()
|
|
97
|
+
val heightInSP = PixelUtil.toDIPFromPixel(staticLayout.height.toFloat())
|
|
98
|
+
val widthInSP = PixelUtil.toDIPFromPixel(maxWidth)
|
|
99
|
+
return YogaMeasureOutput.make(widthInSP, heightInSP)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Returns either: Spannable parsed from HTML defaultValue, or plain text defaultValue, or "I" if no defaultValue
|
|
103
|
+
private fun getInitialText(
|
|
104
|
+
defaultView: EnrichedTextInputView,
|
|
105
|
+
props: ReadableMap?,
|
|
106
|
+
): CharSequence {
|
|
107
|
+
val defaultValue = props?.getString("defaultValue")
|
|
108
|
+
|
|
109
|
+
// If there is no default value, assume text is one line, "I" is a good approximation of height
|
|
110
|
+
if (defaultValue == null) return "I"
|
|
111
|
+
|
|
112
|
+
val isHtml = defaultValue.startsWith("<html>") && defaultValue.endsWith("</html>")
|
|
113
|
+
if (!isHtml) return defaultValue
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
val htmlStyle = HtmlStyle(defaultView, props.getMap("htmlStyle"))
|
|
117
|
+
val factory = EnrichedTextInputSpannableFactory()
|
|
118
|
+
val parsed = EnrichedParser.fromHtml(defaultValue, htmlStyle, factory)
|
|
119
|
+
return parsed.trimEnd('\n')
|
|
120
|
+
} catch (e: Exception) {
|
|
121
|
+
Log.w("MeasurementStore", "Error parsing initial HTML text: ${e.message}")
|
|
122
|
+
return defaultValue
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private fun getInitialFontSize(
|
|
127
|
+
defaultView: EnrichedTextInputView,
|
|
128
|
+
props: ReadableMap?,
|
|
129
|
+
): Float {
|
|
130
|
+
val propsFontSize = props?.getDouble("fontSize")?.toFloat()
|
|
131
|
+
if (propsFontSize == null) return defaultView.textSize
|
|
132
|
+
|
|
133
|
+
return ceil(PixelUtil.toPixelFromSP(propsFontSize))
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Called when view measurements are not available in the store
|
|
137
|
+
// Most likely first measurement, we can use defaultValue, as no native state is set yet
|
|
138
|
+
private fun initialMeasure(
|
|
139
|
+
context: Context,
|
|
140
|
+
id: Int?,
|
|
141
|
+
width: Float,
|
|
142
|
+
props: ReadableMap?,
|
|
143
|
+
): Long {
|
|
144
|
+
val defaultView = EnrichedTextInputView(context)
|
|
145
|
+
|
|
146
|
+
val rawText = getInitialText(defaultView, props)
|
|
147
|
+
val fontSize = getInitialFontSize(defaultView, props)
|
|
148
|
+
val lineHeight = props?.getDouble("lineHeight")?.toFloat() ?: 0f
|
|
149
|
+
|
|
150
|
+
val fontFamily = props?.getString("fontFamily")
|
|
151
|
+
val fontStyle = parseFontStyle(props?.getString("fontStyle"))
|
|
152
|
+
val fontWeight = parseFontWeight(props?.getString("fontWeight"))
|
|
153
|
+
|
|
154
|
+
val text: CharSequence =
|
|
155
|
+
if (lineHeight > 0f) {
|
|
156
|
+
val spannable = SpannableString(rawText)
|
|
157
|
+
spannable.setSpan(
|
|
158
|
+
EnrichedLineHeightSpan(lineHeight),
|
|
159
|
+
0,
|
|
160
|
+
spannable.length,
|
|
161
|
+
Spannable.SPAN_INCLUSIVE_INCLUSIVE,
|
|
162
|
+
)
|
|
163
|
+
spannable
|
|
164
|
+
} else {
|
|
165
|
+
rawText
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
val typeface = applyStyles(defaultView.typeface, fontStyle, fontWeight, fontFamily, context.assets)
|
|
169
|
+
val paintParams = PaintParams(typeface, fontSize)
|
|
170
|
+
val size = measure(width, text, paintParams)
|
|
171
|
+
|
|
172
|
+
if (id != null) {
|
|
173
|
+
data[id] = MeasurementParams(true, width, size, text, paintParams)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return size
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private fun getMeasureById(
|
|
180
|
+
context: Context,
|
|
181
|
+
id: Int?,
|
|
182
|
+
width: Float,
|
|
183
|
+
props: ReadableMap?,
|
|
184
|
+
): Long {
|
|
185
|
+
val id = id ?: return initialMeasure(context, id, width, props)
|
|
186
|
+
val value = data[id] ?: return initialMeasure(context, id, width, props)
|
|
187
|
+
|
|
188
|
+
// First measure has to be done using initialMeasure
|
|
189
|
+
// That way it's free of any side effects and async initializations
|
|
190
|
+
if (!value.initialized) return initialMeasure(context, id, width, props)
|
|
191
|
+
|
|
192
|
+
if (width == value.cachedWidth) {
|
|
193
|
+
return value.cachedSize
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
val paint =
|
|
197
|
+
TextPaint().apply {
|
|
198
|
+
typeface = value.paintParams.typeface
|
|
199
|
+
textSize = value.paintParams.fontSize
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
val size = measure(width, value.spannable, paint)
|
|
203
|
+
data[id] = MeasurementParams(true, width, size, value.spannable, value.paintParams)
|
|
204
|
+
return size
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
fun getMeasureById(
|
|
208
|
+
context: Context,
|
|
209
|
+
id: Int?,
|
|
210
|
+
width: Float,
|
|
211
|
+
height: Float,
|
|
212
|
+
heightMode: YogaMeasureMode?,
|
|
213
|
+
props: ReadableMap?,
|
|
214
|
+
): Long {
|
|
215
|
+
val size = getMeasureById(context, id, width, props)
|
|
216
|
+
if (heightMode !== YogaMeasureMode.AT_MOST) {
|
|
217
|
+
return size
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
val calculatedHeight = YogaMeasureOutput.getHeight(size)
|
|
221
|
+
val atMostHeight = PixelUtil.toDIPFromPixel(height)
|
|
222
|
+
val finalHeight = calculatedHeight.coerceAtMost(atMostHeight)
|
|
223
|
+
return YogaMeasureOutput.make(YogaMeasureOutput.getWidth(size), finalHeight)
|
|
224
|
+
}
|
|
225
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReactContext
|
|
4
|
+
import com.facebook.react.uimanager.UIManagerHelper
|
|
5
|
+
import com.swmansion.enriched.textinput.EnrichedTextInputView
|
|
6
|
+
|
|
7
|
+
class MentionHandler(
|
|
8
|
+
private val view: EnrichedTextInputView,
|
|
9
|
+
) {
|
|
10
|
+
private var previousText: String? = null
|
|
11
|
+
private var previousIndicator: String? = null
|
|
12
|
+
|
|
13
|
+
fun reset() {
|
|
14
|
+
endMention()
|
|
15
|
+
previousText = null
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
fun endMention() {
|
|
19
|
+
val indicator = previousIndicator
|
|
20
|
+
if (indicator == null) return
|
|
21
|
+
|
|
22
|
+
emitEvent(indicator, null)
|
|
23
|
+
previousIndicator = null
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fun onMention(
|
|
27
|
+
indicator: String,
|
|
28
|
+
text: String?,
|
|
29
|
+
) {
|
|
30
|
+
emitEvent(indicator, text)
|
|
31
|
+
previousIndicator = indicator
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private fun emitEvent(
|
|
35
|
+
indicator: String,
|
|
36
|
+
text: String?,
|
|
37
|
+
) {
|
|
38
|
+
// Do not emit events too often
|
|
39
|
+
if (previousText == text) return
|
|
40
|
+
|
|
41
|
+
previousText = text
|
|
42
|
+
val context = view.context as ReactContext
|
|
43
|
+
val surfaceId = UIManagerHelper.getSurfaceId(context)
|
|
44
|
+
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, view.id)
|
|
45
|
+
dispatcher?.dispatchEvent(
|
|
46
|
+
OnMentionEvent(
|
|
47
|
+
surfaceId,
|
|
48
|
+
view.id,
|
|
49
|
+
indicator,
|
|
50
|
+
text,
|
|
51
|
+
view.experimentalSynchronousEvents,
|
|
52
|
+
),
|
|
53
|
+
)
|
|
54
|
+
}
|
|
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
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
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 OnChangeSelectionEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val text: String,
|
|
11
|
+
private val start: Int,
|
|
12
|
+
private val end: Int,
|
|
13
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
14
|
+
) : Event<OnChangeSelectionEvent>(surfaceId, viewId) {
|
|
15
|
+
override fun getEventName(): String = EVENT_NAME
|
|
16
|
+
|
|
17
|
+
override fun getEventData(): WritableMap {
|
|
18
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
19
|
+
eventData.putString("text", text)
|
|
20
|
+
eventData.putInt("start", start)
|
|
21
|
+
eventData.putInt("end", end)
|
|
22
|
+
return eventData
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
26
|
+
|
|
27
|
+
companion object {
|
|
28
|
+
const val EVENT_NAME: String = "onChangeSelection"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.WritableMap
|
|
4
|
+
import com.facebook.react.uimanager.events.Event
|
|
5
|
+
|
|
6
|
+
class OnChangeStateEvent(
|
|
7
|
+
surfaceId: Int,
|
|
8
|
+
viewId: Int,
|
|
9
|
+
private val state: WritableMap,
|
|
10
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
11
|
+
) : Event<OnChangeStateEvent>(surfaceId, viewId) {
|
|
12
|
+
override fun getEventName(): String = EVENT_NAME
|
|
13
|
+
|
|
14
|
+
override fun getEventData(): WritableMap = state
|
|
15
|
+
|
|
16
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
17
|
+
|
|
18
|
+
companion object {
|
|
19
|
+
const val EVENT_NAME: String = "onChangeState"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
|
+
|
|
3
|
+
import android.text.Editable
|
|
4
|
+
import com.facebook.react.bridge.Arguments
|
|
5
|
+
import com.facebook.react.bridge.WritableMap
|
|
6
|
+
import com.facebook.react.uimanager.events.Event
|
|
7
|
+
import com.swmansion.enriched.common.EnrichedConstants
|
|
8
|
+
|
|
9
|
+
class OnChangeTextEvent(
|
|
10
|
+
surfaceId: Int,
|
|
11
|
+
viewId: Int,
|
|
12
|
+
private val editable: Editable,
|
|
13
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
14
|
+
) : Event<OnChangeTextEvent>(surfaceId, viewId) {
|
|
15
|
+
override fun getEventName(): String = EVENT_NAME
|
|
16
|
+
|
|
17
|
+
override fun getEventData(): WritableMap {
|
|
18
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
19
|
+
val text = editable.toString()
|
|
20
|
+
val normalizedText = text.replace(Regex(EnrichedConstants.ZWS_STRING), "")
|
|
21
|
+
eventData.putString("value", normalizedText)
|
|
22
|
+
return eventData
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
26
|
+
|
|
27
|
+
companion object {
|
|
28
|
+
const val EVENT_NAME: String = "onChangeText"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/textinput/events/OnContextMenuItemPressEvent.kt
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import com.facebook.react.bridge.Arguments
|
|
5
|
+
import com.facebook.react.bridge.WritableMap
|
|
6
|
+
import com.facebook.react.uimanager.events.Event
|
|
7
|
+
|
|
8
|
+
class OnContextMenuItemPressEvent(
|
|
9
|
+
surfaceId: Int,
|
|
10
|
+
viewId: Int,
|
|
11
|
+
private val itemText: String,
|
|
12
|
+
private val selectedText: String,
|
|
13
|
+
private val selectionStart: Int,
|
|
14
|
+
private val selectionEnd: Int,
|
|
15
|
+
private val styleState: WritableMap,
|
|
16
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
17
|
+
) : Event<OnContextMenuItemPressEvent>(surfaceId, viewId) {
|
|
18
|
+
override fun getEventName(): String = EVENT_NAME
|
|
19
|
+
|
|
20
|
+
override fun getEventData(): WritableMap {
|
|
21
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
22
|
+
eventData.putString("itemText", itemText)
|
|
23
|
+
eventData.putString("selectedText", selectedText)
|
|
24
|
+
eventData.putInt("selectionStart", selectionStart)
|
|
25
|
+
eventData.putInt("selectionEnd", selectionEnd)
|
|
26
|
+
eventData.putMap("styleState", styleState)
|
|
27
|
+
return eventData
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
31
|
+
|
|
32
|
+
companion object {
|
|
33
|
+
const val EVENT_NAME: String = "onContextMenuItemPress"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
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 OnInputBlurEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
11
|
+
) : Event<OnInputBlurEvent>(surfaceId, viewId) {
|
|
12
|
+
override fun getEventName(): String = EVENT_NAME
|
|
13
|
+
|
|
14
|
+
override fun getEventData(): WritableMap {
|
|
15
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
16
|
+
|
|
17
|
+
return eventData
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
21
|
+
|
|
22
|
+
companion object {
|
|
23
|
+
const val EVENT_NAME: String = "onInputBlur"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
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 OnInputFocusEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
11
|
+
) : Event<OnInputFocusEvent>(surfaceId, viewId) {
|
|
12
|
+
override fun getEventName(): String = EVENT_NAME
|
|
13
|
+
|
|
14
|
+
override fun getEventData(): WritableMap {
|
|
15
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
16
|
+
|
|
17
|
+
return eventData
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
21
|
+
|
|
22
|
+
companion object {
|
|
23
|
+
const val EVENT_NAME: String = "onInputFocus"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -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 OnInputKeyPressEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val key: String,
|
|
11
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
12
|
+
) : Event<OnInputKeyPressEvent>(surfaceId, viewId) {
|
|
13
|
+
override fun getEventName(): String = EVENT_NAME
|
|
14
|
+
|
|
15
|
+
override fun getEventData(): WritableMap {
|
|
16
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
17
|
+
eventData.putString("key", key)
|
|
18
|
+
|
|
19
|
+
return eventData
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
23
|
+
|
|
24
|
+
companion object {
|
|
25
|
+
const val EVENT_NAME: String = "onInputKeyPress"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 OnLinkDetectedEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val text: String,
|
|
11
|
+
private val url: String,
|
|
12
|
+
private val start: Int,
|
|
13
|
+
private val end: Int,
|
|
14
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
15
|
+
) : Event<OnLinkDetectedEvent>(surfaceId, viewId) {
|
|
16
|
+
override fun getEventName(): String = EVENT_NAME
|
|
17
|
+
|
|
18
|
+
override fun getEventData(): WritableMap {
|
|
19
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
20
|
+
eventData.putString("text", text)
|
|
21
|
+
eventData.putString("url", url)
|
|
22
|
+
eventData.putInt("start", start)
|
|
23
|
+
eventData.putInt("end", end)
|
|
24
|
+
return eventData
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
28
|
+
|
|
29
|
+
companion object {
|
|
30
|
+
const val EVENT_NAME: String = "onLinkDetected"
|
|
31
|
+
}
|
|
32
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionDetectedEvent.kt
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
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 OnMentionDetectedEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val text: String,
|
|
11
|
+
private val indicator: String,
|
|
12
|
+
private val payload: String,
|
|
13
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
14
|
+
) : Event<OnMentionDetectedEvent>(surfaceId, viewId) {
|
|
15
|
+
override fun getEventName(): String = EVENT_NAME
|
|
16
|
+
|
|
17
|
+
override fun getEventData(): WritableMap {
|
|
18
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
19
|
+
eventData.putString("text", text)
|
|
20
|
+
eventData.putString("indicator", indicator)
|
|
21
|
+
eventData.putString("payload", payload)
|
|
22
|
+
return eventData
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
26
|
+
|
|
27
|
+
companion object {
|
|
28
|
+
const val EVENT_NAME: String = "onMentionDetected"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 OnMentionEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val indicator: String,
|
|
11
|
+
private val text: String?,
|
|
12
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
13
|
+
) : Event<OnMentionEvent>(surfaceId, viewId) {
|
|
14
|
+
override fun getEventName(): String = EVENT_NAME
|
|
15
|
+
|
|
16
|
+
override fun getEventData(): WritableMap? {
|
|
17
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
18
|
+
eventData.putString("indicator", indicator)
|
|
19
|
+
|
|
20
|
+
if (text == null) {
|
|
21
|
+
eventData.putNull("text")
|
|
22
|
+
} else {
|
|
23
|
+
eventData.putString("text", text)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return eventData
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
30
|
+
|
|
31
|
+
companion object {
|
|
32
|
+
const val EVENT_NAME: String = "onMention"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
package com.swmansion.enriched.textinput.events
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments
|
|
4
|
+
import com.facebook.react.bridge.WritableArray
|
|
5
|
+
import com.facebook.react.bridge.WritableMap
|
|
6
|
+
import com.facebook.react.uimanager.events.Event
|
|
7
|
+
|
|
8
|
+
class OnPasteImagesEvent(
|
|
9
|
+
surfaceId: Int,
|
|
10
|
+
viewId: Int,
|
|
11
|
+
private val images: List<PastedImage>,
|
|
12
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
13
|
+
) : Event<OnPasteImagesEvent>(surfaceId, viewId) {
|
|
14
|
+
override fun getEventName(): String = EVENT_NAME
|
|
15
|
+
|
|
16
|
+
override fun getEventData(): WritableMap {
|
|
17
|
+
val imagesArray: WritableArray = Arguments.createArray()
|
|
18
|
+
|
|
19
|
+
for (image in images) {
|
|
20
|
+
val imageMap = Arguments.createMap()
|
|
21
|
+
imageMap.putString("uri", image.uri)
|
|
22
|
+
imageMap.putString("type", image.type)
|
|
23
|
+
imageMap.putDouble("width", image.width)
|
|
24
|
+
imageMap.putDouble("height", image.height)
|
|
25
|
+
|
|
26
|
+
imagesArray.pushMap(imageMap)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
30
|
+
eventData.putArray("images", imagesArray)
|
|
31
|
+
|
|
32
|
+
return eventData
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
36
|
+
|
|
37
|
+
companion object {
|
|
38
|
+
const val EVENT_NAME: String = "onPasteImages"
|
|
39
|
+
|
|
40
|
+
data class PastedImage(
|
|
41
|
+
val uri: String,
|
|
42
|
+
val type: String,
|
|
43
|
+
val width: Double,
|
|
44
|
+
val height: Double,
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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 OnRequestHtmlResultEvent(
|
|
8
|
+
surfaceId: Int,
|
|
9
|
+
viewId: Int,
|
|
10
|
+
private val requestId: Int,
|
|
11
|
+
private val html: String?,
|
|
12
|
+
private val experimentalSynchronousEvents: Boolean,
|
|
13
|
+
) : Event<OnRequestHtmlResultEvent>(surfaceId, viewId) {
|
|
14
|
+
override fun getEventName(): String = EVENT_NAME
|
|
15
|
+
|
|
16
|
+
override fun getEventData(): WritableMap {
|
|
17
|
+
val eventData: WritableMap = Arguments.createMap()
|
|
18
|
+
eventData.putInt("requestId", requestId)
|
|
19
|
+
if (html != null) {
|
|
20
|
+
eventData.putString("html", html)
|
|
21
|
+
} else {
|
|
22
|
+
eventData.putNull("html")
|
|
23
|
+
}
|
|
24
|
+
return eventData
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
|
|
28
|
+
|
|
29
|
+
companion object {
|
|
30
|
+
const val EVENT_NAME: String = "onRequestHtmlResult"
|
|
31
|
+
}
|
|
32
|
+
}
|