Skip to content

Commit

Permalink
Migrate emitter feedback to TS
Browse files Browse the repository at this point in the history
  • Loading branch information
Rochmar Nicolas (DevExpress) committed Jul 23, 2024
1 parent 72c7b3d commit 6da97d5
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 145 deletions.
288 changes: 143 additions & 145 deletions packages/devextreme/js/__internal/events/core/m_emitter.feedback.ts
Original file line number Diff line number Diff line change
@@ -1,181 +1,179 @@
import Class from '../../core/class';
import { noop, ensureDefined } from '../../core/utils/common';
import { contains } from '../../core/utils/dom';
import devices from '../../core/devices';
import { isMouseEvent } from '../utils/index';
import pointerEvents from '../pointer';
import Emitter from './emitter';
import registerEmitter from './emitter_registrator';
import Class from '@js/core/class';
import devices from '@js/core/devices';
import { ensureDefined, noop } from '@js/core/utils/common';
import { contains } from '@js/core/utils/dom';
import Emitter from '@js/events/core/emitter';
import registerEmitter from '@js/events/core/emitter_registrator';
import pointerEvents from '@js/events/pointer';
import { isMouseEvent } from '@js/events/utils/index';

const ACTIVE_EVENT_NAME = 'dxactive';
const INACTIVE_EVENT_NAME = 'dxinactive';

const ACTIVE_TIMEOUT = 30;
const INACTIVE_TIMEOUT = 400;


const FeedbackEvent = Class.inherit({

ctor: function(timeout, fire) {
this._timeout = timeout;
this._fire = fire;
},
ctor(timeout, fire) {
this._timeout = timeout;
this._fire = fire;
},

start: function() {
const that = this;
start() {
const that = this;

this._schedule(function() {
that.force();
});
},
this._schedule(() => {
that.force();
});
},

_schedule: function(fn) {
this.stop();
this._timer = setTimeout(fn, this._timeout);
},
_schedule(fn) {
this.stop();
this._timer = setTimeout(fn, this._timeout);
},

stop: function() {
clearTimeout(this._timer);
},
stop() {
clearTimeout(this._timer);
},

force: function() {
if(this._fired) {
return;
}
force() {
if (this._fired) {
return;
}

this.stop();
this._fire();
this._fired = true;
},
this.stop();
this._fire();
this._fired = true;
},

fired: function() {
return this._fired;
}
fired() {
return this._fired;
},

});


let activeFeedback;

