Skip to content

Commit ae276f7

Browse files
authored
feat: add start and end props to onLinkDetected payload (#120)
1 parent 2f1acbe commit ae276f7

8 files changed

Lines changed: 23 additions & 10 deletions

File tree

android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnLinkDetectedEvent.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.facebook.react.bridge.Arguments
44
import com.facebook.react.bridge.WritableMap
55
import com.facebook.react.uimanager.events.Event
66

7-
class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val url: String) :
7+
class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val url: String, private val start: Int, private val end: Int) :
88
Event<OnLinkDetectedEvent>(surfaceId, viewId) {
99

1010
override fun getEventName(): String {
@@ -15,6 +15,8 @@ class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String,
1515
val eventData: WritableMap = Arguments.createMap()
1616
eventData.putString("text", text)
1717
eventData.putString("url", url)
18+
eventData.putInt("start", start);
19+
eventData.putInt("end", end);
1820
return eventData
1921
}
2022

android/src/main/java/com/swmansion/reactnativerichtexteditor/utils/EditorSelection.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class EditorSelection(private val editorView: ReactNativeRichTextEditorView) {
236236
val context = editorView.context as ReactContext
237237
val surfaceId = UIManagerHelper.getSurfaceId(context)
238238
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, editorView.id)
239-
dispatcher?.dispatchEvent(OnLinkDetectedEvent(surfaceId, editorView.id, text, url))
239+
dispatcher?.dispatchEvent(OnLinkDetectedEvent(surfaceId, editorView.id, text, url, start, end))
240240
}
241241

242242
private fun emitMentionDetectedEvent(spannable: Spannable, span: EditorMentionSpan?, start: Int, end: Int) {

example/src/App.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ const DEFAULT_STYLE: StylesState = {
5757
const DEFAULT_LINK_STATE = {
5858
text: '',
5959
url: '',
60+
start: 0,
61+
end: 0,
6062
};
6163

6264
const DEBUG_SCROLLABLE = false;
@@ -196,6 +198,11 @@ export default function App() {
196198
console.log('Input blurred');
197199
};
198200

201+
const handleLinkDetected = (state: CurrentLinkState) => {
202+
console.log(state);
203+
setCurrentLink(state);
204+
};
205+
199206
const handleSelectionChangeEvent = (
200207
e: NativeSyntheticEvent<OnChangeSelectionEvent>
201208
) => {
@@ -225,7 +232,7 @@ export default function App() {
225232
onChangeText={handleChangeText}
226233
onChangeHtml={handleChangeHtml}
227234
onChangeState={handleChangeState}
228-
onLinkDetected={setCurrentLink}
235+
onLinkDetected={handleLinkDetected}
229236
onMentionDetected={console.log}
230237
onStartMention={handleStartMention}
231238
onChangeMention={handleChangeMention}

ios/ReactNativeRichTextEditorView.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
2121
@public BOOL emitHtml;
2222
}
2323
- (CGSize)measureSize:(CGFloat)maxWidth;
24-
- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url;
24+
- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url range:(NSRange)range;
2525
- (void)emitOnMentionEvent:(NSString *)indicator text:(nullable NSString *)text;
2626
- (void)anyTextMayHaveBeenModified;
2727
- (BOOL)handleStyleBlocksAndConflicts:(StyleType)type range:(NSRange)range;

ios/ReactNativeRichTextEditorView.mm

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ - (void)tryUpdatingActiveStyles {
654654

655655
if(detectedLinkData != nullptr) {
656656
// emit onLinkeDetected event
657-
[self emitOnLinkDetectedEvent:detectedLinkData.text url:detectedLinkData.url];
657+
[self emitOnLinkDetectedEvent:detectedLinkData.text url:detectedLinkData.url range:detectedLinkRange];
658658

659659
_recentlyActiveLinkData = detectedLinkData;
660660
_recentlyActiveLinkRange = detectedLinkRange;
@@ -753,12 +753,14 @@ - (void)setValue:(NSString *)value {
753753
[self anyTextMayHaveBeenModified];
754754
}
755755

756-
- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url {
756+
- (void)emitOnLinkDetectedEvent:(NSString *)text url:(NSString *)url range:(NSRange)range {
757757
auto emitter = [self getEventEmitter];
758758
if(emitter != nullptr) {
759759
emitter->onLinkDetected({
760760
.text = [text toCppString],
761-
.url = [url toCppString]
761+
.url = [url toCppString],
762+
.start = static_cast<int>(range.location),
763+
.end = static_cast<int>(range.location + range.length),
762764
});
763765
}
764766
}

ios/styles/LinkStyle.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ - (void)handleAutomaticLinks:(NSString *)word inRange:(NSRange)wordRange {
354354
}
355355

356356
// emit onLinkDetected
357-
[_editor emitOnLinkDetectedEvent:word url:regexPassedUrl];
357+
[_editor emitOnLinkDetectedEvent:word url:regexPassedUrl range:wordRange];
358358
}
359359
}
360360

src/ReactNativeRichTextEditorViewNativeComponent.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ export interface OnChangeStateEvent {
3838
export interface OnLinkDetected {
3939
text: string;
4040
url: string;
41+
start: Int32;
42+
end: Int32;
4143
}
4244

4345
export interface OnMentionDetectedInternal {

src/RichTextInput.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ export const RichTextInput = ({
298298
};
299299

300300
const handleLinkDetected = (e: NativeSyntheticEvent<OnLinkDetected>) => {
301-
const { text, url } = e.nativeEvent;
302-
onLinkDetected?.({ text, url });
301+
const { text, url, start, end } = e.nativeEvent;
302+
onLinkDetected?.({ text, url, start, end });
303303
};
304304

305305
const handleMentionDetected = (

0 commit comments

Comments
 (0)