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