const FeedbackEmitter = Emitter.inherit({

ctor: function() {
this.callBase.apply(this, arguments);

this._active = new FeedbackEvent(0, noop);
this._inactive = new FeedbackEvent(0, noop);
},

configure: function(data, eventName) {
switch(eventName) {
case ACTIVE_EVENT_NAME:
data.activeTimeout = data.timeout;
break;
case INACTIVE_EVENT_NAME:
data.inactiveTimeout = data.timeout;
break;
}

this.callBase(data);
},

start: function(e) {
if(activeFeedback) {
const activeChildExists = contains(this.getElement().get(0), activeFeedback.getElement().get(0));
const childJustActivated = !activeFeedback._active.fired();

if(activeChildExists && childJustActivated) {
this._cancel();
return;
}

activeFeedback._inactive.force();
}
activeFeedback = this;

this._initEvents(e);
this._active.start();
},

_initEvents: function(e) {
const that = this;

const eventTarget = this._getEmitterTarget(e);

const mouseEvent = isMouseEvent(e);
const isSimulator = devices.isSimulator();
const deferFeedback = isSimulator || !mouseEvent;

const activeTimeout = ensureDefined(this.activeTimeout, ACTIVE_TIMEOUT);
const inactiveTimeout = ensureDefined(this.inactiveTimeout, INACTIVE_TIMEOUT);

this._active = new FeedbackEvent(deferFeedback ? activeTimeout : 0, function() {
that._fireEvent(ACTIVE_EVENT_NAME, e, { target: eventTarget });
});
this._inactive = new FeedbackEvent(deferFeedback ? inactiveTimeout : 0, function() {
that._fireEvent(INACTIVE_EVENT_NAME, e, { target: eventTarget });
activeFeedback = null;
});
},

cancel: function(e) {
this.end(e);
},

end: function(e) {
const skipTimers = e.type !== pointerEvents.up;

if(skipTimers) {
this._active.stop();
} else {
this._active.force();
}

this._inactive.start();

if(skipTimers) {
this._inactive.force();
}
},

dispose: function() {
this._active.stop();
this._inactive.stop();

if(activeFeedback === this) {
activeFeedback = null;
}

this.callBase();
},

lockInactive: function() {
this._active.force();
this._inactive.stop();
activeFeedback = null;
ctor() {
this.callBase.apply(this, arguments);

this._active = new FeedbackEvent(0, noop);
this._inactive = new FeedbackEvent(0, noop);
},

/* eslint-disable default-case */
configure(data, eventName) {
switch (eventName) {
case ACTIVE_EVENT_NAME:
data.activeTimeout = data.timeout;
break;
case INACTIVE_EVENT_NAME:
data.inactiveTimeout = data.timeout;
break;
}

this.callBase(data);
},

start(e) {
if (activeFeedback) {
const activeChildExists = contains(this.getElement().get(0), activeFeedback.getElement().get(0));
const childJustActivated = !activeFeedback._active.fired();

if (activeChildExists && childJustActivated) {
this._cancel();
return;
}

activeFeedback._inactive.force();
}
activeFeedback = this;

this._initEvents(e);
this._active.start();
},

_initEvents(e) {
const that = this;

const eventTarget = this._getEmitterTarget(e);

const mouseEvent = isMouseEvent(e);
const isSimulator = devices.isSimulator();
const deferFeedback = isSimulator || !mouseEvent;

return this._inactive.force.bind(this._inactive);
const activeTimeout = ensureDefined(this.activeTimeout, ACTIVE_TIMEOUT);
const inactiveTimeout = ensureDefined(this.inactiveTimeout, INACTIVE_TIMEOUT);

this._active = new FeedbackEvent(deferFeedback ? activeTimeout : 0, () => {
that._fireEvent(ACTIVE_EVENT_NAME, e, { target: eventTarget });
});
this._inactive = new FeedbackEvent(deferFeedback ? inactiveTimeout : 0, () => {
that._fireEvent(INACTIVE_EVENT_NAME, e, { target: eventTarget });
activeFeedback = null;
});
},

cancel(e) {
this.end(e);
},

end(e) {
const skipTimers = e.type !== pointerEvents.up;

if (skipTimers) {
this._active.stop();
} else {
this._active.force();
}

this._inactive.start();

if (skipTimers) {
this._inactive.force();
}
},

dispose() {
this._active.stop();
this._inactive.stop();

if (activeFeedback === this) {
activeFeedback = null;
}

this.callBase();
},

lockInactive() {
this._active.force();
this._inactive.stop();
activeFeedback = null;
this._cancel();

return this._inactive.force.bind(this._inactive);
},

});
FeedbackEmitter.lock = function(deferred) {
const lockInactive = activeFeedback ? activeFeedback.lockInactive() : noop;
(FeedbackEmitter as any).lock = function (deferred) {
const lockInactive = activeFeedback ? activeFeedback.lockInactive() : noop;

deferred.done(lockInactive);
deferred.done(lockInactive);
};


registerEmitter({
emitter: FeedbackEmitter,
events: [
ACTIVE_EVENT_NAME,
INACTIVE_EVENT_NAME
]
emitter: FeedbackEmitter,
events: [
ACTIVE_EVENT_NAME,
INACTIVE_EVENT_NAME,
],
});

export const lock = FeedbackEmitter.lock;
export const { lock } = (FeedbackEmitter as any);
export {
ACTIVE_EVENT_NAME as active,
INACTIVE_EVENT_NAME as inactive
ACTIVE_EVENT_NAME as active,
INACTIVE_EVENT_NAME as inactive,
};
1 change: 1 addition & 0 deletions packages/devextreme/js/events/core/emitter.feedback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from '../../__internal/events/core/m_emitter.feedback';

0 comments on commit 6da97d5

Please sign in to comment.