{"version":3,"sources":["Images/MithrilAlmanacLogo.jpg","DataClients/fetchHelper.ts","DataClients/CalendarEventDataClient.ts","DataClients/AuthenticationDataClient.ts","CalenderJoinHelper.ts","Models/CalendarViewType.ts","Models/Month.ts","Models/CalendarModel.ts","State/ErrorState.ts","State/CalendarState.ts","State/UserState.ts","Landing/Landing.tsx","SignIn/GoogleButton.tsx","Images/GoogleG.png","Models/CalendarTemplates/EarthCalendar.ts","Models/CalendarTemplates/GreyhawkCalendar.ts","Models/CalendarTemplates/ExandriaCalendar.ts","Models/CalendarTemplates/TorilCalendar.ts","Models/CalendarTemplates/KhorvaireCalendar.ts","Models/CalendarTemplates/GenericCalendar.ts","Models/CalendarTemplates/index.ts","NewCalendar/NewCalendar.tsx","ToolBar/CalendarDD.tsx","ToolBar/UserToolbar.tsx","ToolBar/AboutToolbarLink.tsx","ToolBar/ToolBar.tsx","Images/ColoredSquares.png","State/EditCalendarState.ts","CalendarEditView/MonthEditCard.tsx","CalendarEditView/AddMonthButton.tsx","CalendarEditView/MonthList.tsx","CalendarEditView/CalendarNumDaysTooltip.tsx","CalendarEditView/DangerZone.tsx","CalendarEditView/HolidayEditDialog.tsx","Models/FantasyDate.ts","CalendarEditView/HolidayLine.tsx","Models/Moon.ts","CalendarEditView/HolidayEdit.tsx","CalendarEditView/Moons/ColorPicker.tsx","CalendarEditView/Moons/MoonModal.tsx","CalendarEditView/Moons/MoonEditItem.tsx","CalendarEditView/Moons/MoonEdit.tsx","CalendarEditView/Days/CalendarDayItem.tsx","CalendarEditView/Days/CalendarEditDays.tsx","CalendarEditView/LeapYearEdit.tsx","CalendarEditView/CalendarEditMisc.tsx","DayDetail/FantasyDateSelector.tsx","LoadingSpinner/index.tsx","CalendarEditView/CalendarEditView.tsx","Authenticate/Authenticate.tsx","Utility.ts","CalendarView/CalendarDay.tsx","CalendarView/MonthView.tsx","DayDetail/EventDetail.tsx","DayDetail/DayDetailView.tsx","CalendarNavigation/ShareLink.tsx","CalendarNavigation/ShareDialog.tsx","CalendarNavigation/CalendarToolBar.tsx","CalendarView/TimelineView/TimeLineEvent.tsx","CalendarView/TimelineView/TimelineView.tsx","Models/CalendarEvent.ts","DayDetail/EditEvent.tsx","Utility/NumbersToWords.ts","CalendarView/CondensedView/CondensedViewBlock.tsx","CalendarView/CondensedView/CondensedViewYear.tsx","CalendarView/CondensedView/CondensedView.tsx","Utility/Range.ts","CalendarView/CalendarView.tsx","CalendarView/CalendarViewWrapper.tsx","About.tsx","Updates/ReleaseNotes.ts","Updates/UpdateBanner.tsx","CalendarView/DefaultView.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["baseUriAddress","baseAddress","process","endsWith","console","error","getBaseAddress","get","uri","parameters","a","fullUri","getUri","requestInit","method","headers","getHeaders","request","response","post","body","JSON","stringify","fetch","status","isJson","json","ConvertDateTimes","responseObj","success","value","myErr","message","undefined","UserState","timeout","getErrorObject","errorObj","log","url","params","myUri","Object","keys","filter","key","map","prototype","toString","call","toISOString","encodeURIComponent","join","contentType","indexOf","getUnknownErrorMsg","includes","errors","hasBody","Headers","set","token","getAccessToken","obj","realDate","Date","Array","isArray","forEach","x","GetCalendar","id","asCalendar","GetCalendarEvents","asEvents","DeleteEvent","eventId","Error","SaveCalendar","calendarModel","payload","DeleteCalendar","GetUserCalendars","models","GetToken","code","expiration","localStorage","setItem","GetRefreshedToken","GetConsentPage","responseModel","calendarId","urlParams","URLSearchParams","window","location","search","has","joinId","userModel","joinCalendar","getItem","removeItem","JoinPendingCalendars","toJoin","split","length","updateCalendars","ViewType","GetOffSetInfo","calendar","monthNumber","year","daysBeforeYear","offset","offSetDays","prevYears","from","totalDaysInYear","months","reduce","total","currMonth","days","totalDays","yearNum","isLeapYear","CheckIfLeapYear","GetDaysBeforeYear","yearOffSetDays","daysOfWeek","previousDays","position","leapYearRules","month","resetWeekAtMonthStart","blankModel","name","currentDate","dayOfMonth","interval","unlessDivisions","holidays","shareId","moons","defaultView","Calendar","GetDaysBetweenDates","d1","d2","dates","newArray","sort","b","sortDates","firstDate","secondDate","firstMonth","find","prev","curr","monthPosition","GetDaysInMonth","date","lastMonth","lastDayOfTheYear","daysRemainingNoLeap","leapMonth","getDaysInYearAfterDate","getDaysInYearBeforeDate","ErrorState","observable","errorMessage","CalendarState","action","bound","this","events","calendarLoadState","calendars","some","selectedDay","loginModalOpen","canEditCalendar","newEvent","calendarEvent","fantasyDate","description","uuid","createUser","hidden","makeCurrentDate","calendarEditEvent","updateModel","oldEvents","stillGoodEvents","newName","computed","setAccessToken","disableJoinPending","createCalendarIsOpen","joinPending","reset","logOut","refreshToken","oldToken","newToken","authenticateUser","getTokenExpiryTimeInMinutes","tokenExpiration","timeStamp","parseInt","getTime","setInterval","document","minutesUntilExpiry","addEventListener","event","Landing","observer","className","src","logo","alt","onClick","style","fontWeight","to","GoogleButton","useState","loading","setLoading","assign","goToGoogleLogin","size","now","EarthCalendar","getFullYear","getDate","getMonth","daysToCycle","color","cycleOffset","GreyhawkCalendar","ExandriaCalendar","TorilCalendar","EberronCalendar","CalendarTemplates","longName","NewCalendar","props","setName","setCalendar","createdCalendarId","setCreatedCalendarId","myTemplate","dto","savedCalendarId","close","onChange","e","target","template","createCalendar","CalendarDd","mouseLeaveTimeout","isOpen","setIsOpen","closeCall","onMouseLeave","setTimeout","onMouseEnter","clearTimeout","display","icon","faEdit","onRequestClose","UserToolbar","showLogout","setShowLogout","userName","faUser","About","faQuestionCircle","ToolBar","useEffect","Modal","setAppElement","EditCalendarState","calendarEventEditId","loadCalendar","LoadCalendar","updateMonthName","monthEditPosition","dayEditPosition","showDayTooltip","MonthEditCard","editMode","showDelete","setShowDelete","newValue","newNum","updateNumDays","type","checked","remaining","AddMonth","modalOpen","setModalOpen","numberOfDays","setNumberOfDays","htmlFor","asInt","safeSetNumberOfDays","newMonth","newPosition","push","addMonth","DragAndDropExample","onDragEnd","result","destination","myItems","list","startIndex","endIndex","splice","removed","i","reorder","source","index","myMonth","myMonths","droppableId","provided","snapshot","droppableProps","ref","innerRef","isDraggingOver","item","draggableId","dProvided","dSnapshot","draggableProps","dragHandleProps","isDragging","draggableStyle","userSelect","margin","background","border","placeholder","CalendarNumDays","showToolTip","setShowTooltip","onMouseOver","faInfoCircle","DangerZone","showModal","setShowModal","showDeleteButton","setSHowDeleteButton","fontSize","deletePressed","faExclamationTriangle","HolidayEditDialog","holiday","setMonth","setDay","maxWidth","marginLeft","setDaySafe","newHoliday","onSave","addHoliday","datesAreEqual","date1","date2","getDateString","monthName","getDayString","dayNum","MoonPhase","MyComponent","thisHoliday","HolidayView","HolidayLine","ColorPicker","node","useRef","showColorPicker","setShowColorPicker","handleClick","current","contains","removeEventListener","backgroundColor","hex","MoonModal","moon","toFixed","setDays","offSet","setOffset","setColor","toolTip","save","parseFloat","offsetText","getOffset","newModel","updateMoon","onClose","placement","trigger","overlay","MoonEditLine","MoonEdit","m","CalendarEditDay","dayIndex","dayName","setDayName","updateDayOfTheWeek","newDays","deleteDay","onVisibleChange","visible","faCheckSquare","CalendarEditDaysOfWeek","myDays","onDragStart","LeapYearEdit","rules","setEditMode","unless","setUnless","monthModel","getLeapYearMonthName","newInterval","unlessYears","newUnless","newUnlessInt","getUnlessYears","EditMisc","min","step","newVal","newOffset","updateOffset","newType","Timeline","Condensed","FantasyDateSelector","monthValue","setMonthValue","dayValue","setDayValue","yearValue","setYearValue","updatePosition","updateDate","updateMonth","paddingRight","paddingLeft","updatedDay","updateDay","getDayOptions","updatedYear","updateYear","LoadingSpinner","faCog","spin","CalendarEditView","useParams","redirect","setRedirect","MonthList","CalendarEditDays","href","Authenticate","auth","marginTop","getMoonStateInternal","moonFullPercentage","cycles","myPct","getMoonFullPercentage","sliceSize","fullThreshold","phase","None","Full","Math","abs","New","getCalendarNumber","num","CalendarDay","getHoliday","fullMoons","moonStates","newMoons","myClass","getClass","addNewEvent","title","borderColor","MonthView","hasEvents","Fragment","arr","n","isLeapMonth","numberOfDayBoxes","v","weeks","resultArray","chunkIndex","floor","getMoonStates","state","GetMoonState","week","weekIndex","EventDetail","format","marginBottom","DayDetailView","ShareLink","copyButtonText","setCopyButtonText","isEdit","shareLink","getElementById","focus","select","setSelectionRange","execCommand","copyToClipBoard","readOnly","link","ShareDialog","viewLink","protocol","host","editLink","showOptions","setShowOptions","faShareAltSquare","CalendarToolbar","viewType","setViewType","myDisplay","faAngleLeft","faAngleRight","TimeLineEvent","showDesc","setShowDesc","stopPropagation","preventDefault","editEvent","TimeLineView","sortEvents","daysBetween","nextEvent","spacing","getTimeLineEventSpacing","height","EditEvent","setDescription","setRealDate","setFantasyDate","setHidden","setMakeCurrentDate","saveEvent","updateEvent","myEvent","myIndex","findIndex","keyCode","ctrlKey","onKeyDown","textAreaKeyDown","parseISO","onRealDateChange","deleteEvent","lowMap","Map","tensMap","NumbersToWords","myString","finalDigit","tens","toUpperCase","slice","CondensedViewElement","isMonthEvent","CondensedViewYear","yearEvents","condensedViewObjects","acc","monthEvents","myObj","filler","final","pop","first","CondensedView","gappedYears","Set","years","myArray","newNumber","CreateRange","finalYear","CalendarView","currentYear","JoinCalendarHelper","CalendarViewWrapper","role","aria-label","ReleaseNotes","version","items","UpdateBanner","updateInfo","setUpdateInfo","currentVersion","p","c","closeBanner","myUpdateInfo","lastSeen","vString","getLastVersionSeen","getUpdateInfo","flexDirection","cursor","faTimes","DefaultView","App","loaded","setLoaded","calendarRedirect","setCalendarRedirect","myApp","accessToken","lastCalendar","navigator","userAgent","match","alert","rv","appName","ua","RegExp","exec","$1","getInternetExplorerVersion","path","Boolean","hostname","ReactDOM","render","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.70e30f37.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/MithrilAlmanacLogo.6164e594.jpg\";","import UserState from \"../State/UserState\";\r\nconst baseUriAddress = getBaseAddress();\r\n\r\nexport interface ErrorObject {\r\n status: number;\r\n message: string;\r\n errors?: string[];\r\n}\r\n\r\nexport interface Result {\r\n success: boolean;\r\n value: unknown | ErrorObject;\r\n}\r\n\r\nexport async function get(uri: string, parameters?: any): Promise {\r\n const fullUri = getUri(baseUriAddress + uri, parameters);\r\n const requestInit: RequestInit = {\r\n method: \"GET\",\r\n headers: getHeaders(false),\r\n };\r\n const response = await request(fullUri, requestInit);\r\n return response;\r\n}\r\n\r\nexport async function post(uri: string, body: any): Promise {\r\n const fullUri = getUri(baseUriAddress + uri);\r\n const requestInit: RequestInit = {\r\n method: \"POST\",\r\n body: JSON.stringify(body),\r\n headers: getHeaders(!!body),\r\n };\r\n const response = await request(fullUri, requestInit);\r\n return response;\r\n}\r\n\r\nasync function request(uri: string, requestInit: RequestInit): Promise {\r\n const response = await fetch(uri, requestInit);\r\n if (response.status === 200) {\r\n if (isJson(response)) {\r\n try {\r\n const responseObj = await response.json();\r\n ConvertDateTimes(responseObj);\r\n return {\r\n success: true,\r\n value: responseObj,\r\n };\r\n }\r\n catch (err) {\r\n const myErr: ErrorObject = {\r\n message: \"ERR 1: Something went wrong parsing the Response JSON\",\r\n status: response.status,\r\n };\r\n return {\r\n success: false,\r\n value: myErr,\r\n };\r\n }\r\n }\r\n else {\r\n return {\r\n success: true,\r\n value: undefined,\r\n };\r\n }\r\n }\r\n if (response.status === 401) {\r\n UserState.timeout();\r\n const errorObj = await getErrorObject(response);\r\n console.log(\"Unauthorized\", errorObj);\r\n return {\r\n success: false,\r\n value: errorObj,\r\n };\r\n \r\n }\r\n else {\r\n console.log(\"Get the error obj\", response);\r\n const errorObj = await getErrorObject(response);\r\n return {\r\n success: false,\r\n value: errorObj,\r\n };\r\n }\r\n}\r\n\r\n\r\nfunction getUri(url: string, params?: any) {\r\n let myUri = url;\r\n if (params) {\r\n const queryParams = Object.keys(params)\r\n .filter((key) => {\r\n return typeof (params[key]) !== \"undefined\" && params[key] !== null;\r\n })\r\n .map((key) => {\r\n let value = params[key];\r\n if (Object.prototype.toString.call(value) === \"[object Date]\") {\r\n value = value.toISOString();\r\n }\r\n else {\r\n value = encodeURIComponent(value);\r\n }\r\n return encodeURIComponent(key) + \"=\" + value;\r\n });\r\n const queryString = queryParams.join(\"&\");\r\n myUri = myUri + \"?\" + queryString;\r\n }\r\n return myUri;\r\n}\r\n\r\nfunction isJson(response: any) {\r\n const contentType = response.headers.get(\"content-type\");\r\n if (contentType && contentType.indexOf(\"application/json\") !== -1) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nasync function getErrorObject(response: Response): Promise {\r\n const contentType = response.headers.get(\"content-type\");\r\n const errorObj: ErrorObject = {\r\n message: getUnknownErrorMsg(response.status),\r\n status: response.status,\r\n };\r\n if (contentType && contentType.includes(\"application/json\")) {\r\n try {\r\n const json = await response.json();\r\n errorObj.message = json.message;\r\n if (json.errors) {\r\n errorObj.errors = json.errors;\r\n }\r\n }\r\n catch (err) {\r\n console.log(\"There was an exception parsing the error object\", response, err);\r\n }\r\n }\r\n return errorObj;\r\n}\r\n\r\nfunction getUnknownErrorMsg(status: number) {\r\n if (status === 401) {\r\n return \"There was an unknown error with your request. Please make sure you are logged in.\";\r\n }\r\n else {\r\n return \"There was an unknown error with your request. Status code: \" + status;\r\n }\r\n}\r\n\r\nfunction getBaseAddress() {\r\n let baseAddress = process.env.REACT_APP_API_ADDRESS;\r\n if (!baseAddress) {\r\n console.error(\"YOU MUST ADD THE FUNCTION BASE ADDRESS TO THE ENV FILE!\");\r\n }\r\n else if (!baseAddress.endsWith(\"/\")) {\r\n baseAddress += \"/\";\r\n }\r\n return baseAddress;\r\n}\r\n\r\nfunction getHeaders(hasBody: boolean): Headers {\r\n const headers: HeadersInit = new Headers();\r\n headers.set(\"Accept\", \"application/json\");\r\n if (hasBody) {\r\n headers.set(\"Content-Type\", \"application/json\");\r\n }\r\n const token = UserState.getAccessToken();\r\n if (token) {\r\n headers.set(\"Authorization\", token);\r\n }\r\n return headers;\r\n}\r\n\r\n\r\n// let timeout: number | undefined;\r\n// const tokenRefreshInterval = 1000 * 60 * 5; //five minutes\r\n// async function EnsureFreshToken() {\r\n// if (!timeout) {\r\n// timeout = window.setTimeout(() => {\r\n// const tokenExpiration = localStorage.getItem(\"tokenExpiration\");\r\n// if (tokenExpiration) {\r\n// const timeStamp = parseInt(tokenExpiration, 10);\r\n// if (timeStamp) {\r\n// const diff = timeStamp - (new Date().getTime());\r\n// const minutesUntilExpiry = diff / 1000 / 60;\r\n// if (minutesUntilExpiry > 0 && minutesUntilExpiry < 30) {\r\n// UserState.refreshToken();\r\n// }\r\n// }\r\n// }\r\n// timeout = undefined;\r\n// }, tokenRefreshInterval);\r\n// }\r\n// }\r\n\r\nfunction ConvertDateTimes(obj: any){\r\n if (obj.realDate){\r\n if (typeof(obj.realDate) === \"string\"){\r\n obj.realDate = new Date(obj.realDate);\r\n }\r\n }\r\n if (Array.isArray(obj)){\r\n obj.forEach(x => ConvertDateTimes(x));\r\n }\r\n}\r\n","import {get, post} from \"./fetchHelper\";\r\nimport CalendarEvent from \"../Models/CalendarEvent\";\r\nimport {CalendarModel} from \"../Models/CalendarModel\";\r\nimport UserCalendarDto from \"../Models/UserCalendarDto\";\r\n\r\nexport async function GetCalendar(id: string): Promise{\r\n // if (!id){\r\n // id = \"9a865260-1f8f-11ea-97ed-9555018c1b02\";\r\n // }\r\n const response = await get(\"GetCalendar\", {id});\r\n if (response.success){\r\n const asCalendar = response.value as CalendarModel;\r\n if (!asCalendar){\r\n return undefined;\r\n }\r\n return asCalendar;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport async function GetCalendarEvents(id: string): Promise{\r\n const response = await get(\"GetCalendarEvents\", {id});\r\n if (response.success){\r\n const asEvents = response.value as CalendarEvent[];\r\n if (!asEvents){\r\n return [];\r\n }\r\n return asEvents;\r\n }\r\n return [];\r\n}\r\n\r\n// export async function UpsertEvent(event: CalendarEvent): Promise{\r\n// const response = await post(\"UpdateEvent\", event);\r\n// return response;\r\n// }\r\n\r\nexport async function DeleteEvent(eventId: string): Promise{\r\n const response = await post(\"DeleteEvent\", {id: eventId});\r\n if (!response.success){\r\n throw new Error(\"There was an error deleting the event\");\r\n }\r\n}\r\n\r\n\r\nexport async function SaveCalendar(calendarModel: CalendarModel): Promise{\r\n const response = await post(\"SaveCalendar\", calendarModel);\r\n if (response.success){\r\n const payload = response.value as {id: string};\r\n if (payload){\r\n return payload.id;\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nexport async function DeleteCalendar(id: string): Promise{\r\n const response = await post(\"DeleteCalendar\", {id});\r\n if (response.success){\r\n return;\r\n }\r\n throw new Error(\"Something went wrong trying to delete the calendar\");\r\n}\r\n\r\n\r\nexport async function GetUserCalendars(): Promise {\r\n const response = await get(\"GetUserCalendars\");\r\n if (response.success){\r\n const models = response.value as UserCalendarDto[];\r\n return models;\r\n }\r\n return [];\r\n}\r\n\r\n","import { post, get } from \"./fetchHelper\";\r\n\r\nexport async function GetToken(code: string): Promise {\r\n const response = await post(\"GetToken\", {code});\r\n if (response.success){\r\n const responseObj = response.value as {token: string, expiration: number};\r\n if (responseObj.expiration){\r\n localStorage.setItem(\"tokenExpiration\", responseObj.expiration.toString());\r\n } \r\n return responseObj.token;\r\n }\r\n return \"\";\r\n}\r\n\r\nexport async function GetRefreshedToken(token: string): Promise {\r\n const response = await post(\"GetToken\", {token});\r\n if (response.success){\r\n const responseObj = response.value as {token: string, expiration: number};\r\n if (responseObj.expiration){\r\n localStorage.setItem(\"tokenExpiration\", responseObj.expiration.toString());\r\n } \r\n return responseObj.token;\r\n }\r\n return \"\";\r\n}\r\n\r\n\r\nexport async function GetConsentPage(): Promise {\r\n const response = await get(\"ConsentPage\");\r\n if (response.success){\r\n const responseModel = response.value as {url: string};\r\n if (responseModel.url){\r\n return responseModel.url;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n\r\n","import { post } from \"./DataClients/fetchHelper\";\r\nimport UserState from \"./State/UserState\";\r\n\r\nexport default async function JoinCalendarHelper(calendarId: string){\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (urlParams.has(\"joinId\")){\r\n const joinId = urlParams.get(\"joinId\");\r\n if (joinId){\r\n if (UserState.userModel){\r\n joinCalendar(joinId, calendarId);\r\n }\r\n else{\r\n localStorage.setItem(\"toJoin\", joinId + \"|\" + calendarId);\r\n }\r\n } \r\n }\r\n else{\r\n const joinId = localStorage.getItem(\"JoinId\");\r\n if (joinId){\r\n localStorage.removeItem(\"JoinId\");\r\n await joinCalendar(joinId, calendarId);\r\n }\r\n }\r\n}\r\n\r\nexport async function JoinPendingCalendars(): Promise {\r\n const toJoin = localStorage.getItem(\"toJoin\");\r\n if (toJoin){\r\n localStorage.removeItem(\"toJoin\");\r\n const split = toJoin.split(\"|\");\r\n if (split.length === 2){\r\n const joinId = split[0];\r\n const calendarId = split[1];\r\n await joinCalendar(joinId, calendarId);\r\n console.log(\"Joined calendar\", calendarId);\r\n return calendarId;\r\n }\r\n }\r\n}\r\n\r\n\r\nasync function joinCalendar(joinId: string, calendarId: string){\r\n const response = await post(\"JoinCalendar\", {joinId, calendarId});\r\n if (response.success){\r\n await UserState.updateCalendars();\r\n }\r\n}\r\n","export enum ViewType {\r\n Calendar = \"calendar\",\r\n Timeline = \"timeline\",\r\n Condensed = \"condensed\",\r\n}\r\n","import { CalendarModel, CheckIfLeapYear, GetDaysBeforeYear } from \"./CalendarModel\";\r\n\r\nexport default interface Month {\r\n days: number;\r\n name: string;\r\n position: number;\r\n}\r\n\r\n\r\nexport interface OffSetInfo{\r\n previousDays: number;\r\n offSetDays: number;\r\n}\r\n\r\nexport function GetOffSetInfo(calendar: CalendarModel, monthNumber: number, year: number): OffSetInfo {\r\n \r\n const daysBeforeYear = GetDaysBeforeYear(calendar, year);\r\n const yearOffSetDays = daysBeforeYear % calendar.daysOfWeek.length;\r\n\r\n const isLeapYear = CheckIfLeapYear(year, calendar);\r\n const prevMonths = calendar.months.filter(x => x.position < monthNumber);\r\n const previousDays = prevMonths.reduce((total, currMonth) => {\r\n if (isLeapYear && calendar.leapYearRules.month === currMonth.position){\r\n return total + currMonth.days + 1;\r\n }\r\n return total + currMonth.days;\r\n }, 0);\r\n let offSetDays = yearOffSetDays + previousDays % calendar.daysOfWeek.length;\r\n if (offSetDays >= 7) {\r\n offSetDays -= 7;\r\n }\r\n return {\r\n offSetDays : calendar.resetWeekAtMonthStart ? 0 : offSetDays,\r\n previousDays: previousDays + daysBeforeYear,\r\n };\r\n}\r\n\r\nexport function GetDaysInMonth(calendar: CalendarModel, monthPosition: number, year: number): number {\r\n const month = calendar.months.find(x => x.position === monthPosition);\r\n if (!month){\r\n return 0;\r\n }\r\n if (calendar.leapYearRules.month === monthPosition && CheckIfLeapYear(year, calendar)){\r\n return month.days + 1;\r\n }\r\n return month.days;\r\n}\r\n","import Month, { GetDaysInMonth } from \"./Month\";\r\nimport FantasyDate, { Holiday } from \"./FantasyDate\";\r\nimport Moon from \"./Moon\";\r\nimport { ViewType } from \"./CalendarViewType\";\r\n\r\ninterface LeapYearRules{\r\n interval: number;\r\n unlessDivisions: number[];\r\n month: number;\r\n}\r\n\r\nexport interface CalendarTemplate {\r\n months: Month[];\r\n daysOfWeek: string[];\r\n leapYearRules: LeapYearRules;\r\n currentDate: FantasyDate;\r\n resetWeekAtMonthStart: boolean;\r\n holidays: Holiday[];\r\n moons: Moon[];\r\n offSetDays: number;\r\n}\r\n\r\n\r\nexport interface CalendarModel extends CalendarTemplate {\r\n id: string;\r\n name: string;\r\n shareId: string;\r\n defaultView: ViewType;\r\n}\r\n\r\nexport const blankModel: CalendarModel = {\r\n name: \"\",\r\n id: \"__BLANK__\",\r\n currentDate: {dayOfMonth: 0, year: 0, month: 0},\r\n months: [],\r\n daysOfWeek: [],\r\n leapYearRules: {\r\n month: 0,\r\n interval: 0,\r\n unlessDivisions: [],\r\n },\r\n resetWeekAtMonthStart: false,\r\n holidays: [],\r\n shareId: \"\",\r\n moons: [],\r\n offSetDays: 0,\r\n defaultView: ViewType.Calendar,\r\n};\r\n\r\n\r\nexport function CheckIfLeapYear(year: number, calendar: CalendarModel): boolean{\r\n if (year === 0){\r\n return false;\r\n }\r\n let isLeapYear = year % calendar.leapYearRules.interval === 0;\r\n for (const divisionRule of calendar.leapYearRules.unlessDivisions){\r\n if (year % divisionRule === 0){\r\n isLeapYear = !isLeapYear;\r\n }\r\n }\r\n return isLeapYear;\r\n}\r\n\r\nexport function GetDaysBeforeYear(calendar: CalendarModel, year: number){\r\n const offset = calendar.offSetDays || 0;\r\n const prevYears = year > 1 ? Array.from(Array(year - 1).keys()).map(x => x + 1) : [];\r\n const totalDaysInYear = calendar.months.reduce((total, currMonth) => {\r\n return total + currMonth.days;\r\n }, 0);\r\n const daysBeforeYear = offset + prevYears.reduce((totalDays, yearNum) => {\r\n const isLeapYear = CheckIfLeapYear(yearNum, calendar);\r\n return totalDays + totalDaysInYear + (isLeapYear ? 1 : 0);\r\n }, 0);\r\n return daysBeforeYear;\r\n}\r\n\r\nfunction sortDates(dates: FantasyDate[]){\r\n const newArray = [...dates];\r\n newArray.sort((a, b) => {\r\n if (a.year !== b.year) {\r\n return a.year - b.year;\r\n }\r\n else if (a.month !== b.month) {\r\n return a.month - b.month;\r\n }\r\n else {\r\n return a.dayOfMonth - b.dayOfMonth;\r\n }\r\n });\r\n return newArray;\r\n}\r\n\r\nfunction getDaysInYearAfterDate(date: FantasyDate, calendar: CalendarModel){\r\n const lastMonth = calendar.months.reduce((prev, curr) => curr.position > prev.position ? curr : prev);\r\n const lastDayOfTheYear: FantasyDate = {\r\n year: date.year,\r\n month: lastMonth.position,\r\n dayOfMonth: lastMonth.days,\r\n };\r\n const daysRemainingNoLeap = GetDaysBetweenDates(calendar, date, lastDayOfTheYear);\r\n if (CheckIfLeapYear(date.year, calendar)){\r\n if (calendar.leapYearRules.month < date.month){\r\n return daysRemainingNoLeap + 1; \r\n }\r\n else if (calendar.leapYearRules.month === date.month){\r\n const leapMonth = calendar.months.find(x => x.position === calendar.leapYearRules.month) as Month;\r\n if (date.dayOfMonth <= leapMonth.days){\r\n return daysRemainingNoLeap + 1;\r\n }\r\n }\r\n }\r\n return daysRemainingNoLeap;\r\n}\r\n\r\nfunction getDaysInYearBeforeDate(date: FantasyDate, calendar: CalendarModel){\r\n const firstDayOfTheYear: FantasyDate = {\r\n year: date.year,\r\n month: 1,\r\n dayOfMonth: 1,\r\n };\r\n const daysRemainingNoLeap = GetDaysBetweenDates(calendar, date, firstDayOfTheYear);\r\n if (calendar.leapYearRules.month < date.month && CheckIfLeapYear(date.year, calendar)){\r\n return daysRemainingNoLeap + 1;\r\n }\r\n return daysRemainingNoLeap;\r\n}\r\n\r\nexport function GetDaysBetweenDates(calendar: CalendarModel, d1: FantasyDate, d2: FantasyDate): number{\r\n const [firstDate, secondDate] = sortDates([d1, d2]);\r\n if (firstDate.year === secondDate.year && firstDate.month === secondDate.month){\r\n return secondDate.dayOfMonth - firstDate.dayOfMonth;\r\n }\r\n else if (firstDate.year === secondDate.year) {\r\n const firstMonth = calendar.months.find(x => x.position === firstDate.month);\r\n if (!firstMonth){\r\n console.log(\"Couldn't find month for a date. Something went wrong!\", calendar, d1, d2);\r\n return 0;\r\n }\r\n const remainingDaysInMonth = firstMonth.days - firstDate.dayOfMonth + 1;\r\n const daysInMonthsBetween = calendar.months\r\n .filter(x => x.position < secondDate.month && x.position > firstDate.month)\r\n .reduce((prev, curr) => {\r\n const daysInMonth = GetDaysInMonth(calendar, curr.position, firstDate.year);\r\n return prev + daysInMonth;\r\n }, 0);\r\n const total = remainingDaysInMonth + daysInMonthsBetween + secondDate.dayOfMonth - 1;\r\n return total;\r\n }\r\n else{\r\n let totalDays = 0;\r\n totalDays += getDaysInYearAfterDate(firstDate, calendar);\r\n totalDays += getDaysInYearBeforeDate(secondDate, calendar);\r\n const totalDaysInYear = calendar.months.reduce((total, currMonth) => {\r\n return total + currMonth.days;\r\n }, 0);\r\n for (let year = firstDate.year + 1; year < secondDate.year; year++){\r\n totalDays += totalDaysInYear;\r\n if (CheckIfLeapYear(year, calendar)){\r\n totalDays += 1;\r\n }\r\n }\r\n return totalDays;\r\n }\r\n}\r\n","import { observable } from \"mobx\";\r\n\r\ninterface IErrorState {\r\n errorMessage: string;\r\n}\r\n\r\nconst ErrorState = observable({\r\n errorMessage: \"\",\r\n \r\n});\r\n\r\n\r\n\r\nexport default ErrorState;\r\n","import { observable, action, computed } from \"mobx\";\r\nimport CalendarEvent from \"../Models/CalendarEvent\";\r\nimport FantasyDate from \"../Models/FantasyDate\";\r\nimport { GetCalendar, GetCalendarEvents } from \"../DataClients/CalendarEventDataClient\";\r\nimport { CalendarModel, blankModel } from \"../Models/CalendarModel\";\r\nimport uuid from \"uuid\";\r\nimport ErrorState from \"./ErrorState\";\r\nimport { post, ErrorObject } from \"../DataClients/fetchHelper\";\r\nimport UserState from \"./UserState\";\r\nimport CalendarEventEditModel from \"../Models/CalendarEventEditModel\";\r\n\r\ninterface ICalendarState {\r\n calendar: CalendarModel;\r\n selectedDay: FantasyDate | undefined;\r\n events: CalendarEvent[];\r\n calendarEditEvent: CalendarEventEditModel | undefined;\r\n loadCalendar: (id: string) => void;\r\n calendarLoadState: \"Blank\" | \"Loaded\" | \"Loading\" | \"Error\";\r\n addNewEvent: (props: FantasyDate) => void;\r\n updateEvent: (props: CalendarEventEditModel) => Promise;\r\n updateMonthName: (position: number, newName: string) => void;\r\n reset: () => void;\r\n setSelectedDay: (date: FantasyDate) => void;\r\n canEditCalendar: boolean;\r\n createCalendarIsOpen: boolean;\r\n}\r\n\r\nexport class CalendarStore implements ICalendarState {\r\n @observable calendarLoadState: \"Blank\" | \"Loaded\" | \"Loading\" | \"Error\" = \"Blank\";\r\n @observable calendar = blankModel;\r\n @observable selectedDay: undefined | FantasyDate;\r\n @observable events: CalendarEvent[] = [];\r\n @observable calendarEditEvent: CalendarEventEditModel | undefined;\r\n @observable createCalendarIsOpen = false;\r\n\r\n @action.bound\r\n public async loadCalendar(id: string){\r\n console.log(\"LoadCalendar\", id);\r\n if (id !== this.calendar.id) {\r\n this.events = [];\r\n this.calendarLoadState = \"Loading\";\r\n const calendar = await GetCalendar(id);\r\n if (!calendar) {\r\n this.calendar = {\r\n ...blankModel,\r\n id: \"\",\r\n };\r\n this.events = [];\r\n this.calendarLoadState = \"Error\";\r\n localStorage.removeItem(\"LastCalendar\");\r\n return;\r\n }\r\n this.calendar = calendar;\r\n this.calendarLoadState = \"Loaded\";\r\n localStorage.setItem(\"LastCalendar\", id);\r\n const events = await GetCalendarEvents(calendar.id);\r\n this.events = events;\r\n }\r\n }\r\n\r\n @computed get canEditCalendar(): boolean{\r\n return !!UserState.userModel && UserState.calendars.some(x => x.id === this.calendar.id);\r\n }\r\n\r\n @action.bound\r\n public async addNewEvent(date: FantasyDate){\r\n if (!UserState.userModel){\r\n this.selectedDay = undefined;\r\n UserState.loginModalOpen = true;\r\n return;\r\n }\r\n if (!this.canEditCalendar){\r\n this.selectedDay = undefined;\r\n ErrorState.errorMessage = \"You do not have permission to add events to this calendar.\";\r\n return;\r\n }\r\n const newEvent: CalendarEventEditModel = {\r\n calendarEvent: {\r\n calendarId: this.calendar.id,\r\n fantasyDate: date,\r\n name: \"Title\",\r\n description: \"\",\r\n realDate: undefined,\r\n id: uuid(),\r\n createUser: UserState.userModel.id,\r\n hidden: false,\r\n },\r\n makeCurrentDate: false,\r\n };\r\n this.calendarEditEvent = newEvent;\r\n }\r\n\r\n @action.bound\r\n public async updateEvent(updateModel: CalendarEventEditModel){\r\n const oldEvents = this.events;\r\n try {\r\n const stillGoodEvents = this.events.filter(x => x.id !== updateModel.calendarEvent.id);\r\n this.events = [...stillGoodEvents, updateModel.calendarEvent];\r\n const response = await post(\"UpdateEvent\", updateModel);\r\n if (response.success) {\r\n const newEvent = response.value as CalendarEvent;\r\n if (newEvent.id){\r\n this.events = [...stillGoodEvents, newEvent];\r\n }\r\n }\r\n else{\r\n console.log(\"FAIL\");\r\n const defaultErrorMsg = \"There was an error saving your event. \" + \r\n \"If the problem persists, try logging out and logging back in again.\";\r\n const errorObj = response.value as ErrorObject;\r\n this.events = oldEvents;\r\n ErrorState.errorMessage = errorObj.message || defaultErrorMsg;\r\n }\r\n }\r\n catch (e){\r\n console.log(\"Error updating events\", e);\r\n this.events = oldEvents;\r\n ErrorState.errorMessage = \"There was an error saving your event. \" + \r\n \"If the problem persists, try logging out and logging back in again.\";\r\n }\r\n }\r\n\r\n @action.bound\r\n public async updateMonthName(position: number, newName: string) {\r\n const month = this.calendar.months.find(x => x.position === position);\r\n if (month) {\r\n month.name = newName;\r\n }\r\n }\r\n\r\n \r\n\r\n @action.bound\r\n public async setSelectedDay(date: FantasyDate) {\r\n this.selectedDay = date;\r\n }\r\n\r\n @action.bound\r\n public reset() {\r\n this.calendar = blankModel;\r\n this.calendarLoadState = \"Blank\";\r\n }\r\n}\r\n\r\n// const OldCalendarState = observable({\r\n// calendarLoadState: \"Blank\",\r\n// calendar: blankModel,\r\n// selectedDay: undefined,\r\n// events: [],\r\n// calendarEditEvent: undefined,\r\n// setCalendar: (id: string) => {\r\n// if (id !== CalendarState.calendar.id) {\r\n// LoadCalendar(id);\r\n// }\r\n// },\r\n// addNewEvent: (date: FantasyDate) => {\r\n// const newEvent: CalendarEvent = {\r\n// calendarId: CalendarState.calendar.id,\r\n// fantasyDate: date,\r\n// name: \"Title\",\r\n// description: \"\",\r\n// realDate: undefined,\r\n// id: uuid(),\r\n// };\r\n// CalendarState.calendarEditEvent = newEvent;\r\n// },\r\n// updateEvent: async (myEvent: CalendarEvent): Promise => {\r\n// const oldEvents = CalendarState.events;\r\n// try {\r\n// const stillGoodEvents = CalendarState.events.filter(x => x.id !== myEvent.id);\r\n// CalendarState.events = [...stillGoodEvents, myEvent];\r\n// const response = await post(\"UpdateEvent\", myEvent);\r\n// if (response.success) {\r\n// const newEvent = response.value as CalendarEvent;\r\n// CalendarState.events = [...stillGoodEvents, newEvent];\r\n// }\r\n// else{\r\n// console.log(\"FAIL\");\r\n// const defaultErrorMsg = \"There was an error saving your event. \" + \r\n// \"If the problem persists, try logging out and logging back in again.\";\r\n// const errorObj = response.value as ErrorObject;\r\n// CalendarState.events = oldEvents;\r\n// ErrorState.errorMessage = errorObj.message || defaultErrorMsg;\r\n// }\r\n// }\r\n// catch (e){\r\n// console.log(\"Error updating events\", e);\r\n// CalendarState.events = oldEvents;\r\n// ErrorState.errorMessage = \"There was an error saving your event. \" + \r\n// \"If the problem persists, try logging out and logging back in again.\";\r\n// }\r\n// },\r\n// updateMonthName: (position: number, newName: string) => {\r\n// const month = CalendarState.calendar.months.find(x => x.position === position);\r\n// if (month) {\r\n// month.name = newName;\r\n// }\r\n// },\r\n// reset: () => {\r\n// CalendarState.calendar = blankModel;\r\n// CalendarState.calendarLoadState = \"Blank\";\r\n// },\r\n// viewType: \"Calendar\",\r\n// });\r\n\r\n\r\n\r\n// async function LoadCalendar(id: string) {\r\n// CalendarState.calendarLoadState = \"Loading\";\r\n// const calendar = await GetCalendar(id);\r\n// if (!calendar) {\r\n// CalendarState.calendar = {\r\n// ...blankModel,\r\n// id: \"__ERROR__\",\r\n// };\r\n// CalendarState.events = [];\r\n// CalendarState.calendarLoadState = \"Error\";\r\n// return;\r\n// }\r\n// CalendarState.calendar = calendar;\r\n// CalendarState.calendarLoadState = \"Loaded\";\r\n// const events = await GetCalendarEvents(calendar.id);\r\n// CalendarState.events = events;\r\n// }\r\n\r\nconst CalendarState = new CalendarStore();\r\n\r\nexport default CalendarState;\r\n","import { observable } from \"mobx\";\r\nimport { GetUserCalendars } from \"../DataClients/CalendarEventDataClient\";\r\nimport { get, post } from \"../DataClients/fetchHelper\";\r\nimport { UserModel } from \"../Models/UserModel\";\r\nimport { GetRefreshedToken } from \"../DataClients/AuthenticationDataClient\";\r\nimport { JoinPendingCalendars } from \"../CalenderJoinHelper\";\r\nimport CalendarState from \"./CalendarState\";\r\nimport UserCalendarDto from \"../Models/UserCalendarDto\";\r\n\r\ninterface IUserState {\r\n loginModalOpen: boolean;\r\n getAccessToken: () => string | null;\r\n setAccessToken: (token: string) => void;\r\n userModel: UserModel | undefined;\r\n calendars: UserCalendarDto[];\r\n updateCalendars: (disableJoinPending?: boolean) => Promise;\r\n timeout: () => void;\r\n logOut: () => void;\r\n refreshToken: () => void;\r\n authenticateUser: (token: string) => Promise;\r\n reset: () => void;\r\n}\r\n\r\nconst UserState = observable({\r\n loginModalOpen: false,\r\n getAccessToken: () => localStorage.getItem(\"accessToken\"),\r\n setAccessToken: (token: string) => localStorage.setItem(\"accessToken\", token),\r\n userModel: undefined,\r\n calendars: [],\r\n updateCalendars: async (disableJoinPending?: boolean) => {\r\n const token = UserState.getAccessToken();\r\n if (token) {\r\n const calendars = await GetUserCalendars();\r\n if (calendars) {\r\n UserState.calendars = calendars;\r\n if (calendars.length === 0) {\r\n CalendarState.createCalendarIsOpen = true;\r\n }\r\n }\r\n const joinPending = await JoinPendingCalendars();\r\n //Prevent any nasty recursion.\r\n if (!disableJoinPending && joinPending) {\r\n UserState.updateCalendars(true);\r\n }\r\n }\r\n },\r\n timeout: () => {\r\n UserState.userModel = undefined;\r\n UserState.calendars = [];\r\n localStorage.removeItem(\"accessToken\");\r\n },\r\n reset: () => {\r\n UserState.userModel = undefined;\r\n UserState.calendars = [];\r\n },\r\n logOut: async () => {\r\n UserState.userModel = undefined;\r\n UserState.calendars = [];\r\n localStorage.removeItem(\"accessToken\");\r\n const result = await get(\"LogOut\");\r\n if (!result.success) {\r\n console.log(\"There was an error attempting to log out\");\r\n }\r\n },\r\n refreshToken: async () => {\r\n const oldToken = localStorage.getItem(\"accessToken\");\r\n if (oldToken) {\r\n try {\r\n const newToken = await GetRefreshedToken(oldToken);\r\n if (!newToken) {\r\n console.log(\"There was an error attempting to refresh token\");\r\n UserState.reset();\r\n }\r\n else {\r\n UserState.setAccessToken(newToken);\r\n }\r\n }\r\n catch (e) {\r\n console.log(\"There was an exception attempting to refresh token\", e);\r\n UserState.reset();\r\n }\r\n }\r\n },\r\n authenticateUser: async (token: string) => {\r\n const response = await post(\"AuthenticateUser\", { token });\r\n if (response.success) {\r\n const userModel = response.value as UserModel;\r\n UserState.setAccessToken(token);\r\n UserState.userModel = userModel;\r\n UserState.updateCalendars();\r\n }\r\n },\r\n});\r\n\r\n\r\n//const tokenRefreshInterval = 1000 * 5; //five seconds \r\nconst tokenRefreshInterval = 1000 * 60 * 5; //five minutes \r\nwindow.setInterval(() => {\r\n if (!UserState.userModel) {\r\n return;\r\n }\r\n if (!document.hidden) {\r\n UserState.refreshToken();\r\n }\r\n else {\r\n const minutesUntilExpiry = getTokenExpiryTimeInMinutes();\r\n if (minutesUntilExpiry && minutesUntilExpiry < 15) {\r\n UserState.refreshToken();\r\n }\r\n }\r\n}, tokenRefreshInterval);\r\n\r\n\r\nwindow.addEventListener(\"focus\", (event) => {\r\n const minutesUntilExpiry = getTokenExpiryTimeInMinutes();\r\n if (!minutesUntilExpiry || minutesUntilExpiry < 0) {\r\n UserState.reset();\r\n }\r\n else if (minutesUntilExpiry && minutesUntilExpiry < 45 && UserState.userModel) {\r\n UserState.refreshToken();\r\n }\r\n\r\n}, false);\r\n\r\n\r\nfunction getTokenExpiryTimeInMinutes() {\r\n const tokenExpiration = localStorage.getItem(\"tokenExpiration\");\r\n if (tokenExpiration) {\r\n const timeStamp = parseInt(tokenExpiration, 10);\r\n if (timeStamp) {\r\n const diff = timeStamp - (new Date().getTime());\r\n const minutesUntilExpiry = diff / 1000 / 60;\r\n return minutesUntilExpiry;\r\n }\r\n }\r\n}\r\n\r\n// let timeout: number | undefined;\r\n// const tokenRefreshInterval = 1000 * 60 * 5; //five minutes\r\n// async function EnsureFreshToken() {\r\n// if (!timeout) {\r\n// timeout = window.setTimeout(() => {\r\n// const tokenExpiration = localStorage.getItem(\"tokenExpiration\");\r\n// if (tokenExpiration) {\r\n// const timeStamp = parseInt(tokenExpiration, 10);\r\n// if (timeStamp) {\r\n// const diff = timeStamp - (new Date().getTime());\r\n// const minutesUntilExpiry = diff / 1000 / 60;\r\n// if (minutesUntilExpiry > 0 && minutesUntilExpiry < 30) {\r\n// UserState.refreshToken();\r\n// }\r\n// }\r\n// }\r\n// timeout = undefined;\r\n// }, tokenRefreshInterval);\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\nexport default UserState;\r\n","import React from \"react\";\r\nimport \"./Landing.css\";\r\nimport logo from \"../Images/MithrilAlmanacLogo.jpg\";\r\nimport { observer } from \"mobx-react\";\r\nimport UserState from \"../State/UserState\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nconst Landing: React.FC = observer(() => {\r\n function getStarted(){\r\n if (!UserState.userModel){\r\n UserState.loginModalOpen = true;\r\n }\r\n else{\r\n CalendarState.createCalendarIsOpen = true;\r\n } \r\n }\r\n return (\r\n
\r\n
\r\n
\r\n \"Mithril\r\n
\r\n
\r\n

\"What did we do last week?\"

\r\n

It's the eternal question that starts every game. Hopefully someone kept good notes,\r\n but even if no one did, you can usually remember it all after a few minutes.\r\n

\r\n

\r\n But inevitably at some point someone asks \"How long ago was it that we fought those gnolls?\" Or\r\n \"How long did we spend traveling from Furyondy to Celene?\"\r\n

\r\n

\r\n That's where the Mithril Almanac comes in. Our goal is to create an invaluable resource for tracking\r\n the events in your campaign. Start a new Calendar, and start adding events. Share it with your group.\r\n Create a calendar for your world. Cool, right?\r\n

\r\n

To get started you can either

\r\n
\r\n
getStarted()}>Create your own calendar
\r\n
- or -
\r\n
\r\n \r\n
Check out the sample Calendar based on Critical Role
\r\n \r\n
\r\n
\r\n

\r\n
\r\n
\r\n
\r\n About\r\n
\r\n
);\r\n});\r\n\r\nexport default Landing;\r\n\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport GoogleLogo from \"../Images/GoogleG.png\";\r\nimport BounceLoader from \"react-spinners/BounceLoader\";\r\nimport \"./SignIn.css\";\r\nimport { GetConsentPage } from \"../DataClients/AuthenticationDataClient\";\r\n\r\nconst GoogleButton: React.FC = observer(() => {\r\n const [loading, setLoading] = useState(false);\r\n async function goToGoogleLogin() {\r\n setLoading(true);\r\n const url = await GetConsentPage();\r\n if (url && url.length){\r\n window.location.assign(url);\r\n } \r\n else{\r\n setLoading(false);\r\n console.log(\"Something went wrong getting the consent page\");\r\n }\r\n }\r\n return (\r\n
\r\n \r\n {/* (\r\n \r\n )}\r\n buttonText=\"Login\"\r\n onSuccess={responseGoogle}\r\n onFailure={responseGoogle}\r\n cookiePolicy={\"single_host_origin\"}\r\n /> */}\r\n
\r\n );\r\n});\r\n\r\nexport default GoogleButton;\r\n","export default \"data:image/png;base64,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\"","import {CalendarTemplate} from \"../CalendarModel\";\r\n\r\nconst now = new Date();\r\n\r\nconst EarthCalendar: CalendarTemplate = {\r\n currentDate: {\r\n year: now.getFullYear(),\r\n dayOfMonth: now.getDate(),\r\n month: now.getMonth() + 1,\r\n },\r\n daysOfWeek: [\r\n \"Sunday\",\r\n \"Monday\",\r\n \"Tuesday\",\r\n \"Wednesday\",\r\n \"Thursday\",\r\n \"Friday\",\r\n \"Saturday\",\r\n ],\r\n months: [\r\n {name: \"January\", days: 31, position: 1},\r\n {name: \"February\", days: 28, position: 2},\r\n {name: \"March\", days: 31, position: 3},\r\n {name: \"April\", days: 30, position: 4},\r\n {name: \"May\", days: 31, position: 5},\r\n {name: \"June\", days: 30, position: 6},\r\n {name: \"July\", days: 31, position: 7},\r\n {name: \"August\", days: 31, position: 8},\r\n {name: \"September\", days: 30, position: 9},\r\n {name: \"October\", days: 31, position: 10},\r\n {name: \"November\", days: 30, position: 11},\r\n {name: \"December\", days: 31, position: 12},\r\n ],\r\n leapYearRules: {\r\n month: 2,\r\n interval: 4,\r\n unlessDivisions: [100, 400],\r\n },\r\n resetWeekAtMonthStart: false,\r\n holidays: [\r\n {\r\n name: \"New Year\",\r\n date: {month: 1, dayOfMonth: 1},\r\n },\r\n {\r\n name: \"Festivus\",\r\n date: {month: 12, dayOfMonth: 23},\r\n },\r\n ],\r\n moons: [\r\n {\r\n name: \"The Moon\",\r\n daysToCycle: 29.531,\r\n color: \"#fcf9b1\",\r\n cycleOffset: 15,\r\n },\r\n ],\r\n offSetDays: 1,\r\n};\r\n\r\nexport default EarthCalendar;\r\n\r\n","import {CalendarTemplate} from \"../CalendarModel\";\r\n\r\n/* cSpell:disable */\r\n\r\nconst GreyhawkCalendar: CalendarTemplate = {\r\n currentDate: {\r\n dayOfMonth: 1,\r\n month: 1,\r\n year: 567,\r\n },\r\n daysOfWeek: [\r\n \"Starday\",\r\n \"Sunday\",\r\n \"Moonday\",\r\n \"Godsday\",\r\n \"Waterday\",\r\n \"Earthday\",\r\n \"Freeday\",\r\n ],\r\n months: [\r\n {name: \"Needfest\", days: 7, position: 1},\r\n {name: \"Fireseek\", days: 28, position: 2},\r\n {name: \"Readying\", days: 28, position: 3},\r\n {name: \"Coldeven\", days: 28, position: 4},\r\n {name: \"Growfest\", days: 7, position: 5},\r\n {name: \"Planting\", days: 28, position: 6},\r\n {name: \"Flocktime\", days: 28, position: 7},\r\n {name: \"Wealsun\", days: 28, position: 8},\r\n {name: \"Richfest\", days: 7, position: 9},\r\n {name: \"Reaping\", days: 28, position: 10},\r\n {name: \"Goodmonth\", days: 28, position: 11},\r\n {name: \"Harvester\", days: 28, position: 12},\r\n {name: \"Brewfest\", days: 7, position: 13},\r\n {name: \"Patchwall\", days: 28, position: 14},\r\n {name: \"Ready'reat\", days: 28, position: 15},\r\n {name: \"Sunsebb\", days: 28, position: 16},\r\n ],\r\n leapYearRules: {\r\n month: 0,\r\n interval: 0,\r\n unlessDivisions: [],\r\n },\r\n resetWeekAtMonthStart: false,\r\n holidays: [],\r\n moons: [\r\n {\r\n name: \"Luna\",\r\n daysToCycle: 28,\r\n cycleOffset: 17,\r\n color: \"#fafbd2\",\r\n },\r\n {\r\n name: \"Celene\",\r\n daysToCycle: 91,\r\n cycleOffset: 3,\r\n color: \"rgb(127, 255, 212)\",\r\n },\r\n ],\r\n offSetDays: 0,\r\n};\r\n\r\nexport default GreyhawkCalendar;\r\n","import { CalendarTemplate } from \"../CalendarModel\";\r\n\r\n/* cSpell:disable */\r\n\r\nconst ExandriaCalendar: CalendarTemplate = {\r\n currentDate: {\r\n dayOfMonth: 1,\r\n month: 1,\r\n year: 836,\r\n },\r\n daysOfWeek: [\r\n \"Miresen\",\r\n \"Grissen\",\r\n \"Whelsen\",\r\n \"Conthsen\",\r\n \"Folsen\",\r\n \"Yulisen\",\r\n \"Da'leysen\",\r\n ],\r\n months: [\r\n { name: \"Horisal\", days: 29, position: 1 },\r\n { name: \"Misuthar\", days: 30, position: 2 },\r\n { name: \"Dualahei\", days: 30, position: 3 },\r\n { name: \"Thunsheer\", days: 31, position: 4 },\r\n { name: \"Unndilar\", days: 28, position: 5 },\r\n { name: \"Brussendar\", days: 31, position: 6 },\r\n { name: \"Sydenstar\", days: 32, position: 7 },\r\n { name: \"Fessuran\", days: 29, position: 8 },\r\n { name: \"Quen'pillar \", days: 27, position: 9 },\r\n { name: \"Cuersaar\", days: 29, position: 10 },\r\n { name: \"Duscar\", days: 32, position: 11 },\r\n ],\r\n leapYearRules: {\r\n month: 0,\r\n interval: 0,\r\n unlessDivisions: [],\r\n },\r\n resetWeekAtMonthStart: false,\r\n holidays: [\r\n {\r\n name: \"New Dawn\",\r\n date: { month: 1, dayOfMonth: 1 },\r\n },\r\n ],\r\n moons: [\r\n {\r\n name: \"Catha\",\r\n daysToCycle: 33,\r\n color: \"yellow\",\r\n cycleOffset: 1,\r\n },\r\n {\r\n name: \"Ruidus\",\r\n daysToCycle: 328,\r\n color: \"#a22700\",\r\n cycleOffset: 2,\r\n },\r\n ],\r\n offSetDays: 0,\r\n};\r\n\r\nexport default ExandriaCalendar;\r\n","import {CalendarTemplate} from \"../CalendarModel\";\r\n\r\n/* cSpell:disable */\r\n\r\nconst TorilCalendar: CalendarTemplate = {\r\n currentDate: {\r\n dayOfMonth: 1,\r\n month: 1,\r\n year: 1491,\r\n },\r\n daysOfWeek: [\r\n \"FirstDay\",\r\n \"SecondDay\",\r\n \"ThirdDay\",\r\n \"FourthDay\",\r\n \"FifthDay\",\r\n \"SixthDay\",\r\n \"SeventhDay\",\r\n \"EighthDay\",\r\n \"NinthDay\",\r\n \"TenthDay\",\r\n ],\r\n months: [\r\n {name: \"Hammer, Deepwinter\", days: 31, position: 1},\r\n {name: \"Alturaik, The Claw of Winter\", days: 30, position: 2},\r\n {name: \"Ches, The Claw of the Sunsets\", days: 30, position: 3},\r\n {name: \"Tarsakh, The Claw of the Storms\", days: 31, position: 4},\r\n {name: \"Mirtul, The Melting \", days: 30, position: 5},\r\n {name: \"Kythorn, The Time of Flowers\", days: 30, position: 6},\r\n {name: \"Flamerule, Summertide\", days: 31, position: 7},\r\n {name: \"Eleasis, Highsun\", days: 30, position: 8},\r\n {name: \"Eleint, The Fading\", days: 31, position: 9},\r\n {name: \"Marpenoth, Leaffall\", days: 30, position: 10},\r\n {name: \"Uktar, The Rotting \", days: 31, position: 11},\r\n {name: \"Nightal, The Drawing Down\", days: 30, position: 12},\r\n ],\r\n leapYearRules: {\r\n month: 9,\r\n interval: 4,\r\n unlessDivisions: [],\r\n },\r\n resetWeekAtMonthStart: true,\r\n holidays: [\r\n {\r\n name: \"Midwinter\",\r\n date: {month: 1, dayOfMonth: 31},\r\n },\r\n {\r\n name: \"Greengrass\",\r\n date: {month: 4, dayOfMonth: 31},\r\n },\r\n {\r\n name: \"Midsummer\",\r\n date: {month: 7, dayOfMonth: 31},\r\n },\r\n {\r\n name: \"Highharvestide\",\r\n date: {month: 9, dayOfMonth: 31},\r\n },\r\n {\r\n name: \"Feast of the Moon\",\r\n date: {month: 11, dayOfMonth: 31},\r\n },\r\n {\r\n name: \"Shieldmeet\",\r\n date: {month: 9, dayOfMonth: 32},\r\n },\r\n ],\r\n moons: [\r\n {\r\n name: \"Selûne\",\r\n daysToCycle: 30.4375,\r\n cycleOffset: -0.5,\r\n color: \"#fafbd2\",\r\n },\r\n ],\r\n offSetDays: 0,\r\n};\r\n\r\nexport default TorilCalendar;\r\n","import {CalendarTemplate} from \"../CalendarModel\";\r\n\r\n/* cSpell:disable */\r\n\r\nconst EberronCalendar: CalendarTemplate = {\r\n currentDate: {\r\n dayOfMonth: 1,\r\n month: 1,\r\n year: 998,\r\n },\r\n daysOfWeek: [\r\n \"Sul\",\r\n \"Mol\",\r\n \"Zol\",\r\n \"Wir\",\r\n \"Zor\",\r\n \"Far\",\r\n \"Sar\",\r\n ],\r\n months: [\r\n {name: \"Zarantyr \", days: 28, position: 1},\r\n {name: \"Olarune\", days: 28, position: 2},\r\n {name: \"Therendor\", days: 28, position: 3},\r\n {name: \"Eyre\", days: 28, position: 4},\r\n {name: \"Dravago\", days: 28, position: 5},\r\n {name: \"Nymm\", days: 28, position: 6},\r\n {name: \"Lharvion \", days: 28, position: 7},\r\n {name: \"Barrakas\", days: 28, position: 8},\r\n {name: \"Rhaan\", days: 28, position: 9},\r\n {name: \"Aryth\", days: 28, position: 10},\r\n {name: \"Vult\", days: 28, position: 11},\r\n {name: \"Crya\", days: 28, position: 12},\r\n ],\r\n leapYearRules: {\r\n month: 0,\r\n interval: 0,\r\n unlessDivisions: [],\r\n },\r\n resetWeekAtMonthStart: true,\r\n holidays: [\r\n {\r\n name: \"The Day of Mourning\",\r\n date: {month: 9, dayOfMonth: 20},\r\n },\r\n {\r\n name: \"Thronehold\",\r\n date: {month: 10, dayOfMonth: 11},\r\n },\r\n ],\r\n moons: [],\r\n offSetDays: 0,\r\n};\r\n\r\nexport default EberronCalendar;\r\n","import {CalendarTemplate} from \"../CalendarModel\";\r\n\r\nconst now = new Date();\r\n\r\nconst GenericCalendar: CalendarTemplate = {\r\n currentDate: {\r\n year: now.getFullYear(),\r\n dayOfMonth: now.getDate(),\r\n month: now.getMonth() + 1,\r\n },\r\n daysOfWeek: [\r\n \"Day1\",\r\n \"Day2\",\r\n \"Day3\",\r\n \"Day4\",\r\n \"Day5\",\r\n \"Day6\",\r\n \"Day7\",\r\n ],\r\n months: [\r\n {name: \"Month1\", days: 30, position: 1},\r\n {name: \"Month2\", days: 30, position: 2},\r\n {name: \"Month3\", days: 30, position: 3},\r\n {name: \"Month4\", days: 30, position: 4},\r\n {name: \"Month5\", days: 30, position: 5},\r\n {name: \"Month6\", days: 30, position: 6},\r\n {name: \"Month7\", days: 30, position: 7},\r\n {name: \"Month8\", days: 30, position: 8},\r\n {name: \"Month9\", days: 30, position: 9},\r\n {name: \"Month10\", days: 30, position: 10},\r\n {name: \"Month11\", days: 30, position: 11},\r\n {name: \"Month12\", days: 30, position: 12},\r\n ],\r\n leapYearRules: {\r\n month: 2,\r\n interval: 4,\r\n unlessDivisions: [100, 400],\r\n },\r\n resetWeekAtMonthStart: false,\r\n holidays: [\r\n {\r\n name: \"New Year\",\r\n date: {month: 1, dayOfMonth: 1},\r\n },\r\n ],\r\n moons: [\r\n {\r\n name: \"The Moon\",\r\n daysToCycle: 28,\r\n color: \"#fcf9b1\",\r\n cycleOffset: 15,\r\n },\r\n ],\r\n offSetDays: 1,\r\n};\r\n\r\nexport default GenericCalendar;\r\n\r\n","/* cSpell:disable */\r\nimport EarthCalendar from \"./EarthCalendar\";\r\nimport GreyhawkCalendar from \"./GreyhawkCalendar\";\r\nimport ExandriaCalendar from \"./ExandriaCalendar\";\r\nimport TorilCalendar from \"./TorilCalendar\";\r\nimport EberronCalendar from \"./KhorvaireCalendar\";\r\nimport GenericCalendar from \"./GenericCalendar\";\r\n\r\nconst CalendarTemplates = [\r\n {id: \"oerth\", longName: \"Oerth (Greyhawk)\", value: GreyhawkCalendar},\r\n {id: \"toril\", longName: \"Toril (Forgotten Realms)\", value: TorilCalendar},\r\n {id: \"exandria\", longName: \"Exandria (Critical Role)\", value: ExandriaCalendar},\r\n {id: \"eberron\", longName: \"Khorvaire (Eberron)\", value: EberronCalendar},\r\n {id: \"earth\", longName: \"Earth (The Real World)\", value: EarthCalendar},\r\n {id: \"generic\", longName: \"Generic (Placeholders)\", value: GenericCalendar},\r\n];\r\n\r\nexport {CalendarTemplates};\r\nexport {EarthCalendar};\r\nexport {ExandriaCalendar};\r\nexport {TorilCalendar};\r\nexport {GenericCalendar};\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport \"./NewCalendar.css\";\r\nimport {CalendarTemplates} from \"../Models/CalendarTemplates\";\r\nimport {SaveCalendar} from \"../DataClients/CalendarEventDataClient\";\r\nimport { Redirect } from \"react-router-dom\";\r\nimport UserState from \"../State/UserState\";\r\nimport { CalendarModel } from \"../Models/CalendarModel\";\r\nimport { ViewType } from \"../Models/CalendarViewType\";\r\n\r\nconst NewCalendar = observer((props: {close: () => void}) => {\r\n const [name, setName] = useState(\"My Calendar\");\r\n const [calendarId, setCalendar] = useState(CalendarTemplates[0].id);\r\n const [createdCalendarId, setCreatedCalendarId] = useState(\"\");\r\n async function createCalendar(){\r\n const myTemplate = CalendarTemplates.find(x => x.id === calendarId);\r\n if (myTemplate){\r\n const dto: CalendarModel = {\r\n ...myTemplate.value,\r\n name,\r\n id: \"\",\r\n shareId: \"\",\r\n defaultView: ViewType.Calendar,\r\n };\r\n const savedCalendarId = await SaveCalendar(dto);\r\n UserState.updateCalendars();\r\n setCreatedCalendarId(savedCalendarId);\r\n props.close();\r\n }\r\n }\r\n if (createdCalendarId){\r\n return ;\r\n }\r\n return (\r\n
\r\n

