import React, { useState } from "react"; import PropTypes from "prop-types"; import { Card, FAB, IconButton, List, Menu, Portal, Snackbar, TextInput, ToggleButton, } from "react-native-paper"; import { StyleSheet, View } from "react-native"; import DateTimePicker from "@react-native-community/datetimepicker"; import { format } from "date-fns"; function AddEntry({addTimetableEntry, days, subjects, navigation }) { const [ subject, setSubject ] = useState({ id: null, name: null }); const [ showSubjectMenu, setShowSubjectMenu ] = useState(false); const [ showTimePicker, setShowTimePicker ] = useState(false); // Set to true if date time picker should set start or not const [ mode, setMode ] = useState("start"); const [ start, setStart ] = useState(null); const [ end, setEnd ] = useState(null); const [ count, setCount ] = useState(0); const [ snackbar, setSnackbar ] = useState({ visible: false, message: "" }); const [ dayStates, setDayStates ] = useState([ true, false, false, false, false, false, false ]); function parseCount(text) { const num = parseInt(text); if (isNaN(num)) setCount(0); else setCount(num); } function onChange(_, selectedDate) { setShowTimePicker(false); if (selectedDate) { switch (mode) { case "start": setStart(selectedDate); return; case "end": setEnd(selectedDate); return; } } } function submit() { let message = ""; if (subject.id === null) message = "Missing Subject"; else if (start === null) message = "Missing start time."; else if (end === null) message = "Missing end time."; else if (count === 0) message = "Missing count."; if (! dayStates.filter(i => i).length) message = "No day selected."; if (message !== "") { setSnackbar({visible: true, message: message}); setTimeout(() => setSnackbar({ visible: false, message: null }), 2000); return; } dayStates.forEach((i, idx) => { if (i) { addTimetableEntry(idx, { sub_id: subject.id, count, start, end }); } }); navigation.pop(); } const defTime = (mode == "start" ? start : end) || (new Date); return (<> navigation.pop()}/> setShowSubjectMenu(false)} anchor={ setShowSubjectMenu(true)} right={props => } /> } > {subjects.map(subject => ( { setSubject(subject); setShowSubjectMenu(false); }} key={subject.id} /> ))} { setShowTimePicker(true); setMode("start"); }} /> { setShowTimePicker(true); setMode("end"); }} /> {dayStates.map( (i, idx) => ( setDayStates([ ...dayStates.slice(0, idx), !i, ...dayStates.slice(idx + 1) ]) } /> ) )} {showTimePicker && ( )} setSnackbar({ ...snackbar, visible: false })} action={{ label: "Dismiss", onPress: () => setSnackbar({ ...snackbar, visible: false }), }} > {snackbar.message} ); } AddEntry.propTypes = { addTimetableEntry: PropTypes.func, subjects: PropTypes.array, days: PropTypes.array, navigation: PropTypes.object, }; const style = StyleSheet.create({ card: { marginTop: 12, marginLeft: 10, marginRight: 10, }, text: { marginTop: 12, textAlign: "center", }, class: { flexDirection: "row", justifyContent: "space-between" }, daysContainer: { flexDirection: "row", justifyContent: "space-evenly", marginTop: 10 }, }); export default AddEntry;