UNPKG

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
// ** 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