use-exit-intent
Version:
A React Hook to handle exit intent strategies
3 lines (2 loc) • 5.33 kB
JavaScript
import{useState as L,useRef as j,useCallback as b,useEffect as U}from"react";/*! js-cookie v3.0.1 | MIT */function x(e){for(var n=1;n<arguments.length;n++){var o=arguments[n];for(var u in o)e[u]=o[u]}return e}var _={read:function(e){return e[0]==='"'&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function O(e,n){function o(r,f,t){if(!(typeof document>"u")){t=x({},n,t),typeof t.expires=="number"&&(t.expires=new Date(Date.now()+t.expires*864e5)),t.expires&&(t.expires=t.expires.toUTCString()),r=encodeURIComponent(r).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var a="";for(var s in t)!t[s]||(a+="; "+s,t[s]!==!0&&(a+="="+t[s].split(";")[0]));return document.cookie=r+"="+e.write(f,r)+a}}function u(r){if(!(typeof document>"u"||arguments.length&&!r)){for(var f=document.cookie?document.cookie.split("; "):[],t={},a=0;a<f.length;a++){var s=f[a].split("="),g=s.slice(1).join("=");try{var p=decodeURIComponent(s[0]);if(t[p]=e.read(g,p),r===p)break}catch{}}return r?t[r]:t}}return Object.create({set:o,get:u,remove:function(r,f){o(r,"",x({},f,{expires:-1}))},withAttributes:function(r){return O(this.converter,x({},this.attributes,r))},withConverter:function(r){return O(x({},this.converter,r),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(e)}})}var S=O(_,{path:"/"});function B(){return typeof window<"u"}function h(){if(B())return window.matchMedia("(hover: none)").matches||navigator.userAgent.toLowerCase().includes("mobile")}function M(){if(B())return!h()}function R(e){var n,o;const u=(n=e.context)==null?void 0:n.includes("onDesktop"),r=(o=e.context)==null?void 0:o.includes("onMobile");!u&&!r&&e.handler(),u&&M()&&e.handler(),r&&h()&&e.handler()}function C(e){return e*1e3}function P(e){y(e),window.addEventListener("load",e,!0),window.addEventListener("mousemove",e,!0),window.addEventListener("mousedown",e,!0),window.addEventListener("keydown",e,!0),window.addEventListener("touchstart",e,!0),window.addEventListener("click",e,!0),window.addEventListener("scroll",e,!0)}function y(e){window.removeEventListener("load",e,!0),window.removeEventListener("mousemove",e,!0),window.removeEventListener("mousedown",e,!0),window.removeEventListener("keydown",e,!0),window.removeEventListener("touchstart",e,!0),window.removeEventListener("click",e,!0),window.removeEventListener("scroll",e,!0)}function A(e,n=200){let o;return{execute(u){clearTimeout(o),o=setTimeout(()=>e(u),n)},abort(){clearTimeout(o)}}}const T={onMobile:"onMobile",onTrigger:"onTrigger",onDesktop:"onDesktop",onUnsubscribe:"onUnsubscribe"},k={cookie:{daysToExpire:30,key:"exit-intent"},desktop:{triggerOnIdle:!1,useBeforeUnload:!1,triggerOnMouseLeave:!0,delayInSecondsToTrigger:10,mouseLeaveDelayInSeconds:5},mobile:{triggerOnIdle:!0,delayInSecondsToTrigger:10}};var V=Object.defineProperty,W=Object.defineProperties,X=Object.getOwnPropertyDescriptors,F=Object.getOwnPropertySymbols,Y=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable,z=(e,n,o)=>n in e?V(e,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[n]=o,c=(e,n)=>{for(var o in n||(n={}))Y.call(n,o)&&z(e,o,n[o]);if(F)for(var o of F(n))Z.call(n,o)&&z(e,o,n[o]);return e},D=(e,n)=>W(e,X(n));function $(e={}){const n=D(c({},k),{cookie:c(c({},k.cookie),e?.cookie),desktop:c(c({},k.desktop),e?.desktop),mobile:c(c({},k.mobile),e?.mobile)}),[o,u]=L(n),[r,f]=L(!1),[t,a]=L(!1),s=j([]).current,g=j(!1),{mobile:p,desktop:v,cookie:m}=o,H=!(t||r);g.current=t||r;const E=b(()=>{g.current||(f(!0),s.filter(d=>{var i,l;return((i=d.context)==null?void 0:i.filter(w=>w!==T.onDesktop&&w!==T.onMobile).length)===0||((l=d.context)==null?void 0:l.includes(T.onTrigger))}).forEach(R))},[]),q=b(()=>{S.set(m.key,"true",{expires:m.daysToExpire,sameSite:"Strict"}),s.filter(d=>{var i;return(i=d.context)==null?void 0:i.includes(T.onUnsubscribe)}).forEach(R),a(!0)},[m?.key]),I=b(()=>{S.remove(m?.key,{sameSite:"Strict"}),window.onbeforeunload=null,f(!1),a(!1)},[m?.key]),G=b(()=>{I(),u(n)},[]),J=b(d=>{const i=s.find(w=>w.id===d.id),l=D(c({},d),{context:d?.context||[]});if(i){s[s.indexOf(i)]=l;return}s.push(l)},[]),Q=b((d=k)=>{const i=d;I(),u(l=>D(c(c({},l||{}),i||{}),{cookie:c(c({},l?.cookie||{}),i?.cookie||{}),desktop:c(c({},l?.desktop||{}),i?.desktop||{}),mobile:c(c({},l?.mobile||{}),i?.mobile||{})}))},[o]);return U(()=>{a(S.get(m.key)==="true")},[]),U(()=>{if(h()){const{execute:d,abort:i}=A(E,C(p?.delayInSecondsToTrigger));if(g.current){y(d);return}return h()&&p?.triggerOnIdle&&P(d),()=>{i(),y(d)}}if(M()){const{execute:d,abort:i}=A(E,C(v?.delayInSecondsToTrigger));let l;const w=()=>{g.current||E()};return v!=null&&v.triggerOnIdle&&P(d),v!=null&&v.triggerOnMouseLeave&&(l=setTimeout(()=>{document.body.addEventListener("mouseleave",w)},C(v.mouseLeaveDelayInSeconds))),v!=null&&v.useBeforeUnload&&(window.onbeforeunload=()=>{if(!g.current)return E(),""}),()=>{i(),clearTimeout(l),document.body.removeEventListener("mouseleave",w),y(d),window.onbeforeunload=null}}}),{settings:o,resetState:I,isTriggered:r,unsubscribe:q,resetSettings:G,updateSettings:Q,isUnsubscribed:t,registerHandler:J,willBeTriggered:H}}export{$ as useExitIntent};
//# sourceMappingURL=index.js.map