Create A New Calendar

\r\n
\r\n Let's start by giving your Calendar a name, and selecting a template.\r\n You'll be able to customize it later.
\r\n
\r\n \r\n setName(e.target.value)} />\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default NewCalendar;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport UserState from \"../State/UserState\";\r\nimport { Link } from \"react-router-dom\";\r\nimport Modal from \"react-modal\";\r\nimport NewCalendar from \"../NewCalendar/NewCalendar\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\n\r\nconst CalendarDd: React.FC = observer(() => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n function closeCall(){\r\n CalendarState.createCalendarIsOpen = false;\r\n setIsOpen(false);\r\n }\r\n let mouseLeaveTimeout: number | undefined;\r\n function onMouseLeave(){\r\n mouseLeaveTimeout = window.setTimeout(() => {\r\n setIsOpen(false);\r\n }, 500);\r\n }\r\n function onMouseEnter(){\r\n if (mouseLeaveTimeout){\r\n window.clearTimeout(mouseLeaveTimeout);\r\n }\r\n }\r\n return (\r\n
onMouseLeave()} onMouseEnter={() => onMouseEnter()}\r\n className=\"calendar-dd-wrap tool-child\">\r\n
setIsOpen(true)}>Calendars
\r\n
\r\n {\r\n UserState.calendars.map(x => (\r\n
\r\n
\r\n setIsOpen(false)} to={\"/defaultView/\" + x.id}>\r\n {x.name}\r\n \r\n
\r\n
\r\n
\r\n setIsOpen(false)} \r\n className=\"hover-underline toolbar-link\" \r\n to={`/edit/${x.id}`}>\r\n \r\n \r\n
\r\n
\r\n
))\r\n }\r\n
CalendarState.createCalendarIsOpen = true}>Create New
\r\n closeCall()}\r\n >\r\n closeCall()} />\r\n \r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default CalendarDd;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport UserState from \"../State/UserState\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faUser } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nconst UserToolbar: React.FC = observer(() => {\r\n const [showLogout, setShowLogout] = useState(false);\r\n function logOut() {\r\n UserState.logOut();\r\n setShowLogout(false);\r\n }\r\n const userName = UserState.userModel ? UserState.userModel.userName : \"\";\r\n return (\r\n
setShowLogout(false)}>\r\n
setShowLogout(!showLogout)}>\r\n \r\n  {userName}\r\n
\r\n
\r\n
logOut()} className=\"fake-link\">Logout
\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default UserToolbar;\r\n","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faQuestionCircle } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nconst About = () => {\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default About;\r\n","import React, { useEffect } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport ColoredSquares from \"../Images/ColoredSquares.png\";\r\nimport Modal from \"react-modal\";\r\nimport GoogleButton from \"../SignIn/GoogleButton\";\r\nimport UserState from \"../State/UserState\";\r\nimport \"./ToolBar.css\";\r\nimport CalendarDd from \"./CalendarDD\";\r\nimport { Link } from \"react-router-dom\";\r\nimport UserToolbar from \"./UserToolbar\";\r\nimport About from \"./AboutToolbarLink\";\r\n\r\nconst ToolBar: React.FC = observer(() => {\r\n useEffect(() => Modal.setAppElement(\"#app\"), []);\r\n\r\n return (\r\n
\r\n
\"small
\r\n {/*
The Mithril Almanac
*/}\r\n {\r\n UserState.userModel ?\r\n (
\r\n \r\n \r\n \r\n
) :\r\n (
\r\n \r\n
UserState.loginModalOpen = true}>Log In
\r\n
)\r\n }\r\n UserState.loginModalOpen = false}>\r\n
\r\n
Sign in with Google
\r\n \r\n
\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default ToolBar;\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAB9CAYAAABUHpEuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAR5SURBVHhe7dy/b1VlHMfx55xSKeJGequIJmoL6oADC/wHkPhjdXQUJxcHEqMxLvwBxjhqYoirOsDGJgwmDiQmQAOJIZJeMUSQUAqcr2d41ltI7iUcv/f1atLbz13a5uScd9PhKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLaa+joz+/Z1ux4slVfqZEo7NsvVa9fau3UO1p4D3YHFh2WhTqYQXbmxcaUd1zkg0T6/Gq/XwZTu7mqu/3OhuVnnYL3wZrwcW/FcnUyheab59/rvzR91ztzMgz5a7Q6XtjlXJ9Pq4sh4vT1f12At7+/GTWmW62QaESfHl9sTdQ3GysFud2yW2/1jY+bPjbnUxfH+3v6mrsEarXWn+0t+tE6mEXGmv7eP1TVzbX0FAP7HBB0AEhB0AEhA0AEgAUEHgAQEHQASEHQASEDQASABQQeABJ7aSXERsdV/9/dK13/MmaYth/vPX9S5vXQnxcXn0ZXB/z6zFk3Z0f/1/GNpmh31rckynBQX8WFEuVrX3GgWynJ/sb+vc3v5Tor7Lro4Vb+eK/0z/av+81qdkz3hk+KeXtBLbP51qdnd/whzF/SV1e6daJuf6txesqA3Xby7sd7+XOf8OBSLo1txp38wLtZ3JssQ9CYOji+2F+qaG3tf6156sPCYZ3WnC3p8Nr7UflnHXBmtxa99TQ/VOZmjXwGARxF0AEhA0AEgAUEHgAQEHQASEHQASEDQASABQQeABAQdABIQdABIQNABIAFBB4AEBB0AEhB0AEhA0AEgAUEHgAQEHQASEHQASEDQASABQQeABAQdABIQdABIQNABIAFBB4AEBB0AEhB0AEhA0AEgAUEHgAQEHQASEHQASEDQASABQQeABAQdABIQdABIQNABIAFBB4AEBB0AEhB0AEhA0AEgAUEHgAQEHQASEHQASEDQASABQQeABAQdABIQdABIQNABIAFBB4AEBB0AEhB0AEhA0AEgAUEHgAQEHQASEHQASEDQASABQQeABAQdABIQdABIQNABIAFBB4AEmvo6M6PV7nBpm3N1ThQRW01p3ri3VG7Wt+bGzs04WprmVJ3b6+LIeL09X9dgLe/vxv31XK5zoijx0dbO5oc658bSnViMhXKtv+6L9a3JIk6OL7cn6hqMlYPd7tgst/vHxiOfG13E2/eXml/qnBtL9+PF6JoLdW6vi+P9vf1NXYM1WutO95f8aJ2TRXx9b6n5tK65svNenO3vi7fqnCziTH9vH6tr5p5a0HlMyYLOY0gQdB5DtqDzaE846P7lDgAJCDoAJCDoAJCAoANAAoIOAAkIOgAkIOgAkICgA0ACgg4ACcz8xKc9B7q9C135oE6m9LAt3/59sf2zzsEa7e8+LlGerZMpNG05t3GxPVvncByKxdGt+KQuptRFOX1jvf2tzsFaWevej1JerZMp9MG9snG5nbujrwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBhK+Q+0Ziqzp/KaEgAAAABJRU5ErkJggg==\"","import {observable} from \"mobx\";\r\nimport { GetCalendar } from \"../DataClients/CalendarEventDataClient\";\r\nimport { CalendarModel, blankModel } from \"../Models/CalendarModel\";\r\n\r\ninterface IEditCalendarState {\r\n calendar: CalendarModel;\r\n calendarEventEditId: string | undefined;\r\n loadCalendar: (id: string) => void;\r\n calendarLoadState: \"Blank\" | \"Loaded\" | \"Loading\" | \"Error\";\r\n updateMonthName: (position: number, newName: string) => void;\r\n monthEditPosition: number | undefined;\r\n dayEditPosition: number | undefined;\r\n showDayTooltip: boolean;\r\n}\r\n\r\n\r\nconst EditCalendarState = observable({\r\n calendarLoadState: \"Blank\",\r\n calendar: blankModel,\r\n calendarEventEditId: undefined,\r\n loadCalendar: (id: string) => {\r\n LoadCalendar(id); \r\n },\r\n updateMonthName: (position: number, newName: string) => {\r\n const month = EditCalendarState.calendar.months.find(x => x.position === position);\r\n if (month){\r\n month.name = newName;\r\n }\r\n },\r\n monthEditPosition: undefined,\r\n dayEditPosition: undefined,\r\n showDayTooltip: true,\r\n});\r\n\r\nasync function LoadCalendar(id: string) {\r\n try{\r\n EditCalendarState.calendarLoadState = \"Loading\";\r\n const calendar = await GetCalendar(id);\r\n if (!calendar){\r\n console.log(\"No Calendar\");\r\n EditCalendarState.calendar = {\r\n ...blankModel,\r\n id: \"__ERROR__\",\r\n };\r\n EditCalendarState.calendarLoadState = \"Error\";\r\n }\r\n else{\r\n EditCalendarState.calendar = calendar;\r\n EditCalendarState.calendarLoadState = \"Loaded\";\r\n }\r\n\r\n }\r\n catch (e){\r\n EditCalendarState.calendarLoadState = \"Error\";\r\n }\r\n}\r\n\r\n\r\nexport default EditCalendarState;\r\n","import React, { useState } from \"react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\n\r\nconst MonthEditCard = observer((props: { position: number }) => {\r\n const month = EditCalendarState.calendar.months.find(x => x.position === props.position);\r\n if (!month) {\r\n return (
Could not locate month
);\r\n }\r\n const editMode = props.position === EditCalendarState.monthEditPosition;\r\n function updateNumDays(newValue: string) {\r\n if (month) {\r\n const newNum = parseInt(newValue, 10);\r\n if (newNum) {\r\n month.days = newNum;\r\n }\r\n else {\r\n month.days = 0;\r\n }\r\n }\r\n }\r\n function deleteMonth(){\r\n const remaining = EditCalendarState.calendar.months.filter(x => x.position !== props.position);\r\n EditCalendarState.calendar.months = remaining;\r\n }\r\n const [showDelete, setShowDelete] = useState(false);\r\n return (\r\n
\r\n
\r\n {\r\n editMode ?\r\n ( month.name = e.target.value}\r\n />)\r\n :\r\n ({month.name} )\r\n }\r\n {\r\n !editMode && EditCalendarState.monthEditPosition = props.position}\r\n className=\"month-edit-icon\" icon={faEdit} />\r\n }\r\n
\r\n {\r\n editMode ?\r\n (
\r\n
\r\n Days \r\n updateNumDays(e.target.value)}\r\n type=\"text\"\r\n value={month.days}>\r\n EditCalendarState.monthEditPosition = undefined}\r\n className=\"edit-month-save\">Close\r\n
\r\n
) :\r\n (
\r\n Days \r\n {month.days}\r\n
)\r\n }\r\n {\r\n editMode && (\r\n
\r\n setShowDelete(!showDelete))} type=\"checkbox\" checked={showDelete} />\r\n \r\n {\r\n showDelete && (\r\n
\r\n \r\n
\r\n )\r\n }\r\n
\r\n\r\n )\r\n }\r\n
\r\n );\r\n});\r\n\r\nexport default MonthEditCard;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport Modal from \"react-modal\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport Month from \"../Models/Month\";\r\n\r\nconst AddMonth = observer((props: {newPosition: number}) => {\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [name, setName] = useState(\"My Month\");\r\n const [numberOfDays, setNumberOfDays] = useState(30);\r\n function safeSetNumberOfDays(newValue: string){\r\n const asInt = parseInt(newValue, 10);\r\n if (asInt){\r\n setNumberOfDays(asInt);\r\n }\r\n }\r\n function addMonth(){\r\n const newMonth: Month = {\r\n name,\r\n days: numberOfDays,\r\n position: props.newPosition,\r\n };\r\n EditCalendarState.calendar.months.push(newMonth);\r\n setName(\"\");\r\n setNumberOfDays(30);\r\n setModalOpen(false);\r\n }\r\n return (\r\n
\r\n \r\n setModalOpen(false)}>\r\n
\r\n

