reactive-blocs
Version:
50 lines (49 loc) • 1.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTask = void 0;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const action_context_1 = require("./action-context");
const primitives_1 = require("./primitives");
const utils_1 = require("./utils");
const createTask = (executor, initialValue, initialParams) => {
const { actionOf, dispatch } = (0, action_context_1.createActionContext)();
const actionName = (0, utils_1.generateId)();
const result = (0, primitives_1.createValue)(initialValue);
const loading = new rxjs_1.BehaviorSubject(false);
const error = new rxjs_1.BehaviorSubject(null);
const reset = () => {
if (result.value !== initialValue) {
result.next(initialValue);
}
loading.next(true);
error.next(null);
};
const execute = (args, ignoreErorr) => {
loading.next(true);
error.next(null);
return new Promise((resolve, reject) => {
const actionResult = dispatch(actionName, args).pipe((0, operators_1.tap)(() => loading.next(false)), (0, operators_1.filter)(res => {
if (res instanceof Error) {
error.next(res);
ignoreErorr ? resolve(null) : reject(res);
return false;
}
else {
error.next(null);
resolve(res);
return true;
}
}), (0, operators_1.share)());
actionResult.subscribe(val => result.next(val));
});
};
if (initialParams !== undefined) {
execute(initialParams);
}
actionOf(actionName, (args) => {
return executor(args);
});
return { result, loading, error, execute };
};
exports.createTask = createTask;