import { useCallback, useContext, useEffect, useState } from 'react'; import { Button } from '@chakra-ui/react'; import { FiUsers } from '@react-icons/all-files/fi/FiUsers'; import { IoBan } from '@react-icons/all-files/io5/IoBan'; import { editorEventId } from 'common/atoms/LocalEventSettings'; import ColourInput from 'common/components/input/ColourInput'; import TextInput from 'common/components/input/TextInput'; import TimeInput from 'common/components/input/TimeInput'; import { LoggingContext } from 'common/context/LoggingContext'; import { useEventAction } from 'common/hooks/useEventAction'; import { millisToMinutes } from 'common/utils/dateConfig'; import getDelayTo from 'common/utils/getDelayTo'; import { stringFromMillis } from 'common/utils/time'; import { calculateDuration, validateEntry } from 'common/utils/timesManager'; import { useAtom } from 'jotai'; import useEventsList from '../../common/hooks-query/useEventsList'; import style from './EventEditor.module.scss'; export default function EventEditor() { const [openId] = useAtom(editorEventId); const { data } = useEventsList(); const { emitWarning, emitError } = useContext(LoggingContext); const { updateEvent } = useEventAction(); const [event, setEvent] = useState(null); const [delay, setDelay] = useState(0); useEffect(() => { if (!data || !openId) { return; } const eventIndex = data.findIndex((event) => event.id === openId); if (eventIndex > -1) { setDelay(getDelayTo(data, eventIndex)); setEvent(data[eventIndex]); } }, [data, event, openId]); const handleSubmit = useCallback( (field, value) => { const newEventData = { id: event.id }; switch (field) { case 'durationOverride': { // duration defines timeEnd newEventData.timeEnd = event.timeStart += value; break; } case 'timeStart': { newEventData.duration = calculateDuration(value, event.timeEnd); newEventData.timeStart = value; break; } case 'timeEnd': { newEventData.duration = calculateDuration(event.timeStart, value); newEventData.timeEnd = value; break; } default: { if (field in event) { // create object with new field newEventData[field] = value; break; } else { emitError(`Unknown field: ${field}`); return; } } } updateEvent(newEventData); }, [emitError, event, updateEvent], ); const timerValidationHandler = useCallback( (entry, val) => { const valid = validateEntry(entry, val, event.timeStart, event.timeEnd); if (!valid.value) { emitWarning(`Time Input Warning: ${valid.catch}`); } return valid.value; }, [emitWarning, event?.timeStart, event?.timeEnd], ); const togglePublic = useCallback( (currentValue) => { updateEvent({ id: event.id, isPublic: !currentValue }); }, [event?.id, updateEvent], ); if (!event) { return Loading; } const delayed = delay !== 0; const addedTime = delayed ? `${delay >= 0 ? '+' : '-'} ${millisToMinutes(Math.abs(delay))} minutes` : null; const newStart = delayed ? `New start ${stringFromMillis(event.timeStart + delay)}` : null; const newEnd = delayed ? `New end ${stringFromMillis(event.timeEnd + delay)}` : null; return (
handleSubmit('colour', value)} />
{`OSC Trigger /ontime/gotoid/${event.id}`}
); }