react-simply-carousel
Version:
A simple, lightweight, fully controlled isomorphic (with SSR support) React.js carousel component. Touch enabled and responsive. With support for autoplay and infinity options. Fully customizable
2 lines (1 loc) • 12.5 kB
JavaScript
import e,{memo as t,useState as n,useRef as i,Children as r,useCallback as o,useEffect as d}from"react";var l=function(){return l=Object.assign||function(e){for(var t,n=1,i=arguments.length;n<i;n++)for(var r in t=arguments[n])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},l.apply(this,arguments)};function c(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r<i.length;r++)t.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(n[i[r]]=e[i[r]])}return n}function s(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,r,o=n.call(e),d=[];try{for(;(void 0===t||t-- >0)&&!(i=o.next()).done;)d.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return d}function a(e,t,n){if(n||2===arguments.length)for(var i,r=0,o=t.length;r<o;r++)!i&&r in t||(i||(i=Array.prototype.slice.call(t,0,r)),i[r]=t[r]);return e.concat(i||Array.prototype.slice.call(t))}"function"==typeof SuppressedError&&SuppressedError;var u=t((function(t){var u,v,m=t.responsiveProps,f=void 0===m?[]:m,h=c(t,["responsiveProps"]),p=s(n(0),2),b=p[0],w=p[1],y=s(n(h.activeSlideIndex),2),x=y[0],S=y[1],E=i(null),g=i(null),L=i(null),T=i(!1),I=i(0),k=i(!1),C=i(""),M=i(null),W=i(null),P=i(0),O=i(x),X=f.reduce((function(e,t){void 0===t&&(t={});var n=t.minWidth,i=void 0===n?0:n,r=t.maxWidth,o=void 0===r?null:r,d=c(t,["minWidth","maxWidth"]);return b>i&&(!o||b<=o)?l(l({},e),d):e}),h),A=r.toArray(X.children),N=b?l(l({},X),{activeSlideIndex:Math.max(0,Math.min(X.activeSlideIndex,A.length-1)),itemsToShow:Math.min(A.length,X.itemsToShow||0),itemsToScroll:Math.min(A.length,X.itemsToScroll||1)}):h,F=N.containerProps,V=void 0===F?{}:F,j=V.style,z=void 0===j?{}:j,B=c(V,["style"]),R=N.innerProps,D=void 0===R?{}:R,q=D.style,H=void 0===q?{}:q,G=c(D,["style"]),J=N.itemsListProps,K=void 0===J?{}:J,Q=K.style,U=void 0===Q?{}:Q,Y=K.onTransitionEnd,Z=void 0===Y?void 0:Y,$=c(K,["style","onTransitionEnd"]),_=N.backwardBtnProps,ee=void 0===_?{}:_,te=ee.children,ne=void 0===te?null:te,ie=ee.show,re=void 0===ie||ie,oe=c(ee,["children","show"]),de=N.forwardBtnProps,le=void 0===de?{}:de,ce=le.children,se=void 0===ce?null:ce,ae=le.show,ue=void 0===ae||ae,ve=c(le,["children","show"]),me=N.activeSlideProps,fe=void 0===me?{}:me,he=fe.className,pe=void 0===he?"":he,be=fe.style,we=void 0===be?{}:be,ye=c(fe,["className","style"]),xe=N.visibleSlideProps,Se=void 0===xe?{}:xe,Ee=Se.className,ge=void 0===Ee?"":Ee,Le=Se.style,Te=void 0===Le?{}:Le,Ie=c(Se,["className","style"]),ke=N.updateOnItemClick,Ce=void 0!==ke&&ke,Me=N.activeSlideIndex,We=N.onRequestChange,Pe=N.speed,Oe=void 0===Pe?0:Pe,Xe=N.delay,Ae=void 0===Xe?0:Xe,Ne=N.easing,Fe=void 0===Ne?"linear":Ne,Ve=N.itemsToShow,je=void 0===Ve?0:Ve,ze=N.itemsToScroll,Be=void 0===ze?1:ze,Re=N.children,De=N.onAfterChange,qe=N.autoplay,He=void 0!==qe&&qe,Ge=N.autoplayDirection,Je=void 0===Ge?"forward":Ge,Ke=N.disableNavIfAllVisible,Qe=void 0===Ke||Ke,Ue=N.hideNavIfAllVisible,Ye=void 0===Ue||Ue,Ze=N.centerMode,$e=void 0!==Ze&&Ze,_e=N.infinite,et=void 0===_e||_e,tt=N.disableNavIfEdgeVisible,nt=void 0===tt||tt,it=N.disableNavIfEdgeActive,rt=void 0===it||it,ot=N.dotsNav,dt=void 0===ot?{}:ot,lt=N.persistentChangeCallbacks,ct=void 0!==lt&<,st=N.autoplayDelay,at=void 0===st?0:st,ut=N.preventScrollOnSwipe,vt=void 0!==ut&&ut,mt=N.disableSwipeByMouse,ft=void 0!==mt&&mt,ht=N.disableSwipeByTouch,pt=void 0!==ht&&ht,bt=N.touchSwipeTreshold,wt=N.mouseSwipeTreshold,yt=N.swipeTreshold,xt=N.touchSwipeRatio,St=N.mouseSwipeRatio,Et=N.swipeRatio,gt=void 0===Et?1:Et,Lt=N.dirRTL,Tt=void 0!==Lt&&Lt,It=dt||{},kt=It.show,Ct=void 0!==kt&&kt,Mt=It.containerProps,Wt=void 0===Mt?{}:Mt,Pt=It.itemBtnProps,Ot=void 0===Pt?{}:Pt,Xt=It.activeItemBtnProps,At=void 0===Xt?{}:Xt,Nt=r.count(Re)-1,Ft=!!b&&(null===(u=g.current)||void 0===u?void 0:u.offsetWidth)>=(null===(v=L.current)||void 0===v?void 0:v.offsetWidth),Vt=Ye&&Ft,jt=Qe&&Ft,zt=Me-x==0||!Oe&&!Ae?"none":"transform ".concat(Oe,"ms ").concat(Fe," ").concat(Ae,"ms"),Bt=o((function(e){var t,n=e.correctionSlideIndex,i=e.prevCorrectionSlideIndex,r=e.curActiveSlideIndex,o=L.current.offsetWidth,d=L.current.children,l=d.length,c=et?a([],s(d),!1).slice(l/3-i,l/3-i+l/3):a([],s(d),!1),u=null===(t=c[r])||void 0===t?void 0:t.offsetWidth,v=je?c.reduce((function(e,t,n){return n>=r&&n<r+je||n<r&&n<r+je-c.length?e+t.offsetWidth:e}),0):g.current.offsetWidth,m=Math.min(v,g.current.offsetWidth),f=o-m,h=$e&&et?-(m-u)/2:0,p=et?o/3:0,b=n-r==0?0:"forward"===C.current&&r<n?p:"backward"===C.current&&r>n?-p:0,w=r-n!=0,y=function(e){var t=c.reduce((function(t,n,i){return i>=e?t:t+(n.offsetWidth||0)}),0);return et?t:Math.min(f,t)},x=w&&et?y(n):0,S=w||!et?y(r):0,E=jt?0:S-x+h+b+p,T="translateX(".concat(Tt?"":"-").concat(E,"px)"),I=et?p+h:Math.min(f,c.reduce((function(e,t,n){return n<r?e+t.offsetWidth:e}),0)),k=I+m,M=c.map((function(e,t){return{slideIndex:t,htmlElement:e}})),W=et?a(a(a(a([],s(c.slice(r).map((function(e,t){return{slideIndex:t+r,htmlElement:e}}))),!1),s(M),!1),s(M),!1),s(c.slice(0,r).map((function(e,t){return{slideIndex:t,htmlElement:e}}))),!1):M,P=W.reduce((function(e,t){var n=t.slideIndex,i=t.htmlElement.offsetWidth;return(e.summ>=I&&e.summ<k||e.summ+i>I&&e.summ+i<=k)&&e.items.push({slideIndex:n,isFullyVisible:e.summ+i<=k&&e.summ>=I}),e.summ+=i,e}),{summ:0,items:[]}),O=!!P.items.find((function(e){return 0===e.slideIndex})),X=!!P.items.find((function(e){return e.slideIndex===c.length-1}));return{slidesHTMLElements:c,innerMaxWidth:v,itemsListMaxTranslateX:f,activeSlideWidth:u,offsetCorrectionForCenterMode:h,offsetCorrectionForInfiniteMode:p,itemsListTranslateX:E,itemsListTransform:T,visibleSlides:P.items,isFirstSlideVisible:O,isLastSlideVisible:X}}),[$e,jt,et,je,Tt]),Rt=b?Bt({prevCorrectionSlideIndex:O.current,curActiveSlideIndex:Me,correctionSlideIndex:x}):{},Dt=Rt.innerMaxWidth,qt=void 0===Dt?0:Dt,Ht=Rt.itemsListMaxTranslateX,Gt=void 0===Ht?0:Ht,Jt=Rt.activeSlideWidth,Kt=void 0===Jt?0:Jt,Qt=Rt.offsetCorrectionForCenterMode,Ut=void 0===Qt?0:Qt,Yt=Rt.offsetCorrectionForInfiniteMode,Zt=void 0===Yt?0:Yt,$t=Rt.itemsListTranslateX,_t=void 0===$t?0:$t,en=Rt.itemsListTransform,tn=void 0===en?"none":en,nn=Rt.visibleSlides,rn=void 0===nn?[]:nn,on=o((function(e){var t;return"forward"===e?(t=Me+Be)>Nt?et?t-Nt-1:Nt:t:"backward"===e?(t=Me-Be)<0?et?Nt+1+t:0:t:Me}),[Me,Be,Nt,et]),dn=o((function(e,t){var n;if(C.current=t,L.current.style.transition=Oe||Ae?"transform ".concat(Oe,"ms ").concat(Fe," ").concat(Ae,"ms"):"none",e!==Me||ct){clearTimeout(M.current);var i=Bt({correctionSlideIndex:x,prevCorrectionSlideIndex:x,curActiveSlideIndex:e}),r=i.visibleSlides,o=i.isFirstSlideVisible,d=i.isLastSlideVisible,l=i.itemsListTransform;e!==Me&&(null===(n=L.current)||void 0===n?void 0:n.style.transform)===l&&(T.current=!0),L.current.style.transform=l,We(e,{visibleSlides:r,isFirstSlideVisible:o,isLastSlideVisible:d})}else L.current.style.transform="translateX(".concat(Tt?"":"-").concat(Ut+Zt+(et?0:_t),"px)")}),[ct,Me,Ut,Ae,Fe,Oe,We,Zt,et,_t,x,Bt,Tt]),ln=o((function(){He&&(clearTimeout(M.current),M.current=setTimeout((function(){dn(on(Je),Je)}),at||Ae))}),[He,Je,at,dn,on,Ae]),cn=o((function(){dn(on("backward"),"backward")}),[dn,on]),sn=o((function(e){S(Me),Z&&Z(e)}),[Me,Z]),an=o((function(){dn(on("forward"),"forward")}),[dn,on]),un=function(e,t,n){return e.map((function(e,i){var r=e.props,o=void 0===r?{}:r,d=o.className,s=void 0===d?"":d,a=o.onClick,u=void 0===a?null:a,v=o.style,m=void 0===v?{}:v,f=c(o,["className","onClick","style"]),h=c(e,["props"]),p=et?P.current>=A.length?"forward":"backward":i>=Me?"forward":"backward",b=i+t===Me,w=rn.find((function(e){return e.slideIndex===i+t})),y="".concat(s," ").concat(b?pe:""," ").concat(w?ge:"").trim()||void 0,x=l(l(l(l({},m),w?Te:{}),b?we:{}),{boxSizing:"border-box",margin:0}),S=!n&&Ce?function(e){var t=e.direction,n=e.index,i=e.onClick;return function(e){dn(n,t||(Me<n?"forward":"")||(Me>n?"backward":"")),i&&i(e)}}({direction:p,index:i+t,onClick:u}):u,E=l(l(l({role:"tabpanel",className:y,style:x,onClick:S},f),w?Ie:{}),b?ye:{});return P.current+=1,l({props:E},h)}))};return d((function(){var e=L.current;function t(e){var n;e.preventDefault(),e.stopPropagation(),null===(n=e.target)||void 0===n||n.removeEventListener("click",t)}function n(e){var t,n;k.current=!0;var i=!!(null===(t=e.touches)||void 0===t?void 0:t[0]),r=i?null===(n=e.touches)||void 0===n?void 0:n[0].clientX:e.clientX,o=(I.current-r)*((i?xt:St)||gt)+Ut+Zt+(et?0:_t),d=L.current.offsetWidth,l=Math.max(-o,-d);L.current.style.transition="none",L.current.style.transform="translateX(".concat((Tt?-1:1)*l,"px)")}function i(e){var r,o,d;if(document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",i),document.removeEventListener("touchmove",n),document.removeEventListener("touchend",i),k.current){null===(r=e.target)||void 0===r||r.addEventListener("click",t);var l=!!(null===(o=e.changedTouches)||void 0===o?void 0:o[0]),c=l?e.changedTouches[e.changedTouches.length-1].clientX:e.clientX,s=(I.current-c)*((l?xt:St)||gt),a=(l?bt:wt)||yt||Kt/2,u=s>a?{index:on("forward"),direction:"forward"}:s<-a?{index:on("backward"),direction:"backward"}:{index:Me,direction:"forward"};dn(u.index,u.direction)}else null===(d=e.target)||void 0===d||d.removeEventListener("click",t);I.current=0,k.current=!1}function r(e){var t,r;clearTimeout(M.current);var o=!!(null===(t=e.touches)||void 0===t?void 0:t[0]);I.current=o?null===(r=e.touches)||void 0===r?void 0:r[0].clientX:e.clientX,o?(document.addEventListener("touchmove",n),document.addEventListener("touchend",i)):(document.addEventListener("mousemove",n),document.addEventListener("mouseup",i))}return jt||(ft||null==e||e.addEventListener("mousedown",r),pt||null==e||e.addEventListener("touchstart",r,{passive:!0}),ft&&pt||null==e||e.addEventListener("dragstart",i)),function(){k.current=!1,I.current=0,null==e||e.removeEventListener("mousedown",r),null==e||e.removeEventListener("touchstart",r),null==e||e.removeEventListener("dragstart",i),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",i),document.removeEventListener("touchmove",n),document.removeEventListener("touchend",i)}}),[et,_t,tn,Ut,Zt,Me,Kt,on,dn,jt,ft,pt,bt,wt,yt,xt,St,gt,Tt]),d((function(){return Me!==x?(!Oe&&!Ae||T.current)&&(T.current=!1,S(Me)):(De&&De(Me,x),(et||"forward"===Je&&Me!==Nt||"backward"===Je&&0!==Me)&&ln()),function(){clearTimeout(M.current)}}),[x,Me,De,Oe,Ae,ln,et,Nt,Je]),d((function(){return b&&ln(),function(){clearTimeout(M.current)}}),[b]),d((function(){function e(){clearTimeout(W.current),clearTimeout(M.current),W.current=setTimeout((function(){b!==window.innerWidth&&w(0)}),400)}return b!==window.innerWidth&&w(window.innerWidth),window.addEventListener("resize",e),function(){clearTimeout(W.current),window.removeEventListener("resize",e)}}),[b]),P.current=0,O.current=x,e.createElement("div",l({style:l({display:"flex",flexFlow:"row wrap",boxSizing:"border-box",justifyContent:"center",width:"100%"},z)},B,{ref:E}),re&&!Vt&&e.createElement("button",l({},oe,{type:"button",onClick:(0===_t&&nt||0===Me&&rt)&&!et?void 0:cn,disabled:"boolean"==typeof oe.disabled?oe.disabled:!(!(0===_t&&nt||0===Me&&rt)||et)}),ne),e.createElement("div",l({},G,{style:l(l({width:"100%"},H),{display:"flex",boxSizing:"border-box",flexFlow:"row wrap",padding:"0",overflow:"hidden",maxWidth:qt?"".concat(qt,"px"):void 0,flex:qt?void 0:"1 0 auto"}),ref:g}),e.createElement("div",l({},$,{style:l(l({},U),{display:"flex",boxSizing:"border-box",outline:"none",transition:zt,transform:tn,touchAction:vt?"none":"auto"}),onTransitionEnd:Oe||Ae?sn:Z,tabIndex:-1,role:"presentation",ref:L}),et&&un(A.slice(x),x,jt),un(A,0,jt),et&&un(A,0,jt),et&&un(A.slice(0,x),0,jt))),ue&&!Vt&&e.createElement("button",l({},ve,{type:"button",onClick:(_t===Gt&&nt||Me===Nt&&rt)&&!et?void 0:an,disabled:"boolean"==typeof ve.disabled?ve.disabled:!(!(_t===Gt&&nt||Me===Nt&&rt)||et)}),se),!!Ct&&e.createElement("div",l({style:{width:"100%",display:"flex",justifyContent:"center"}},Wt),Array.from({length:Math.ceil(A.length/Be)}).map((function(t,n){return e.createElement("button",l({type:"button",key:n,title:"".concat(n)},Ot,Me>=n*Be&&Me<Math.min(Be*(n+1),Nt+1)?At:{},{onClick:function(){dn(Math.min(n*Be,A.length-1),Math.min(n*Be,A.length-1)>Me?"forward":"backward")}}))}))))}));export{u as default};