Pop quiz, hotshot:
Вы создаете собственное приложение реакции. Вы устанавливаете некоторые значения для firebase как объекта в root вашего приложения, например:
firebase
.database()
.ref("/companies/")
.set({
awesomeCompany: {
name: "Awesome Company",
owner: "Joe Awesome",
gmail: "joeawesome@gmail.com",
fleetSize: 2
},
badCompany: {
name: "Bad Company",
owner: "Joe Bad",
gmail: "joebad@gmail.com",
fleetSize: 3
}
Вы хотите дать текущему пользователю поле для ввода текста, через которое он может изменить fleetSize компания, если они являются владельцем этой компании.
У вас есть аутентификация firebase, работающая должным образом, поэтому вы знаете, что firebase.auth().currentUser.email
будет работать для проверки, чтобы определить, являются ли они владельцем.
Значения вашей базы данных установлены - они выглядят так:
{
"companies": {
"awesomeCompany": {
"fleetSize": 2,
"gmail": "joeawesome@gmail.com",
"name": "Awesome Company",
"owner": "Joe Awesome"
},
"badCompany": {
"fleetSize": 3,
"gmail": "joebad@gmail.com",
"name": "Bad Company",
"owner": "Joe Bad"
}
}
}
Как бы вы отобразили исходную информацию на экране и как вы настроили бы логи ввода текста c чтобы пользовательский ввод изменял данные в базе данных?
Чтобы понять мой мозг и то, как я терплю неудачу, я включаю свой собственный код ниже в качестве отправной точки. Если есть способ показать мне, как я могу взять свою базовую стратегию c и заставить ее работать - даже если она не элегантна - я был бы признателен за это. Но в целом я просто очень борюсь с тем, как получить ссылки на пути к данным с помощью моментального снимка данных и сохранить их доступными для использования в других местах.
Спасибо за помощь, всем!
// my crummy half baked code below
import React, { Component } from "react";
import { View, Text, TextInput, Button } from "react-native";
import { styles } from "../styles";
import * as firebase from "firebase";
export default class OwnerProfileScreen extends React.Component {
constructor(props) {
super(props);
this.state = {
gmail: null,
name: null,
fleetSize: null
};
}
componentDidMount() {
this.getData();
}
getData = () => {
const rootRef = firebase.database().ref(); // firebase reference
const authEmail = firebase.auth().currentUser.email; // current user
return rootRef.once("value").then(
function(snapshot) {
const idArray = Object.keys(snapshot.child("companies/").val()); // array of Ids
const companyData = idArray.map(id =>
snapshot.child("companies/" + id).val()
); // values of contained in objects at each key
const ownersCompany = companyData.filter(
obj => obj.gmail === authEmail
); // an array containing one object if the gmail address in the object is the same as the currentUser logged in
// what is the path of fleetSize?
// how do I define it to keep it available to use later
// with a Text Input event?
this.setState({
name: ownersCompany[0].name,
gmail: ownersCompany[0].gmail,
fleetSize: ownersCompany[0].fleetSize
});
}.bind(this)
);
};
changeFleetSize = userInput => {
//in order to set the user input to the database, I need the path
//of the fleetSize of the current user (who has been verified as an
// owner by comparing firebase auth to gmail addresses of company)
};
render() {
return (
<View style={styles.container}>
<Text>minPrice = {this.state.name}</Text>
<Text>gmail = {this.state.gmail}</Text>
<Text>fleetSize = {this.state.fleetSize}</Text>
<TextInput
style={{ height: 40, borderColor: "gray", borderWidth: 1 }}
//onChangeText currently does nothing since I don't know how
// to get the particular path of particular fleetSize
onChangeText={userInput => this.changeFleetSize(userInput)}
/>
</View>
);
}
}