Skip to content

Commit 8105e69

Browse files
authored
Reinstall custom event handlers when component updates (#158)
1 parent 9127a1a commit 8105e69

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

demo/src/Demo.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ class Demo extends React.Component {
4242
};
4343

4444
render() {
45+
let events = {
46+
'focus': () => console.log('focus')
47+
};
48+
if (counter % 2 === 0) {
49+
events['blur'] = () => console.log('blur')
50+
}
4551
return (
4652
<div className="container container-narrow">
4753
<div className="page-header">
@@ -68,6 +74,7 @@ class Demo extends React.Component {
6874
label="Markdown Editor"
6975
value={this.state.textValue1}
7076
onChange={this.handleChange1}
77+
events={events}
7178
/>
7279
<hr />
7380
<SimpleMDEReact

src/index.tsx

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export default class SimpleMDEEditor extends React.PureComponent<
4949
private elementWrapperRef: HTMLDivElement | null;
5050
private setElementWrapperRef: (element: HTMLDivElement) => void;
5151
private keyChange = false;
52+
private customEventCallbacks: SimpleMdeToCodemirror = {}
5253

5354
static defaultProps = {
5455
events: {},
@@ -92,6 +93,8 @@ export default class SimpleMDEEditor extends React.PureComponent<
9293
this.simpleMde!.value(this.props.value || "");
9394
}
9495
this.keyChange = false;
96+
97+
this.updateCustomEvents(this.props.events, prevProps.events);
9598
}
9699

97100
componentWillUnmount() {
@@ -156,22 +159,37 @@ export default class SimpleMDEEditor extends React.PureComponent<
156159
this.simpleMde.codemirror.on("change", this.eventWrapper);
157160
this.simpleMde.codemirror.on("cursorActivity", this.getCursor);
158161

159-
const { events } = this.props;
160-
161-
// Handle custom events
162-
events &&
163-
Object.entries(events).forEach(([eventName, callback]) => {
164-
if (eventName && callback) {
165-
this.simpleMde &&
166-
this.simpleMde.codemirror.on(
167-
eventName as DOMEvent,
168-
callback as any
169-
);
170-
}
171-
});
162+
this.updateCustomEvents(this.props.events)
172163
}
173164
};
174165

166+
updateCustomEvents = (events: SimpleMdeToCodemirror | undefined, prevEvents?: SimpleMdeToCodemirror | undefined) => {
167+
prevEvents &&
168+
Object.entries(prevEvents).forEach(([eventName, callback]) => {
169+
if (eventName && callback && !events?.[eventName as CodemirrorEvents | DOMEvent]) {
170+
this.simpleMde &&
171+
this.simpleMde.codemirror.off(
172+
eventName as DOMEvent,
173+
this.customEventCallbacks[eventName as CodemirrorEvents | DOMEvent] as any
174+
);
175+
}
176+
});
177+
events &&
178+
Object.entries(events).forEach(([eventName, callback]) => {
179+
if (eventName && callback && !prevEvents?.[eventName as CodemirrorEvents | DOMEvent]) {
180+
if (this.simpleMde) {
181+
this.customEventCallbacks[eventName as CodemirrorEvents | DOMEvent] = (instance: any) => {
182+
(this.props.events?.[eventName as CodemirrorEvents | DOMEvent] as any)?.(instance);
183+
}
184+
this.simpleMde.codemirror.on(
185+
eventName as DOMEvent,
186+
this.customEventCallbacks[eventName as CodemirrorEvents | DOMEvent] as any
187+
);
188+
}
189+
}
190+
});
191+
};
192+
175193
getCursor = () => {
176194
// https://codemirror.net/doc/manual.html#api_selection
177195
if (this.props.getLineAndCursor) {

0 commit comments

Comments
 (0)