import { Type } from '@ephox/katamari';
import Editor from '../Editor';
interface Delay {
setEditorInterval: (editor: Editor, callback: () => void, time?: number) => number;
setEditorTimeout: (editor: Editor, callback: () => void, time?: number) => number;
}
/**
* Utility class for working with delayed actions like setTimeout.
*
* @class tinymce.util.Delay
*/
const wrappedSetTimeout = (callback: () => void, time?: number) => {
if (!Type.isNumber(time)) {
time = 0;
}
return setTimeout(callback, time);
};
const wrappedSetInterval = (callback: Function, time?: number): number => {
if (!Type.isNumber(time)) {
time = 0;
}
return setInterval(callback, time);
};
const Delay: Delay = {
/**
* Sets a timeout that's similar to the native browser setTimeout
* API, except that it checks if the editor instance is still alive when the callback gets executed.
*
* @method setEditorTimeout
* @param {tinymce.Editor} editor Editor instance to check the removed state on.
* @param {Function} callback Callback to execute when timer runs out.
* @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
* @return {Number} Timeout id number.
*/
setEditorTimeout: (editor, callback, time?) => {
return wrappedSetTimeout(() => {
if (!editor.removed) {
callback();
}
}, time);
},
/**
* Sets an interval timer that's similar to native browser setInterval
* API, except that it checks if the editor instance is still alive when the callback gets executed.
*
* @method setEditorInterval
* @param {Function} callback Callback to execute when interval time runs out.
* @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
* @return {Number} Timeout id number.
*/
setEditorInterval: (editor, callback, time?) => {
const timer = wrappedSetInterval(() => {
if (!editor.removed) {
callback();
} else {
clearInterval(timer);
}
}, time);
return timer;
}
};
export default Delay;