import DateTimePicker, { DateTimePickerEvent, IOSNativeProps, } from '@react-native-community/datetimepicker'; import SegmentedControl from '@react-native-segmented-control/segmented-control'; import moment from 'moment'; import React, { useRef, useState } from 'react'; import { SafeAreaView, ScrollView, StyleSheet, View, Text, StatusBar, Platform, TextInput, useColorScheme, Switch, TextProps, TextInputProps, Button, } from 'react-native'; import { Colors } from 'react-native/Libraries/NewAppScreen'; export const DAY_OF_WEEK = Object.freeze({ Sunday: 0, Monday: 1, Tuesday: 2, Wednesday: 3, Thursday: 4, Friday: 5, Saturday: 6, }); const ThemedText = (props: TextProps) => { const isDarkMode = useColorScheme() === 'dark'; const textColorByMode = { color: isDarkMode ? Colors.white : Colors.black }; const TextElement = React.createElement(Text, props); return React.cloneElement(TextElement, { style: [props.style, textColorByMode], }); }; const ThemedTextInput = (props: TextInputProps) => { const isDarkMode = useColorScheme() === 'dark'; const textColorByMode = { color: isDarkMode ? Colors.white : Colors.black }; const TextElement = React.createElement(TextInput, props); return React.cloneElement(TextElement, { style: [props.style, styles.textInput, textColorByMode], placeholderTextColor: isDarkMode ? Colors.white : Colors.black, }); }; type Mode = NonNullable; const MODE_VALUES = Platform.select({ ios: ['date', 'time', 'datetime', 'countdown'], android: ['date', 'time'], }) as Mode[]; const DISPLAY_VALUES = Platform.select({ ios: ['default', 'spinner', 'compact', 'inline'], android: ['default', 'spinner'], })! as ['default', 'spinner']; type MinuteInterval = NonNullable; const MINUTE_INTERVALS: MinuteInterval[] = [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30]; // This example is a refactored copy from https://github.com/react-native-community/react-native-datetimepicker/tree/master/example // Please try to keep it up to date when updating @react-native-community/datetimepicker package :) const DateTimePickerScreen = () => { // Sat, 13 Nov 2021 10:00:00 GMT (local: Saturday, November 13, 2021 11:00:00 AM GMT+01:00) const sourceMoment = moment.unix(1636797600); const sourceDate = sourceMoment.local().toDate(); const [show, setShow] = useState(false); const [date, setDate] = useState(sourceDate); const [mode, setMode] = useState(MODE_VALUES[0]); const [textColor, setTextColor] = useState(); const [accentColor, setAccentColor] = useState(); const [display, setDisplay] = useState<'default' | 'spinner'>(DISPLAY_VALUES[0]); const [interval, setMinInterval] = useState(1); const [neutralButtonLabel, setNeutralButtonLabel] = useState(); const [disabled, setDisabled] = useState(false); const [neutralButtonPressed, setNeutralButtonPressed] = useState(false); const scrollRef = useRef(null); const onChange = (event: DateTimePickerEvent, selectedDate?: Date | undefined) => { if (Platform.OS === 'android') { setShow(false); } const currentDate = selectedDate || date; if (event.type === 'neutralButtonPressed') { setNeutralButtonPressed(true); setDate(new Date()); } else { setNeutralButtonPressed(false); setDate(currentDate); } }; const isDarkMode = useColorScheme() === 'dark'; const backgroundStyle = { backgroundColor: isDarkMode ? Colors.dark : Colors.lighter, }; return ( { if (Platform.OS === 'ios') { scrollRef.current?.scrollToEnd({ animated: true }); } }}> {/* @ts-expect-error */} {global.HermesInternal != null && ( Engine: Hermes )} mode prop: { setMode(MODE_VALUES[event.nativeEvent.selectedSegmentIndex]); }} /> display prop: { setDisplay(DISPLAY_VALUES[event.nativeEvent.selectedSegmentIndex]); }} /> minute interval prop: { setMinInterval(MINUTE_INTERVALS[event.nativeEvent.selectedSegmentIndex]); }} /> {Platform.OS === 'ios' && ( <> text color (iOS only) { setTextColor(text.toLowerCase()); }} placeholder="textColor" /> accent color (iOS only) { setAccentColor(text.toLowerCase()); }} placeholder="accentColor" /> disabled (iOS only) )} {Platform.OS === 'android' && ( neutralButtonLabel (android only) )}