patronum
Version:
☄️ Effector utility library delivering modularity and convenience
78 lines (77 loc) • 1.99 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.delay = delay;
var _effector = require("effector");
function delay(...args) {
const argsShape = args.length === 2 ? {
source: args[0],
timeout: args[1]
} : args[0];
const {
source,
timeout,
target = (0, _effector.createEvent)({
name: "target",
sid: "jucb8d"
})
} = argsShape;
const targets = Array.isArray(target) ? target : [target];
if (!_effector.is.unit(source)) throw new TypeError('source must be a unit from effector');
if (!targets.every(unit => _effector.is.unit(unit))) throw new TypeError('target must be a unit from effector');
const ms = validateTimeout(timeout);
const timerFx = (0, _effector.createEffect)(({
payload,
milliseconds
}) => new Promise(resolve => {
setTimeout(resolve, milliseconds, payload);
}), {
name: "timerFx",
sid: "-wp3hwr"
});
(0, _effector.sample)({
and: [{
// ms can be Store<number> | number
// converts object of stores or object of values to store
source: (0, _effector.combine)({
and: [{
milliseconds: ms
}],
or: {
name: "source",
sid: "-gaikyz"
}
}),
clock: source,
fn: ({
milliseconds
}, payload) => ({
payload,
milliseconds: typeof milliseconds === 'function' ? milliseconds(payload) : milliseconds
}),
target: timerFx
}],
or: {
sid: "-uuqxfw"
}
});
(0, _effector.sample)({
and: [{
clock: timerFx.doneData,
target: targets
}],
or: {
sid: "-uc1x9m"
}
});
return target;
}
function validateTimeout(timeout) {
if (_effector.is.store(timeout, {
sid: "-tvk3f2"
}) || typeof timeout === 'function' || typeof timeout === 'number') {
return timeout;
}
throw new TypeError(`'timeout' argument must be a function, Store, or a number. Passed "${typeof timeout}"`);
}
;