react-custom-calendars
Version:
A calendar that can be customized to your liking 🧨
2 lines (1 loc) • 2.99 kB
JavaScript
(function(f,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("react")):typeof define=="function"&&define.amd?define(["exports","react"],c):(f=typeof globalThis<"u"?globalThis:f||self,c(f.index={},f.React))})(this,function(f,c){"use strict";const g=(e,n)=>{const i=e.getUTCFullYear(),o=e.getUTCMonth()+1,a=e.getUTCDate();let t=n;return n.includes("yyyy")&&(t=t.replace("yyyy",i.toString())),n.includes("MM")&&(t=t.replace("MM",o.toString().padStart(2,"0"))),n.includes("dd")&&(t=t.replace("dd",a.toString().padStart(2,"0"))),t},p=(e,n,i,o=!1)=>{const t=new Date(Date.UTC(e,n,1)).getUTCDay(),l=new Date(Date.UTC(e,n+1,0)).getUTCDate(),s=n-1,r=s<0?e-1:e,u=s<0?11:s,D=new Date(Date.UTC(r,u+1,0)).getUTCDate(),T=n+1,S=T>11?e+1:e,v=T>11?0:T,C=Array(6).fill(null).map(()=>Array(7).fill(0)),d={},h={};let b=1,w=1;for(let m=0;m<6;m++)for(let M=0;M<7;M++)if(m===0&&M<t){const U=D-(t-M-1);if(C[m][M]=o?-U:0,o){const Y=new Date(Date.UTC(r,u,U));d[U]=g(Y,i)}}else if(b<=l)C[m][M]=b++;else{if(C[m][M]=o?-w:0,o){const U=new Date(Date.UTC(S,v,w));h[w]=g(U,i)}w++}return{matrix:C,year:e,month:n,prevMonthDates:d,nextMonthDates:h}},k=(e,n,i,o,a,t,l)=>{let s=e.find(r=>r.includes(o));return!s&&o>28&&(s=e[e.length-1]),s?s.map(r=>{if(r>0)return g(new Date(Date.UTC(n,i,r)),l);if(r<0){const u=Math.abs(r),D=a[u]||t[u];return D?g(new Date(D),l):"0"}return"0"}):[]},x=(e,n,i,o,a=!1,t={},l={})=>e.map(s=>s.map(r=>{if(r>0)return g(new Date(Date.UTC(n,i,r)),o);if(a&&r<0){const u=Math.abs(r),D=t[u]||l[u];return D?g(new Date(D),o):"0"}return"0"})),y=({type:e,initialDate:n})=>{if(!e)throw new Error("Calendar type is required");const[i,o]=c.useState(()=>{if(n)return new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth(),1)).toISOString();const u=new Date;return new Date(Date.UTC(u.getUTCFullYear(),u.getUTCMonth(),1)).toISOString()}),[a,t]=i.split("T")[0].split("-").map(Number),l=c.useMemo(()=>p(a,t-1,e),[a,t]),s=c.useMemo(()=>x(l.matrix,a,t-1,e),[l,e,a,t]),r=u=>{const D=new Date(Date.UTC(a,t-1+u,1));o(D.toISOString())};return{currentDate:i,setCurrentDate:o,monthCalendarData:s,moveToNext:()=>r(1),moveToPrev:()=>r(-1),moveToPeriod:r}},O=({type:e,initialDate:n})=>{if(!e)throw new Error("Calendar type is required");const[i,o]=c.useState(()=>{if(n)return new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate())).toISOString();const d=new Date;return new Date(Date.UTC(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate())).toISOString()}),[a,t,l]=i.split("T")[0].split("-").map(Number),{matrix:s,year:r,month:u,prevMonthDates:D,nextMonthDates:T}=c.useMemo(()=>p(a,t-1,e,!0),[a,t]),S=c.useMemo(()=>k(s,a,t-1,l,D,T,e),[s,a,t,l,D,T,e]),v=c.useMemo(()=>x(s,r,u,e,!0,D,T),[s,r,u,e,D,T]),C=d=>{const h=new Date(Date.UTC(a,t-1,l+d*7));o(h.toISOString())};return{currentDate:i,setCurrentDate:o,weekDates:S,monthlyWeekGrid:v,moveToNext:()=>C(1),moveToPrev:()=>C(-1),moveToPeriod:C,matrix:s}};f.MonthCalendar=y,f.WeekCalendar=O,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});