Add Month

\r\n
\r\n \r\n setName(e.target.value)}/>\r\n
\r\n
\r\n \r\n safeSetNumberOfDays(e.target.value)}/>\r\n
\r\n \r\n
\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default AddMonth;\r\n","import React, { CSSProperties } from \"react\";\r\nimport {\r\n DragDropContext,\r\n Droppable,\r\n Draggable,\r\n DropResult,\r\n} from \"react-beautiful-dnd\";\r\nimport Month from \"../Models/Month\";\r\nimport MonthEditCard from \"./MonthEditCard\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport AddMonth from \"./AddMonthButton\";\r\n\r\nconst DragAndDropExample = observer(() => {\r\n const grid = 3;\r\n // tslint:disable-next-line:max-line-length\r\n function getItemStyle(isDragging: boolean, draggableStyle: CSSProperties | undefined): CSSProperties {\r\n const myStyle: CSSProperties = {\r\n // some basic styles to make the items look a bit nicer\r\n userSelect: \"none\",\r\n margin: `0 0 ${grid}px 0`,\r\n\r\n // change background colour if dragging\r\n background: isDragging ? \"\" : \"\",\r\n border: isDragging ? \"1px solid lightgray\" : \"\",\r\n\r\n // styles we need to apply on draggables\r\n ...draggableStyle,\r\n };\r\n return myStyle;\r\n }\r\n\r\n\r\n const reorder = (list: Month[], startIndex: number, endIndex: number): Month[] => {\r\n const result = Array.from(list);\r\n const [removed] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removed);\r\n const newMonths: Month[] = result.map((x, i) => {\r\n return {\r\n ...x,\r\n position: i + 1,\r\n };\r\n });\r\n return newMonths;\r\n };\r\n\r\n function onDragEnd(result: DropResult) {\r\n // dropped outside the list\r\n if (!result.destination) {\r\n return;\r\n }\r\n\r\n const myItems: Month[] = reorder(\r\n EditCalendarState.calendar.months,\r\n result.source.index,\r\n result.destination.index,\r\n );\r\n if (EditCalendarState.monthEditPosition){\r\n const myMonth = EditCalendarState.calendar.months.find(x => x.position === EditCalendarState.monthEditPosition);\r\n if (myMonth){\r\n const newMonth = myItems.find(x => x.name === myMonth.name);\r\n if (newMonth){\r\n EditCalendarState.monthEditPosition = newMonth.position;\r\n }\r\n } \r\n }\r\n EditCalendarState.calendar.months = myItems;\r\n }\r\n const myMonths = [...EditCalendarState.calendar.months];\r\n myMonths.sort((a, b) => a.position - b.position);\r\n return (\r\n
\r\n

