// ** React Imports import { useState, useEffect, forwardRef, useCallback, Fragment } from 'react' // ** MUI Imports import Box from '@mui/material/Box' import Drawer from '@mui/material/Drawer' import Select from '@mui/material/Select' import Switch from '@mui/material/Switch' import Button from '@mui/material/Button' import MenuItem from '@mui/material/MenuItem' import TextField from '@mui/material/TextField' import IconButton from '@mui/material/IconButton' import InputLabel from '@mui/material/InputLabel' import Typography from '@mui/material/Typography' import FormControl from '@mui/material/FormControl' import FormHelperText from '@mui/material/FormHelperText' import FormControlLabel from '@mui/material/FormControlLabel' // ** Third Party Imports import DatePicker from 'react-datepicker' import { useForm, Controller } from 'react-hook-form' // ** Icon Imports import Icon from 'src/@core/components/icon' // ** Styled Components import DatePickerWrapper from 'src/@core/styles/libs/react-datepicker' // ** Types import { EventDateType, AddEventSidebarType } from 'src/types/apps/calendarTypes' interface PickerProps { label?: string error?: boolean registername?: string } interface DefaultStateType { url: string title: string allDay: boolean calendar: string description: string endDate: Date | string startDate: Date | string guests: string[] | string | undefined } const capitalize = (string: string) => string && string[0].toUpperCase() + string.slice(1) const defaultState: DefaultStateType = { url: '', title: '', guests: [], allDay: true, description: '', endDate: new Date(), calendar: 'Business', startDate: new Date() } const AddEventSidebar = (props: AddEventSidebarType) => { // ** Props const { store, dispatch, addEvent, updateEvent, drawerWidth, calendarApi, deleteEvent, handleSelectEvent, addEventSidebarOpen, handleAddEventSidebarToggle } = props // ** States const [values, setValues] = useState(defaultState) const { control, setValue, clearErrors, handleSubmit, formState: { errors } } = useForm({ defaultValues: { title: '' } }) const handleSidebarClose = async () => { setValues(defaultState) clearErrors() dispatch(handleSelectEvent(null)) handleAddEventSidebarToggle() } const onSubmit = (data: { title: string }) => { const modifiedEvent = { url: values.url, display: 'block', title: data.title, end: values.endDate, allDay: values.allDay, start: values.startDate, extendedProps: { calendar: capitalize(values.calendar), guests: values.guests && values.guests.length ? values.guests : undefined, description: values.description.length ? values.description : undefined } } if (store.selectedEvent === null || (store.selectedEvent !== null && !store.selectedEvent.title.length)) { dispatch(addEvent(modifiedEvent)) } else { dispatch(updateEvent({ id: store.selectedEvent.id, ...modifiedEvent })) } calendarApi.refetchEvents() handleSidebarClose() } const handleDeleteEvent = () => { if (store.selectedEvent) { dispatch(deleteEvent(store.selectedEvent.id)) } // calendarApi.getEventById(store.selectedEvent.id).remove() handleSidebarClose() } const handleStartDate = (date: Date) => { if (date > values.endDate) { setValues({ ...values, startDate: new Date(date), endDate: new Date(date) }) } } const resetToStoredValues = useCallback(() => { if (store.selectedEvent !== null) { const event = store.selectedEvent setValue('title', event.title || '') setValues({ url: event.url || '', title: event.title || '', allDay: event.allDay, guests: event.extendedProps.guests || [], description: event.extendedProps.description || '', calendar: event.extendedProps.calendar || 'Business', endDate: event.end !== null ? event.end : event.start, startDate: event.start !== null ? event.start : new Date() }) } }, [setValue, store.selectedEvent]) const resetToEmptyValues = useCallback(() => { setValue('title', '') setValues(defaultState) }, [setValue]) useEffect(() => { if (store.selectedEvent !== null) { resetToStoredValues() } else { resetToEmptyValues() } }, [addEventSidebarOpen, resetToStoredValues, resetToEmptyValues, store.selectedEvent]) const PickersComponent = forwardRef(({ ...props }: PickerProps, ref) => { return ( ) }) PickersComponent.displayName = 'PickersComponent'; const RenderSidebarFooter = () => { if (store.selectedEvent === null || (store.selectedEvent !== null && !store.selectedEvent.title.length)) { return ( ) } else { return ( ) } } return ( theme.spacing(3, 3.255, 3, 5.255) }} > {store.selectedEvent !== null && store.selectedEvent.title.length ? 'Update Event' : 'Add Event'} {store.selectedEvent !== null && store.selectedEvent.title.length ? ( ) : null} theme.spacing(5, 6) }}>
( )} /> {errors.title && ( This field is required )} Calendar } onChange={(date: Date) => setValues({ ...values, startDate: new Date(date) })} onSelect={handleStartDate} /> } onChange={(date: Date) => setValues({ ...values, endDate: new Date(date) })} /> setValues({ ...values, allDay: e.target.checked })} /> } /> setValues({ ...values, url: e.target.value })} /> Guests setValues({ ...values, description: e.target.value })} />
) } export default AddEventSidebar