react-garden
Version:
React + TypeScript + ThreeJS app using Material UI on NextJS, Apollo Client, GraphQL + WordPress REST APIs, for ThreeD web development.. a part of the threed.ai code family.
169 lines (145 loc) • 4.74 kB
JavaScript
// ** React Import
import { useEffect, useRef } from 'react'
// ** Full Calendar & it's Plugins
import FullCalendar from '@fullcalendar/react'
// import listPlugin from '@fullcalendar/list' // [MM] HEY HEY HEY
import dayGridPlugin from '@fullcalendar/daygrid'
import timeGridPlugin from '@fullcalendar/timegrid'
import interactionPlugin from '@fullcalendar/interaction'
// ** Icons Imports
import Menu from 'mdi-material-ui/Menu'
// ==============================================================
// [MM] HEY HEY HEY
const blankEvent = {
title: '',
start: '',
end: '',
allDay: false,
url: '',
extendedProps: {
calendar: '',
guests: [],
location: '',
description: ''
}
}
// ==============================================================
// FunctionComponent<FC><Props>
const Calendar = props => {
// ** Props
const {
store,
dispatch,
direction,
updateEvent,
calendarApi,
calendarsColor,
setCalendarApi,
handleSelectEvent,
handleLeftSidebarToggle,
handleAddEventSidebarToggle
} = props
// ** Refs
const calendarRef = useRef()
// [MM] HEY HEY HEY
useEffect(() => {
if (calendarApi === null) {
// @ts-ignore
setCalendarApi(calendarRef.current.getApi())
}
}, [calendarApi, setCalendarApi])
// [MM] HEY HEY HEY
if (store) {
// ** calendarOptions(Props)
const calendarOptions = {
events: store.events.length ? store.events : [],
plugins: [interactionPlugin, dayGridPlugin, timeGridPlugin], // , listPlugin // [MM] HEY HEY HEY
initialView: 'dayGridMonth',
headerToolbar: {
start: 'sidebarToggle, prev, next, title',
end: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
},
/*
Enable dragging and resizing event
? Docs: https://fullcalendar.io/docs/editable
*/
editable: true,
/*
Enable resizing event from start
? Docs: https://fullcalendar.io/docs/eventResizableFromStart
*/
eventResizableFromStart: true,
/*
Automatically scroll the scroll-containers during event drag-and-drop and date selecting
? Docs: https://fullcalendar.io/docs/dragScroll
*/
dragScroll: true,
/*
Max number of events within a given day
? Docs: https://fullcalendar.io/docs/dayMaxEvents
*/
dayMaxEvents: 2,
/*
Determines if day names and week names are clickable
? Docs: https://fullcalendar.io/docs/navLinks
*/
navLinks: true,
eventClassNames({ event: calendarEvent }) {
// @ts-ignore
const colorName = calendarsColor[calendarEvent._def.extendedProps.calendar]
return [
// Background Color
`bg-${colorName}`
]
},
eventClick({ event: clickedEvent }) {
dispatch(handleSelectEvent(clickedEvent))
handleAddEventSidebarToggle()
// * Only grab required field otherwise it goes in infinity loop
// ! Always grab all fields rendered by form (even if it get `undefined`) otherwise due to Vue3/Composition API you might get: "object is not extensible"
// event.value = grabEventDataFromEventApi(clickedEvent)
// isAddNewEventSidebarActive.value = true
},
customButtons: {
sidebarToggle: {
text: <Menu />,
click() {
handleLeftSidebarToggle()
}
}
},
dateClick(info) {
const ev = { ...blankEvent }
ev.start = info.date
ev.end = info.date
ev.allDay = true
// @ts-ignore
dispatch(handleSelectEvent(ev))
handleAddEventSidebarToggle()
},
/*
Handle event drop (Also include dragged event)
? Docs: https://fullcalendar.io/docs/eventDrop
? We can use `eventDragStop` but it doesn't return updated event so we have to use `eventDrop` which returns updated event
*/
eventDrop({ event: droppedEvent }) {
dispatch(updateEvent(droppedEvent))
},
/*
Handle event resize
? Docs: https://fullcalendar.io/docs/eventResize
*/
eventResize({ event: resizedEvent }) {
dispatch(updateEvent(resizedEvent))
},
ref: calendarRef,
// Get direction from app state (store)
direction
}
// @ts-ignore
return <FullCalendar {...calendarOptions} />
} else {
return null
}
}
export default Calendar