Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<OnLinkDetectedEvent>(surfaceId, viewId) {

override fun getEventName(): String {
Expand All @@ -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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
9 changes: 8 additions & 1 deletion example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ const DEFAULT_STYLE: StylesState = {
const DEFAULT_LINK_STATE = {
text: '',
url: '',
start: 0,
end: 0,
};

const DEBUG_SCROLLABLE = false;
Expand Down Expand Up @@ -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<OnChangeSelectionEvent>
) => {
Expand Down Expand Up @@ -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}
Expand Down
2 changes: 1 addition & 1 deletion ios/ReactNativeRichTextEditorView.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 5 additions & 3 deletions ios/ReactNativeRichTextEditorView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<int>(range.location),
.end = static_cast<int>(range.location + range.length),
});
}
}
Expand Down
2 changes: 1 addition & 1 deletion ios/styles/LinkStyle.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/ReactNativeRichTextEditorViewNativeComponent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ export interface OnChangeStateEvent {
export interface OnLinkDetected {
text: string;
url: string;
start: Int32;
end: Int32;
}

export interface OnMentionDetectedInternal {
Expand Down
4 changes: 2 additions & 2 deletions src/RichTextInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,8 @@ export const RichTextInput = ({
};

const handleLinkDetected = (e: NativeSyntheticEvent<OnLinkDetected>) => {
const { text, url } = e.nativeEvent;
onLinkDetected?.({ text, url });
const { text, url, start, end } = e.nativeEvent;
onLinkDetected?.({ text, url, start, end });
};

const handleMentionDetected = (
Expand Down