diff --git a/src/app/components/DatePicker.js b/src/app/components/DatePicker.js new file mode 100644 index 0000000..74c8b30 --- /dev/null +++ b/src/app/components/DatePicker.js @@ -0,0 +1,204 @@ +import React, { useState } from "react"; +import { + Modal, + StyleSheet, + Text, + TouchableHighlight, + View, + Platform, + TouchableOpacity, + Alert, +} from "react-native"; +import DateTimePicker from "@react-native-community/datetimepicker"; + +import moment from "moment"; +import colors from "../config/colors"; + +export default function DatePicker(props) { + const [disabled, setDisabled] = useState(props.disabled); + + const { textStyle, defaultDate } = props; + const [date, setDate] = useState(moment(defaultDate)); + const [show, setShow] = useState(false); + const [auxDate, setAuxDate] = useState(moment()); + const [mode, setMode] = useState("date"); + const [time, setTime] = useState(moment(defaultDate)); + + const validateTimeInput = (selectedDate) => { + if ( + !moment().isSameOrAfter(selectedDate) && + new Date(moment()).getDay() == new Date(date).getDay() + ) { + Alert.alert("Horário inválido", "Selecione um horário válido", [ + { text: "OK", onPress: () => renderDatePicker() }, + ]); + return false; + } + return true; + }; + + const onChange = (e, selectedDate) => { + setAuxDate(moment(selectedDate)); // variavel auxiliar para não alterar a data com a rolagem, apenas com o done + }; + + const androidOnChange = (e, selectedDate) => { + console.log("selectedDate: " + selectedDate + " " + mode); + setShow(false); + + if (selectedDate) { + if (mode == "date") { + setDate(moment(selectedDate)); + props.onDateChange(date); + setMode("time"); + setShow(true); // to show the picker again in time mode + } else { + if (validateTimeInput(selectedDate)) { + setTime(moment(selectedDate)); + props.onTimeChange(moment(selectedDate)); + setShow(false); + setMode("date"); + } else { + setTime(moment()); + } + } + } + }; + + const onCancelPress = () => { + setShow(false); + }; + + const onDonePress = () => { + setShow(false); + + if (mode == "date") { + setDate(moment(auxDate)); //atualizar a data com a variável auxiliar + props.onDateChange(auxDate); + setMode("time"); + setShow(true); // to show the picker again in time mode + } else { + if (validateTimeInput(auxDate)) { + setTime(moment(auxDate)); + props.onTimeChange(auxDate); + setShow(false); + setMode("date"); + } else { + setTime(moment()); + } + } + }; + + const renderDatePicker = () => { + return ( + { + // if (mode == "date") { + // return moment(selectedDate).format("DD/mm/YYYY"); + // } else { + // return moment(selectedDate).format("HH:mm"); + // } + // }} //formatar a data e hora do selected date + display={Platform.OS === "ios" ? "spinner" : "default"} + onChange={Platform.OS === "ios" ? onChange : androidOnChange} + /> + ); + }; + + return ( + + setShow(true)}> + {props.children} + + {Platform.OS !== "ios" && show && renderDatePicker()} + + {Platform.OS === "ios" && show && ( + setShow(false)} + > + + setShow(false)} + > + console.log("datepicker clicked")} + > + + {renderDatePicker()} + onCancelPress()} + style={[styles.btnText, styles.btnCancel]} + > + Cancelar + + onDonePress()} + style={[styles.btnText, styles.btnDone]} + > + Confirmar + + + + + + + )} + + ); +} + +DatePicker.defaultProps = { + textStyle: {}, + defaultDate: moment(), + onDateChange: () => {}, + onTimeChange: () => {}, +}; + +const styles = StyleSheet.create({ + btnCancel: { + left: 0, + }, + btnDone: { + right: 0, + }, + btnText: { + position: "absolute", + top: 0, + height: 42, + paddingHorizontal: 20, + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + }, +}); diff --git a/src/app/components/forms/FormDatePicker.js b/src/app/components/forms/FormDatePicker.js index aa9114f..9333e0d 100644 --- a/src/app/components/forms/FormDatePicker.js +++ b/src/app/components/forms/FormDatePicker.js @@ -16,114 +16,22 @@ import moment from "moment"; import colors from "../../config/colors"; import { dimensions } from "../../config/dimensions"; import { showMessage } from "react-native-flash-message"; +import DatePicker from "../../components/DatePicker"; const FormDatePicker = (props) => { - const [disabled, setDisabled] = useState(props.disabled); - - const { textStyle, defaultDate } = props; - const [date, setDate] = useState(moment(defaultDate)); - const [show, setShow] = useState(false); - const [auxDate, setAuxDate] = useState(moment()); - const [mode, setMode] = useState("date"); - const [time, setTime] = useState(moment(defaultDate)); - - const validateTimeInput = (selectedDate) => { - if (!(moment().isSameOrAfter(selectedDate)) && new Date(moment()).getDay() == new Date(date).getDay()) { - Alert.alert( - "Horário inválido", - "Selecione um horário válido", - [ - { text: "OK", onPress: () => renderDatePicker() } - ] - ); - return false; - } - return true; - } - - const onChange = (e, selectedDate) => { - setAuxDate(moment(selectedDate)); // variavel auxiliar para não alterar a data com a rolagem, apenas com o done - }; - - const androidOnChange = (e, selectedDate) => { - setShow(false); - - if (selectedDate) { - if (mode == "date") { - setDate(moment(selectedDate)); - props.onDateChange(selectedDate); - setMode("time"); - setShow(true); // to show the picker again in time mode - } - else { - if (validateTimeInput(selectedDate)) { - setTime(moment(selectedDate)); - props.onTimeChange(selectedDate); - setShow(false); - setMode("date"); - } - else{ - setTime(moment()); - } - } - } - }; - - const onCancelPress = () => { - setShow(false); - }; - - const onDonePress = () => { - setShow(false); - - if (mode == "date") { - setDate(moment(auxDate)); //atualizar a data com a variável auxiliar - props.onDateChange(auxDate); - setMode("time"); - setShow(true); // to show the picker again in time mode - } - else { - if (validateTimeInput(auxDate)) { - setTime(moment(auxDate)); - props.onTimeChange(auxDate); - setShow(false); - setMode("date"); - } - else{ - setTime(moment()); - } - } - - }; - - const renderDatePicker = () => { - return ( - { - if (mode == "date") { - return moment(selectedDate).format("DD/MM/YYYY"); - } else { - return moment(selectedDate).format("HH:mm"); - } - }} //formatar a data e hora do selected date - display={Platform.OS === "ios" ? "spinner" : "default"} - onChange={Platform.OS === "ios" ? onChange : androidOnChange} - /> - ); - }; - + console.log("date " + props.date + " time " + props.time) return ( - setShow(true)}> + { - {" "}{date.format("DD/MM/YYYY")} {" | "} {time.format("HH:mm")} + {" "} + {props.date.format("DD/MM/YYYY")} {" | "}{" "} + {props.time.format("HH:mm")} - {(props.subtitle ? props.subtitle : " Defina a data do evento")} + {props.subtitle ? props.subtitle : " Defina a data do evento"} - {Platform.OS !== "ios" && show && renderDatePicker()} - - {Platform.OS === "ios" && show && ( - setShow(false)} - > - - setShow(false)} - > - console.log("datepicker clicked")} - > - - {renderDatePicker()} - onCancelPress()} - style={[styles.btnText, styles.btnCancel]} - > - Cancelar - - onDonePress()} - style={[styles.btnText, styles.btnDone]} - > - Confirmar - - - - - - - )} - + ); }; -FormDatePicker.defaultProps = { - textStyle: {}, - defaultDate: moment(), - onDateChange: () => { }, - onTimeChange: () => { }, -}; - const styles = StyleSheet.create({ - btnCancel: { - left: 0, - }, - btnDone: { - right: 0, - }, - btnText: { - position: "absolute", - top: 0, - height: 42, - paddingHorizontal: 20, - flexDirection: "row", - alignItems: "center", - justifyContent: "center", - }, dateInput: { paddingLeft: 16, height: "100%",