@ebay/ui-core-react
Version:
Skin components build off React
2 lines (1 loc) • 5.2 kB
JavaScript
;const r=require("react"),ue=require("./icon-button-B1aE4GTn.js"),de=require("classnames");function Ce(n){const c=new Intl.Locale(n);return c.weekInfo?c.weekInfo.firstDay:0}function Ue(n){const c=Ce(n),i=new Intl.DateTimeFormat(n,{weekday:"short"}),d=new Date(2022,9,2+c),A=[...Array(7)].map(()=>{const k=i.format(d);return d.setDate(d.getDate()+1),k});return{firstDayOfWeek:c,weekdayLabels:A}}function Ae(n){if(n)return/^\d\d\d\d-\d\d-\d\d$/g.test(n)?n:u(new Date(n))}function u(n){if(!isNaN(n.getTime()))return n.toISOString().slice(0,10)}function U(n){return new Date(n)}function H(n,c){const i=U(n);return i.setUTCDate(i.getUTCDate()+c),u(i)}function fe(n){return n||navigator.language}const Fe={ArrowRight:1,ArrowLeft:-1,ArrowDown:7,ArrowUp:-7},Re=({selected:n,numMonths:c=1,navigable:i,interactive:d,range:A,locale:k,disableBefore:g,disableAfter:I,disableWeekdays:B,disableList:G,a11ySelectedText:me="selected",a11yRangeStartText:ye="start of range",a11yInRangeText:ge="in range",a11yRangeEndText:Ie="end of range",a11ySeparator:J="-",a11yTodayText:De="today",a11yDisabledText:Se="inactive",getA11yShowMonthText:Q=T=>`Show ${T}`,linkBuilder:X,onMonthChange:Z=()=>{},onFocus:we=()=>{},onSelect:Ee=()=>{}})=>{const T=u(new Date),{firstDayOfWeek:Oe,weekdayLabels:Te}=Ue(fe(k)),ee=r.useRef(null),[m,F]=r.useState(0),[te,ne]=r.useState(null),[D,_]=r.useState(T),R=r.useRef(T),S=e=>{const t=U(R.current);return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+e))},w=()=>u(S(m)),E=()=>{const e=U(R.current);return u(new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+m+(c||1),0)))};r.useEffect(()=>{if(n){const e=Array.isArray(n)?n:[n],t=w(),a=E();e.find(f=>f>=t&&f<=a)===void 0&&(R.current=e[0],F(0))}},[n]);const be=()=>{if(n&&A){let e,t;if(Array.isArray(n)?[e,t]=n:te&&(e=n,t=te),e&&t){const[a,s]=[e,t].sort();return{rangeStart:a,rangeEnd:s}}}return{rangeStart:null,rangeEnd:null}},h=e=>new Intl.DateTimeFormat(fe(k),{month:"long",year:"numeric"}).format(new Date(e.getUTCFullYear(),e.getUTCMonth())),p=e=>g&&e<g||I&&e>I||B&&B.includes(U(e).getUTCDay())||G&&G.includes(e),ae=()=>{let e=w();const t=E();for(;e<=t&&p(e);)e=H(e,1);return e>t?null:e},re=()=>{let e=E();const t=w();for(;e>=t&&p(e);)e=H(e,-1);return e<t?null:e},b=e=>{_(e),setTimeout(()=>{var t;const a=(t=ee.current)===null||t===void 0?void 0:t.querySelector(`[data-iso="${e}"]`);a?.focus()})},N=e=>{if(g&&w()<=g)return!1;F(s=>s-1);let t=D;const a=re();return a&&a<D&&(t=a,_(a)),e&&b(t),Z({iso:u(S(m))}),!0},L=e=>{if(I&&E()>=I)return!1;F(s=>s+1);let t=D;const a=ae();a&&a>D&&(t=a,_(a)),e&&b(t),Z({iso:u(S(m+(c||1)))})},ke=e=>{const t=Fe[e.key];if(t){e.preventDefault();let a=7,s=D;do s=H(s,t);while(a-- >0&&p(s));if(a>0){const f=w(),O=E();s<f?i?N():s=f:s>O&&(i?L():s=O),b(s)}}else switch(e.key){case"PageUp":N(!0);break;case"PageDown":L(!0);break;case"Home":b(ae());break;case"End":b(re());break}},_e=(e,t)=>{Ee(e,{iso:t})},se=(e,t)=>{ne(t),_(t),we(e,{iso:t})},oe=()=>{ne(null)},{rangeStart:V,rangeEnd:x}=be(),he=e=>!(!V||!x||e<V||e>x),ce=[...Array(c)].map((e,t)=>S(m+t));return r.createElement("div",{className:"calendar",ref:ee},i&&r.createElement("div",{className:"calendar__header"},r.createElement("div",{className:"calendar__header--inner"},r.createElement(ue.EbayIconButton,{transparent:!0,size:"small",icon:"chevronLeft24",disabled:g&&w()<=g,"aria-label":Q(h(S(m-1))),onClick:()=>N()}),ce.map((e,t)=>r.createElement("h3",{key:t},h(e))),r.createElement(ue.EbayIconButton,{transparent:!0,size:"small",icon:"chevronRight24",disabled:I&&E()>=I,"aria-label":Q(h(S(m+c))),onClick:()=>L()}))),r.createElement("div",{className:"calendar__body"},ce.map((e,t)=>{const a=(e.getUTCDay()-Oe+7)%7,s=e.getUTCFullYear(),f=e.getUTCMonth(),O=new Date(s,f+1,0).getDate(),pe=[...Array(Math.ceil((a+O)/7))];return r.createElement("div",{key:t,className:"calendar__month"},r.createElement("table",{onKeyDown:ke},r.createElement("caption",null,h(e)),r.createElement("thead",null,r.createElement("tr",null,Te.map(M=>r.createElement("th",{key:M,scope:"col"},M)))),r.createElement("tbody",null,pe.map((M,Y)=>{let $=Y*7-a+1,q=$+6;const P=[];Y===0&&a!==0?($=1,P.push(r.createElement("td",{key:"pre-column",colSpan:a}))):q>O&&(q=O);for(let y=$;y<=q;y++){const o=u(new Date(Date.UTC(s,f,y))),W=o===T,j=Array.isArray(n)?n.some(l=>l===o):n===o,z=o===V,le=he(o),K=o===x,v=p(o),C=["",j&&me,z&&ye,!z&&!K&&le&&ge,K&&Ie,!d&&W&&De,!d&&v&&Se].filter(l=>typeof l!="boolean"||l!==!1),ie=!d&&!v&&X&&X(o),ve=ie?"a":"span";P.push(r.createElement("td",{key:y,className:de({"calendar__cell--selected":j,"calendar__range--start":z,calendar__range:le,"calendar__range--end":K})},d?r.createElement("button",{disabled:v,"aria-label":C.length>1?`${y}${C.join(J)}`:void 0,tabIndex:D!==o?-1:void 0,"aria-current":W?"date":void 0,"aria-pressed":j?"true":void 0,onClick:l=>_e(l,o),onFocus:l=>se(l,o),onMouseOver:l=>se(l,o),onMouseOut:()=>oe(),onBlur:()=>oe(),"data-iso":o},y):r.createElement(ve,{className:de({"calendar__cell--disabled":v,"calendar__cell--current":W}),href:ie},y,C.length>1&&r.createElement("span",{className:"clipped"},C.join(J)))))}return r.createElement("tr",{key:Y},P)}))))})))};exports.EbayCalendar=Re;exports.dateArgToISO=Ae;exports.toISO=u;