React Native DateTimePickerModal from "react-native-modal-datetime-picker" Not letting me add 2 DateTime picker in one component - react-native

I need to add 2 DateTimePicker to my component in my React-native app. But only one work even if i add 2. I can open each datetimepicker but only one value change that is the top one. So can select bottom one and will only change the top value. See the code below
import React, { useState } from 'react';
import { Button, View, Text } from 'react-native';
import DateTimePickerModal from 'react-native-modal-datetime-picker';
import moment from 'moment';
const Example = () => {
const [selectedDate, setSelectedDate] = useState();
const [selectedDate1, setSelectedDate1] = useState();
const [isDatePickerVisible, setDatePickerVisibility] = useState(false);
const showDatePicker = () => {
setDatePickerVisibility(true);
};
const hideDatePicker = () => {
setDatePickerVisibility(false);
};
const handleConfirm = (date) => {
setSelectedDate(date);
hideDatePicker();
};
const handleConfirm1 = (date) => {
setSelectedDate1(date);
hideDatePicker();
};
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>{`Date: ${selectedDate? moment(selectedDate).format("MM/DD/YYYY"):"Please select date"}`}</Text>
<Button title="Show Date Picker" onPress={showDatePicker} />
<DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
onConfirm={handleConfirm}
onCancel={hideDatePicker}
/>
<Text>{`Date: ${selectedDate1? moment(selectedDate1).format("MM/DD/YYYY"):"Please select date"}`}</Text>
<Button title="Show Date Picker" onPress={showDatePicker} />
<DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
onConfirm={handleConfirm1}
onCancel={hideDatePicker}
/>
</View>
);
};
export default Example;
So I am wondering if it is even possible to add 2 DateTimePicker into one component?

It looks like there is only 1 state handling the opening of the pickers which is causing the first to open each time
const [isDatePickerVisibleOne, setDatePickerVisibilityOne] = useState(false)
const [isDatePickerVisibleTwo, setDatePickerVisibilityTwo] = useState(false)

Related

How can I store multiple data using asyncstorage in React Native?

I have used the asyncstorage for storing the data but I think it's storing only one entry at a time that's because when I tried to print the value it only showed the last signup details and the too only on console instead of screen.
What I want:
Store data of all the users.
Print all the details on the screen.
Due to formatting issue I was not able to attach the code. Please check my code on this link.
Async storage isnt really meant for state management. Its for having data that will persist between app opens and closes. Some examples of this is using it to save a user auth token, or to keep track of the user defined settings.
Here's a quick demo
import { useState, useEffect } from 'react';
import { Text, View, StyleSheet } from 'react-native';
import { TextInput, Button } from 'react-native-paper';
import Constants from 'expo-constants';
import AsyncStorage from '#react-native-async-storage/async-storage';
const someDataKey = '#someData';
export default function App() {
const [someData, setSomeData] = useState({
token: null,
userId: null,
expiresAt: '',
});
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const submit = () => {
// fake server call to get token
setSomeData({
token:getRandomChars(50),
userId:Math.floor(Math.random()*1000)+1,
expiresAt:Date.now()+60*60*24*4
})
};
useEffect(() => {
const getData = async () => {
const dataAsString = await AsyncStorage.getItem(someDataKey);
if (dataAsString) setSomeData(JSON.parse(someData));
};
getData();
}, []);
useEffect(()=>{
AsyncStorage.setItem(someDataKey,JSON.stringify(someData))
},[someData])
return (
<View style={styles.container}>
{!someData.token ? (
<>
<TextInput
value={email}
label="Enter email"
onChangeText={setEmail}
style={styles.input}
dense
/>
<TextInput
value={password}
label="Password"
onChangeText={setPassword}
style={styles.input}
dense
/>
<Button onPress={submit}>Login</Button>
</>
) : (
<>
<Text>Last session retrieved</Text>
<Text>Token:{someData.token}</Text>
<Text>User ID:{someData.userId}</Text>
<Button onPress={()=>{
setSomeData({})
}}>Reset data</Button>
</>
)}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
},
input: {
marginBottom: 10,
},
});
const getRandomChars = (len=20)=>{
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
let str =''
while(str.length <len){
const index = Math.floor(Math.random()*chars.length)
str+=chars[index]
}
return str
}
Before the data was saved to storage, reloading the page would show the login form; but once the data is set, the data is retrieved, omitting the login part

how to set default value as selected date in text filed after selcted