Months

\r\n onDragEnd(e)}>\r\n \r\n {(provided, snapshot) => (\r\n \r\n {myMonths.map((item: Month, index: number) => (\r\n \r\n {(dProvided, dSnapshot) => (\r\n \r\n \r\n
\r\n )}\r\n \r\n ))}\r\n {provided.placeholder}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n});\r\n\r\nexport default DragAndDropExample;\r\n","import React, { useState } from \"react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfoCircle } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\n\r\nconst CalendarNumDays = (props: {totalDaysInYear: number}) => {\r\n const [showToolTip, setShowTooltip] = useState(false);\r\n return (\r\n
\r\n Days In Year: \r\n {props.totalDaysInYear} \r\n \r\n setShowTooltip(true)}\r\n onMouseLeave={() => setShowTooltip(false)}\r\n onClick={() => setShowTooltip(!showToolTip)}\r\n className=\"day-number-info-icon\" icon={faInfoCircle} />\r\n
\r\n To change this number, alter the number of days in individual months\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default CalendarNumDays;\r\n","import React, { useState } from \"react\";\r\nimport Modal from \"react-modal\";\r\nimport { observer } from \"mobx-react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { DeleteCalendar } from \"../DataClients/CalendarEventDataClient\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\n\r\nconst DangerZone = observer(() => {\r\n const [showModal, setShowModal] = useState(false);\r\n const [showDeleteButton, setSHowDeleteButton] = useState(false);\r\n async function deletePressed() {\r\n await DeleteCalendar(EditCalendarState.calendar.id);\r\n window.location.assign(\"/\");\r\n }\r\n return (\r\n
\r\n \r\n setShowModal(false)}>\r\n
\r\n
\r\n {\r\n `Are you really, really sure you want to delete the calendar ${EditCalendarState.calendar.name}???`\r\n }\r\n
\r\n
THIS OPERATION CANNOT BE UNDONE!
\r\n
\r\n setShowModal(false)}>No, Don't Delete this Calendar\r\n
\r\n setSHowDeleteButton(!showDeleteButton)} />\r\n \r\n
\r\n
\r\n {\r\n showDeleteButton && ( deletePressed()}\r\n className=\"yes-delete-btn\">\r\n \r\n  Yes, I really want to delete this calendar \r\n \r\n )\r\n }\r\n
\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default DangerZone;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport { Holiday } from \"../Models/FantasyDate\";\r\n\r\ninterface IHolidayEditDialog {\r\n onSave: (holiday?: Holiday) => void;\r\n holiday?: Holiday;\r\n}\r\n\r\nconst HolidayEditDialog = observer((props: IHolidayEditDialog) => {\r\n const [name, setName] = useState(props.holiday ? props.holiday.name : \"Holiday Name\");\r\n const [month, setMonth] = useState(props.holiday ? props.holiday.date.month : 1);\r\n const [dayOfMonth, setDay] = useState(props.holiday ? props.holiday.date.dayOfMonth : 1);\r\n function addHoliday() {\r\n setName(\"Holiday Name\");\r\n setMonth(1);\r\n setDay(1);\r\n const newHoliday: Holiday = {\r\n name,\r\n date: {\r\n month,\r\n dayOfMonth,\r\n },\r\n };\r\n props.onSave(newHoliday);\r\n }\r\n function setDaySafe(newValue: string) {\r\n const asInt = parseInt(newValue, 10);\r\n if (asInt) {\r\n setDay(asInt);\r\n }\r\n else {\r\n setDay(0);\r\n }\r\n }\r\n return (\r\n
\r\n

{props.holiday ? \"Edit Holiday\" : \"New Holiday\"}

\r\n
\r\n
\r\n \r\n setName(e.target.value)} />\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n setDaySafe(e.target.value)}>\r\n
\r\n
\r\n addHoliday()}>{props.holiday ? \"Close\" : \"Add\"}\r\n {\r\n props.holiday && (\r\n props.onSave(undefined)}>Remove\r\n )\r\n }\r\n
\r\n\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default HolidayEditDialog;\r\n","import { CalendarModel } from \"./CalendarModel\";\r\n\r\nexport interface RecurringDate {\r\n month: number;\r\n dayOfMonth: number;\r\n}\r\n\r\nexport default interface FantasyDate extends RecurringDate {\r\n year: number;\r\n}\r\n\r\nexport interface Holiday {\r\n name: string;\r\n date: RecurringDate;\r\n}\r\n\r\nexport function datesAreEqual(date1: FantasyDate, date2: FantasyDate) {\r\n return (date1.dayOfMonth === date2.dayOfMonth) &&\r\n (date1.month === date2.month) &&\r\n (date1.year === date2.year);\r\n}\r\n\r\nexport function recurringDatesAreEqual(date1: RecurringDate, date2: RecurringDate) {\r\n return (date1.dayOfMonth === date2.dayOfMonth) &&\r\n (date1.month === date2.month);\r\n}\r\n\r\nexport function getDateString(date: RecurringDate, calendar: CalendarModel) {\r\n let monthName = \"\";\r\n const month = calendar.months.find(x => x.position === date.month);\r\n if (month) {\r\n monthName = month.name;\r\n }\r\n const fantasyDate = date as FantasyDate;\r\n if (typeof(fantasyDate.year) !== \"undefined\"){\r\n return `${monthName} ${getDayString(date.dayOfMonth)}, ${fantasyDate.year}`;\r\n }\r\n else{\r\n return `${monthName} ${getDayString(date.dayOfMonth)}`;\r\n }\r\n}\r\n\r\n\r\nexport function getDayString(dayNum: number) {\r\n if (dayNum === 1) {\r\n return \"1st\";\r\n }\r\n else if (dayNum === 2) {\r\n return \"2nd\";\r\n }\r\n else if (dayNum === 3) {\r\n return \"3rd\";\r\n }\r\n else {\r\n return dayNum + \"th\";\r\n }\r\n}\r\n\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport { Holiday, getDateString } from \"../Models/FantasyDate\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport Modal from \"react-modal\";\r\nimport HolidayEditDialog from \"./HolidayEditDialog\";\r\n\r\nconst MyComponent = observer((props: { holiday: Holiday }) => {\r\n const [modalOpen, setModalOpen] = useState(false);\r\n function updateHoliday(holiday?: Holiday){\r\n setModalOpen(false); \r\n if (holiday){\r\n const thisHoliday = EditCalendarState.calendar.holidays.filter(x => x === props.holiday);\r\n if (thisHoliday && thisHoliday.length){\r\n thisHoliday[0].name = holiday.name;\r\n thisHoliday[0].date = holiday.date;\r\n } \r\n }\r\n else{\r\n EditCalendarState.calendar.holidays = EditCalendarState.calendar.holidays.filter(x => x !== props.holiday);\r\n } \r\n }\r\n return (\r\n
\r\n
\r\n
{props.holiday.name}
\r\n
\r\n setModalOpen(true)} />\r\n
\r\n
\r\n
{getDateString(props.holiday.date, EditCalendarState.calendar)}
\r\n setModalOpen(false)}>\r\n
\r\n \r\n
\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default MyComponent;\r\n","export default interface Moon {\r\n name: string;\r\n daysToCycle: number;\r\n color: string;\r\n cycleOffset: number;\r\n}\r\n\r\nexport enum MoonPhase {\r\n None = \"None\",\r\n New = \"New\",\r\n Full = \"Full\",\r\n}\r\n\r\nexport interface MoonState extends Moon {\r\n phase: MoonPhase;\r\n}\r\n\r\nfunction getMoonStateInternal(moon: Moon, previousDays: number): MoonState {\r\n function getMoonFullPercentage(cycles: number) {\r\n let myPct = cycles % 1;\r\n if (myPct < .5) {\r\n myPct = 1 - myPct;\r\n }\r\n return myPct;\r\n }\r\n\r\n const cyclesSinceFirstFullMoon = previousDays / moon.daysToCycle;\r\n const moonFullPercentage = getMoonFullPercentage(cyclesSinceFirstFullMoon);\r\n const sliceSize = 1 / moon.daysToCycle;\r\n const fullThreshold = 1 - (sliceSize / 2);\r\n let phase = MoonPhase.None;\r\n\r\n if (previousDays < 0){\r\n phase = MoonPhase.None;\r\n }\r\n else if (previousDays === moon.cycleOffset){\r\n phase = MoonPhase.Full;\r\n }\r\n else if (moonFullPercentage > fullThreshold) {\r\n phase = MoonPhase.Full;\r\n }\r\n else if (Math.abs(.50001 - moonFullPercentage) <= sliceSize / 2) {\r\n phase = MoonPhase.New;\r\n }\r\n const newMoonModal = {\r\n ...moon,\r\n phase,\r\n };\r\n return newMoonModal;\r\n}\r\n\r\nexport function GetMoonState(moon: Moon, previousDays: number): MoonState {\r\n const state = getMoonStateInternal(moon, previousDays);\r\n if (state.phase === MoonPhase.New || state.phase === MoonPhase.Full){\r\n const prevDayState = getMoonStateInternal(moon, previousDays - 1);\r\n if (prevDayState.phase === state.phase){\r\n return {\r\n ...state,\r\n phase: MoonPhase.None,\r\n };\r\n }\r\n }\r\n return state;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport { Holiday } from \"../Models/FantasyDate\";\r\nimport Modal from \"react-modal\";\r\nimport HolidayEditDialog from \"./HolidayEditDialog\";\r\nimport HolidayLine from \"./HolidayLine\";\r\n\r\nconst HolidayView: React.FC = observer(() => {\r\n const [modalOpen, setModalOpen] = useState(false);\r\n function addHoliday(newHoliday?: Holiday) {\r\n if (newHoliday) {\r\n if (!EditCalendarState.calendar.holidays) {\r\n EditCalendarState.calendar.holidays = [];\r\n }\r\n EditCalendarState.calendar.holidays.push(newHoliday);\r\n setModalOpen(false);\r\n }\r\n }\r\n const holidays = [...EditCalendarState.calendar.holidays];\r\n holidays.sort((a, b) => {\r\n if (a.date.month !== b.date.month) {\r\n return a.date.month - b.date.month;\r\n }\r\n else {\r\n return a.date.dayOfMonth - b.date.dayOfMonth;\r\n }\r\n });\r\n return (\r\n
\r\n

Holidays

\r\n
\r\n {\r\n holidays ?\r\n holidays.map((x, i) => (\r\n \r\n )) :\r\n (
No Holidays Entered
)\r\n }\r\n
\r\n \r\n
\r\n setModalOpen(false)}>\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default HolidayView;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { SketchPicker } from \"react-color\";\r\n\r\nconst ColorPicker = (props: {color: string, onChange: (color: string) => void}) => {\r\n const node = useRef(null);\r\n const [showColorPicker, setShowColorPicker] = useState(false);\r\n function handleClick(e: any){\r\n if (node && node.current && e.target && !node.current.contains(e.target)) {\r\n setShowColorPicker(false);\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"mousedown\", handleClick); // return function to be called when unmounted\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClick);\r\n };\r\n }, []);\r\n return (\r\n
\r\n \r\n
setShowColorPicker(!showColorPicker)}>\r\n
 
