UNPKG

@symbiot.dev/react-native-timegrid

Version:

A lightweight and customizable time grid calendar component for React Native, Web, and Expo.

1 lines 122 kB
import{jsx,jsxs}from"react/jsx-runtime";import{createContext,memo,useCallback,useContext,useMemo,useRef,useState,useEffect,useImperativeHandle,createElement,useLayoutEffect,forwardRef}from"react";import{Platform,Text,StyleSheet,View,Pressable,useWindowDimensions,Appearance,AppState}from"react-native";import{isAfter}from"date-fns/isAfter";import{isBefore}from"date-fns/isBefore";import{addDays}from"date-fns/addDays";import{getDay}from"date-fns/getDay";import{startOfWeek}from"date-fns/startOfWeek";import{differenceInDays}from"date-fns/differenceInDays";import{toDate as toDate$1}from"date-fns/toDate";import{isSameDay}from"date-fns/isSameDay";import{startOfDay}from"date-fns/startOfDay";import Animated,{useAnimatedStyle,useSharedValue,runOnJS,cancelAnimation,withTiming,useDerivedValue,useAnimatedReaction,withSpring}from"react-native-reanimated";import{Gesture,GestureHandlerRootView,GestureDetector,ScrollView,RefreshControl}from"react-native-gesture-handler";import{differenceInMinutes}from"date-fns/differenceInMinutes";import{addMinutes}from"date-fns/addMinutes";import{endOfDay}from"date-fns/endOfDay";import{subMinutes}from"date-fns/subMinutes";import{differenceInCalendarDays}from"date-fns/differenceInCalendarDays";import{set}from"date-fns/set";import"date-fns/addHours";import"date-fns/setSeconds";import"date-fns/setHours";import"date-fns/setMinutes";import{areIntervalsOverlapping}from"date-fns/areIntervalsOverlapping";import{format}from"date-fns/format";import{eachDayOfInterval}from"date-fns/eachDayOfInterval";import{isEqual}from"date-fns/isEqual";function tzTokenizeDate(date,timeZone){const dtf=function(timeZone){dtfCache[timeZone]||(dtfCache[timeZone]=hourCycleSupported?new Intl.DateTimeFormat("en-US",{hourCycle:"h23",timeZone:timeZone,year:"numeric",month:"numeric",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:timeZone,year:"numeric",month:"numeric",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}));return dtfCache[timeZone]}(timeZone);return"formatToParts"in dtf?function(dtf,date){try{const formatted=dtf.formatToParts(date),filled=[];for(let i=0;i<formatted.length;i++){const pos=typeToPos[formatted[i].type];void 0!==pos&&(filled[pos]=parseInt(formatted[i].value,10))}return filled}catch(error){if(error instanceof RangeError)return[NaN];throw error}}(dtf,date):function(dtf,date){const formatted=dtf.format(date),parsed=/(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/.exec(formatted);return[parseInt(parsed[3],10),parseInt(parsed[1],10),parseInt(parsed[2],10),parseInt(parsed[4],10),parseInt(parsed[5],10),parseInt(parsed[6],10)]}(dtf,date)}const typeToPos={year:0,month:1,day:2,hour:3,minute:4,second:5};const dtfCache={},testDateFormatted=new Intl.DateTimeFormat("en-US",{hourCycle:"h23",timeZone:"America/New_York",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(new Date("2014-06-25T04:00:00.123Z")),hourCycleSupported="06/25/2014, 00:00:00"===testDateFormatted||"‎06‎/‎25‎/‎2014‎ ‎00‎:‎00‎:‎00"===testDateFormatted;function newDateUTC(fullYear,month,day,hour,minute,second,millisecond){const utcDate=new Date(0);return utcDate.setUTCFullYear(fullYear,month,day),utcDate.setUTCHours(hour,minute,second,millisecond),utcDate}const patterns$1={timezoneZ:/^(Z)$/,timezoneHH:/^([+-]\d{2})$/,timezoneHHMM:/^([+-])(\d{2}):?(\d{2})$/};function tzParseTimezone(timezoneString,date,isUtcDate){if(!timezoneString)return 0;let hours,absoluteOffset,token=patterns$1.timezoneZ.exec(timezoneString);if(token)return 0;if(token=patterns$1.timezoneHH.exec(timezoneString),token)return hours=parseInt(token[1],10),validateTimezone(hours)?-36e5*hours:NaN;if(token=patterns$1.timezoneHHMM.exec(timezoneString),token){hours=parseInt(token[2],10);const minutes=parseInt(token[3],10);return validateTimezone(hours,minutes)?(absoluteOffset=36e5*Math.abs(hours)+6e4*minutes,"+"===token[1]?-absoluteOffset:absoluteOffset):NaN}if(function(timeZoneString){if(validIANATimezoneCache[timeZoneString])return!0;try{return new Intl.DateTimeFormat(void 0,{timeZone:timeZoneString}),validIANATimezoneCache[timeZoneString]=!0,!0}catch(error){return!1}}(timezoneString)){date=new Date(date||Date.now());const utcDate=isUtcDate?date:function(date){return newDateUTC(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds())}(date),offset=calcOffset(utcDate,timezoneString),fixedOffset=isUtcDate?offset:function(date,offset,timezoneString){const localTS=date.getTime();let utcGuess=localTS-offset;const o2=calcOffset(new Date(utcGuess),timezoneString);if(offset===o2)return offset;utcGuess-=o2-offset;const o3=calcOffset(new Date(utcGuess),timezoneString);if(o2===o3)return o2;return Math.max(o2,o3)}(date,offset,timezoneString);return-fixedOffset}return NaN}function calcOffset(date,timezoneString){const tokens=tzTokenizeDate(date,timezoneString),asUTC=newDateUTC(tokens[0],tokens[1]-1,tokens[2],tokens[3]%24,tokens[4],tokens[5],0).getTime();let asTS=date.getTime();const over=asTS%1e3;return asTS-=over>=0?over:1e3+over,asUTC-asTS}function validateTimezone(hours,minutes){return-23<=hours&&hours<=23&&(null==minutes||0<=minutes&&minutes<=59)}const validIANATimezoneCache={};function getTimezoneOffsetInMilliseconds(date){const utcDate=new Date(Date.UTC(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()));return utcDate.setUTCFullYear(date.getFullYear()),+date-+utcDate}const tzPattern=/(Z|[+-]\d{2}(?::?\d{2})?| UTC| [a-zA-Z]+\/[a-zA-Z_]+(?:\/[a-zA-Z_]+)?)$/,patterns={dateTimePattern:/^([0-9W+-]+)(T| )(.*)/,datePattern:/^([0-9W+-]+)(.*)/,YY:/^(\d{2})$/,YYY:[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],YYYY:/^(\d{4})/,YYYYY:[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],MM:/^-(\d{2})$/,DDD:/^-?(\d{3})$/,MMDD:/^-?(\d{2})-?(\d{2})$/,Www:/^-?W(\d{2})$/,WwwD:/^-?W(\d{2})-?(\d{1})$/,HH:/^(\d{2}([.,]\d*)?)$/,HHMM:/^(\d{2}):?(\d{2}([.,]\d*)?)$/,HHMMSS:/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,timeZone:tzPattern};function toDate(argument,options={}){if(arguments.length<1)throw new TypeError("1 argument required, but only "+arguments.length+" present");if(null===argument)return new Date(NaN);const additionalDigits=null==options.additionalDigits?2:Number(options.additionalDigits);if(2!==additionalDigits&&1!==additionalDigits&&0!==additionalDigits)throw new RangeError("additionalDigits must be 0, 1 or 2");if(argument instanceof Date||"object"==typeof argument&&"[object Date]"===Object.prototype.toString.call(argument))return new Date(argument.getTime());if("number"==typeof argument||"[object Number]"===Object.prototype.toString.call(argument))return new Date(argument);if("[object String]"!==Object.prototype.toString.call(argument))return new Date(NaN);const dateStrings=function(dateString){const dateStrings={};let timeString,parts=patterns.dateTimePattern.exec(dateString);parts?(dateStrings.date=parts[1],timeString=parts[3]):(parts=patterns.datePattern.exec(dateString),parts?(dateStrings.date=parts[1],timeString=parts[2]):(dateStrings.date=null,timeString=dateString));if(timeString){const token=patterns.timeZone.exec(timeString);token?(dateStrings.time=timeString.replace(token[1],""),dateStrings.timeZone=token[1].trim()):dateStrings.time=timeString}return dateStrings}(argument),{year:year,restDateString:restDateString}=function(dateString,additionalDigits){if(dateString){const patternYYY=patterns.YYY[additionalDigits],patternYYYYY=patterns.YYYYY[additionalDigits];let token=patterns.YYYY.exec(dateString)||patternYYYYY.exec(dateString);if(token){const yearString=token[1];return{year:parseInt(yearString,10),restDateString:dateString.slice(yearString.length)}}if(token=patterns.YY.exec(dateString)||patternYYY.exec(dateString),token){const centuryString=token[1];return{year:100*parseInt(centuryString,10),restDateString:dateString.slice(centuryString.length)}}}return{year:null}}(dateStrings.date,additionalDigits),date=function(dateString,year){if(null===year)return null;let date,month,week;if(!dateString||!dateString.length)return date=new Date(0),date.setUTCFullYear(year),date;let token=patterns.MM.exec(dateString);if(token)return date=new Date(0),month=parseInt(token[1],10)-1,validateDate(year,month)?(date.setUTCFullYear(year,month),date):new Date(NaN);if(token=patterns.DDD.exec(dateString),token){date=new Date(0);const dayOfYear=parseInt(token[1],10);return function(year,dayOfYear){if(dayOfYear<1)return!1;const isLeapYear=isLeapYearIndex(year);if(isLeapYear&&dayOfYear>366)return!1;if(!isLeapYear&&dayOfYear>365)return!1;return!0}(year,dayOfYear)?(date.setUTCFullYear(year,0,dayOfYear),date):new Date(NaN)}if(token=patterns.MMDD.exec(dateString),token){date=new Date(0),month=parseInt(token[1],10)-1;const day=parseInt(token[2],10);return validateDate(year,month,day)?(date.setUTCFullYear(year,month,day),date):new Date(NaN)}if(token=patterns.Www.exec(dateString),token)return week=parseInt(token[1],10)-1,validateWeekDate(week)?dayOfISOWeekYear(year,week):new Date(NaN);if(token=patterns.WwwD.exec(dateString),token){week=parseInt(token[1],10)-1;const dayOfWeek=parseInt(token[2],10)-1;return validateWeekDate(week,dayOfWeek)?dayOfISOWeekYear(year,week,dayOfWeek):new Date(NaN)}return null}(restDateString,year);if(null===date||isNaN(date.getTime()))return new Date(NaN);if(date){const timestamp=date.getTime();let offset,time=0;if(dateStrings.time&&(time=function(timeString){let hours,minutes,token=patterns.HH.exec(timeString);if(token)return hours=parseFloat(token[1].replace(",",".")),validateTime(hours)?hours%24*36e5:NaN;if(token=patterns.HHMM.exec(timeString),token)return hours=parseInt(token[1],10),minutes=parseFloat(token[2].replace(",",".")),validateTime(hours,minutes)?hours%24*36e5+6e4*minutes:NaN;if(token=patterns.HHMMSS.exec(timeString),token){hours=parseInt(token[1],10),minutes=parseInt(token[2],10);const seconds=parseFloat(token[3].replace(",","."));return validateTime(hours,minutes,seconds)?hours%24*36e5+6e4*minutes+1e3*seconds:NaN}return null}(dateStrings.time),null===time||isNaN(time)))return new Date(NaN);if(dateStrings.timeZone||options.timeZone){if(offset=tzParseTimezone(dateStrings.timeZone||options.timeZone,new Date(timestamp+time)),isNaN(offset))return new Date(NaN)}else offset=getTimezoneOffsetInMilliseconds(new Date(timestamp+time)),offset=getTimezoneOffsetInMilliseconds(new Date(timestamp+time+offset));return new Date(timestamp+time+offset)}return new Date(NaN)}function dayOfISOWeekYear(isoWeekYear,week,day){week=week||0,day=day||0;const date=new Date(0);date.setUTCFullYear(isoWeekYear,0,4);const diff=7*week+day+1-(date.getUTCDay()||7);return date.setUTCDate(date.getUTCDate()+diff),date}const DAYS_IN_MONTH=[31,28,31,30,31,30,31,31,30,31,30,31],DAYS_IN_MONTH_LEAP_YEAR=[31,29,31,30,31,30,31,31,30,31,30,31];function isLeapYearIndex(year){return year%400==0||year%4==0&&year%100!=0}function validateDate(year,month,date){if(month<0||month>11)return!1;if(null!=date){if(date<1)return!1;const isLeapYear=isLeapYearIndex(year);if(isLeapYear&&date>DAYS_IN_MONTH_LEAP_YEAR[month])return!1;if(!isLeapYear&&date>DAYS_IN_MONTH[month])return!1}return!0}function validateWeekDate(week,day){return!(week<0||week>52)&&(null==day||!(day<0||day>6))}function validateTime(hours,minutes,seconds){return!(hours<0||hours>=25)&&((null==minutes||!(minutes<0||minutes>=60))&&(null==seconds||!(seconds<0||seconds>=60)))}var DirectionOffset$1;!function(DirectionOffset){DirectionOffset[DirectionOffset.PREV=-1]="PREV",DirectionOffset[DirectionOffset.NEXT=1]="NEXT"}(DirectionOffset$1||(DirectionOffset$1={}));const DAY_NUMS=[0,1,2,3,4,5,6],getNextWeekday=(weekday,hiddenDays,offset)=>{let newDay=(weekday+offset+7)%7;if(hiddenDays.length){const direction=offset<0?DirectionOffset$1.PREV:DirectionOffset$1.NEXT;for(;hiddenDays.includes(newDay);)newDay=(newDay+direction+7)%7}return newDay},adjustWeekStartsOn=(weekStartsOn=0)=>Math.min(6,Math.round(Math.abs(weekStartsOn))),adjustNumberOfDays=numberOfDays=>numberOfDays?Math.abs(Math.round(numberOfDays)):1;function _extends(){return _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source)Object.prototype.hasOwnProperty.call(source,key)&&(target[key]=source[key])}return target},_extends.apply(this,arguments)}const isDateSatisfyMinDate=(date,minDate)=>!minDate||isAfter(date,minDate)||isSameDay(date,minDate),isDateSatisfyMaxDate=(date,maxDate)=>!maxDate||isBefore(date,maxDate)||isSameDay(date,maxDate),isDateInAllowedRange=(date,minDate,maxDate)=>isDateSatisfyMinDate(date,minDate)&&isDateSatisfyMaxDate(date,maxDate),getSubDates=params=>{const result=[];let date=addDays(params.fromDate,params.ignoreFrom?params.offset:0);for(;result.length<params.numberOfDays;)params.hiddenDays.includes(getDay(date))||result.push(date),date=addDays(date,params.offset);return params.offset===DirectionOffset$1.PREV?result.reverse():result},tzDate=(date,timezone)=>{var _Intl_DateTimeFormat_resolvedOptions,_Intl_DateTimeFormat,_Intl;return timezone?function(date,timeZone,options){const offsetMilliseconds=tzParseTimezone(timeZone,date=toDate(date,options),!0),d=new Date(date.getTime()-offsetMilliseconds),resultDate=new Date(0);return resultDate.setFullYear(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate()),resultDate.setHours(d.getUTCHours(),d.getUTCMinutes(),d.getUTCSeconds(),d.getUTCMilliseconds()),resultDate}(date,timezone||(null==(_Intl=Intl)||null==(_Intl_DateTimeFormat=_Intl.DateTimeFormat())||null==(_Intl_DateTimeFormat_resolvedOptions=_Intl_DateTimeFormat.resolvedOptions())?void 0:_Intl_DateTimeFormat_resolvedOptions.timeZone)):toDate$1(date)},fromTzDate=(date,timezone)=>{var _Intl_DateTimeFormat_resolvedOptions,_Intl_DateTimeFormat,_Intl;return timezone?function(date,timeZone,options){if("string"==typeof date&&!date.match(tzPattern))return toDate(date,{...options,timeZone:timeZone});const utc=newDateUTC((date=toDate(date,options)).getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()).getTime(),offsetMilliseconds=tzParseTimezone(timeZone,new Date(utc));return new Date(utc+offsetMilliseconds)}(date,timezone||(null==(_Intl=Intl)||null==(_Intl_DateTimeFormat=_Intl.DateTimeFormat())||null==(_Intl_DateTimeFormat_resolvedOptions=_Intl_DateTimeFormat.resolvedOptions())?void 0:_Intl_DateTimeFormat_resolvedOptions.timeZone)):toDate$1(date)},getOffsetDate=(offset,params)=>{const followingDate=((fromDate,hiddenDays,offset)=>{let date=addDays(fromDate,offset),i=0;for(;i<7;){if(!hiddenDays.includes(getDay(date)))return date;date=addDays(date,offset),i+=1}throw new Error("No available day of the week found")})(startOfDay(params.date),params.hiddenDays,offset);if((null==params?void 0:params.ignoreLimit)||isDateInAllowedRange(followingDate,params.minDate,params.maxDate))return followingDate};function isObject(value){return"object"==typeof value&&null!==value}function objectsEqual(a,b){if(a===b)return!0;if(a instanceof Date&&b instanceof Date)return a.getTime()===b.getTime();if(!isObject(a)||!isObject(b))return!1;const keysA=Object.keys(a),keysB=Object.keys(b);if(keysA.length!==keysB.length)return!1;for(const key of keysA){if(!Object.prototype.hasOwnProperty.call(b,key))return!1;if(!objectsEqual(a[key],b[key]))return!1}return!0}function arraysOfObjectsEqual(arrA,arrB){if(!Array.isArray(arrA)||!Array.isArray(arrB))return!1;if(arrA.length!==arrB.length)return!1;for(let i=0;i<arrA.length;i++)if(!objectsEqual(arrA[i],arrB[i]))return!1;return!0}const useRestoreApp=callback=>{const{appState:appState}=(()=>{const[appState,setAppState]=useState(AppState.currentState);return useEffect((()=>{const subscription=AppState.addEventListener("change",setAppState);return()=>{subscription.remove()}}),[appState]),{appState:appState}})(),lastAppStateRef=useRef(appState);useEffect((()=>{"background"===lastAppStateRef.current&&"active"===appState&&callback(),lastAppStateRef.current=appState}),[appState,callback])};"function"==typeof SuppressedError&&SuppressedError;const isWeb$1="web"===Platform.OS;Platform.OS,Platform.OS;const Context$3$1=createContext(void 0),useScrollXY=()=>useContext(Context$3$1);createContext(void 0),createContext(void 0),createContext(void 0);new class{constructor(){try{this.expoHaptic=require("expo-haptics")}catch(_a){}try{this.reactNativeHaptic=require("react-native-haptic-feedback")}catch(_b){}}showInstallationWarning(){console.log("%c Warning: Haptic feedback library not found. Kindly install one of the following packages: expo-haptics, react-native-haptic-feedback.","color: orange")}isInstalled(){return this.expoHaptic||this.reactNativeHaptic}impactLight(){var _a,_b,_c,_d;this.expoHaptic?null===(_b=(_a=this.expoHaptic).impactAsync)||void 0===_b||_b.call(_a,"light"):this.reactNativeHaptic&&(null===(_d=(_c=this.reactNativeHaptic).trigger)||void 0===_d||_d.call(_c,"impactLight",{enableVibrateFallback:!0}))}};const RRule$=new class{showInstallationWarning(){console.log("%c Warning: RRule not found. Install rrule to support recurring events.","color: orange")}isInstalled(){return!!this.rrule}fromString(props){if(!this.rrule)return[];const rruleSet=this.rrule.rrulestr(props.rule,{dtstart:-1===props.rule.indexOf("DTSTART")?props.startDate:void 0});return props.between?rruleSet.between(props.between.start,props.between.end,!0):rruleSet.all()}constructor(){try{this.rrule=require("rrule")}catch(e){}}},getEventEntities=(event,props)=>{const eventStart=toDate$1(event.start),eventEnd=toDate$1(event.end),duration=differenceInMinutes(eventEnd,eventStart),isAllDay=duration>=1439||eventStart.getTime()===eventEnd.getTime()||eventStart.getTime()===startOfDay(eventStart).getTime()&&eventEnd.getTime()===endOfDay(eventEnd).getTime(),tz=isAllDay?void 0:event.timezone||props.timezone,startTz=tz?tzDate(eventStart,tz):eventStart,endTz=tz?tzDate(eventEnd,tz):eventEnd,countDays=differenceInCalendarDays(subMinutes(endTz,1),startTz),durationFormatter=countDays?"dd.MM p":"p",result=[],addEvent=(key,start,end)=>{let uiDuration=duration;const fromChangeable=0!==props.timeFrom||countDays,toChangeable=1440!==props.timeTo||countDays;if(fromChangeable){const sd=startOfDay(start),sdDiff=differenceInMinutes(start,sd);start=set(sd,{minutes:Math.max(props.timeFrom,sdDiff)})}if(toChangeable){const sd=startOfDay(end),sdDiff=differenceInMinutes(end,sd);end=set(sd,{minutes:Math.min(props.timeTo,sdDiff)})}(fromChangeable||toChangeable)&&(uiDuration=differenceInMinutes(end,start)),result.push({key:key,duration:duration,uiDuration:uiDuration,start:start,end:end,countDays:countDays,isAllDay:isAllDay,origin:event,text:event.text||`${props.formatDate(event.start,durationFormatter)} - ${props.formatDate(event.end,durationFormatter)}`})},addEvents=(dateIndex,start,end)=>{for(let i=0;i<=countDays;i++){const eventStarts=addDays(start,i),dayStarts=startOfDay(eventStarts);addEvent(`${event.id}_${i}_${dateIndex}`,0===i?eventStarts:dayStarts,i===countDays?end:endOfDay(eventStarts))}};return!props.ignoreRec&&event.rrule&&RRule$.isInstalled()?RRule$.fromString({rule:event.rrule,startDate:startTz,between:{start:props.startDate,end:addDays(props.endDate,1)}}).forEach(((date,dateIndex)=>{const dayStarts=startOfDay(date),eventStarts=addMinutes(dayStarts,60*startTz.getHours()+startTz.getMinutes()),eventEnds=addMinutes(dayStarts,60*endTz.getHours()+endTz.getMinutes());countDays>0?addEvents(dateIndex,eventStarts,eventEnds):addEvent(`${event.id}_${dayStarts.toString()}`,eventStarts,eventEnds)})):countDays>0?addEvents(0,startTz,endTz):addEvent(event.id,startTz,endTz),result},Context$d=createContext(void 0),useHaptic=()=>useContext(Context$d),Context$c=createContext(void 0),ActionProvider=({children:children,onHeaderSafeAreaPress:onHeaderSafeAreaPress,onAllDayEventsSafeAreaPress:onAllDayEventsSafeAreaPress,onDayHeaderPress:onDayHeaderPress,onLoad:onLoad,onUnavailableTimePress:onUnavailableTimePress,onUnavailableTimeLongPress:onUnavailableTimeLongPress,onDatetimeContextMenu:onDatetimeContextMenu,onDatetimePress:onDatetimePress,onDatetimeLongPress:onDatetimeLongPress,onEventPress:onEventPress,onEventLongPress:onEventLongPress,onEventUpdated:onEventUpdated,onEventCreated:onEventCreated,onChangeScale:onChangeScale,onCollectionHeaderPress:onCollectionHeaderPress})=>jsx(Context$c.Provider,{value:{onHeaderSafeAreaPress:onHeaderSafeAreaPress,onAllDayEventsSafeAreaPress:onAllDayEventsSafeAreaPress,onDayHeaderPress:onDayHeaderPress,onLoad:onLoad,onUnavailableTimePress:onUnavailableTimePress,onUnavailableTimeLongPress:onUnavailableTimeLongPress,onDatetimeContextMenu:onDatetimeContextMenu,onDatetimePress:onDatetimePress,onDatetimeLongPress:onDatetimeLongPress,onEventPress:onEventPress,onEventLongPress:onEventLongPress,onEventUpdated:onEventUpdated,onEventCreated:onEventCreated,onChangeScale:onChangeScale,onCollectionHeaderPress:onCollectionHeaderPress},children:children}),useAction=()=>useContext(Context$c),Context$b=createContext(void 0),ControllerProvider=({lazy:lazy,children:children,snappable:snappable,draggable:draggable,groupable:groupable,rtl:rtl,isTimelineVisible:isTimelineVisible,isNowIndicatorVisible:isNowIndicatorVisible,isAllDayEventsEnabled:isAllDayEventsEnabled,isAllDayEventsVisible:isAllDayEventsVisible,isDayHeaderVisible:isDayHeaderVisible,isCollectionHeaderVisible:isCollectionHeaderVisible,collections:collections})=>{const isSlow=useRef(!1),controller=useMemo((()=>{const grouping=!!groupable&&!!(null==collections?void 0:collections.length),allDayEventsVisible=null==isAllDayEventsVisible||isAllDayEventsVisible;return{lazy:null==lazy||lazy,snappable:!!snappable,draggable:!!draggable,groupable:grouping,rtl:!!rtl,isTimelineVisible:null==isTimelineVisible||isTimelineVisible,isNowIndicatorVisible:null==isNowIndicatorVisible||isNowIndicatorVisible,isAllDayEventsEnabled:(null==isAllDayEventsEnabled||isAllDayEventsEnabled)&&allDayEventsVisible,isAllDayEventsVisible:allDayEventsVisible,isDayHeaderVisible:null==isDayHeaderVisible||isDayHeaderVisible,isCollectionHeaderVisible:grouping&&(null==isCollectionHeaderVisible||isCollectionHeaderVisible)}}),[lazy,collections,draggable,groupable,isAllDayEventsEnabled,isAllDayEventsVisible,isCollectionHeaderVisible,isDayHeaderVisible,isNowIndicatorVisible,isTimelineVisible,rtl,snappable]);return useEffect((()=>{new Promise((resolve=>{const start=performance.now();Array.from({length:100},((_,i)=>i)).sort((()=>Math.random()-.5)),resolve(+(performance.now()-start).toFixed(2)>.1)})).then((slow=>isSlow.current=slow))}),[]),jsx(Context$b.Provider,{value:Object.assign(Object.assign({},controller),{isSlow:isSlow.current}),children:children})},useController=()=>useContext(Context$b),Context$a=createContext(void 0),BASE_COLLECTION={id:"",name:""},useCollection=()=>useContext(Context$a);function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P((function(resolve){resolve(value)}))).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const generateContainer=props=>{const colWeight=1/props.collections.length,dateWeight=1/props.dates.length,collections=props.rtl?props.collections.slice().reverse():props.collections,adjustedDates=props.rtl?props.dates.slice().reverse():props.dates,dateTimes=adjustedDates.map((date=>date.getTime())),dates=collections.flatMap(((collection,colIndex)=>{const collectionOffset=colIndex*colWeight,fromDateIndex=colIndex*props.numberOfDays;return adjustedDates.slice(fromDateIndex,fromDateIndex+props.numberOfDays).map(((date,dateIndex)=>({date:date,offset:props.fromOffset+collectionOffset+dateIndex*dateWeight,collectionId:collection.id})))}));let from=props.fromOffset,to=props.fromOffset;if(props.snappable){if(props.minDate){const offsets=dates.filter((props.rtl,({date:date})=>isDateSatisfyMinDate(date,props.minDate))).map((({offset:offset})=>offset));from=offsets.length?props.rtl?Math.max(...offsets):Math.min(...offsets):null}if(props.maxDate){const offsets=dates.filter((props.rtl,({date:date})=>isDateSatisfyMaxDate(date,props.maxDate))).map((({offset:offset})=>offset));to=offsets.length?props.rtl?Math.min(...offsets):Math.max(...offsets):null}}else props.minDate&&(from=isDateSatisfyMinDate(dates[props.rtl?0:dates.length-1].date,props.minDate)?props.fromOffset:null),props.maxDate&&(to=isDateSatisfyMaxDate(dates[props.rtl?dates.length-1:0].date,props.maxDate)?props.fromOffset:null);return{dates:dates,from:from,to:to,offset:props.fromOffset,maxTime:Math.max(...dateTimes),minTime:Math.min(...dateTimes),collections:collections.map((collection=>collection.id))}},generateInitialContainers=props=>{const initialDates=(params=>{const result=[];if(params.numberOfDays>=5){const sortedDays=[...DAY_NUMS.slice(params.weekStartsOn),...DAY_NUMS.slice(0,params.weekStartsOn)],lastDayNum=sortedDays[sortedDays.length-1],beforeLastDay=sortedDays[sortedDays.length-2],currentDay=getDay(params.fromDate);let start=startOfWeek(params.fromDate,{weekStartsOn:params.weekStartsOn});params.numberOfDays<7&&!params.hiddenDays.length&&(5===params.numberOfDays&&[beforeLastDay,lastDayNum].includes(currentDay)&&(start=addDays(start,currentDay===beforeLastDay?1:2)),6===params.numberOfDays&&lastDayNum===currentDay&&(start=addDays(start,1)));let offset=differenceInDays(start,params.fromDate);for(;offset<0&&result.length<params.numberOfDays;){const prevDate=addDays(params.fromDate,offset);params.hiddenDays.includes(getDay(prevDate))||result.push(prevDate),offset+=1}}return[...result,...result.length<params.numberOfDays?getSubDates(_extends({},params,{numberOfDays:params.numberOfDays-result.length,offset:DirectionOffset$1.NEXT,ignoreFrom:!1})):[]]})(props),initialContainer=generateContainer({fromOffset:props.fromOffset,numberOfDays:props.numberOfDays,rtl:props.rtl,snappable:props.snappable,minDate:props.minDate,maxDate:props.maxDate,collections:props.collections.slice(props.fromCollectionIndex,props.fromCollectionIndex+props.numberOfCollections),dates:Array.from({length:props.numberOfCollections}).flatMap((()=>initialDates))}),subsequentProps=Object.assign(Object.assign({},props),{fromContainer:initialContainer});return[...generatePrevContainers(subsequentProps),initialContainer,...generateNextContainers(subsequentProps)]},generatePrevContainers=props=>{const containers=[],totalCollections=props.collections.length-1,indexMultiplier=props.rtl?-1:1,{collectionId:collectionId}=props.fromContainer.dates[props.rtl?props.fromContainer.dates.length-1:0];let collectionIndex=props.collections.slice().reverse().findIndex((collection=>collectionId===collection.id));for(let i=0;i<5;i++){const collections=[];for(;collections.length<props.numberOfCollections;){const adjustedCollectionIndex=totalCollections-++collectionIndex%props.collections.length;collections.unshift({index:adjustedCollectionIndex,collection:props.collections[adjustedCollectionIndex]})}containers.push(generateContainer({fromOffset:props.fromOffset-(i+1)*indexMultiplier,numberOfDays:props.numberOfDays,rtl:props.rtl,snappable:props.snappable,minDate:props.minDate,maxDate:props.maxDate,collections:collections.map((({collection:collection})=>collection)),dates:collections.slice().reverse().reduce(((arr,{index:index})=>{var _a,_b;const adjustedDatesDates=props.rtl?arr[0]||((null===(_a=containers.at(-1))||void 0===_a?void 0:_a.dates)||props.fromContainer.dates).slice().reverse().map((({date:date})=>date)).slice(0,props.numberOfDays):arr[0]||((null===(_b=containers.at(-1))||void 0===_b?void 0:_b.dates)||props.fromContainer.dates).map((({date:date})=>date)).slice(0,props.numberOfDays);return index!==totalCollections?[adjustedDatesDates,...arr]:[getSubDates({fromDate:adjustedDatesDates[0],hiddenDays:props.hiddenDays,offset:-1,numberOfDays:props.numberOfDays,ignoreFrom:!0}),...arr]}),[]).flat()}))}return containers},generateNextContainers=props=>{const containers=[],indexMultiplier=props.rtl?-1:1,{collectionId:collectionId}=props.fromContainer.dates[props.rtl?0:props.fromContainer.dates.length-1];let collectionIndex=props.collections.findIndex((collection=>collectionId===collection.id));for(let i=0;i<5;i++){const collections=[];for(;collections.length<props.numberOfCollections;){const adjustedCollectionIndex=++collectionIndex%props.collections.length;collections.push({index:adjustedCollectionIndex,collection:props.collections[adjustedCollectionIndex]})}containers.push(generateContainer({fromOffset:props.fromOffset+(i+1)*indexMultiplier,numberOfDays:props.numberOfDays,rtl:props.rtl,snappable:props.snappable,minDate:props.minDate,maxDate:props.maxDate,collections:collections.map((({collection:collection})=>collection)),dates:collections.reduce(((arr,{index:index})=>{var _a,_b;const adjustedDatesDates=props.rtl?arr.at(-1)||((null===(_a=containers.at(-1))||void 0===_a?void 0:_a.dates)||props.fromContainer.dates).slice().reverse().map((({date:date})=>date)).slice(-props.numberOfDays):arr.at(-1)||((null===(_b=containers.at(-1))||void 0===_b?void 0:_b.dates)||props.fromContainer.dates).map((({date:date})=>date)).slice(-props.numberOfDays);return 0!==index?[...arr,adjustedDatesDates]:[...arr,getSubDates({fromDate:adjustedDatesDates.at(-1),hiddenDays:props.hiddenDays,offset:1,numberOfDays:props.numberOfDays,ignoreFrom:!0})]}),[]).flat()}))}return containers},Context$9=createContext(void 0),DatetimeProvider=({timezone:timezone,weekStartsOn:weekStartsOn,hiddenDays:hiddenDays,minDate:minDate,maxDate:maxDate,numberOfDays:numberOfDays,timeFrom:timeFrom,timeTo:timeTo,timeInterval:timeInterval,timeStep:timeStep,locale:locale,dayHeaderTextFormat:dayHeaderTextFormat,timelineTextFormat:timelineTextFormat,children:children})=>{const timeSlotsRef=useRef([]),hiddenDaysRef=useRef([]),[now,setNow]=useState(tzDate(new Date,timezone)),datetime=useMemo((()=>{const from=(timeFrom=>timeFrom?Math.max(Math.round(timeFrom),0):0)(timeFrom),to=(timeTo=>timeTo?Math.min(Math.round(timeTo),1440):1440)(timeTo),adjustedFrom=Math.min(from,to),adjustedTo=Math.max(from,to),interval=(timeInterval=>timeInterval?Math.abs(Math.round(timeInterval)):60)(timeInterval),distance=adjustedTo-adjustedFrom,timeSlots=[],hd=(hiddenDays=>hiddenDays?[...new Set(hiddenDays.filter((day=>day<7)))].sort().slice(0,6):[])(hiddenDays);let currentSlot=adjustedFrom;for(;currentSlot<=adjustedTo;)timeSlots.push(currentSlot),currentSlot+=interval;return timeSlots.length===timeSlotsRef.current.length&&timeSlots.every((slot=>timeSlotsRef.current.includes(slot)))||(timeSlotsRef.current=timeSlots),hd.length===hiddenDaysRef.current.length&&hd.every((day=>hiddenDaysRef.current.includes(day)))||(hiddenDaysRef.current=hd),{timeSlots:timeSlotsRef.current,hiddenDays:hiddenDaysRef.current,weekStartsOn:adjustWeekStartsOn(weekStartsOn),minDate:minDate&&startOfDay(tzDate(minDate,timezone)),maxDate:maxDate&&startOfDay(tzDate(maxDate,timezone)),numberOfDays:adjustNumberOfDays(numberOfDays),timeFrom:adjustedFrom,timeTo:adjustedTo,timeDistance:distance,timeInterval:interval,timeWeight:100/distance,timeUnit:distance/100,timeStep:Math.min(timeStep?Math.abs(timeStep):15,distance),dayHeaderTextFormat:dayHeaderTextFormat||"EEEEEE dd",timelineTextFormat:timelineTextFormat||"p"}}),[timeFrom,timeTo,timeInterval,weekStartsOn,hiddenDays,minDate,timezone,maxDate,numberOfDays,timeStep,dayHeaderTextFormat,timelineTextFormat]),formatDate=useCallback(((date,formatSrt)=>format(date,formatSrt,{locale:locale})),[locale]),isDateInRange=useCallback((date=>{const start=addMinutes(date,datetime.timeFrom),end=addMinutes(date,datetime.timeTo-1);return eachDayOfInterval({start:start,end:end}).some((intervalDate=>!datetime.hiddenDays.includes(intervalDate.getDay())&&isSameDay(intervalDate,now)))}),[now,datetime.timeFrom,datetime.timeTo,datetime.hiddenDays]);return useRestoreApp((()=>{setNow(tzDate(new Date,timezone))})),useEffect((()=>{const date=new Date,timeout=setTimeout((()=>setNow(tzDate(date,timezone))),1e3*(60-date.getSeconds()));return()=>clearTimeout(timeout)}),[timezone,now]),jsx(Context$9.Provider,{value:Object.assign(Object.assign({},datetime),{now:now,timezone:timezone,locale:locale,formatDate:formatDate,isDateInRange:isDateInRange,setNow:setNow}),children:children})},useDatetime=()=>useContext(Context$9),Context$8=createContext(void 0),ContainerProvider=({children:children,selectedDateRef:selectedDateRef,setSelectedDate:setSelectedDate})=>{const{numberOfDays:numberOfDays,minDate:minDate,maxDate:maxDate,weekStartsOn:weekStartsOn,hiddenDays:hiddenDays}=useDatetime(),{snappable:snappable,groupable:groupable,rtl:rtl}=useController(),{scrollXTo:scrollXTo}=useScrollXY(),collection=useCollection(),haptic=useHaptic(),containersRef=useRef(new Map),containersOffsetRef=useRef({min:0,max:0,active:0}),[activeContainers,setActiveContainers]=useState([]),buffer=useMemo((()=>snappable?2:1),[snappable]),getContainersBuffer=useCallback((offset=>Array.from({length:2*buffer+1}).map(((_,i)=>containersRef.current.get(i-buffer+Math.floor(offset)))).filter(Boolean)),[buffer]),handleOffset=useCallback((offset=>{const containers=getContainersBuffer(offset);containersOffsetRef.current={min:Math.min(...containers.map(rtl?({to:to})=>to:({from:from})=>from).filter((value=>null!==value))),max:Math.max(...containers.map(rtl?({from:from})=>from:({to:to})=>to).filter((value=>null!==value))),active:offset},setActiveContainers(containers)}),[getContainersBuffer,rtl]),initContainers=useCallback(((fromDate,fromCollectionIndex,params)=>__awaiter(void 0,0,void 0,(function*(){let initOffset=0;const adjustedFromDate=startOfDay(fromDate),initialDate=(null==params?void 0:params.ignoreLimit)?adjustedFromDate:((date,minDate,maxDate)=>minDate&&!isDateSatisfyMinDate(date,minDate)?minDate:maxDate&&!isDateSatisfyMaxDate(date,maxDate)?maxDate:date)(adjustedFromDate,minDate,maxDate),containers=generateInitialContainers({numberOfDays:numberOfDays,numberOfCollections:(null==collection?void 0:collection.numberOfCollections)||1,weekStartsOn:weekStartsOn,hiddenDays:hiddenDays,rtl:rtl,snappable:snappable,minDate:minDate,maxDate:maxDate,collections:(null==collection?void 0:collection.items)||[BASE_COLLECTION],fromCollectionIndex:fromCollectionIndex,fromOffset:initOffset,fromDate:initialDate});if(containersRef.current.clear(),containers.forEach((container=>containersRef.current.set(container.offset,container))),snappable&&!groupable){const targetDate=containers[5].dates.find((({date:date})=>isSameDay(initialDate,date)));targetDate&&(initOffset=targetDate.offset)}handleOffset(initOffset),yield scrollXTo({value:100*-initOffset,animated:null==params?void 0:params.animated})}))),[handleOffset,groupable,hiddenDays,maxDate,minDate,numberOfDays,rtl,snappable,weekStartsOn,null==collection?void 0:collection.numberOfCollections,null==collection?void 0:collection.items,scrollXTo]),addContainers=useCallback((offset=>{const offsetProps={rtl:rtl,snappable:snappable,minDate:minDate,maxDate:maxDate,numberOfDays:numberOfDays,numberOfCollections:(null==collection?void 0:collection.numberOfCollections)||1,collections:(null==collection?void 0:collection.items)||[BASE_COLLECTION],hiddenDays:hiddenDays,fromOffset:offset,fromContainer:containersRef.current.get(offset)};((rtl?offset<0:offset>0)?generateNextContainers(offsetProps):generatePrevContainers(offsetProps)).forEach((container=>containersRef.current.set(container.offset,container)))}),[rtl,snappable,minDate,maxDate,numberOfDays,hiddenDays,null==collection?void 0:collection.numberOfCollections,null==collection?void 0:collection.items]),setContainersOffset=useCallback(((nextOffset,ignoreDateSelection)=>{var _a,_b,_c,_d;const accumulation=((offset,buffer)=>5*Math.floor((Math.abs(offset)+buffer)/5)*(offset<=-5+buffer?-1:1))(nextOffset,buffer);if(containersRef.current.has(accumulation+5*(nextOffset<0?-1:1))||addContainers(accumulation),!ignoreDateSelection&&nextOffset!==containersOffsetRef.current.active){let nextSelectedDate,dates=null===(_a=containersRef.current.get(Math.floor(nextOffset)))||void 0===_a?void 0:_a.dates;if(!dates)return;!snappable||snappable&&groupable?(rtl&&(dates=dates.slice().reverse()),nextSelectedDate=null===(_b=dates.find((({date:date,offset:offset})=>offset>=nextOffset&&isDateInAllowedRange(date,minDate,maxDate))))||void 0===_b?void 0:_b.date):nextSelectedDate=null===(_c=dates.find((({date:date,offset:offset})=>offset>=nextOffset&&isDateInAllowedRange(date,minDate,maxDate))))||void 0===_c?void 0:_c.date,nextSelectedDate&&!isSameDay(selectedDateRef.current,nextSelectedDate)&&(setSelectedDate(nextSelectedDate),null===(_d=null==haptic?void 0:haptic.emitImpact)||void 0===_d||_d.call(haptic,"onChangeDate"))}containersOffsetRef.current.active!==nextOffset&&handleOffset(nextOffset)}),[addContainers,buffer,handleOffset,groupable,maxDate,minDate,rtl,snappable,setSelectedDate,null==haptic?void 0:haptic.emitImpact]),getActiveContainers=useCallback((()=>getContainersBuffer(containersOffsetRef.current.active)),[getContainersBuffer]),getActiveContainersDates=useCallback((()=>getActiveContainers().flatMap((({dates:dates})=>dates)).filter((({offset:offset})=>rtl&&snappable&&!groupable?offset>containersOffsetRef.current.active-.99&&offset<=containersOffsetRef.current.active:offset>=containersOffsetRef.current.active&&offset<containersOffsetRef.current.active+.99))),[getActiveContainers,rtl,snappable,groupable]),moveContainers=useCallback(((moveOffset,velocity)=>__awaiter(void 0,0,void 0,(function*(){var _a;const{min:min,active:active,max:max}=containersOffsetRef.current,dates=getActiveContainers().flatMap((({dates:dates})=>dates));let nextOffset;if(snappable){const targetDateIndex=dates.findIndex((({offset:offset})=>offset.toFixed(3)===active.toFixed(3)));nextOffset=null===(_a=dates[targetDateIndex+moveOffset*(groupable?numberOfDays:1)])||void 0===_a?void 0:_a.offset}else nextOffset=active+moveOffset;void 0===nextOffset?nextOffset=active:nextOffset<min?nextOffset=min:nextOffset>max&&(nextOffset=max),nextOffset!==containersOffsetRef.current.active&&setContainersOffset(nextOffset),yield scrollXTo({value:100*-nextOffset,animated:!0,velocity:velocity})}))),[getActiveContainers,snappable,scrollXTo,groupable,numberOfDays,setContainersOffset]);return useEffect((()=>{initContainers(selectedDateRef.current,0)}),[]),jsx(Context$8.Provider,{value:{containersRef:containersRef,containersOffsetRef:containersOffsetRef,activeContainers:activeContainers,initContainers:initContainers,setContainersOffset:setContainersOffset,moveContainers:moveContainers,getActiveContainers:getActiveContainers,getActiveContainersDates:getActiveContainersDates},children:children})},useContainer=()=>useContext(Context$8),Context$7=createContext(void 0),DimensionProvider=({children:children,horizontalLineSize:horizontalLineSize,gridVerticalPadding:gridVerticalPadding,allDayEventHeight:allDayEventHeight,dayHeaderHeight:dayHeaderHeight,collectionHeaderHeight:collectionHeaderHeight,timelineWidth:timelineWidth,width:width,nowIndicatorHeight:nowIndicatorHeight,eventBorderWidth:eventBorderWidth,eventBorderRadius:eventBorderRadius})=>{const windowDimensions=useWindowDimensions(),{numberOfDays:numberOfDays}=useDatetime(),{rtl:rtl,isTimelineVisible:isTimelineVisible,isDayHeaderVisible:isDayHeaderVisible,isCollectionHeaderVisible:isCollectionHeaderVisible}=useController(),collection=useCollection(),timegridWidth=useMemo((()=>width||windowDimensions.width),[width,windowDimensions.width]),dimensions=useMemo((()=>{const headerHeight={coll:collectionHeaderHeight||30,day:dayHeaderHeight||50},tmlWidth=isTimelineVisible?timelineWidth||58:0,columnWidth=100/((null==collection?void 0:collection.numberOfCollections)||1)/numberOfDays,containerWidth=timegridWidth-tmlWidth;return{containerWidth:containerWidth,columnUnit:columnWidth/100,containerUnit:containerWidth/100,containerWeight:100/containerWidth,verticalLineSize:1,horizontalLineSize:Math.max(null!=horizontalLineSize?horizontalLineSize:.5,0),gridVerticalPadding:gridVerticalPadding||0,allDayEventHeight:allDayEventHeight||25,collectionHeaderHeight:headerHeight.coll,timelineWidth:tmlWidth,timelineLeftWidth:rtl?0:tmlWidth,columnWidth:columnWidth,dayHeaderHeight:headerHeight.day,nowIndicatorHeight:Math.max(nowIndicatorHeight||.5,0),headerHeight:(isDayHeaderVisible?headerHeight.day:0)+(isCollectionHeaderVisible?headerHeight.coll:0),containerLeft:rtl?void 0:tmlWidth,containerRight:rtl?tmlWidth:void 0,hlLeft:rtl?void 0:tmlWidth,hlRight:rtl?tmlWidth:void 0,eventBorderWidth:eventBorderWidth||1,eventBorderRadius:eventBorderRadius||5}}),[rtl,allDayEventHeight,collectionHeaderHeight,dayHeaderHeight,gridVerticalPadding,horizontalLineSize,isCollectionHeaderVisible,isDayHeaderVisible,isTimelineVisible,nowIndicatorHeight,numberOfDays,timegridWidth,timelineWidth,eventBorderWidth,eventBorderRadius,null==collection?void 0:collection.numberOfCollections]);return jsx(Context$7.Provider,{value:Object.assign({timegridWidth:timegridWidth},dimensions),children:children})},useDimension=()=>useContext(Context$7),Context$6=createContext(void 0),EventProvider=({children:children,events:events,allDayEventsSafeAreaText:allDayEventsSafeAreaText,createEventDuration:createEventDuration})=>{const{groupable:groupable}=useController(),{timezone:timezone,timeFrom:timeFrom,timeTo:timeTo,formatDate:formatDate}=useDatetime(),{activeContainers:activeContainers,getActiveContainers:getActiveContainers,getActiveContainersDates:getActiveContainersDates}=useContainer(),eventsRef=useRef({}),eventsByOffsetRef=useRef({}),[eventsByOffset,setEventsByOffset]=useState({}),[draggableEvent,setDraggableEvent]=useState(),eventDuration=useMemo((()=>createEventDuration?Math.max(5,Math.ceil(createEventDuration)):60),[createEventDuration]),activeAllDayEvents=useMemo((()=>Object.values(eventsByOffset).flat().filter((event=>event.isAllDay))),[eventsByOffset]),maxAllDayEventsByOffset=useMemo((()=>Math.max(1,...getActiveContainersDates().map((({offset:offset})=>activeAllDayEvents.filter((event=>event.offset===offset)).length)))),[activeAllDayEvents,getActiveContainersDates]),handleEvents=useCallback((()=>{if(null==events?void 0:events.length){const validIds={},newEvents=[],forDate=new Date;let hasRecurrenceEvents=!1;events.forEach((event=>{var _a;const refArr=eventsRef.current[event.id];refArr&&objectsEqual(event,null===(_a=refArr[0])||void 0===_a?void 0:_a.origin)?validIds[event.id]=!0:newEvents.push(event)})),Object.keys(eventsRef.current).forEach((id=>{validIds[id]||delete eventsRef.current[id]})),newEvents.forEach((event=>{event.rrule&&!hasRecurrenceEvents&&(hasRecurrenceEvents=!0),eventsRef.current[event.id]=getEventEntities(event,{ignoreRec:!0,timezone:timezone,timeFrom:timeFrom,timeTo:timeTo,formatDate:formatDate,startDate:forDate,endDate:forDate})})),hasRecurrenceEvents&&!RRule$.isInstalled()&&RRule$.showInstallationWarning()}else eventsRef.current={}}),[events,timeFrom,timeTo,timezone,formatDate]),handleActiveContainers=useCallback((()=>{const containers=getActiveContainers();if(!containers.length)return;const pendingContainers=containers.filter((({offset:offset})=>!eventsByOffsetRef.current[offset]));if(pendingContainers.length){const minDate=Math.min(...pendingContainers.map((({minTime:minTime})=>minTime))),maxDate=Math.max(...pendingContainers.map((({maxTime:maxTime})=>maxTime))),events=[],recEvents=[];Object.values(eventsRef.current).flat().forEach((event=>{event.origin.rrule&&!recEvents.some((recEvent=>recEvent.id===event.origin.id))?recEvents.push(event.origin):isDateInAllowedRange(event.start,minDate,maxDate)&&events.push(event)})),recEvents.length&&recEvents.forEach((event=>{const entities=getEventEntities(event,{ignoreRec:!1,timezone:timezone,timeFrom:timeFrom,timeTo:timeTo,formatDate:formatDate,startDate:new Date(minDate),endDate:new Date(maxDate)});events.push(...entities)})),pendingContainers.forEach((({offset:offset,dates:dates})=>{eventsByOffsetRef.current[offset]=dates.flatMap((({date:date,collectionId:collectionId,offset:offset})=>events.filter((event=>(!groupable||!event.origin.collectionId||event.origin.collectionId===collectionId)&&isSameDay(event.start,date))).map((event=>Object.assign(Object.assign({},event),{offset:offset}))))).reduce(((uniqEvents,event)=>uniqEvents.some((({origin:origin,offset:offset})=>origin.id===event.origin.id&&offset===event.offset))?uniqEvents:[...uniqEvents,event]),[])}))}setEventsByOffset(containers.reduce(((obj,{offset:offset})=>Object.assign(Object.assign({},obj),{[offset]:eventsByOffsetRef.current[offset]})),{}))}),[groupable,timeFrom,timeTo,timezone,formatDate,getActiveContainers]),clearEventsCache=useCallback((()=>{eventsByOffsetRef.current={}}),[]);return useEffect((()=>{clearEventsCache(),handleEvents()}),[clearEventsCache,handleEvents]),useEffect((()=>{activeContainers.length&&handleActiveContainers()}),[events,handleActiveContainers,activeContainers]),jsx(Context$6.Provider,{value:{draggableEvent:draggableEvent,clearEventsCache:clearEventsCache,eventsByOffset:eventsByOffset,activeAllDayEvents:activeAllDayEvents,maxAllDayEventsByOffset:maxAllDayEventsByOffset,allDayEventsSafeAreaText:allDayEventsSafeAreaText,createEventDuration:eventDuration,setDraggableEvent:setDraggableEvent},children:children})},useEvent=()=>useContext(Context$6),getUnavailableTimeForDates=props=>{const result=[];return props.dates.forEach((({date:date,collectionId:collectionId},dateIndex)=>{const filteredUnavailableTime=props.unavailableTime.filter((({origin:origin})=>!props.groupable||!origin.collectionId||origin.collectionId===collectionId)),unavailableDates=filteredUnavailableTime.filter((({date:date})=>!!date)),unavailableRanges=filteredUnavailableTime.filter((({start:start,end:end})=>start||end)),unavailableWeekdays=filteredUnavailableTime.filter((({weekday:weekday})=>void 0!==weekday));filteredUnavailableTime.forEach(((unavailableTime,unavailableTimeIndex)=>{const pushItem=()=>{result.push(Object.assign(Object.assign({},unavailableTime),{key:`${date}_${dateIndex}_${unavailableTimeIndex}}`,columns:{start:dateIndex,count:1}}))},expandOrPushItem=()=>{const expandableItem=result.find((({from:from,to:to,columns:columns})=>from===unavailableTime.from&&to===unavailableTime.to&&dateIndex===columns.start+columns.count));expandableItem?expandableItem.columns.count+=1:pushItem()};unavailableTime.date?isSameDay(unavailableTime.date,date)&&pushItem():unavailableDates.length&&unavailableDates.some((({dayOffset:dayOffset,date:unavailableDate})=>dayOffset===unavailableTime.dayOffset&&isSameDay(unavailableDate,date)))||(unavailableTime.start||unavailableTime.end?unavailableTime.start&&isBefore(date,startOfDay(unavailableTime.start))||unavailableTime.end&&isAfter(date,startOfDay(unavailableTime.end))||props.hiddenDays.includes(addDays(date,-unavailableTime.dayOffset).getDay())||expandOrPushItem():unavailableRanges.length&&unavailableRanges.some((({dayOffset:dayOffset,start:start,end:end})=>!(dayOffset!==unavailableTime.dayOffset||start&&isBefore(date,startOfDay(start))||end&&isAfter(date,startOfDay(end)))))||(void 0!==unavailableTime.weekday?unavailableTime.weekday===date.getDay()&&pushItem():unavailableWeekdays.length&&unavailableWeekdays.some((({dayOffset:dayOffset,weekday:weekday})=>dayOffset===unavailableTime.dayOffset&&weekday===date.getDay()))||expandOrPushItem()))}))})),result},Context$5=createContext(void 0),UtProvider=({unavailableTime:unavailableTime,children:children})=>{const{hiddenDays:hiddenDays,maxDate:maxDate,minDate:minDate,timeFrom:timeFrom,timeTo:timeTo,timezone:timezone}=useDatetime(),{groupable:groupable}=useController(),{activeContainers:activeContainers,getActiveContainers:getActiveContainers}=useContainer(),utByOffsetRef=useRef({}),[utByOffset,setUtByOffset]=useState({}),ut=useMemo((()=>{const arr=unavailableTime||[];return minDate&&arr.push({from:0,to:1440,start:addDays(minDate,-36500),end:addDays(minDate,-1)}),maxDate&&arr.push({from:0,to:1440,start:addDays(maxDate,1),end:addDays(maxDate,36500)}),arr.length?(props=>{const unavailableTime=[],today=new Date,daysCount=Math.ceil(1440/(props.timeTo-props.timeFrom)),offset=Math.floor(props.timeFrom/1440),timezoneOffset=props.timezone?differenceInMinutes(tzDate(today,props.timezone),today):0;return props.unavailableTime.filter((({weekday:weekday,date:date})=>!(void 0!==weekday&&props.hiddenDays.includes(weekday)||date&&props.hiddenDays.includes(toDate$1(date).getDay())))).forEach((origin=>{for(let day=0;day<daysCount;day++){const timeOffset=1440*day+timezoneOffset,dayOffset=day+offset&&-(day+offset);unavailableTime.push({origin:origin,dayOffset:dayOffset,from:Math.max(origin.from+timeOffset,props.timeFrom),to:Math.min(origin.to+timeOffset,props.timeTo-props.timeFrom),start:origin.start?addDays(origin.start,dayOffset):void 0,end:origin.end?addDays(origin.end,dayOffset):void 0,date:origin.date?addDays(origin.date,dayOffset):void 0,weekday:void 0!==origin.weekday?getNextWeekday(origin.weekday,props.hiddenDays,dayOffset):void 0})}})),unavailableTime.sort(((a,b)=>a.date&&!b.date?-1:!a.date&&b.date?1:!a.start&&!a.end||b.start||b.end?a.start||a.end||!b.start&&!b.end?void 0!==a.weekday&&void 0===b.weekday?-1:void 0===a.weekday&&void 0!==b.weekday?1:0:1:-1))})({timeFrom:timeFrom,timeTo:timeTo,hiddenDays:hiddenDays,timezone:timezone,unavailableTime:arr}):[]}),[hiddenDays,maxDate,minDate,timeFrom,timeTo,timezone,unavailableTime]),handleActiveContainers=useCallback((()=>{const containers=getActiveContainers();containers.length&&setUtByOffset(containers.reduce(((obj,container)=>{let value=utByOffsetRef.current[container.offset];return value||(value=(null==ut?void 0:ut.length)?getUnavailableTimeForDates({groupable:groupable,hiddenDays:hiddenDays,unavailableTime:ut,dates:container.dates}):[],utByOffsetRef