next-easy-keepalive
Version:
It is an easy-to-use keepAlive library exclusively for nextjs.
3 lines (2 loc) • 3.2 kB
JavaScript
;function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=require("react"),r=e(t),n=e(require("lodash/debounce"));function o(){return(o=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}var a={current:{backHistory:{},isBack:!1},alwaysRemember:!1,maxPage:10},i=t.createContext(a);exports.KeepAliveProvider=function(e){var c=e.children,s=e.router,u=e.alwaysRemember,l=void 0!==u&&u,f=e.maxPage,d=void 0===f?10:f,v=t.useRef(a.current),w=t.useRef(0);return t.useEffect((function(){var e=window.location.pathname,t=n((function(){w.current=window.scrollY||window.pageYOffset}),100),r=function(){v.current.isBack=!0,setTimeout((function(){v.current.isBack=!1}),500)};return window.removeEventListener("popstate",r),window.addEventListener("popstate",r),window.removeEventListener("scroll",t),window.addEventListener("scroll",t),function(){window.removeEventListener("scroll",t),window.removeEventListener("popstate",r),v.current.backHistory[e]&&(v.current.backHistory[e].scrollPos=w.current)}}),[s]),r.createElement(i.Provider,{value:o({},v,{alwaysRemember:l,maxPage:d>17?15:d})},c)},exports.useKeepAlive=function(e,r){var n=r||{},a=n.alwaysRemember,c=void 0===a||a,s=n.store,u=void 0===s||s,l=t.useContext(i),f=l.current,d=l.maxPage,v=l.alwaysRemember&&c,w="undefined"!=typeof window&&window.location.pathname?window.location.pathname:"temp";"undefined"!=typeof window&&(window.__BACK_HISTORY__=f.backHistory);var b=t.useRef({state:{},ref:{}}),y=function(){var t,r=null==(t=f.backHistory[w])?void 0:t.data;return(f.isBack||v)&&r?r[e]:void 0};return t.useLayoutEffect((function(){if((f.isBack||v)&&f.backHistory[w]){var e=f.backHistory[w];e.scrollPos>0&&window.scrollTo(0,e.scrollPos)}}),[]),t.useEffect((function(){return function(){if(u){var t,r,n,a,i,c=b.current,s=c.state,l=c.ref,v=(null==(t=f.backHistory[w])?void 0:t.data)||{},y=o({},f.backHistory,((i={})[w]={order:Object.keys(f.backHistory).length,scrollPos:null!=(r=null==(n=f.backHistory[w])?void 0:n.scrollPos)?r:0,data:o({},v,(a={},a[e]={state:s,ref:l},a))},i));Object.entries(y).length>d&&(y=Object.entries(y).sort((function(e,t){var r=e[1],n=t[1];return((null==n?void 0:n.order)||0)-((null==r?void 0:r.order)||0)})).filter((function(e,t){return 0!==t})).reduce((function(e,t){var r;return o({},e,((r={})[t[0]]=t[1],r))}),{})),f.backHistory=y}}}),[]),{isBack:f.isBack,useNotBackEffect:function(r,n){return void 0===n&&(n=[]),t.useEffect((function(){var t,n=(null==(t=f.backHistory[w])?void 0:t.data)||{};f.isBack&&n[e]||r()}),[].concat(n))},useBackActive:function(r,n){return void 0===n&&(n=[]),t.useEffect((function(){var t,n=(null==(t=f.backHistory[w])?void 0:t.data)||{};f.isBack&&n[e]&&r()}),[].concat(n))},useMemState:function(e,r){var n=y(),o=n&&n.state[r],a=t.useState(null!=o?o:e);return b.current.state[r]=a[0],a},useMemRef:function(e,r){var n=y(),o=n&&n.ref[r].current,a=t.useRef(null!=o?o:e);return b.current.ref[r]=a,a}}};
//# sourceMappingURL=next-easy-keepalive.cjs.production.min.js.map