\r\n
\r\n {\r\n showColorPicker && (\r\n
\r\n
props.onChange(e.hex)} />
\r\n
\r\n )\r\n }\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default ColorPicker;\r\n","import React, { useState } from \"react\";\r\nimport Moon from \"../../Models/Moon\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfoCircle } from \"@fortawesome/free-solid-svg-icons\";\r\nimport Tooltip from \"rc-tooltip\";\r\nimport ColorPicker from \"./ColorPicker\";\r\n\r\ninterface IMoonModal{\r\n moon?: Moon;\r\n onClose: () => void;\r\n updateMoon: (moon: Moon | undefined) => void;\r\n}\r\n\r\nconst MoonModal = (props: IMoonModal) => {\r\n const [name, setName] = useState(props.moon ? props.moon.name : \"Moon Name\");\r\n const [days, setDays] = useState(props.moon ? props.moon.daysToCycle.toString() : 29.531.toFixed(3));\r\n const [offSet, setOffset] = useState(props.moon ? props.moon.cycleOffset.toString() : 26 + \"\");\r\n const [color, setColor] = useState(props.moon ? props.moon.color : \"yellow\");\r\n const toolTip = (\r\n
\r\n
The number of days until the first full moon in Year 1 of your calendar.
\r\n
Please note that real, exact moon periods require knowing the orbit of
\r\n
the body, and the simplified model I use assumes a perfectly round orbit.
\r\n
If you tried to model the real world's moon phases you would find
\r\n
they're not quite exact over hundreds of years.
\r\n
\r\n );\r\n function getOffset(offsetText: string){\r\n let offset = parseInt(offsetText, 10);\r\n if (offset <= 1){\r\n offset = 1;\r\n }\r\n return offset;\r\n }\r\n function save(){\r\n const daysToCycle = parseFloat(days);\r\n const cycleOffset = getOffset(offSet);\r\n if (daysToCycle && cycleOffset >= 0){\r\n const newModel: Moon = {\r\n ...props.moon,\r\n name,\r\n daysToCycle,\r\n color,\r\n cycleOffset,\r\n };\r\n props.updateMoon(newModel);\r\n } \r\n props.onClose(); \r\n }\r\n function deleteMoon() {\r\n props.updateMoon(undefined);\r\n props.onClose();\r\n }\r\n return (\r\n
\r\n

{props.moon ? \"Edit Moon\" : \"New Moon\"}

\r\n
\r\n \r\n setName(e.target.value)} />\r\n
\r\n
\r\n \r\n setDays(e.target.value)} />\r\n
\r\n
\r\n \r\n \r\n setOffset(e.target.value)} />\r\n
\r\n \r\n
\r\n \r\n {\r\n props.moon && (\r\n \r\n )\r\n }\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default MoonModal;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport Moon from \"../../Models/Moon\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\r\nimport Modal from \"react-modal\";\r\nimport MoonModal from \"./MoonModal\";\r\n\r\nconst MoonEditLine = observer((props: { moon: Moon, updateMoon: (moon: Moon | undefined) => void }) => {\r\n const [modalOpen, setModalOpen] = useState(false);\r\n return (\r\n
\r\n
\r\n
{props.moon.name}
\r\n
 
\r\n setModalOpen(true)} />\r\n
\r\n
Cycle: {props.moon.daysToCycle} days
\r\n setModalOpen(false)}>\r\n setModalOpen(false)} moon={props.moon} updateMoon={props.updateMoon}/>\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default MoonEditLine;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport \"./Moons.css\";\r\nimport EditCalendarState from \"../../State/EditCalendarState\";\r\nimport Modal from \"react-modal\";\r\nimport MoonEditLine from \"./MoonEditItem\";\r\nimport Moon from \"../../Models/Moon\";\r\nimport MoonModal from \"./MoonModal\";\r\n\r\nconst MoonEdit: React.FC = observer(() => {\r\n const [modalOpen, setModalOpen] = useState(false);\r\n function addMoon(moon: Moon | undefined) {\r\n if (moon) {\r\n EditCalendarState.calendar.moons.push(moon);\r\n }\r\n }\r\n function updateMoon(index: number, moon: Moon | undefined): void {\r\n if (moon) {\r\n EditCalendarState.calendar.moons[index] = moon;\r\n }\r\n else {\r\n EditCalendarState.calendar.moons.splice(index, 1);\r\n }\r\n }\r\n return (\r\n
\r\n

