diff --git a/src/App.js b/src/App.js index db2cc6ed1..049d0eb57 100644 --- a/src/App.js +++ b/src/App.js @@ -1,17 +1,20 @@ import { Route } from 'react-router'; import './App.css'; +import { EventProvider } from './app/context/eventContext'; import { EventListProvider } from './app/context/eventListContext'; import Editor from './features/editors/Editor'; import DefaultPresenter from './features/viewers/DefaultPresenter'; function App() { return ( -
- - - - -
+ +
+ {/* */} + + + +
+
); } diff --git a/src/app/context/eventContext.js b/src/app/context/eventContext.js new file mode 100644 index 000000000..d692ed6a7 --- /dev/null +++ b/src/app/context/eventContext.js @@ -0,0 +1,13 @@ +import { createContext, useState } from 'react'; + +export const EventContext = createContext(); + +export function EventProvider(props) { + const [event, setEvent] = useState(null); + + return ( + + {props.children} + + ); +} diff --git a/src/features/editors/Editor.jsx b/src/features/editors/Editor.jsx index 60c924eac..5edd0d050 100644 --- a/src/features/editors/Editor.jsx +++ b/src/features/editors/Editor.jsx @@ -1,53 +1,45 @@ import { Button } from '@chakra-ui/button'; import { ArrowForwardIcon } from '@chakra-ui/icons'; -import { Flex, Heading } from '@chakra-ui/layout'; -import { SimpleGrid } from '@chakra-ui/layout'; +import { Grid, GridItem, Heading } from '@chakra-ui/layout'; import { Box } from '@chakra-ui/layout'; +import { useContext } from 'react'; import { useEffect, useState } from 'react'; -import { sampleData } from '../../app/sampleData'; +import { EventContext } from '../../app/context/eventContext'; import NumberedText from '../../common/components/text/NumberedText'; +import PlaybackControl from '../control/PlaybackControl'; import EventForm from '../form/EventForm'; +import MessageForm from '../form/MessageForm'; import PreviewContainer from '../viewers/PreviewContainer'; import styles from './Editor.module.css'; import EventList from './list/EventList'; export default function Editor() { - const [data, setData] = useState(sampleData); - const [selectedData, setSelectedData] = useState(null); - const [selectedEvent, setSelectedEvent] = useState(null); const [formMode, setFormMode] = useState(null); + const [event] = useContext(EventContext); useEffect(() => { - if (selectedEvent === null) { - setSelectedData(null); + if (event === null) { setFormMode(null); } else { - const se = data.events.filter((d) => d.id === selectedEvent); - if (se.length > 0) setSelectedData(se[0]); setFormMode('edit'); } - }, [data, selectedEvent]); + }, [event]); return ( - - - List Events - -
- + + List Events + -
+
-
-
- - Event Details - -
- -
-
+
+ +
+ + - - List Events - -
- -
-
- + + + Event Details + +
+ +
+
+
+ + + + Screens + +
+ {/* */} +
+
+
+ + + + Screen Messages + +
+ +
+
+ + + + Time Control + +
+ +
+
+ ); } diff --git a/src/features/editors/list/EventList.jsx b/src/features/editors/list/EventList.jsx index a5e5fb4f7..7ee15f2b3 100644 --- a/src/features/editors/list/EventList.jsx +++ b/src/features/editors/list/EventList.jsx @@ -1,14 +1,20 @@ import { Table, Thead, Tbody, Tr, Th } from '@chakra-ui/react'; import { useContext } from 'react'; +import { EventContext } from '../../../app/context/eventContext'; import { EventListContext } from '../../../app/context/eventListContext'; import EventListItem from './EventListItem'; import { sortByDate } from './listUtils'; export default function EventList(props) { - const [events, setEvents] = useContext(EventListContext); + const [events, ] = useContext(EventListContext); + const [event, setEvent] = useContext(EventContext); - console.log('e', events); - console.log('sort', sortByDate(events)); + const handleSetSelected = (id) => { + setEvent(events.filter((e) => e.id === id)[0]); + props.setFormMode('edit'); + }; + + const disabled = props.formMode !== null; return ( @@ -26,9 +32,9 @@ export default function EventList(props) { ))} diff --git a/src/features/editors/list/EventListItem.jsx b/src/features/editors/list/EventListItem.jsx index 9f498df39..400178134 100644 --- a/src/features/editors/list/EventListItem.jsx +++ b/src/features/editors/list/EventListItem.jsx @@ -5,11 +5,11 @@ import { timeFormat } from '../../../common/dateConfig'; import { ChevronRightIcon } from '@chakra-ui/icons'; export default function EventListItem(props) { - const selected = props.selected === props.data.id + const isSelected = props.selectedId === props.data.id; return ( props.setSelectedEvent(props.data.id)} - disabled={props.formMode !== null} + variant={isSelected ? 'solid' : 'outline'} + onClick={() => props.setSelected(props.data.id)} + disabled={props.disabled} size='sm' aria-label='Select Item' icon={} diff --git a/src/features/form/EventForm.jsx b/src/features/form/EventForm.jsx index dcff4ada2..80a332af2 100644 --- a/src/features/form/EventForm.jsx +++ b/src/features/form/EventForm.jsx @@ -1,33 +1,48 @@ import { Button } from '@chakra-ui/button'; import { Form, Formik } from 'formik'; -import { useContext, useState } from 'react'; -import ReactDatePicker from 'react-datepicker'; +import { useContext, useEffect, useState } from 'react'; import DatePicker from 'react-datepicker'; import * as Yup from 'yup'; +import { EventContext } from '../../app/context/eventContext'; import { EventListContext } from '../../app/context/eventListContext'; import ChakraInput from '../../common/input/ChakraInput'; import ChakraNumberInput from '../../common/input/ChakraNumberInput'; import TimeInput from '../../common/input/TimeInput'; - import styles from './EventForm.module.css'; +const sampleInitialValues = { + title: '', + subtitle: '', + presenter: '', + timeStart: new Date(), + timeEnd: new Date(), + timerDuration: 5, +}; + export default function EventForm(props) { - const [events, setEvents] = useContext(EventListContext); - const today = new Date(); - const initialValues = props.data ?? { - title: '', - subtitle: '', - presenter: '', - timeStart: today, - timeEnd: today, - timerDuration: 30, - }; + const [event, setEvent] = useContext(EventContext); + const [, setEvents] = useContext(EventListContext); + const [initialValues, setInitialValues] = useState(null); + + useEffect(() => { + if (props.formMode === 'edit') setInitialValues(event); + else if (props.formMode === 'add') setInitialValues(sampleInitialValues); + else if (props.formMode === null) setInitialValues(null); + }, [event, props.formMode]); + + // TODO: Cleanup + if (props.formMode === null || initialValues === null) + return
Replace with nice empty illustration
; + else if (props.formMode === 'edit' && event === null) { + return
Replace with nice empty illustration also
; + } const validationSchema = Yup.object({ title: Yup.string().required('An event requires a title'), subtitle: Yup.string(), presenter: Yup.string(), - timeStart: Yup.date().nullable(), + timeStart: Yup.date(), + timeEnd: Yup.date(), timerDuration: Yup.number() .min(1) .max(60) @@ -35,12 +50,12 @@ export default function EventForm(props) { }); const submitForm = (values) => { + console.log('called submit'); + // prevent default stops page from refreshing, necessary? - console.log('form', values); // update form state props.setFormMode(null); - props.setSelectedEvent(null); // are we updating or creating new? @@ -58,17 +73,14 @@ export default function EventForm(props) { const cancelForm = () => { props.setFormMode(null); - props.setSelectedEvent(null); + setEvent(null); + setInitialValues(null); }; - if (props.data === null || props.data === undefined) { - if (props.formMode === null) - return
Replace with nice empty illustration
; - } - return (
{ @@ -76,7 +88,10 @@ export default function EventForm(props) { submitForm(values); }, 100); }} - onReset={(values) => cancelForm()} + // FIX: This kept being called on render + // onReset={() => { + // cancelForm(); + // }} > {(props) => (
@@ -109,9 +124,10 @@ export default function EventForm(props) {