Как «Получить и обновить данные пользователя и сохранить их в FireBase» с помощью реагировать - PullRequest
0 голосов
/ 04 июля 2019

Я создаю небольшое собственное приложение для реакции, я хочу получить пользовательские данные, которые уже существуют в коллекции 'Users' в firestore, и затем я хочу иметь возможность обновлять эти данные. Но я не смог получить эти данные, и он всегда показывает мне «Объект не определен».

Это компонент профиля пользователя:

//thats the modal component that will handle the update
import UserDetails from '../src/components/userDetails'

//this func to send data to the modal component, but it didn't work!
handleUpdate  = (id, nom, prenom, address) => {
      this.setState(
        {
          id:id,
          nom: nom,
          prenom: prenom,
          address: address,
        }
      )
    }
//this func to get data from firebase, but it didn't work!
    componentWillMount(props) {
      const { user } = this.props ;
      this.setState(
        {
          nom: user.nom,
          prenom: user.prenom,
          address: user.address,
        }
      )
    }

  render() {

    const { user } = this.props.user ;
    const update = user
      ? <UserDetails style={styles.modal} handleUpdate={this.handleUpdate(user.id, user.nom, user.prenom, user.address)} />
      : <UserDetails style={styles.modal} />;

    return (
              <Block style={styles.profileTexts}>
                <Text color="white" size={28} style={{ paddingBottom: 8 }}>{this.state.prenom}</Text>
                    <Text color="white" size={16} muted style={styles.seller}>{this.state.nom}</Text>
                    <Text size={16} color={'#FF9800'}>
                      4.8 
                    </Text>
                    <Text color={theme.COLORS.MUTED} size={16}>

                      {`  `} {this.state.address}
                      </Text>
                  </Block>
//this block will open the modal
              <Block row space="between" style={{ flexWrap: 'wrap' }} 
                {update}
              </Block>
            </Block>     ) ;
const mapStateToProps = (state) => {
  console.log(state);
  return{
    auth: state.firebase.auth,
    user: state.firebase.ordered.Users
  }
}
const mapDispatchToProps = (dispatch) => {
  return {
    signOut: () => dispatch(signOut())
  }
}
export default compose(
   connect(mapStateToProps, mapDispatchToProps),
   firestoreConnect([
       { collection: 'Users'},
   ]))(Profile)

Это модальный компонент (userDetails):

//thats the action component that will send data to firebase
import updateUser from '../actions/userAction';
saveUpdate=()=>{
    this.props.updateUser({
      nom: this.state.nom,
      prenom: this.state.prenom,
      address: this.state.address,
      id: this.state.id
    })
    this.setState({
      nom: "",
      prenom: "",
      address: "",
    }) 
    console.log("state after save update : ", state) 
  }

  render() {

    return (
      <View style={styles.container}>                 
                  <TextInput
                    editable = {true}
                    maxLength = {40}
                    onChangeText={(text) => this.setState({nom: text})}
                    value={this.state.nom}
                    placeholder={"Nom"}
                  />
                   <TextInput
                    editable = {true}
                    maxLength = {40}
                    onChangeText={(text) => this.setState({prenom: text})}
                    placeholder={"Prénom"}
                    value={this.state.prenom}
                  />
                   <TextInput
                    editable = {true}
                    maxLength = {40}
                    onChangeText={(text) => this.setState({address: text})}
                    placeholder={'Address'}
                    value={this.state.address}
                  />

              </View>

              <TouchableHighlight  
                style={styles.button}
                onPress={() => { this.saveUpdate }}>
                <Text style={styles.buttonTitle} >Save</Text>
              </TouchableHighlight>
)}

const mapStateToProps = (state) => {
 return {
   users: state.firestore.ordered.Users 
 }
}

export default compose(
   connect(mapStateToProps, {updateUser}),
   firestoreConnect([
       { collection: 'Users'},
   ]))(UserDetails);

Это пользовательское действие:

import firestore from '../config/firebase_config'

const updateUser =(user)=>{ 

  return (dispatch)=>{
      console.log("trying to update: ", user);
    firestore.firestore().collection("Users").doc(user.id)
     .update(
       {
         nom: user.nom,
         prenom: user.prenom,
         address: user.address,
       }
      )
     .then(() =>{ 
       dispatch({
         type:'UPDATE_USER',  
       })  
      })
      .catch(function(error) {
        console.error("Error updating document: ", error);
    })
 }
}
export default updateUser ;

Я испробовал много решений и потратил много времени, но не могу понять, что мне здесь не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...