Moons

\r\n
\r\n {\r\n EditCalendarState.calendar.moons.map((moon, i) => (\r\n updateMoon(i, m)} key={i} />\r\n ))\r\n }\r\n \r\n
\r\n setModalOpen(false)}>\r\n setModalOpen(false)} updateMoon={addMoon} />\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default MoonEdit;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../../State/EditCalendarState\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit, faCheckSquare } from \"@fortawesome/free-solid-svg-icons\";\r\nimport ErrorState from \"../../State/ErrorState\";\r\nimport Tooltip from \"rc-tooltip\";\r\n\r\nconst CalendarEditDay = observer((props: { dayIndex: number }) => {\r\n const [dayName, setDayName] = useState(EditCalendarState.calendar.daysOfWeek[props.dayIndex]);\r\n function updateDayOfTheWeek() {\r\n const duplicates = EditCalendarState.calendar.daysOfWeek.some((x, i) => x === dayName && i !== props.dayIndex);\r\n if (duplicates) {\r\n ErrorState.errorMessage = \"A day with that name already exists\";\r\n }\r\n else {\r\n if (dayName) {\r\n EditCalendarState.calendar.daysOfWeek[props.dayIndex] = dayName;\r\n EditCalendarState.dayEditPosition = undefined;\r\n }\r\n else {\r\n deleteDay();\r\n }\r\n }\r\n }\r\n function deleteDay() {\r\n const newDays = [...EditCalendarState.calendar.daysOfWeek];\r\n newDays.splice(props.dayIndex, 1);\r\n EditCalendarState.calendar.daysOfWeek = newDays;\r\n EditCalendarState.dayEditPosition = undefined;\r\n }\r\n \r\n const toolTip = (\r\n
\r\n
To delete a day, just remove all the text
\r\n
and then click the green checkbox
\r\n
\r\n );\r\n function onTooltipChange(visible: boolean){\r\n if (!visible){\r\n EditCalendarState.showDayTooltip = false;\r\n }\r\n }\r\n return (\r\n
\r\n {\r\n EditCalendarState.dayEditPosition !== props.dayIndex ?\r\n (
{dayName}
) :\r\n (\r\n \r\n setDayName(e.target.value)} />\r\n \r\n )\r\n }\r\n {\r\n EditCalendarState.dayEditPosition !== props.dayIndex ?\r\n (\r\n
\r\n EditCalendarState.dayEditPosition = props.dayIndex} />\r\n
\r\n ) :\r\n (\r\n
\r\n updateDayOfTheWeek()} />\r\n
\r\n )\r\n }\r\n
\r\n );\r\n});\r\n\r\nexport default CalendarEditDay;\r\n","import React, { CSSProperties } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../../State/EditCalendarState\";\r\nimport CalendarEditDay from \"./CalendarDayItem\";\r\nimport \"./CalendarEditDay.css\";\r\nimport {\r\n DragDropContext,\r\n Droppable,\r\n Draggable,\r\n DropResult,\r\n} from \"react-beautiful-dnd\";\r\n\r\nconst CalendarEditDaysOfWeek = observer(() => {\r\n function AddDay() {\r\n if (!EditCalendarState.calendar.daysOfWeek.some(x => x === \"\")) {\r\n EditCalendarState.calendar.daysOfWeek.push(\"\");\r\n EditCalendarState.dayEditPosition = EditCalendarState.calendar.daysOfWeek.length - 1;\r\n }\r\n }\r\n const reorder = (list: string[], startIndex: number, endIndex: number): string[] => {\r\n const result = Array.from(list);\r\n const [removed] = result.splice(startIndex, 1);\r\n result.splice(endIndex, 0, removed);\r\n return result;\r\n };\r\n\r\n const grid = 3;\r\n // tslint:disable-next-line:max-line-length\r\n function getItemStyle(isDragging: boolean, draggableStyle: CSSProperties | undefined): CSSProperties {\r\n const myStyle: CSSProperties = {\r\n // some basic styles to make the items look a bit nicer\r\n userSelect: \"none\",\r\n margin: `0 0 ${grid}px 0`,\r\n\r\n // change background colour if dragging\r\n background: isDragging ? \"\" : \"\",\r\n border: isDragging ? \"1px solid lightgray\" : \"\",\r\n\r\n // styles we need to apply on draggables\r\n ...draggableStyle,\r\n };\r\n return myStyle;\r\n }\r\n\r\n\r\n function onDragEnd(result: DropResult) {\r\n // dropped outside the list\r\n if (!result.destination) {\r\n return;\r\n }\r\n EditCalendarState.dayEditPosition = undefined;\r\n\r\n const myItems: string[] = reorder(\r\n EditCalendarState.calendar.daysOfWeek,\r\n result.source.index,\r\n result.destination.index,\r\n );\r\n EditCalendarState.calendar.daysOfWeek = myItems;\r\n }\r\n const myDays = [...EditCalendarState.calendar.daysOfWeek];\r\n return (\r\n
\r\n
\r\n

Days of the Week

\r\n
\r\n
\r\n onDragEnd(e)}\r\n onDragStart={() => EditCalendarState.dayEditPosition = undefined}>\r\n \r\n {(provided, snapshot) => (\r\n \r\n {myDays.map((item: string, index: number) => (\r\n \r\n {(dProvided, dSnapshot) => (\r\n \r\n \r\n
\r\n )}\r\n \r\n ))}\r\n {provided.placeholder}\r\n
\r\n )}\r\n \r\n \r\n
\r\n
\r\n AddDay()}\r\n className=\"blue-button\">Add Day\r\n
\r\n EditCalendarState.calendar.resetWeekAtMonthStart = !EditCalendarState.calendar.resetWeekAtMonthStart}\r\n checked={EditCalendarState.calendar.resetWeekAtMonthStart} />\r\n \r\n
\r\n \r\n \r\n );\r\n});\r\n\r\nexport default CalendarEditDaysOfWeek;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit, faInfoCircle } from \"@fortawesome/free-solid-svg-icons\";\r\nimport Tooltip from \"rc-tooltip\";\r\n\r\nconst LeapYearEdit: React.FC = observer(() => {\r\n const rules = EditCalendarState.calendar.leapYearRules;\r\n const [editMode, setEditMode] = useState(false);\r\n const [interval, setInterval] = useState(\"\");\r\n const [month, setMonth] = useState(rules.month);\r\n const [unless, setUnless] = useState(\"\");\r\n const toolTip = (\r\n
\r\n
If the year is divisible by the first number, then it is not a leap year
\r\n
But it will be a leap year if it is divisible by the second number,
\r\n
but again not a leap year if divisible by the third, and so on.
\r\n
These numbers should be separated by a dash
\r\n
For the real word, the leap year rules would be \"100-400\"
\r\n
Because we have leap years every 4 years, unless that year is divisible by 100
\r\n
but always if it is divisible by 400.
\r\n
\r\n );\r\n function getLeapYearMonthName(){\r\n const monthModel = EditCalendarState.calendar.months.find(x => x.position === rules.month);\r\n if (monthModel){\r\n return monthModel.name;\r\n }\r\n return \"N/A\";\r\n }\r\n function enableEdit(){\r\n setEditMode(true);\r\n setInterval(rules.interval.toString());\r\n setUnless(rules.unlessDivisions.join(\"-\"));\r\n setMonth(rules.month);\r\n }\r\n function endEdit(){\r\n function getUnlessYears(){\r\n const newUnless = unless.split(\"-\");\r\n if (newUnless && newUnless.length > 0){\r\n const newUnlessInt = newUnless.map(x => parseInt(x, 10));\r\n if (!newUnlessInt.some(x => !x)){\r\n return newUnlessInt;\r\n } \r\n }\r\n return undefined;\r\n }\r\n const newInterval = parseInt(interval, 10);\r\n if (newInterval){\r\n EditCalendarState.calendar.leapYearRules.interval = newInterval;\r\n }\r\n else{\r\n EditCalendarState.calendar.leapYearRules.interval = 0;\r\n }\r\n const unlessYears = getUnlessYears();\r\n if (unlessYears){\r\n EditCalendarState.calendar.leapYearRules.unlessDivisions = unlessYears;\r\n }\r\n else{\r\n EditCalendarState.calendar.leapYearRules.unlessDivisions = [];\r\n }\r\n if (month){\r\n EditCalendarState.calendar.leapYearRules.month = month;\r\n }\r\n setEditMode(false);\r\n }\r\n return (\r\n
\r\n

\r\n
\r\n
Leap Years
\r\n
enableEdit()} />
\r\n
\r\n

\r\n
\r\n {\r\n !editMode && (\r\n
\r\n
{`A day is added to ${getLeapYearMonthName()} every ${rules.interval} years`}
\r\n
    \r\n {\r\n rules.unlessDivisions.map((x, i) =>\r\n (
  • {`${(i % 2 === 0 ? \"But not if\" : \"But is if\")} the year is divisible by ${x}`}
  • ))\r\n }\r\n
\r\n
\r\n )\r\n }\r\n {\r\n editMode && (\r\n
\r\n
\r\n \r\n setInterval(e.target.value)} />\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n setUnless(e.target.value)} />\r\n
\r\n \r\n
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default LeapYearEdit;\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport Tooltip from \"rc-tooltip\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfoCircle } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { ViewType } from \"../Models/CalendarViewType\";\r\n\r\nconst EditMisc: React.FC = observer(() => {\r\n // const [editMode, setEditMode] = useState(false);\r\n const toolTip = (\r\n
\r\n
The number of days to offset the first day of Year 1.
\r\n
For instance, in the real world, the Gregorian calendar began
\r\n
on a Monday instead of a Sunday, so you would enter a 1 here.
\r\n
\r\n );\r\n function updateOffset(newVal: string) {\r\n const newOffset = parseInt(newVal, 10);\r\n if (newOffset || newOffset === 0) {\r\n EditCalendarState.calendar.offSetDays = newOffset;\r\n }\r\n }\r\n function updateViewType(newType: string){\r\n EditCalendarState.calendar.defaultView = newType as ViewType;\r\n }\r\n return (\r\n
\r\n

Miscellaneous

\r\n
\r\n
\r\n \r\n updateOffset(e.target.value)} />\r\n
\r\n
\r\n \r\n updateViewType(e.target.value)}>\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default EditMisc;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport FantasyDate from \"../Models/FantasyDate\";\r\nimport { CalendarModel } from \"../Models/CalendarModel\";\r\n\r\nexport interface IFantasyDateSelector {\r\n date: FantasyDate;\r\n calendarModel: CalendarModel;\r\n updateDate: (date: FantasyDate) => void;\r\n\r\n}\r\n\r\nconst FantasyDateSelector = (props: IFantasyDateSelector) => {\r\n const [monthValue, setMonthValue] = useState(props.date.month);\r\n const [dayValue, setDayValue] = useState(props.date.dayOfMonth);\r\n const [yearValue, setYearValue] = useState(props.date.year);\r\n\r\n useEffect(() => {\r\n setMonthValue(props.date.month);\r\n setDayValue(props.date.dayOfMonth);\r\n setYearValue(props.date.year);\r\n }, [props.date.month, props.date.dayOfMonth, props.date.year]);\r\n\r\n function updateMonth(newValue: string) {\r\n const updatePosition = parseInt(newValue, 10);\r\n if (updatePosition && updatePosition > 0) {\r\n setMonthValue(updatePosition);\r\n props.updateDate({\r\n month: updatePosition,\r\n dayOfMonth: dayValue,\r\n year: yearValue,\r\n });\r\n }\r\n }\r\n function updateDay(newValue: string) {\r\n const updatedDay = parseInt(newValue, 10);\r\n if (updatedDay && updatedDay > 0) {\r\n setDayValue(updatedDay);\r\n props.updateDate({\r\n month: monthValue,\r\n dayOfMonth: updatedDay,\r\n year: yearValue,\r\n });\r\n }\r\n else {\r\n setDayValue(0);\r\n props.updateDate({\r\n month: monthValue,\r\n dayOfMonth: 0,\r\n year: yearValue,\r\n });\r\n }\r\n }\r\n function updateYear(newValue: string) {\r\n const updatedYear = parseInt(newValue, 10);\r\n if (updatedYear && updatedYear > 0) {\r\n setYearValue(updatedYear);\r\n props.updateDate({\r\n month: monthValue,\r\n dayOfMonth: dayValue,\r\n year: updatedYear,\r\n });\r\n }\r\n }\r\n function getDayOptions() {\r\n const month = props.calendarModel.months.find(x => x.position === props.date.month);\r\n if (!month) {\r\n return ;\r\n }\r\n const dayArray = Array.from(Array(month.days).keys()).map(x => x + 1);\r\n return dayArray.map(x => ());\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n updateDay(e.target.value)}>\r\n {\r\n getDayOptions()\r\n }\r\n \r\n
\r\n
\r\n \r\n updateYear(e.target.value)} />\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default FantasyDateSelector;\r\n","import React from \"react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faCog } from \"@fortawesome/free-solid-svg-icons\";\r\nimport \"./LoadingSpinner.css\";\r\n\r\nconst LoadingSpinner = () => {\r\n return (\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default LoadingSpinner;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport EditCalendarState from \"../State/EditCalendarState\";\r\nimport { useParams, Redirect } from \"react-router-dom\";\r\nimport MonthList from \"./MonthList\";\r\nimport \"./CalendarEditViewStyle.css\";\r\nimport CalendarNumDays from \"./CalendarNumDaysTooltip\";\r\nimport { SaveCalendar } from \"../DataClients/CalendarEventDataClient\";\r\nimport DangerZone from \"./DangerZone\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport HolidayView from \"./HolidayEdit\";\r\nimport MoonEdit from \"./Moons/MoonEdit\";\r\nimport CalendarEditDaysOfWeek from \"./Days/CalendarEditDays\";\r\nimport LeapYearEdit from \"./LeapYearEdit\";\r\nimport EditMisc from \"./CalendarEditMisc\";\r\nimport FantasyDate from \"../Models/FantasyDate\";\r\nimport FantasyDateSelector from \"../DayDetail/FantasyDateSelector\";\r\nimport LoadingSpinner from \"../LoadingSpinner\";\r\n\r\nconst CalendarEditView: React.FC = observer(() => {\r\n const { calendarId } = useParams<{calendarId: string}>();\r\n const [redirect, setRedirect] = useState(false);\r\n if (redirect) {\r\n return ();\r\n }\r\n if (calendarId && EditCalendarState.calendar.id !== calendarId) {\r\n EditCalendarState.loadCalendar(calendarId);\r\n }\r\n function setCalendarName(newValue: string) {\r\n EditCalendarState.calendar.name = newValue;\r\n }\r\n function setCurrentDate(newValue: FantasyDate) {\r\n if (newValue) {\r\n EditCalendarState.calendar.currentDate = newValue;\r\n }\r\n }\r\n async function save() {\r\n await SaveCalendar(EditCalendarState.calendar);\r\n setRedirect(true);\r\n CalendarState.reset();\r\n }\r\n const totalDaysInYear = EditCalendarState.calendar.months.reduce((total, currMonth) => {\r\n return total + currMonth.days;\r\n }, 0);\r\n if (EditCalendarState.calendarLoadState === \"Error\"){\r\n return
There was an error loading the calendar
\r\n }\r\n if (EditCalendarState.calendarLoadState === \"Loading\"){\r\n return
\r\n }\r\n if (EditCalendarState.calendarLoadState === \"Loaded\"){\r\n return (\r\n
\r\n
\r\n \r\n
\r\n setCalendarName(e.target.value)} />\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n return
\r\n
Somethign went wrong. You can report bugs here
\r\n
\r\n \r\n});\r\n\r\nexport default CalendarEditView;\r\n","import React from \"react\";\r\nimport { GetToken } from \"../DataClients/AuthenticationDataClient\";\r\nimport UserState from \"../State/UserState\";\r\nimport { observer } from \"mobx-react\";\r\nimport { Redirect } from \"react-router-dom\";\r\n\r\nconst Authenticate = observer(() => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const code = urlParams.get(\"code\");\r\n if (UserState.userModel){\r\n return ;\r\n }\r\n if (code) {\r\n auth();\r\n }\r\n async function auth() {\r\n if (code) {\r\n const token = await GetToken(code);\r\n await UserState.authenticateUser(token);\r\n }\r\n }\r\n return (\r\n
\r\n Please wait while we log you in...\r\n
\r\n );\r\n});\r\n\r\nexport default Authenticate;\r\n","export function chunks(arr: T[], n: number): T[][] {\r\n\r\n const start: T[][] = [];\r\n\r\n const result = arr.reduce((resultArray, item, index) => {\r\n const chunkIndex = Math.floor(index / n);\r\n\r\n if (!resultArray[chunkIndex]) {\r\n resultArray[chunkIndex] = []; // start a new chunk\r\n }\r\n\r\n resultArray[chunkIndex].push(item);\r\n\r\n return resultArray;\r\n }, start);\r\n\r\n return result;\r\n}\r\n\r\nexport function clone(object: T): T {\r\n const json = JSON.stringify(object);\r\n const clonedOjb = JSON.parse(json) as T;\r\n return clonedOjb;\r\n}\r\n\r\nexport function getCalendarNumber(num: number): string {\r\n if (num <= 7){\r\n return \"seven\";\r\n }\r\n if (num === 8){\r\n return \"eight\";\r\n }\r\n if (num === 9){\r\n return \"nine\";\r\n }\r\n if (num === 10){\r\n return \"ten\";\r\n }\r\n return \"seven\";\r\n}\r\n\r\nexport function getInternetExplorerVersion()\r\n{\r\n let rv = -1;\r\n if (navigator.appName === \"Microsoft Internet Explorer\")\r\n {\r\n const ua = navigator.userAgent;\r\n const re = new RegExp(\"MSIE ([0-9]{1,}[\\\\.0-9]{0,})\");\r\n if (re.exec(ua) != null){\r\n rv = parseFloat( RegExp.$1 );\r\n }\r\n \r\n }\r\n else if (navigator.appName === \"Netscape\")\r\n {\r\n const ua = navigator.userAgent;\r\n const re = new RegExp(\"Trident/.*rv:([0-9]{1,}[\\\\.0-9]{0,})\");\r\n if (re.exec(ua) != null)\r\n {\r\n rv = parseFloat( RegExp.$1 );\r\n }\r\n }\r\n return rv;\r\n}\r\n","import React from \"react\";\r\nimport FantasyDate, { datesAreEqual, recurringDatesAreEqual } from \"../Models/FantasyDate\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { MoonPhase, MoonState } from \"../Models/Moon\";\r\nimport { getCalendarNumber } from \"../Utility\";\r\n\r\nconst CalendarDay = observer((props: { date: FantasyDate, moonStates: MoonState[]}) => {\r\n const events = CalendarState.events.filter(x => datesAreEqual(x.fantasyDate, props.date));\r\n function selectDay() {\r\n if (events.length === 0) {\r\n CalendarState.addNewEvent(props.date);\r\n }\r\n else {\r\n CalendarState.selectedDay = props.date;\r\n }\r\n }\r\n function getHoliday() {\r\n if (CalendarState.calendar.holidays) {\r\n return CalendarState.calendar.holidays.find(x => recurringDatesAreEqual(x.date, props.date));\r\n }\r\n }\r\n const holiday = getHoliday();\r\n const fullMoons = props.date.year > 0 ? props.moonStates.filter(x => x.phase === MoonPhase.Full) : [];\r\n const newMoons = props.date.year > 0 ? props.moonStates.filter(x => x.phase === MoonPhase.New) : [];\r\n function getClass(){\r\n let myClass = \"day day-width \" + getCalendarNumber(CalendarState.calendar.daysOfWeek.length);\r\n if (datesAreEqual(CalendarState.calendar.currentDate, props.date)){\r\n myClass += \" current-day\";\r\n }\r\n if (events.length){\r\n myClass += \" has-events\";\r\n }\r\n return myClass;\r\n }\r\n return (\r\n
selectDay()}>\r\n
{props.date.dayOfMonth}\r\n {\r\n fullMoons.map((moon, i) => (\r\n
\r\n
\r\n ))\r\n }\r\n {\r\n newMoons.map((moon, i) => (\r\n
\r\n
\r\n ))\r\n }\r\n
\r\n
\r\n {\r\n datesAreEqual(CalendarState.calendar.currentDate, props.date) && (\r\n
Current Date
\r\n )\r\n }\r\n {\r\n holiday &&
{holiday.name}
\r\n }\r\n {\r\n events.length > 1 && (
{`${events.length} Events`}
)\r\n }\r\n {events.map(x => (
{x.name}
))}\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default CalendarDay;\r\n\r\n","import React from \"react\";\r\nimport CalendarDay from \"./CalendarDay\";\r\nimport { chunks, getCalendarNumber } from \"../Utility\";\r\nimport FantasyDate from \"../Models/FantasyDate\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { CheckIfLeapYear } from \"../Models/CalendarModel\";\r\nimport { GetOffSetInfo } from \"../Models/Month\";\r\nimport { MoonState, GetMoonState } from \"../Models/Moon\";\r\n\r\n\r\nconst MonthView = observer((props: { monthNumber: number, year: number }) => {\r\n const hasEvents = CalendarState.events.length === 0 || CalendarState.events\r\n .some(x => x.fantasyDate.year === props.year && x.fantasyDate.month === props.monthNumber);\r\n const isLeapYear = CheckIfLeapYear(props.year, CalendarState.calendar);\r\n\r\n const { offSetDays, previousDays } = GetOffSetInfo(CalendarState.calendar, props.monthNumber, props.year);\r\n // console.log(\"Offset\", offSetDays, props.year, props.monthNumber);\r\n const month = CalendarState.calendar.months.find(x => x.position === props.monthNumber);\r\n if (!month) {\r\n return ();\r\n }\r\n const isLeapMonth = isLeapYear && CalendarState.calendar.leapYearRules.month === props.monthNumber;\r\n const numberOfDayBoxes = month.days + offSetDays + (isLeapMonth ? 1 : 0);\r\n const days = Array.from({ length: numberOfDayBoxes }, (v, i) => i + 1);\r\n const weeks = chunks(days, CalendarState.calendar.daysOfWeek.length);\r\n\r\n function getMoonStates(date: FantasyDate): MoonState[] {\r\n const states = CalendarState.calendar.moons.map(moon => {\r\n const previousToDate = previousDays + (date.dayOfMonth - 1) - moon.cycleOffset;\r\n const state = GetMoonState(moon, previousToDate);\r\n return state;\r\n });\r\n return states;\r\n }\r\n return (\r\n
\r\n
{month.name + (hasEvents ? \" \" : \" (no events) \") + props.year}
\r\n
\r\n {\r\n weeks.map((week, weekIndex) => (\r\n
\r\n {week.map((x, i) => {\r\n if (weekIndex === 0 && i < offSetDays) {\r\n return (
);\r\n }\r\n const fantasyDate: FantasyDate = {\r\n year: props.year,\r\n dayOfMonth: x - offSetDays,\r\n month: props.monthNumber,\r\n };\r\n return ;\r\n })}\r\n
\r\n ))\r\n }\r\n
\r\n \r\n );\r\n});\r\n\r\nexport default MonthView;\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport \"./DayDetail.css\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\r\nimport CalendarEvent from \"../Models/CalendarEvent\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { format } from \"date-fns\";\r\n\r\nconst EventDetail = observer((props: { event: CalendarEvent }) => {\r\n function startEdit() {\r\n CalendarState.calendarEditEvent = {\r\n calendarEvent: props.event,\r\n makeCurrentDate: false\r\n }\r\n }\r\n let realDate = \"Error\";\r\n try {\r\n realDate = props.event.realDate ? format(props.event.realDate, \"MMM do yyyy\") : \"Unknown Real Date\";\r\n }\r\n catch (e) {\r\n console.log(\"Real Date error\", e, realDate);\r\n }\r\n\r\n return (\r\n
\r\n
\r\n

\r\n {props.event.name} \r\n {\r\n CalendarState.canEditCalendar && (\r\n startEdit()} />\r\n )\r\n }\r\n

\r\n
{realDate}
\r\n
\r\n
\r\n {\r\n props.event.description.split(\"\\n\").map((x, i) => (
{x}
))\r\n }\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default EventDetail;\r\n\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport FantasyDate, { datesAreEqual } from \"../Models/FantasyDate\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport \"./DayDetail.css\";\r\nimport EventDetail from \"./EventDetail\";\r\n\r\n\r\nconst DayDetailView = observer((props: { date: FantasyDate }) => {\r\n let monthName = \"\";\r\n const month = CalendarState.calendar.months.find(x => x.position === props.date.month);\r\n if (month) {\r\n monthName = month.name;\r\n }\r\n const events = CalendarState.events.filter(x => datesAreEqual(props.date, x.fantasyDate));\r\n return (\r\n
\r\n

