minh-custom-hooks-release
Version:
Đây là custom hooks được viết bởi hoanggminh2702, bao gồm:
117 lines • 6.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = useTaskObservable;
/* eslint-disable @typescript-eslint/no-explicit-any */
var react_1 = require("react");
var rxjs_1 = require("rxjs");
var innerFrom_1 = require("rxjs/internal/observable/innerFrom");
function useTaskObservable(_a) {
var task = _a.task, observablePreHandler = _a.observablePreHandler, onNext = _a.onNext, onComplete = _a.onComplete, onError = _a.onError, onCancel = _a.onCancel;
var currentSubscription = (0, react_1.useRef)(null);
var _b = (0, react_1.useState)(), data = _b[0], setData = _b[1];
var _c = (0, react_1.useState)(), err = _c[0], setErr = _c[1];
var _d = (0, react_1.useState)("IDLE" /* EnumSubscriptionState.IDLE */), taskState = _d[0], setTaskState = _d[1];
var _e = (0, react_1.useState)("IDLE" /* EnumSubscriptionState.IDLE */), subscriptionState = _e[0], setSubscriptionState = _e[1];
var run = function () {
var _a;
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
(_a = currentSubscription.current) === null || _a === void 0 ? void 0 : _a.unsubscribe();
setTaskState("LOADING" /* EnumSubscriptionState.LOADING */);
setSubscriptionState("LOADING" /* EnumSubscriptionState.LOADING */);
if (task instanceof Promise) {
var toObservable = (0, rxjs_1.defer)(function () {
return (0, innerFrom_1.fromPromise)(task);
});
if (typeof observablePreHandler === 'function') {
toObservable = observablePreHandler(toObservable);
}
currentSubscription.current = toObservable.subscribe({
next: function (v) {
setData(v);
setSubscriptionState("DATARECEIVED" /* EnumSubscriptionState.DATARECEIVED */);
onNext === null || onNext === void 0 ? void 0 : onNext(v);
},
error: function (err) {
setTaskState("FAILED" /* EnumSubscriptionState.FAILED */);
setSubscriptionState("FAILED" /* EnumSubscriptionState.FAILED */);
setErr(err);
onError === null || onError === void 0 ? void 0 : onError(err);
},
complete: function () {
setTaskState("SUCCESS" /* EnumSubscriptionState.SUCCESS */);
setSubscriptionState("SUCCESS" /* EnumSubscriptionState.SUCCESS */);
onComplete === null || onComplete === void 0 ? void 0 : onComplete();
},
});
}
else {
var source$ = (0, rxjs_1.defer)(function () {
var generateObservable$ = task.apply(void 0, args);
return generateObservable$ instanceof Promise ? (0, innerFrom_1.fromPromise)(generateObservable$) : generateObservable$;
});
if (typeof observablePreHandler === 'function') {
source$ = observablePreHandler(source$);
}
currentSubscription.current = source$.subscribe({
next: function (v) {
setData(v);
setSubscriptionState("DATARECEIVED" /* EnumSubscriptionState.DATARECEIVED */);
onNext === null || onNext === void 0 ? void 0 : onNext(v);
},
error: function (err) {
setErr(err);
setTaskState("FAILED" /* EnumSubscriptionState.FAILED */);
setSubscriptionState("FAILED" /* EnumSubscriptionState.FAILED */);
onError === null || onError === void 0 ? void 0 : onError(err);
},
complete: function () {
setTaskState("SUCCESS" /* EnumSubscriptionState.SUCCESS */);
setSubscriptionState("SUCCESS" /* EnumSubscriptionState.SUCCESS */);
onComplete === null || onComplete === void 0 ? void 0 : onComplete();
},
});
}
};
var cancel = (0, react_1.useCallback)(function () {
var _a;
(_a = currentSubscription.current) === null || _a === void 0 ? void 0 : _a.unsubscribe();
setTaskState("CANCELED" /* EnumSubscriptionState.CANCELED */);
setSubscriptionState("CANCELED" /* EnumSubscriptionState.CANCELED */);
onCancel === null || onCancel === void 0 ? void 0 : onCancel(data);
}, []);
(0, react_1.useEffect)(function () {
return function () {
var _a;
(_a = currentSubscription.current) === null || _a === void 0 ? void 0 : _a.unsubscribe();
};
}, []);
return {
// data state
data: data,
err: err,
// current state
state: taskState,
subscriptionState: subscriptionState,
// task state
isIdle: taskState === "IDLE" /* EnumSubscriptionState.IDLE */,
isLoading: taskState === "LOADING" /* EnumSubscriptionState.LOADING */,
isSuccess: taskState === "SUCCESS" /* EnumSubscriptionState.SUCCESS */,
isFailed: taskState === "FAILED" /* EnumSubscriptionState.FAILED */,
isCanceled: taskState === "CANCELED" /* EnumSubscriptionState.CANCELED */,
// subscription state
isSubscriptionIdle: taskState === "IDLE" /* EnumSubscriptionState.IDLE */,
isSubscriptionLoading: taskState === "LOADING" /* EnumSubscriptionState.LOADING */,
isSubscriptionDataReceived: taskState === "DATARECEIVED" /* EnumSubscriptionState.DATARECEIVED */,
isSubscriptionSuccess: taskState === "SUCCESS" /* EnumSubscriptionState.SUCCESS */,
isSubscriptionFailed: taskState === "FAILED" /* EnumSubscriptionState.FAILED */,
isSubscriptionCanceled: taskState === "CANCELED" /* EnumSubscriptionState.CANCELED */,
// action
run: run,
cancel: cancel,
subscription: currentSubscription.current,
};
}
//# sourceMappingURL=useTaskObservable.js.map