diff --git a/android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnLinkDetectedEvent.kt b/android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnLinkDetectedEvent.kt index 8c8bbb633..1f2962acf 100644 --- a/android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnLinkDetectedEvent.kt +++ b/android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnLinkDetectedEvent.kt @@ -4,7 +4,7 @@ import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.WritableMap import com.facebook.react.uimanager.events.Event -class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val url: String) : +class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val url: String, private val start: Int, private val end: Int) : Event(surfaceId, viewId) { override fun getEventName(): String { @@ -15,6 +15,8 @@ class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, val eventData: WritableMap = Arguments.createMap() eventData.putString("text", text) eventData.putString("url", url) + eventData.putInt("start", start); + eventData.putInt("end", end); return eventData } diff --git a/android/src/main/java/com/swmansion/reactnativerichtexteditor/utils/EditorSelection.kt b/android/src/main/java/com/swmansion/reactnativerichtexteditor/utils/EditorSelection.kt index fa116383e..9cb0036f3 100644 --- a/android/src/main/java/com/swmansion/reactnativerichtexteditor/utils/EditorSelection.kt +++ b/android/src/main/java/com/swmansion/reactnativerichtexteditor/utils/EditorSelection.kt @@ -236,7 +236,7 @@ class EditorSelection(private val editorView: ReactNativeRichTextEditorView) { val context = editorView.context as ReactContext val surfaceId = UIManagerHelper.getSurfaceId(context) val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, editorView.id) - dispatcher?.dispatchEvent(OnLinkDetectedEvent(surfaceId, editorView.id, text, url)) + dispatcher?.dispatchEvent(OnLinkDetectedEvent(surfaceId, editorView.id, text, url, start, end)) } private fun emitMentionDetectedEvent(spannable: Spannable, span: EditorMentionSpan?, start: Int, end: Int) { diff --git a/example/src/App.tsx b/example/src/App.tsx index e3306e586..731a8dd55 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -57,6 +57,8 @@ const DEFAULT_STYLE: StylesState = { const DEFAULT_LINK_STATE = { text: '', url: '', + start: 0, + end: 0, }; const DEBUG_SCROLLABLE = false; @@ -196,6 +198,11 @@ export default function App() { console.log('Input blurred'); }; + const handleLinkDetected = (state: CurrentLinkState) => { + console.log(state); + setCurrentLink(state); + }; + const handleSelectionChangeEvent = ( e: NativeSyntheticEvent ) => { @@ -225,7 +232,7 @@ export default function App() { onChangeText={handleChangeText} onChangeHtml={handleChangeHtml} onChangeState={handleChangeState} - onLinkDetected={setCurrentLink} + onLinkDetected={handleLinkDetected} onMentionDetected={console.log} onStartMention={handleStartMention} onChangeMention={handleChangeMention} diff --git a/ios/ReactNativeRichTextEditorView.h b/ios/ReactNativeRichTextEditorView.h index 77c78dd05..0da90ef59 100644 --- a/ios/ReactNativeRichTextEditorView.h +++ b/ios/ReactNativeRichTextEditorView.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @public BOOL emitHtml; } - (CGSize)measureSize:(CGFloat)maxWidth; -- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url; +- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url range:(NSRange)range; - (void)emitOnMentionEvent:(NSString *)indicator text:(nullable NSString *)text; - (void)anyTextMayHaveBeenModified; - (BOOL)handleStyleBlocksAndConflicts:(StyleType)type range:(NSRange)range; diff --git a/ios/ReactNativeRichTextEditorView.mm b/ios/ReactNativeRichTextEditorView.mm index 702312390..35fdcab30 100644 --- a/ios/ReactNativeRichTextEditorView.mm +++ b/ios/ReactNativeRichTextEditorView.mm @@ -654,7 +654,7 @@ - (void)tryUpdatingActiveStyles { if(detectedLinkData != nullptr) { // emit onLinkeDetected event - [self emitOnLinkDetectedEvent:detectedLinkData.text url:detectedLinkData.url]; + [self emitOnLinkDetectedEvent:detectedLinkData.text url:detectedLinkData.url range:detectedLinkRange]; _recentlyActiveLinkData = detectedLinkData; _recentlyActiveLinkRange = detectedLinkRange; @@ -753,12 +753,14 @@ - (void)setValue:(NSString *)value { [self anyTextMayHaveBeenModified]; } -- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url { +- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url range:(NSRange)range { auto emitter = [self getEventEmitter]; if(emitter != nullptr) { emitter->onLinkDetected({ .text = [text toCppString], - .url = [url toCppString] + .url = [url toCppString], + .start = static_cast(range.location), + .end = static_cast(range.location + range.length), }); } } diff --git a/ios/styles/LinkStyle.mm b/ios/styles/LinkStyle.mm index 8dbb26446..ecd3620b7 100644 --- a/ios/styles/LinkStyle.mm +++ b/ios/styles/LinkStyle.mm @@ -354,7 +354,7 @@ - (void)handleAutomaticLinks:(NSString *)word inRange:(NSRange)wordRange { } // emit onLinkDetected - [_editor emitOnLinkDetectedEvent:word url:regexPassedUrl]; + [_editor emitOnLinkDetectedEvent:word url:regexPassedUrl range:wordRange]; } } diff --git a/src/ReactNativeRichTextEditorViewNativeComponent.ts b/src/ReactNativeRichTextEditorViewNativeComponent.ts index 02b20694c..b2da50aa4 100644 --- a/src/ReactNativeRichTextEditorViewNativeComponent.ts +++ b/src/ReactNativeRichTextEditorViewNativeComponent.ts @@ -38,6 +38,8 @@ export interface OnChangeStateEvent { export interface OnLinkDetected { text: string; url: string; + start: Int32; + end: Int32; } export interface OnMentionDetectedInternal { diff --git a/src/RichTextInput.tsx b/src/RichTextInput.tsx index f081fd0f4..8daa8218d 100644 --- a/src/RichTextInput.tsx +++ b/src/RichTextInput.tsx @@ -298,8 +298,8 @@ export const RichTextInput = ({ }; const handleLinkDetected = (e: NativeSyntheticEvent) => { - const { text, url } = e.nativeEvent; - onLinkDetected?.({ text, url }); + const { text, url, start, end } = e.nativeEvent; + onLinkDetected?.({ text, url, start, end }); }; const handleMentionDetected = (