Это код, который отправляет и получает данные от firebase соответственно.
class Fire {
addAppointment(currentDate, addComplete) {
firebase.firestore()
.collection("appointment")
.add({
date: currentDate.date,
createdAt: firebase.firestore.FieldValue.serverTimestamp()
}).then((snapshot) => snapshot.get())
.then((dateInfo) => addComplete(dateInfo.data()))
.catch((error) => alert(error));
}
getAppointment = async ({ dateRetreived }) => {
var dateList = [];
var snapshot = await firebase.firestore()
.collection("appointment")
.orderBy('createdAt')
.get()
snapshot.forEach((doc) => {
const dateCreated = doc.data();
dateCreated.id = doc.id;
dateList.push(dateCreated);
});
dateRetreived(dateList);
}
}
Fire.shared = new Fire();
export default Fire;
Это код datetimepicker, который отправляет "currentDate" в приведенный выше код. Обратите внимание, что onChange был изменен на handleChange.
class Booking extends Component {
state = {
isDatePickerVisible: false,
date: new Date(),
};
showDateTimePicker = () => {
this.setState({
isDatePickerVisible: true
})
}
hideDateTimePicker = () => {
this.setState({
isDatePickerVisible: false
})
}
handleChange = (event, selectedDate) => {
const currentDate = selectedDate || date;
this.setState(prevState => ({
currentDate: prevState.currentDate = currentDate
}));
};
render() {
return (
<View>
<View style={styles.picker}>
<Button
title="Show Date Picker" onPress={this.showDateTimePicker}
/>
<DateTimePicker
cancelTextIOS={'Exit'}
confirmTextIOS={'OK'}
isVisible={this.state.isDatePickerVisible}
mode="date"
onConfirm={this.handleChange}
onCancel={this.hideDateTimePicker}
is24Hour={false}
/>
</View>
<View style={styles.btn} >
<Button
onPress={() =>
Fire.shared.addAppointment(this.handleChange)
}
title="Book"
/>
</View>
</View>
)
};
};
export default Booking;
Я получаю сообщение об ошибке:
FirebaseError: функция documentReference.set () вызывается с недопустимыми данными. неподдерживаемое значение поля: undefined (найдено в поле date)
Я внес несколько изменений в код:
addAppointment(currentDate, addComplete) {
firebase.firestore()
.collection("appointment")
.add({
date: firebase.firestore.Timestamp.fromDate(new Date(currentDate)),
...
}
И в состоянии:
state = {
isDatePickerVisible: false,
Date: new Date(1598051730000),
};
При обработке изменений
handleChange = (event, selectedDate) => {
const currentDate = selectedDate || Date;
this.setState(prevState => ({
currentDate: prevState.currentDate = currentDate
}));
};
На DateTimePicker
onConfirm={this.handleChange}
При нажатии кнопки «Книга»
<Button onPress={() => {Fire.shared.addAppointment(this.handleChange)}}
title="Book"
/>
Я не получаю ReferenceError: date is not defined
после выбора даты. Когда я нажимаю BOOK, ошибок не происходит и данные в Cloud Firestore не отображаются.