Skip to content

Commit 7788ddb

Browse files
authored
Merge pull request wix-incubator#9 from wix/woa-2914
Add support for adding listeners to selected text change
2 parents cf47487 + ac440f2 commit 7788ddb

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

src/RichTextEditor.js

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@ export default class RichTextEditor extends Component {
3232
this._onKeyboardWillShow = this._onKeyboardWillShow.bind(this);
3333
this._onKeyboardWillHide = this._onKeyboardWillHide.bind(this);
3434
this.state = {
35-
listeners: [],
35+
selectionChangeListeners: [],
3636
onChange: [],
3737
showLinkDialog: false,
3838
linkInitialUrl: '',
3939
linkTitle: '',
4040
linkUrl: '',
4141
keyboardHeight: 0
4242
};
43+
this._selectedTextChangeListeners = [];
4344
}
4445

4546
componentWillMount() {
@@ -154,14 +155,25 @@ export default class RichTextEditor extends Component {
154155
case messages.CONTENT_FOCUSED:
155156
this.contentFocusHandler && this.contentFocusHandler();
156157
break;
157-
case messages.SELECTION_CHANGE:
158+
case messages.SELECTION_CHANGE: {
158159
const items = message.data.items;
159-
this.state.listeners.map((listener) => listener(items));
160-
break
161-
case messages.CONTENT_CHANGE:
160+
this.state.selectionChangeListeners.map((listener) => {
161+
listener(items);
162+
});
163+
break;
164+
}
165+
case messages.CONTENT_CHANGE: {
162166
const content = message.data.content;
163167
this.state.onChange.map((listener) => listener(content));
164-
break
168+
break;
169+
}
170+
case messages.SELECTED_TEXT_CHANGED: {
171+
const selectedText = message.data;
172+
this._selectedTextChangeListeners.forEach((listener) => {
173+
listener(selectedText);
174+
});
175+
break;
176+
}
165177
}
166178
} catch(e) {
167179
//alert('NON JSON MESSAGE');
@@ -319,7 +331,7 @@ export default class RichTextEditor extends Component {
319331

320332
registerToolbar(listener) {
321333
this.setState({
322-
listeners: [...this.state.listeners, listener]
334+
selectionChangeListeners: [...this.state.selectionChangeListeners, listener]
323335
});
324336
}
325337

@@ -559,6 +571,10 @@ export default class RichTextEditor extends Component {
559571
this.contentFocusHandler = callbackHandler;
560572
this._sendAction(actions.setContentFocusHandler);
561573
}
574+
575+
addSelectedTextChangeListener(listener) {
576+
this._selectedTextChangeListeners.push(listener);
577+
}
562578
}
563579

564580
const styles = StyleSheet.create({

src/const.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,6 @@ export const messages = {
6565
SELECTION_CHANGE: 'SELECTION_CHANGE',
6666
CONTENT_CHANGE: 'CONTENT_CHANGE',
6767
SELECTED_TEXT_RESPONSE: 'SELECTED_TEXT_RESPONSE',
68-
LINK_TOUCHED: 'LINK_TOUCHED'
68+
LINK_TOUCHED: 'LINK_TOUCHED',
69+
SELECTED_TEXT_CHANGED: 'SELECTED_TEXT_CHANGED'
6970
};

src/editor.html

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,7 @@
889889
zss_editor.calculateEditorHeightWithCaretPosition();
890890
zss_editor.setScrollPosition();
891891
zss_editor.enabledEditingItems(e);
892+
notifyIfSelectedTextHasChanged();
892893
});
893894

894895
// Make sure that when we tap anywhere in the document we focus on the editor
@@ -919,6 +920,18 @@
919920

920921
}//end
921922

923+
function notifyIfSelectedTextHasChanged() {
924+
var selectedTextChangeMessage = JSON.stringify({
925+
data: String(getSelection()),
926+
type: 'SELECTED_TEXT_CHANGED'
927+
});
928+
929+
if (selectedTextChangeMessage !== zss_editor.previousSelectedTextChangeMessage) {
930+
WebViewBridge.send(selectedTextChangeMessage);
931+
zss_editor.previousSelectedTextChangeMessage = selectedTextChangeMessage;
932+
}
933+
}
934+
922935
function whenPastingInsertAsPlainText(editorId) {
923936
var editor = document.getElementById(editorId);
924937
editor.addEventListener('paste', function(event) {
@@ -1537,7 +1550,19 @@
15371550

15381551
}
15391552

1540-
WebViewBridge.send(JSON.stringify({type: 'SELECTION_CHANGE', data: {items: items}}))
1553+
notifyIfSelectionHasChanged(items);
1554+
}
1555+
1556+
function notifyIfSelectionHasChanged(items) {
1557+
var selectionChangeMessage = JSON.stringify({
1558+
data: {items: items},
1559+
type: 'SELECTION_CHANGE'
1560+
});
1561+
1562+
if (selectionChangeMessage !== zss_editor.previousSelectionChangeMessage) {
1563+
WebViewBridge.send(selectionChangeMessage);
1564+
zss_editor.previousSelectionChangeMessage = selectionChangeMessage;
1565+
}
15411566
}
15421567

15431568
zss_editor.focusContent = function() {

0 commit comments

Comments
 (0)