i am trying to make a date piker i am able to open the date picker and delect date but i am not able to dispaly the picked date in the input fild 1s a date is selected
const [text, setpicdate] = useState(); //date is slected here
const [mydate, setDate] = useState(new Date());
const [displaymode, setMode] = useState('date');
const [isDisplayDate, setShow] = useState(false);
const changeSelectedDate = (event, selectedDate) => {
setDate(selectedDate);
setpicdate(selectedDate);
setShow(false);
};
const showMode = currentMode => {
setShow(true);
setMode(currentMode);
};
const displayDatepicker = () => {
showMode('date');
};
<TextInput
style={styles.forminput}
label="Baby's Date of Birth"
defaultValue={text} // displaying date error
onPressIn={displayDatepicker}
// onclick={displayDatepicker}
/>
{isDisplayDate && (
<DateTimePicker
testID="dateTimePicker"
value={mydate}
mode={displaymode}
is24Hour={true}
display="default"
// onDateChange={text => {
// setTextname(text);
// }}
// // onChange={text => changeSelectedDate()}
onChange={changeSelectedDate}
/>
)}
Replace your TextInput by
<TouchableOpacity onPress={displayDatepicker}>
<Text>{moment(mydate).format('DD/MM/YYYY')}</Text>
</TouchableOpacity>
use moment js npm package for dates formatting and validation
https://www.npmjs.com/package/moment
Update Your code Like this, it will work.
import DateTimePicker from '#react-native-community/datetimepicker';
import React, {useState} from 'react';
import {SafeAreaView, StyleSheet, TextInput} from 'react-native';
export default function Test() {
const [mydate, setDate] = useState(new Date());
const [displaymode, setMode] = useState('time');
const [text, setpicdate] = useState(new Date());
const [isDisplayDate, setShow] = useState(false);
const changeSelectedDate = (event, selectedDate) => {
setpicdate(selectedDate);
setShow(false);
};
const showMode = currentMode => {
setShow(true);
setMode(currentMode);
};
const displayTimepicker = () => {
showMode('date');
};
return (
<SafeAreaView style={styles.container}>
<TextInput
onFocus={displayTimepicker}
defaultValue={mydate.toDateString()}
value={text.toDateString()}
style={{backgroundColor: 'lightgray', height: 50, width: '70%'}}
label="Baby's Date of Birth"
/>
{isDisplayDate && (
<DateTimePicker
testID="dateTimePicker"
value={mydate}
mode={displaymode}
is24Hour={true}
display="default"
onChange={changeSelectedDate}
/>
)}
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});

how can i display the selected time from a timepicker in a textinput react native

I used this timepicker my objective is to select a time from the picker and display it in my text inputs everything is working fine up until I select the time it won't show and gives me an error that text input value has to be a string can anyone tell me what I'm doing wrong here is my code so far
import React, { useState } from 'react';
import { View, TextInput, Text, Platform, Button } from 'react-native';
import DateTimePickerModal from 'react-native-modal-datetime-picker';
const AttendanceMain = () => {
const [showPicker, setShowPicker] = useState(false);
const [selectedTime, setSelectedTime] = useState('');
const showTimePicker = () => {
setShowPicker(true);
};
const hideTimePicker = () => {
setShowPicker(false);
};
const handleConfirm = (time) => {
setSelectedTime(time);
hideTimePicker();
};
return (
<View>
<Text>From:</Text>
<TextInput
placeholder="00:00"
keyboardType="numeric"
onFocus={showTimePicker}
value={selectedTime}
onChange={handleConfirm}
/>
<Text>To:</Text>
<TextInput
placeholder="00:00"
keyboardType="numeric"
onFocus={showTimePicker}
value={selectedTime}
onChange={handleConfirm}
/>
<DateTimePickerModal
isVisible={showPicker}
mode="time"
is24Hour={true}
onConfirm={handleConfirm}
onCancel={hideTimePicker}
/>
</View>
);
};
export default AttendanceMain;
Why don't you use react-native-datetimepicker/datetimepicker
Working Example
and Implement it like this
import React, { useState } from 'react';
import { View, Button, Platform, Text, TextInput } from 'react-native';
import DateTimePicker from '#react-native-community/datetimepicker';
const App = () => {
const [From, setFrom] = useState(new Date());
const [To, setTo] = useState(new Date());
const [mode, setMode] = useState('date');
const [show, setShow] = useState(false);
const [currentSetting, setcurrentSetting] = useState('from');
const onChange = (event, selectedDate) => {
if (currentSetting === 'from') {
const currentDate = selectedDate || From;
setShow(Platform.OS === 'ios');
setFrom(currentDate);
} else {
const currentDate = selectedDate || To;
setShow(Platform.OS === 'ios');
setTo(currentDate);
}
};
const showTimepicker = (current) => {
setShow(true);
setcurrentSetting(current);
};
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<View>
<Text>From:</Text>
<TextInput
placeholder="00:00"
keyboardType="numeric"
onFocus={() => showTimepicker('from')}
value={From.toLocaleTimeString()}
/>
<Text>To:</Text>
<TextInput
placeholder="00:00"
keyboardType="numeric"
onFocus={() => showTimepicker('to')}
value={To.toLocaleTimeString()}
/>
</View>
{show && (
<DateTimePicker
testID="dateTimePicker"
value={From}
mode={'time'}
is24Hour={true}
display="default"
onChange={onChange}
/>
)}
</View>
);
};
export default App;

How to show selected date and time in textinput in react native?

