diff --git a/app/(application)/(user)/event/create.tsx b/app/(application)/(user)/event/create.tsx index 6e21b09..84daa3e 100644 --- a/app/(application)/(user)/event/create.tsx +++ b/app/(application)/(user)/event/create.tsx @@ -1,40 +1,43 @@ -/* eslint-disable import/no-duplicates */ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { - BoxButtonOnFooter, - ButtonCustom, - SelectCustom, - Spacing, - StackCustom, - TextAreaCustom, - TextCustom, - TextInputCustom, - ViewWrapper, + BoxButtonOnFooter, + ButtonCustom, + SelectCustom, + StackCustom, + TextAreaCustom, + TextInputCustom, + ViewWrapper, } from "@/components"; -import DateTimeInput from "@/components/DateInput/DateTimeIOS"; import DateTimePickerCustom from "@/components/DateInput/DateTimePickerCustom"; import { masterTypeEvent } from "@/lib/dummy-data/event/master-type-event"; import { DateTimePickerEvent } from "@react-native-community/datetimepicker"; import React, { useState } from "react"; -import { Platform, StyleSheet } from "react-native"; +import { Platform } from "react-native"; export default function EventCreate() { - const [selectedDateIOS, setSelectedDateIOS] = useState(); - const [selectDateAndroid, setSelectDateAndroid] = useState(new Date()); - const [selectedTimeAndroid, setSelectedTimeAndroid] = useState( - new Date() - ); + const [selectedDate, setSelectedDate] = useState< + Date | DateTimePickerEvent | null + >(null); + + const [selectedEndDate, setSelectedEndDate] = useState< + Date | DateTimePickerEvent | null + >(null); const handlerSubmit = () => { - console.log("Simpan"); - const combined = new Date(selectDateAndroid); - combined.setHours(selectedTimeAndroid.getHours()); - combined.setMinutes(selectedTimeAndroid.getMinutes()); - combined.setSeconds(selectedTimeAndroid.getSeconds()); - combined.setMilliseconds(selectedTimeAndroid.getMilliseconds()); + if (selectedDate) { + console.log("Tanggal yang dipilih:", selectedDate); + console.log(`ISO Format ${Platform.OS}:`, selectedDate.toString()); + // Kirim ke API atau proses lanjutan + } else { + console.warn("Tanggal belum dipilih"); + } - const newDate = Platform.OS === "ios" ? selectedDateIOS : combined; - console.log(`newDate ${Platform.OS} > `, newDate); + if (selectedEndDate) { + console.log("Tanggal yang dipilih:", selectedEndDate); + console.log(`ISO Format ${Platform.OS}:`, selectedEndDate.toString()); + // Kirim ke API atau proses lanjutan + } else { + console.warn("Tanggal belum dipilih"); + } }; const buttonSubmit = ( @@ -43,39 +46,9 @@ export default function EventCreate() { ); - const time = () => { - return ( - <> - {Platform.OS === "ios" ? ( - { - setSelectedDateIOS(date); - }} - required - /> - ) : ( - { - setSelectDateAndroid(date); - }} - onChangeTime={(time: Date) => { - setSelectedTimeAndroid(time); - }} - /> - )} - - ); - }; - return ( <> - Test Datetime - - {time()} + { + setSelectedDate(date as any); + }} + value={selectedDate as any} + minimumDate={new Date(Date.now())} + /> + + { + setSelectedEndDate(date as any); + }} + value={selectedEndDate as any} + /> ); } - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: "center", - // padding: 20, - }, -}); diff --git a/components/DateInput/DataTimeAndroid.tsx b/components/DateInput/DataTimeAndroid.tsx new file mode 100644 index 0000000..aafd1a2 --- /dev/null +++ b/components/DateInput/DataTimeAndroid.tsx @@ -0,0 +1,205 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +// DateTimeInput.tsx +import { MainColor } from "@/constants/color-palet"; +import { GStyles } from "@/styles/global-styles"; +import { Ionicons } from "@expo/vector-icons"; +import DateTimePicker, { + DateTimePickerEvent, +} from "@react-native-community/datetimepicker"; +import React, { useCallback, useState } from "react"; +import { Pressable, StyleProp, Text, View, ViewStyle } from "react-native"; +import Grid from "../Grid/GridCustom"; +import TextCustom from "../Text/TextCustom"; + +interface DateTimeInputProps { + // Main + value?: DateTimePickerEvent; + mode?: "date" | "time"; + onChange: (selectedDate: DateTimePickerEvent) => void; + maximumDate?: Date; + minimumDate?: Date; + // Main + label?: string; + required?: boolean; + disabled?: boolean; + iconLeft?: React.ReactNode; + style?: StyleProp; + borderRadius?: number; + externalError?: string; + internalError?: string; + containerStyle?: StyleProp; +} + +const DateTimeInput_Android: React.FC = ({ + // Main + value, + mode, + onChange, + maximumDate, + minimumDate, + // Main + label, + required, + disabled, + iconLeft, + style, + borderRadius = 8, + externalError, + internalError, + containerStyle, +}) => { + const [showDate, setShowDate] = useState(false); + const [showTime, setShowTime] = useState(false); + const [selectedDate, setSelectedDate] = useState(value as any); + const [selectedTime, setSelectedTime] = useState(value as any); + + // Fungsi untuk menggabungkan tanggal dan waktu + const combineDateAndTime = useCallback((date: Date, time: Date): Date => { + const combined = new Date(date); + combined.setHours( + time.getHours(), + time.getMinutes(), + time.getSeconds(), + time.getMilliseconds() + ); + return combined; + }, []); + + // Handler untuk tanggal + const handleConfirmDate = (event: DateTimePickerEvent, date?: Date) => { + if (event.type === "set" && date) { + setSelectedDate(date); + if (selectedTime) { + const combined = combineDateAndTime(date, selectedTime); + onChange?.(combined as any); + } + } + setShowDate(false); + }; + + // Handler untuk waktu + const handleConfirmTime = (event: DateTimePickerEvent, time?: Date) => { + if (event.type === "set" && time) { + setSelectedTime(time); + if (selectedDate) { + const combined = combineDateAndTime(selectedDate, time); + onChange?.(combined as any); + } + } + setShowTime(false); + }; + + const toggleDatePicker = () => { + setShowDate(!showDate); + }; + + const toggleTimePicker = () => { + setShowTime(!showTime); + }; + + return ( + <> + + {label && ( + + {label} + {required && *} + + )} + + + + + + + + + + {selectedDate ? ( + + {selectedDate.toLocaleDateString()} + + ) : ( + "Pilih tanggal" + )} + + + + + | + + + + + + {selectedTime ? ( + + {selectedTime.toLocaleTimeString("id-ID", { + minute: "2-digit", + hour: "2-digit", + })} + + ) : ( + "Pilih waktu" + )} + + + + + + {externalError || + (internalError && ( + + {externalError || internalError} + + ))} + + + {showDate && ( + + )} + + {showTime && ( + + )} + + ); +}; + +export default DateTimeInput_Android; diff --git a/components/DateInput/DateTimeIOS.tsx b/components/DateInput/DateTimeIOS.tsx index eff0cf5..b27a765 100644 --- a/components/DateInput/DateTimeIOS.tsx +++ b/components/DateInput/DateTimeIOS.tsx @@ -1,35 +1,28 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ // DateTimeInput.tsx +import { MainColor } from "@/constants/color-palet"; +import { GStyles } from "@/styles/global-styles"; +import { Ionicons } from "@expo/vector-icons"; import DateTimePicker, { - DateTimePickerEvent, + DateTimePickerEvent, } from "@react-native-community/datetimepicker"; +import dayjs from "dayjs"; import React, { useState } from "react"; import { - Button, - Platform, - Text, - TouchableOpacity, - View, - StyleProp, - ViewStyle, + StyleProp, + Text, + View, + ViewStyle } from "react-native"; -import ButtonCustom from "../Button/ButtonCustom"; -import TextCustom from "../Text/TextCustom"; -import dayjs from "dayjs"; -import TextInputCustom from "../TextInput/TextInputCustom"; -import { GStyles } from "@/styles/global-styles"; -import ButtonCenteredOnly from "../Button/ButtonCenteredOnly"; -import Spacing from "../_ShareComponent/Spacing"; -import Grid from "../Grid/GridCustom"; -import { Ionicons } from "@expo/vector-icons"; import ClickableCustom from "../Clickable/ClickableCustom"; -import { AccentColor, MainColor } from "@/constants/color-palet"; +import TextCustom from "../Text/TextCustom"; interface DateTimeInputProps { // Main value?: DateTimePickerEvent; mode?: "date" | "time"; onChange: (selectedDate: DateTimePickerEvent) => void; + maximumDate?: Date; + minimumDate?: Date; // Main label?: string; required?: boolean; @@ -42,11 +35,13 @@ interface DateTimeInputProps { containerStyle?: StyleProp; } -const DateTimeInput: React.FC = ({ +const DateTimeInput_IOS: React.FC = ({ // Main value, mode, onChange, + maximumDate, + minimumDate, // Main label, required, @@ -153,7 +148,8 @@ const DateTimeInput: React.FC = ({ mode={"datetime"} display="inline" onChange={handleConfirm} - minimumDate={new Date(Date.now())} // 30 days from now + minimumDate={minimumDate} + maximumDate={maximumDate} /> @@ -162,4 +158,4 @@ const DateTimeInput: React.FC = ({ ); }; -export default DateTimeInput; +export default DateTimeInput_IOS; diff --git a/components/DateInput/DateTimePickerCustom.tsx b/components/DateInput/DateTimePickerCustom.tsx index d65d8b9..9a4814a 100644 --- a/components/DateInput/DateTimePickerCustom.tsx +++ b/components/DateInput/DateTimePickerCustom.tsx @@ -1,143 +1,54 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import React, { useState } from "react"; -import { Pressable, Text, View, StyleSheet } from "react-native"; -import DateTimePicker, { + +import { DateTimePickerEvent, } from "@react-native-community/datetimepicker"; -import { GStyles } from "@/styles/global-styles"; -import { TEXT_SIZE_MEDIUM } from "@/constants/constans-value"; -import { MainColor } from "@/constants/color-palet"; -import Grid from "../Grid/GridCustom"; -import TextCustom from "../Text/TextCustom"; +import React from "react"; +import { Platform } from "react-native"; +import DateTimeInput_Android from "./DataTimeAndroid"; +import DateTimeInput_IOS from "./DateTimeIOS"; type Props = { - dateValue?: Date; - timeValue?: Date; - onChangeDate: (date: Date) => void; - onChangeTime: (time: Date) => void; + value?: Date; + onChange?: (date: Date) => void; + label?: string; + required?: boolean; + maximumDate?: Date; + minimumDate?: Date; }; const DateTimePickerCustom: React.FC = ({ - dateValue, - timeValue, - onChangeDate, - onChangeTime, + value, + onChange, + label, + required, + maximumDate, + minimumDate, }) => { - const [showDate, setShowDate] = useState(false); - const [showTime, setShowTime] = useState(false); - - const toggleDatePicker = () => { - setShowDate(!showDate); - }; - - const toggleTimePicker = () => { - setShowTime(!showTime); - }; - - const handleConfirmDate = ( - event: DateTimePickerEvent, - selectedDate?: Date - ) => { - if (event.type === "set" && selectedDate !== undefined) { - onChangeDate(selectedDate); - } - setShowDate(false); - }; - - const handleConfirmTime = ( - event: DateTimePickerEvent, - selectedTime?: Date - ) => { - if (event.type === "set" && selectedTime !== undefined) { - onChangeTime(selectedTime); - } - setShowTime(false); - }; - return ( <> - {/* - - {value ? value.toLocaleDateString() : "Pilih tanggal"} - - */} - - - { + onChange?.(date as any); }} - > - - - - {dateValue ? dateValue.toLocaleDateString() : "Pilih tanggal"} - - - - - | - - - - - - {timeValue ? timeValue.toLocaleTimeString("id-ID", { minute: "2-digit", hour: "2-digit" }) : "Pilih waktu"} - - - - - - - {showDate && ( - - )} - - {showTime && ( - { + onChange?.(date as any); + }} + required={required} + maximumDate={maximumDate} + minimumDate={minimumDate} /> )} ); }; -const styles = StyleSheet.create({ - button: { - paddingVertical: 12, - paddingHorizontal: 20, - backgroundColor: "#007AFF", - borderRadius: 8, - alignItems: "center", - justifyContent: "center", - marginVertical: 10, - }, - buttonText: { - color: MainColor.black, - fontSize: TEXT_SIZE_MEDIUM, - // fontWeight: "bold", - }, -}); - export default DateTimePickerCustom;