{`${monthName} ${getDayString(props.date.dayOfMonth)}, ${props.date.year}`}

\r\n
\r\n {\r\n events.map(x => (\r\n
\r\n \r\n
\r\n ))\r\n }\r\n
\r\n {\r\n \r\n }\r\n
\r\n );\r\n});\r\n\r\nfunction getDayString(dayNum: number) {\r\n if (dayNum === 1) {\r\n return \"1st\";\r\n }\r\n else if (dayNum === 2) {\r\n return \"2nd\";\r\n }\r\n else if (dayNum === 3) {\r\n return \"3rd\";\r\n }\r\n else {\r\n return dayNum + \"th\";\r\n }\r\n}\r\n\r\nexport default DayDetailView;\r\n\r\n","import React, { useState } from \"react\";\r\n\r\nconst ShareLink = (props: { id: string, link: string, isEdit: boolean }) => {\r\n const [copyButtonText, setCopyButtonText] = useState(\"Copy\");\r\n function copyToClipBoard() {\r\n const shareLink = document.getElementById(props.id) as HTMLInputElement;\r\n console.log(\"ShareLink\", shareLink);\r\n shareLink.focus();\r\n shareLink.select();\r\n shareLink.setSelectionRange(0, 99999);\r\n const success = document.execCommand(\"copy\");\r\n if (success) {\r\n setCopyButtonText(\"Copied!\");\r\n }\r\n }\r\n return (\r\n
\r\n {\r\n props.isEdit ?\r\n (\r\n
\r\n Collaboration Link (anyone with this link can EDIT your calendar)\r\n
\r\n ) :\r\n (\r\n
\r\n View Link (anyone with this link can view your calendar)\r\n
\r\n )\r\n }\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default ShareLink;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faShareAltSquare } from \"@fortawesome/free-solid-svg-icons\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport ShareLink from \"./ShareLink\";\r\n\r\nconst ShareDialog = observer((props: { id: string }) => {\r\n const viewLink = `${window.location.protocol}//${window.location.host}/defaultView/${CalendarState.calendar.id}`;\r\n const editLink = viewLink + \"?joinId=\" + CalendarState.calendar.shareId;\r\n const [showOptions, setShowOptions] = useState(false);\r\n let timeout: number | undefined;\r\n function onMouseLeave(){\r\n timeout = window.setTimeout(() => {\r\n setShowOptions(false);\r\n timeout = undefined;\r\n }, 500);\r\n }\r\n function onMouseEnter(){\r\n if (timeout){\r\n window.clearTimeout(timeout);\r\n }\r\n }\r\n return (\r\n
onMouseLeave()} onMouseEnter={() => onMouseEnter()}>\r\n
setShowOptions(!showOptions)}>\r\n
Share
\r\n
\r\n
\r\n
\r\n \r\n {\r\n CalendarState.canEditCalendar && (\r\n \r\n )\r\n }\r\n
\r\n
\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default ShareDialog;\r\n","import React, { CSSProperties, useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faAngleLeft, faAngleRight } from \"@fortawesome/free-solid-svg-icons\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { Link, Redirect } from \"react-router-dom\";\r\nimport \"./CalendarToolBar.css\";\r\nimport ShareDialog from \"./ShareDialog\";\r\nimport { ViewType } from \"../Models/CalendarViewType\";\r\n\r\nconst CalendarToolbar = observer((props: { year: number, viewType: ViewType }) => {\r\n const [viewType, setViewType] = useState(props.viewType);\r\n if (viewType !== props.viewType){\r\n if (viewType === ViewType.Calendar){\r\n return ;\r\n }\r\n if (viewType === ViewType.Timeline){\r\n return ;\r\n }\r\n if (viewType === ViewType.Condensed){\r\n return ;\r\n }\r\n }\r\n function updateViewType(newValue: string) {\r\n const newViewType = newValue as ViewType;\r\n setViewType(newViewType);\r\n }\r\n const myDisplay: CSSProperties = { display: props.viewType === ViewType.Calendar ? \"\" : \"none\" };\r\n return (\r\n
\r\n
\r\n
\r\n updateViewType(e.target.value)}>\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n {\r\n CalendarState.canEditCalendar ? (\r\n
\r\n \r\n {CalendarState.calendar.name}\r\n \r\n
\r\n ) :\r\n
\r\n {CalendarState.calendar.name}\r\n
\r\n }\r\n\r\n\r\n
\r\n
{props.year}
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default CalendarToolbar;\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../../State/CalendarState\";\r\nimport \"./timeline.css\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faEdit } from \"@fortawesome/free-solid-svg-icons\";\r\nimport FantasyDate from \"../../Models/FantasyDate\";\r\nimport CalendarEvent from \"../../Models/CalendarEvent\";\r\nimport { format } from \"date-fns\";\r\n\r\nconst TimeLineEvent = observer((props: { event: CalendarEvent }) => {\r\n const [showDesc, setShowDesc] = useState(false);\r\n function getDateString(date: FantasyDate) {\r\n const dayNum = getDayString(date.dayOfMonth);\r\n const month = CalendarState.calendar.months.find(x => x.position === date.month);\r\n if (month) {\r\n return `${dayNum} of ${month.name}, ${date.year}`;\r\n }\r\n return \"Date Unknown\";\r\n }\r\n function editEvent(e: React.MouseEvent){\r\n e.stopPropagation();\r\n e.preventDefault();\r\n CalendarState.calendarEditEvent = {\r\n calendarEvent: props.event,\r\n makeCurrentDate: false\r\n };\r\n }\r\n return (\r\n
setShowDesc(!showDesc)}>\r\n
\r\n
\r\n

{props.event.name}