Im very new to React native. Im using react-native-community/datetimepicker library and I find it very confusing. Below is my code, what should I add to make it functional and show selected date and time in screen? I would appreciate your help!
import React, {useState} from 'react';
import {View, Button, Platform} from 'react-native';
import DateTimePicker from '#react-native-community/datetimepicker';
export const App = () => {
const [date, setDate] = useState(new Date(1598051730000));
const [mode, setMode] = useState('date');
const [show, setShow] = useState(false);
const onChange = (event, selectedDate) => {
const currentDate = selectedDate || date;
setShow(Platform.OS === 'ios');
setDate(currentDate);
};
const showMode = (currentMode) => {
setShow(true);
setMode(currentMode);
};
const showDatepicker = () => {
showMode('date');
};
const showTimepicker = () => {
showMode('time');
};
return (
<View>
<View>
<Button onPress={showDatepicker} title="Show date picker!" />
</View>
<View>
<Button onPress={showTimepicker} title="Show time picker!" />
</View>
{show && (
<DateTimePicker
testID="dateTimePicker"
value={date}
mode={mode}
is24Hour={true}
display="default"
onChange={onChange}
/>
)}
</View>
);
};
You should try saving the selected date\time somewhere and then you can show it anywhere you want. Do something like this:
import React, { useState } from "react";
import { Button, Text, View, StyleSheet, TouchableOpacity } from "react-native";
import DateTimePickerModal from "react-native-modal-datetime-picker"; //install and import
import { SafeAreaView } from "react-native";
export const Picker = () => {
const [selectedDate, setselectedDate] = useState("");
const [selectedTime, setselectedTime] = useState("");
const [isDatePickerVisible, setDatePickerVisibility] = useState(false);
const [isTimePickerVisible, setTimePickerVisibility] = useState(false);
const showDatePicker = () => {
setDatePickerVisibility(true);
};
const hideDatePicker = () => {
setDatePickerVisibility(false);
};
const showTimePicker = () => {
setTimePickerVisibility(true);
};
const hideTimePicker = () => {
setTimePickerVisibility(false);
};
const handleDate = (date) => {
setselectedDate(date.toDateString());
hideDatePicker();
};
const handleTime = (time) => {
setselectedTime(time.toLocaleTimeString());
hideTimePicker();
};
return (
<SafeAreaView>
<View style={styles.container}>
<View>
<Button title="Show Date Picker" onPress={showDatePicker} />
<DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
onConfirm={handleDate}
onCancel={hideDatePicker}
minimumDate={new Date()}
maximumDate={new Date()}
/>
</View>
<View>
<Button title="Show Time Picker" onPress={showTimePicker} />
<DateTimePickerModal
isVisible={isTimePickerVisible}
mode="time"
onConfirm={handleTime}
onCancel={hideTimePicker}
/>
</View>
<View>
<Text>{selectedDate}</Text>
<Text>{selectedTime}</Text>
</View>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
paddingTop: 300,
},
});

How do I find the component position in a functional react-native component

I am trying to dynamically find the position of my component after it has rendered. Im trying to use useRef and getBoundingClientRect() (see code below).
The response I get is this.
myRef.current.getBoundingClientRect is not a function. (In 'myRef.current.getBoundingClientRect()', 'myRef.current.getBoundingClientRect' is undefined).
Any ideas what I am doing wrong?
import React, { useState, useRef } from "react";
import { View, Button, TextInput } from "react-native";
const MyComponent = () => {
const [value, onChangeText] = useState("Useless Placeholder");
const myRef = useRef();
const showRefPosition = () => {
console.log("button clicked, set focus and log position");
// this works and shows that i am using the ref correctly
myRef.current.focus();
// however, this does not work and throws the eror
let componentPosition = myRef.current.getBoundingClientRect();
console.log(`Component Position ${componentPosition}`);
};
return (
<View>
<TextInput
style={{ height: 40, borderColor: "gray", borderWidth: 1 }}
onChangeText={text => onChangeText(text)}
value={value}
ref={myRef}
/>
<Button title="Click Me" onPress={() => showRefPosition()} />
</View>
);
};
export default MyComponent;
You can try measure method in react-native.
import React, { useState, useRef } from "react";
import { View, Button, TextInput } from "react-native";
const MyComponent = () => {
const [value, onChangeText] = useState("Useless Placeholder");
const myRef = useRef();
const showRefPosition = () => {
console.log("button clicked, set focus and log position");
// this works and shows that i am using the ref correctly
this.ref.measure( (width, height) => {
console.log('Component width is: ' + width)
console.log('Component height is: ' + height)
})
};
return (
<View>
<TextInput
style={{ height: 40, borderColor: "gray", borderWidth: 1 }}
onChangeText={text => onChangeText(text)}
value={value}
ref={(ref) => { this.ref = ref; }}
/>
<Button title="Click Me" onPress={() => showRefPosition()} />
</View>
);
};
export default MyComponent;