diff --git a/package.json b/package.json index 7aeffd45..10918a7a 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@freakycoder/react-native-header-view": "^1.2.0", "@gorhom/bottom-sheet": "^4.4.3", "@react-native-async-storage/async-storage": "^1.17.10", + "@react-native-community/datetimepicker": "6.2.0", "@react-native-masked-view/masked-view": "0.2.7", "@react-navigation/native": "^6.0.13", "@react-navigation/stack": "^6.3.2", @@ -41,6 +42,7 @@ "react-native-app-intro-slider": "^4.0.4", "react-native-gesture-handler": "~2.5.0", "react-native-imaged-card-view": "^0.0.11", + "react-native-modal-datetime-picker": "^14.0.1", "react-native-maps": "0.31.1", "react-native-reanimated": "~2.9.1", "react-native-safe-area-context": "4.3.1", @@ -75,4 +77,4 @@ "@react-navigation/core": "~6.2.2" }, "private": true -} +} \ No newline at end of file diff --git a/src/components/FreeClass/DateTimePicker/DateTimeBox.tsx b/src/components/FreeClass/DateTimePicker/DateTimeBox.tsx new file mode 100644 index 00000000..7b5bc170 --- /dev/null +++ b/src/components/FreeClass/DateTimePicker/DateTimeBox.tsx @@ -0,0 +1,39 @@ +import React, { FC } from "react" +import { View } from "react-native" +import { Text } from "components/Text" +import { usePalette } from "utils/colors" + +export interface DateTimeBoxProps { + value?: string +} +/** + * custom box which contains a 2 digit number, used + * inside {@link DateTimePicker} + */ +export const DateTimeBox: FC = props => { + const { isLight } = usePalette() + return ( + + + {props.value} + + + ) +} diff --git a/src/components/FreeClass/DateTimePicker/DateTimePicker.tsx b/src/components/FreeClass/DateTimePicker/DateTimePicker.tsx new file mode 100644 index 00000000..4fba75f2 --- /dev/null +++ b/src/components/FreeClass/DateTimePicker/DateTimePicker.tsx @@ -0,0 +1,137 @@ +import React, { FC, useState } from "react" +import { Pressable, View } from "react-native" +import { BodyText } from "components/Text" +import { usePalette } from "utils/colors" +import { DateTimeBox } from "./DateTimeBox" +import { destructureDate } from "utils/dates" +import DateTimePickerModal from "react-native-modal-datetime-picker" +import { StyleSheet } from "react-native" +export interface DateTimePickerProps { + date: Date + setDate: (date: Date) => void +} + +/** + * custom DateTime picker + */ +export const DateTimePicker: FC = props => { + const { year, month, day, hour, minute } = destructureDate(props.date) + const { isLight, primary } = usePalette() + + const [isDatePickerVisible, setDatePickerVisibility] = useState(false) + + //there would be also "date-time" but we don't use it + const [dateMode, setDateMode] = useState<"date" | "time">("date") + + const showDatePicker = () => { + setDateMode("date") + setDatePickerVisibility(true) + } + + const showTimePicker = () => { + setDateMode("time") + setDatePickerVisibility(true) + } + + const hideDateOrTimePicker = () => { + setDatePickerVisibility(false) + } + + const handleConfirm = (date: Date) => { + hideDateOrTimePicker() + props.setDate(date) + } + return ( + + + + + Data + + + + + + . + + + + . + + + + + + Ora + + + + + + : + + + + + + + ) +} + +const styles = StyleSheet.create({ + dot: { + alignSelf: "flex-end", + marginHorizontal: 4, + fontSize: 14, + }, + colon: { alignSelf: "center", marginHorizontal: 4, fontSize: 14 }, +}) diff --git a/src/pages/FreeClass/CampusChoice.tsx b/src/pages/FreeClass/CampusChoice.tsx index 7f551ba3..ff7b8c87 100644 --- a/src/pages/FreeClass/CampusChoice.tsx +++ b/src/pages/FreeClass/CampusChoice.tsx @@ -4,6 +4,7 @@ import { View, Pressable, FlatList } from "react-native" import { usePalette } from "utils/colors" import { NavBar } from "components/NavBar" import { Title, BodyText } from "components/Text" +import { DateTimePicker } from "components/FreeClass/DateTimePicker/DateTimePicker" export interface CampusItem { id: number @@ -22,6 +23,10 @@ export const CampusChoice: RootStackScreen<"CampusChoice"> = () => { { id: 4, name: ["Mancinelli"] }, ]) + //non-ISO format for simplicity (local timezone) and + // compatibility with `handleConfirm` function + const [date, setDate] = useState(new Date()) + return ( = () => { > Campus - - Data Picker - + setDate(date)} + />