\r\n
editEvent(e)}>\r\n {\r\n CalendarState.canEditCalendar && (\r\n \r\n )\r\n }\r\n
\r\n
\r\n
\r\n
{getDateString(props.event.fantasyDate)}
\r\n {\r\n showDesc && (
{props.event.realDate ? format(props.event.realDate, \"MMM do yyyy\") : \"\"}
)\r\n }\r\n
\r\n
\r\n\r\n {\r\n showDesc && (\r\n
\r\n
\r\n {props.event.description.split(\"\\n\").map((x, i) => (\r\n
{x}
\r\n ))}\r\n
\r\n
\r\n )\r\n }\r\n
\r\n );\r\n});\r\n\r\nfunction getDayString(dayNum: number) {\r\n if (dayNum === 1) {\r\n return \"1st\";\r\n }\r\n else if (dayNum === 2) {\r\n return \"2nd\";\r\n }\r\n else if (dayNum === 3) {\r\n return \"3rd\";\r\n }\r\n else {\r\n return dayNum + \"th\";\r\n }\r\n}\r\n\r\nexport default TimeLineEvent;\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../../State/CalendarState\";\r\nimport \"./timeline.css\";\r\nimport TimeLineEvent from \"./TimeLineEvent\";\r\nimport { GetDaysBetweenDates } from \"../../Models/CalendarModel\";\r\nimport ErrorState from \"../../State/ErrorState\";\r\nimport UserState from \"../../State/UserState\";\r\nimport { sortEvents } from \"../../Models/CalendarEvent\";\r\n\r\nconst TimeLineView: React.FC = observer(() => {\r\n const events = sortEvents(CalendarState.events);\r\n function addNewEvent() {\r\n if (!UserState.userModel){\r\n UserState.loginModalOpen = true;\r\n }\r\n else if (!CalendarState.canEditCalendar){\r\n ErrorState.errorMessage = \"You do not have permission to edit this calendar. \" + \r\n \"Ask someone to send you a \\\"Share\\\" link.\";\r\n }\r\n else{\r\n CalendarState.addNewEvent(CalendarState.calendar.currentDate);\r\n }\r\n }\r\n const maxSpacing = 200;\r\n function getTimeLineEventSpacing(daysBetween: number) {\r\n const spacing = daysBetween * 5;\r\n if (spacing > maxSpacing) {\r\n return maxSpacing;\r\n }\r\n return spacing;\r\n }\r\n return (\r\n
\r\n {\r\n events.map((x, i) => {\r\n let daysBetween = 0;\r\n if (i < events.length - 1) {\r\n const nextEvent = events[i + 1];\r\n daysBetween = GetDaysBetweenDates(CalendarState.calendar, x.fantasyDate, nextEvent.fantasyDate);\r\n }\r\n const spacing = getTimeLineEventSpacing(daysBetween);\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n })\r\n }\r\n {\r\n !events.length && (\r\n You haven't added any events yet!)\r\n }\r\n
\r\n \r\n
\r\n \r\n );\r\n});\r\n\r\n\r\nexport default TimeLineView;\r\n","import FantasyDate from \"./FantasyDate\";\r\n\r\nexport default interface CalendarEvent {\r\n id: string;\r\n calendarId: string;\r\n name: string;\r\n description: string;\r\n realDate: Date | undefined;\r\n fantasyDate: FantasyDate;\r\n hidden: boolean;\r\n createUser: string;\r\n}\r\n\r\nexport function sortEvents(events: CalendarEvent[]): CalendarEvent[]{\r\n const newArray = Array.from(events);\r\n newArray.sort((a, b) => {\r\n if (a.fantasyDate.year !== b.fantasyDate.year) {\r\n return a.fantasyDate.year - b.fantasyDate.year;\r\n }\r\n else if (a.fantasyDate.month !== b.fantasyDate.month) {\r\n return a.fantasyDate.month - b.fantasyDate.month;\r\n }\r\n else {\r\n return a.fantasyDate.dayOfMonth - b.fantasyDate.dayOfMonth;\r\n }\r\n });\r\n return newArray;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport CalendarEvent from \"../Models/CalendarEvent\";\r\nimport { format, parseISO } from \"date-fns\";\r\nimport { DeleteEvent } from \"../DataClients/CalendarEventDataClient\";\r\nimport UserState from \"../State/UserState\";\r\nimport FantasyDateSelector from \"./FantasyDateSelector\";\r\nimport CalendarEventEditModel from \"../Models/CalendarEventEditModel\";\r\n\r\nconst EditEvent: React.FC = observer(() => {\r\n if (!CalendarState.calendarEditEvent) {\r\n return
No Event to edit
;\r\n }\r\n const [name, setName] = useState(CalendarState.calendarEditEvent.calendarEvent.name);\r\n const [description, setDescription] = useState(CalendarState.calendarEditEvent.calendarEvent.description);\r\n const [realDate, setRealDate] = useState(CalendarState.calendarEditEvent.calendarEvent.realDate);\r\n const [fantasyDate, setFantasyDate] = useState(CalendarState.calendarEditEvent.calendarEvent.fantasyDate);\r\n const [hidden, setHidden] = useState(CalendarState.calendarEditEvent.calendarEvent.hidden);\r\n const [makeCurrentDate, setMakeCurrentDate] = useState(false);\r\n async function saveEvent() {\r\n if (CalendarState.calendarEditEvent) {\r\n const updateEvent: CalendarEvent = {\r\n ...CalendarState.calendarEditEvent.calendarEvent,\r\n name,\r\n description,\r\n realDate,\r\n fantasyDate,\r\n hidden,\r\n };\r\n const updateModel: CalendarEventEditModel = {\r\n calendarEvent: updateEvent,\r\n makeCurrentDate\r\n }\r\n await CalendarState.updateEvent(updateModel);\r\n CalendarState.calendarEditEvent = undefined;\r\n if (CalendarState.selectedDay && CalendarState.selectedDay !== fantasyDate) {\r\n CalendarState.selectedDay = fantasyDate;\r\n }\r\n if (makeCurrentDate){\r\n CalendarState.calendar.currentDate = fantasyDate;\r\n }\r\n }\r\n }\r\n async function deleteEvent() {\r\n if (CalendarState.calendarEditEvent) {\r\n const myEvent = CalendarState.calendarEditEvent;\r\n const myIndex = CalendarState.events.findIndex(x => x.id === myEvent.calendarEvent.id);\r\n CalendarState.events.splice(myIndex, 1);\r\n CalendarState.calendarEditEvent = undefined;\r\n CalendarState.selectedDay = undefined;\r\n try {\r\n await DeleteEvent(myEvent.calendarEvent.id);\r\n }\r\n catch (e) {\r\n console.error(\"Something went wrong when trying to delete an event\", e);\r\n CalendarState.events.push(myEvent.calendarEvent);\r\n }\r\n }\r\n }\r\n async function textAreaKeyDown(e: React.KeyboardEvent) {\r\n if (e.keyCode === 13 && e.ctrlKey) {\r\n saveEvent();\r\n }\r\n }\r\n function onRealDateChange(value: string) {\r\n if (value) {\r\n const date = parseISO(value);\r\n setRealDate(date);\r\n }\r\n else {\r\n setRealDate(undefined);\r\n }\r\n }\r\n function getRealDateValue() {\r\n if (realDate) {\r\n return format(realDate, \"yyyy-MM-dd\");\r\n }\r\n return \"\";\r\n }\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n setName(e.target.value)} />\r\n
\r\n textAreaKeyDown(e)}\r\n onChange={(e) => setDescription(e.target.value)} />\r\n
\r\n
Real World Date: 
\r\n onRealDateChange(e.target.value)} />\r\n
\r\n {\r\n (!CalendarState.calendarEditEvent.calendarEvent.createUser ||\r\n (UserState.userModel &&\r\n CalendarState.calendarEditEvent.calendarEvent.createUser === UserState.userModel.id)) &&\r\n (
\r\n
setHidden(!hidden)} />
\r\n \r\n
setMakeCurrentDate(!makeCurrentDate)} />
\r\n \r\n
)\r\n }\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n});\r\n\r\n\r\nexport default EditEvent;\r\n","const lowMap = new Map();\r\nlowMap.set(1, \"zero\");\r\nlowMap.set(1, \"one\");\r\nlowMap.set(2, \"two\");\r\nlowMap.set(3, \"three\");\r\nlowMap.set(4, \"four\");\r\nlowMap.set(5, \"five\");\r\nlowMap.set(6, \"six\");\r\nlowMap.set(7, \"seven\");\r\nlowMap.set(8, \"eight\");\r\nlowMap.set(9, \"nine\");\r\nlowMap.set(10, \"ten\");\r\nlowMap.set(11, \"eleven\");\r\nlowMap.set(12, \"twelve\");\r\nlowMap.set(13, \"thirteen\");\r\nlowMap.set(14, \"fourteen\");\r\nlowMap.set(15, \"fifteen\");\r\nlowMap.set(16, \"sixteen\");\r\nlowMap.set(17, \"seventeen\");\r\nlowMap.set(18, \"eighteen\");\r\nlowMap.set(19, \"nineteen\");\r\n\r\nconst tensMap = new Map();\r\ntensMap.set(2, \"twenty\");\r\ntensMap.set(3, \"thirty\");\r\ntensMap.set(4, \"forty\");\r\ntensMap.set(5, \"fifty\");\r\ntensMap.set(6, \"sixty\");\r\ntensMap.set(7, \"seventy\");\r\ntensMap.set(8, \"eighty\");\r\ntensMap.set(9, \"ninety\");\r\n\r\nexport function NumbersToWords(num: number): string{\r\n if (num.toString().includes(\".\")){\r\n throw new Error(\"Numbers with Decimal places not supported\");\r\n }\r\n let myString = \"\";\r\n if (lowMap.has(num)){\r\n myString = lowMap.get(num) as string;\r\n }\r\n else{\r\n const finalDigit = num % 10;\r\n const tens = finalDigit - finalDigit;\r\n myString = tensMap.get(tens) as string;\r\n if (finalDigit){\r\n myString += (\" \" + lowMap.get(finalDigit));\r\n } \r\n }\r\n const capitalized = myString[0].toUpperCase() + myString.slice(1);\r\n return capitalized;\r\n}\r\n","import React, { Fragment } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CondensedElement from \"./CondensedInterfaces\";\r\nimport MonthView from \"../MonthView\";\r\nimport CalendarState from \"../../State/CalendarState\";\r\nimport { getCalendarNumber } from \"../../Utility\";\r\nimport { NumbersToWords } from \"../../Utility/NumbersToWords\";\r\n\r\nconst CondensedViewElement = observer((props: { obj: CondensedElement, year: number }) => {\r\n if (props.obj.isMonthEvent) {\r\n return ();\r\n }\r\n else if (props.obj.months.length === 1) {\r\n return ();\r\n }\r\n else {\r\n return (\r\n
\r\n
\r\n {\r\n props.obj.months.length === CalendarState.calendar.months.length ? (\r\n
\r\n
{`No events in ${props.year}`}
\r\n
\r\n ) : (\r\n
\r\n
{`${NumbersToWords(props.obj.months.length)} months with no events in ${props.year}`}
\r\n
\r\n {`from ${props.obj.months[0].name} to ${props.obj.months[props.obj.months.length - 1].name}`}\r\n
\r\n
\r\n )\r\n }\r\n
\r\n
\r\n {\r\n CalendarState.calendar.daysOfWeek.map(x => (\r\n
\r\n ))\r\n }\r\n
\r\n \r\n
);\r\n }\r\n});\r\n\r\nexport default CondensedViewElement;\r\n","import React, { Fragment } from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../../State/CalendarState\";\r\nimport CondensedElement, { MonthEvents, EventMonthFiller } from \"./CondensedInterfaces\";\r\nimport CondensedViewElement from \"./CondensedViewBlock\";\r\n\r\nconst CondensedViewYear = observer((props: { year: number, final: boolean, first: boolean }) => {\r\n const yearEvents = CalendarState.events.filter(x => x.fantasyDate.year === props.year);\r\n const condensedViewObjects = CalendarState.calendar.months.reduce((acc, m) => {\r\n const monthEvents = yearEvents.filter(x => x.fantasyDate.month === m.position);\r\n if (monthEvents.length) {\r\n const myObj: MonthEvents = {\r\n month: m.position,\r\n events: monthEvents,\r\n isMonthEvent: true,\r\n };\r\n return [...acc, myObj];\r\n }\r\n else {\r\n if (acc.length && !acc[acc.length - 1].isMonthEvent) {\r\n const filler = acc[acc.length - 1] as EventMonthFiller;\r\n filler.months.push(m);\r\n filler.days += m.days;\r\n return acc;\r\n }\r\n else {\r\n const myObj: EventMonthFiller = {\r\n months: [m],\r\n days: m.days,\r\n isMonthEvent: false,\r\n };\r\n return [...acc, myObj];\r\n }\r\n }\r\n }, []);\r\n if (props.final){\r\n while (condensedViewObjects.length && !condensedViewObjects[condensedViewObjects.length - 1].isMonthEvent){\r\n condensedViewObjects.pop();\r\n }\r\n } \r\n if (props.first){\r\n while (condensedViewObjects.length && !condensedViewObjects[0].isMonthEvent){\r\n condensedViewObjects.splice(0, 1);\r\n }\r\n } \r\n return (\r\n \r\n {\r\n condensedViewObjects.map((x, i) => ())\r\n }\r\n \r\n );\r\n});\r\n\r\nexport default CondensedViewYear;\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../../State/CalendarState\";\r\nimport CondensedViewYear from \"./CondensedViewYear\";\r\nimport { CreateRange } from \"../../Utility/Range\";\r\n\r\nconst CondensedView: React.FC = observer(() => {\r\n const gappedYears = [...new Set(CalendarState.events.map(x => x.fantasyDate.year))];\r\n gappedYears.sort();\r\n const years = CreateRange(gappedYears[0], gappedYears[gappedYears.length - 1]);\r\n const finalYear = years[years.length - 1];\r\n return (\r\n
\r\n
\r\n {\r\n years.map((year, i) => (\r\n \r\n ))\r\n }\r\n
\r\n
\r\n
\r\n CalendarState.addNewEvent(CalendarState.calendar.currentDate)}\r\n className=\"add-event-button\">\r\n Add New Event\r\n \r\n
\r\n
\r\n
\r\n );\r\n});\r\n\r\nexport default CondensedView;\r\n","export function CreateRange(a: number, b: number): number[] {\r\n const myArray = [a];\r\n while (myArray[myArray.length - 1] < b){\r\n const newNumber = myArray[myArray.length - 1] + 1;\r\n myArray.push(newNumber);\r\n }\r\n return myArray;\r\n}\r\n","import React from \"react\";\r\nimport MonthView from \"./MonthView\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport Modal from \"react-modal\";\r\nimport DayDetailView from \"../DayDetail/DayDetailView\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport CalendarToolbar from \"../CalendarNavigation/CalendarToolBar\";\r\nimport TimeLineView from \"./TimelineView/TimelineView\";\r\nimport JoinCalendarHelper from \"../CalenderJoinHelper\";\r\nimport EditEvent from \"../DayDetail/EditEvent\";\r\nimport \"./CalendarView.css\";\r\nimport { ViewType } from \"../Models/CalendarViewType\";\r\nimport CondensedView from \"./CondensedView/CondensedView\";\r\n\r\n\r\nconst CalendarView = observer((props: { viewType: ViewType }) => {\r\n const { year } = useParams<{year: string}>();\r\n function getYear(): number {\r\n if (!year) {\r\n return CalendarState.calendar.currentDate.year;\r\n }\r\n return parseInt(year, 10);\r\n }\r\n function onModalClose() {\r\n CalendarState.selectedDay = undefined;\r\n CalendarState.calendarEditEvent = undefined;\r\n }\r\n const currentYear = getYear();\r\n JoinCalendarHelper(CalendarState.calendar.id);\r\n return (\r\n
\r\n \r\n
\r\n {\r\n CalendarState.calendar.moons.length > 1 && (\r\n
\r\n {\r\n CalendarState.calendar.moons.map((moon, i) => (\r\n
\r\n
\r\n
{moon.name}
\r\n
\r\n ))\r\n }\r\n
\r\n )\r\n }\r\n {\r\n (() => {\r\n switch (props.viewType) {\r\n case ViewType.Timeline: return ();\r\n case ViewType.Condensed: return ();\r\n case ViewType.Calendar: return (
\r\n {\r\n CalendarState.calendar.months.map((x) =>\r\n ,\r\n )\r\n }\r\n
);\r\n }\r\n })()\r\n }\r\n
\r\n onModalClose()}>\r\n
\r\n {\r\n CalendarState.selectedDay && !CalendarState.calendarEditEvent &&\r\n (\r\n \r\n )\r\n }\r\n {\r\n CalendarState.calendarEditEvent && (\r\n \r\n )\r\n }\r\n
\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default CalendarView;\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { Redirect, useParams } from \"react-router-dom\";\r\nimport CalendarView from \"./CalendarView\";\r\nimport { ViewType } from \"../Models/CalendarViewType\";\r\nimport LoadingSpinner from \"../LoadingSpinner\";\r\n\r\n\r\nconst CalendarViewWrapper = observer((props: {viewType: ViewType}) => {\r\n if (CalendarState.calendarLoadState === \"Error\") {\r\n console.log(\"Redirecting due to error\");\r\n return ;\r\n }\r\n if (CalendarState.calendarLoadState === \"Loading\") {\r\n return (
);\r\n }\r\n const { calendarId } = useParams<{calendarId: string}>();\r\n if (calendarId) {\r\n CalendarState.loadCalendar(calendarId);\r\n }\r\n return (\r\n CalendarState.calendarLoadState === \"Loaded\" ? (\r\n \r\n ) :\r\n (\r\n
\r\n \r\n
\r\n )\r\n );\r\n});\r\n\r\nexport default CalendarViewWrapper;\r\n","import React from \"react\";\r\n\r\nconst About = () => {\r\n return (\r\n
\r\n
\r\n
\r\n

About the Mithril Almanac

\r\n

Hey, my name is Zachary Shuford, and I created this site! 😀

\r\n

If you find any bugs or have any issues, you can report them at \r\n the project's Github page

\r\n

\r\n This site is free to use, and I promise that if I ever add a \"paid tier\" in the future, \r\n it'll only be for new features. What's here as of right now will remain free as long as I operate the site. \r\n Plus, the code is free to resuse, remix, and rehost yourself if you want, as long as you don't use it for commerical\r\n purposes (the exact legal lisence can be found on Github)\r\n

\r\n

If you want to help me keep the lights on, you can head over to my \r\n Patreon Page!

\r\n

Mithril Almanac is (c) 2021 Zachary Shuford

\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default About;\r\n","export interface Release{\r\n version: string;\r\n items: string[];\r\n}\r\n\r\nconst ReleaseNotes: Release[] = [\r\n {\r\n version: \"0.4\",\r\n items: [\r\n \"Leap Year Customization\",\r\n ],\r\n },\r\n {\r\n version: \"0.5\",\r\n items: [\r\n \"A new look. We hope you like it!\",\r\n \"A better color picker for moon colors!\",\r\n \"Set the current date, not just the year! It will appear on the calendar as a light green color\",\r\n \"Set day of the week that 1/1/0001 started on (date offset)\",\r\n ],\r\n },\r\n {\r\n version: \"0.6\",\r\n items: [\r\n \"Improved Timeline view\",\r\n ],\r\n },\r\n {\r\n version: \"0.7\",\r\n items: [\r\n \"Try out the new \\\"Condensed View\\\" to still see the calendar, but remove unnecessary months\",\r\n \"Set your calendar's default view type in the Calendar Edit screen!\",\r\n ],\r\n },\r\n {\r\n version: \"1.0\",\r\n items: [\r\n \"When creating a new event, check \\\"Current Date\\\" to make that event the current day for the calendar without having to go into the Calendar settings.\",\r\n ],\r\n },\r\n];\r\n\r\nexport default ReleaseNotes;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport ReleaseNotes, { Release } from \"./ReleaseNotes\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faTimes } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nconst UpdateBanner = () => {\r\n const [updateInfo, setUpdateInfo] = useState({ version: \"\", items: [] });\r\n\r\n const currentVersion = ReleaseNotes.map(x => x.version).reduce((p, c) => (c > p ? c : p));\r\n\r\n function closeBanner(){\r\n localStorage.setItem(\"lastVersion\", currentVersion.toString());\r\n setUpdateInfo({version: \"\", items: []});\r\n }\r\n\r\n useEffect(() => {\r\n function getLastVersionSeen() {\r\n const vString = localStorage.getItem(\"lastVersion\");\r\n if (vString) {\r\n return parseFloat(vString);\r\n }\r\n return 0;\r\n }\r\n\r\n function getUpdateInfo(): Release {\r\n const lastSeen = getLastVersionSeen();\r\n if (!lastSeen) {\r\n return ReleaseNotes[ReleaseNotes.length - 1];\r\n }\r\n const currentVersionParsed = parseInt(currentVersion, 10);\r\n if (currentVersionParsed <= lastSeen) {\r\n return {\r\n version: \"\",\r\n items: [],\r\n };\r\n }\r\n const items = ReleaseNotes\r\n .filter(x => parseInt(x.version, 10) > lastSeen)\r\n .map(x => x.items)\r\n .reduce((prev, curr) => ([...prev, ...curr]));\r\n if (items.length > 10){\r\n items.splice(10);\r\n }\r\n return {\r\n version: currentVersion,\r\n items,\r\n };\r\n }\r\n const myUpdateInfo = getUpdateInfo();\r\n if (myUpdateInfo.version) {\r\n setUpdateInfo(myUpdateInfo);\r\n }\r\n }, [currentVersion]);\r\n\r\n if (!updateInfo.version) {\r\n return ;\r\n }\r\n return (\r\n
\r\n
\r\n
\r\n
{`Welcome to version ${updateInfo.version} \r\n of the Mithril Almanac! New features in this release include:`}
\r\n
closeBanner()} style={{marginLeft: \"auto\", cursor: \"pointer\"}}>\r\n \r\n
\r\n
\r\n
    \r\n {\r\n updateInfo.items.map(x => (
  • {x}
  • ))\r\n }\r\n
\r\n
If you've spotted a bug or would like to request a feature, please do so on \r\n our Github page!\r\n \r\n
\r\n closeBanner()}\r\n style={{ fontSize: \"1.5em\" }}\r\n className=\"blue-button\">Got it, thanks!\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default UpdateBanner;\r\n","import React from \"react\";\r\nimport { observer } from \"mobx-react\";\r\nimport CalendarState from \"../State/CalendarState\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport CalendarViewWrapper from \"./CalendarViewWrapper\";\r\nimport { ViewType } from \"../Models/CalendarViewType\";\r\nimport LoadingSpinner from \"../LoadingSpinner\";\r\n\r\nconst DefaultView: React.FC = observer(() => {\r\n const { calendarId } = useParams<{calendarId: string}>();\r\n if (CalendarState.calendarLoadState === \"Error\") {\r\n console.log(\"Redirecting due to error and clearing last calendar\");\r\n localStorage.removeItem(\"LastCalendar\");\r\n window.location.assign(\"/home\"); //hard bail to the landing page to force reload in case of error\r\n }\r\n if (CalendarState.calendarLoadState === \"Loading\") {\r\n return (
);\r\n }\r\n if (calendarId) {\r\n CalendarState.loadCalendar(calendarId);\r\n }\r\n return (\r\n CalendarState.calendarLoadState === \"Loaded\" ? (\r\n \r\n ) :\r\n (\r\n
\r\n \r\n
\r\n )\r\n );\r\n});\r\n\r\nexport default DefaultView;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport \"./App.css\";\r\nimport { observer } from \"mobx-react\";\r\nimport { BrowserRouter as Router, Switch, Route, Redirect } from \"react-router-dom\";\r\nimport Landing from \"./Landing/Landing\";\r\nimport ToolBar from \"./ToolBar/ToolBar\";\r\nimport UserState from \"./State/UserState\";\r\nimport CalendarEditView from \"./CalendarEditView/CalendarEditView\";\r\nimport Authenticate from \"./Authenticate/Authenticate\";\r\nimport Modal from \"react-modal\";\r\nimport ErrorState from \"./State/ErrorState\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faExclamationTriangle } from \"@fortawesome/free-solid-svg-icons\";\r\nimport CalendarViewWrapper from \"./CalendarView/CalendarViewWrapper\";\r\nimport \"./Tooltip.css\";\r\nimport About from \"./About\";\r\nimport { getInternetExplorerVersion } from \"./Utility\";\r\nimport UpdateBanner from \"./Updates/UpdateBanner\";\r\nimport { ViewType } from \"./Models/CalendarViewType\";\r\nimport DefaultView from \"./CalendarView/DefaultView\";\r\n\r\nconst App: React.FC = observer(() => {\r\n const [loaded, setLoaded] = useState(false);\r\n const [calendarRedirect, setCalendarRedirect] = useState(\"\");\r\n\r\n useEffect(() => {\r\n const myApp = document.getElementById(\"app\");\r\n if (myApp) {\r\n Modal.setAppElement(myApp);\r\n setLoaded(true);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n const accessToken = UserState.getAccessToken();\r\n if (accessToken) {\r\n UserState.authenticateUser(accessToken); \r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n const lastCalendar = localStorage.getItem(\"LastCalendar\");\r\n if (lastCalendar){\r\n setCalendarRedirect(lastCalendar);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (navigator.userAgent.match(/SamsungBrowser/i)){\r\n alert(\"The Samsung Internet browser does not work with this site. \" +\r\n \"Supported browsers are Firefox, Chrome, Edge, and Safari. Sorry!\");\r\n }\r\n else if (getInternetExplorerVersion() > 0){\r\n alert(\"Internet Explorer does not work with this site. \" +\r\n \"Supported browsers are Firefox, Chrome, Edge, and Safari. Sorry!!\");\r\n }\r\n }, []);\r\n\r\n function getDefaultReturn(){\r\n if (calendarRedirect){\r\n return ;\r\n }\r\n else{\r\n return ;\r\n }\r\n }\r\n\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {getDefaultReturn()}\r\n \r\n \r\n \r\n {\r\n loaded && (\r\n ErrorState.errorMessage = \"\"}>\r\n
\r\n
\r\n \r\n
Uh-oh
\r\n \r\n
\r\n
{ErrorState.errorMessage}
\r\n
\r\n \r\n )\r\n }\r\n \r\n
\r\n );\r\n});\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(\r\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\r\n window.location.href\r\n );\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}