react-redux-dispatch-async
Version:
hooks & redux middleware to be able to wait async actions with fixed defined suffixes
3 lines (2 loc) • 2.42 kB
JavaScript
var e=require("react"),t=require("react-redux"),r={},s={initialized:!1,suffixes:{request:"REQUESTED",success:"SUCCEEDED",failure:"FAILED",cancel:"CANCELED"}};function n(e,t){return new Promise((function(n){var u,c,i=t.type.replace("_"+s.suffixes.request,""),o=(u=function(e){if(e.type===i+"_"+s.suffixes.success)n({success:!0,result:e.payload}),o();else if(e.type===i+"_"+s.suffixes.failure){var t=e.payload instanceof Error?e.payload:new Error("Action failure: "+i);n({success:!1,error:t}),o()}else e.type===i+"_"+s.suffixes.cancel&&(n({success:!1,error:new Error("canceled"),canceled:!0}),o())},c="_"+Math.random().toString(36).substr(2,9),r[c]=u,function(){return delete r[c]});e(t)}))}exports.ConfigMiddleware=s,exports.createDispatchAsyncMiddleware=function(e){return function(){return function(t){return function(n){try{if(e&&!s.initialized&&(s.suffixes=e,s.initialized=!0),function(e,t){return t.type.endsWith(e.request)||t.type.endsWith(e.success)||t.type.endsWith(e.failure)||t.type.endsWith(e.cancel)}(s.suffixes,n)&&Object.keys(r).length>0)for(var u=0,c=Object.values(r);u<c.length;u++)(0,c[u])(n)}catch(e){console.error(e)}return t(n)}}}},exports.dispatchAsync=n,exports.useCompatDispatchAsync=function(e){var r=t.useDispatch();return e?function(){return n(r,e)}:function(e){return n(r,e)}},exports.useDispatchAsync=function(r,s,u){void 0===s&&(s=[]),void 0===u&&(u={timeoutInMilliseconds:15e3});var c=t.useDispatch(),i=e.useState(void 0),o=i[0],a=i[1],f=e.useState(void 0),l=f[0],d=f[1],p=e.useState(!1),y=p[0],h=p[1],v=e.useState(!1),x=v[0],E=v[1],m=e.useRef();e.useEffect((function(){var e=n(c,r.apply(void 0,s)),t=new Promise((function(e){var t;return setTimeout((function(){return e(!1)}),null===(t=u)||void 0===t?void 0:t.timeoutInMilliseconds)})),i=Promise.race([e,t]);m.current=i,i.then((function(e){i===m.current&&("boolean"!=typeof e?e.success?a(e.result):e.canceled?E(!0):d(e.error):h(!0))})).catch((function(e){i===m.current&&(console.error("useDispatchAsync: Unexpected error",e),d(e))}))}),s);var D=e.useMemo((function(){return o||l||y||x?o?"success":x?"canceled":l?"error":y?"timeout":"unknown":"loading"}),[o,l,y,x]);switch(D){case"loading":case"timeout":case"canceled":return{status:D};case"success":return{result:o,status:D};case"error":return{error:l,status:D};default:return{status:"unknown"}}};
//# sourceMappingURL=react-redux-dispatch-async.cjs.production.min.js.map
;