Есть ли способ добиться индивидуального обмена сообщениями в React Native с базой данных firebase в реальном времени?

Я пытаюсь достичь индивидуального обмена сообщениями в реакции на нативном коде с использованием базы данных firebase в реальном времени. Я очень новичок в реагировании на native / firebase, и я не слишком уверен, как я могу отправить сообщение определенному uid пользователя. Я видел несколько ссылок в Интернете, которые используют firebase firestore для групповых чатов, но я хотел бы сделать это, используя базу данных в реальном времени и только индивидуальный обмен сообщениями. Пока мне удалось отправить сообщение в моем приложении, но я также отображаю все сообщения от всех пользователей из базы данных, когда я вошел в систему как текущий пользователь. Я использую response-native-gifted-chat для пользовательского интерфейса.

// This is file MessagesScreen.js

class MessagesScreen extends Component {
  state = {
    messages: []
  }  

  get user() {
    return {
      _id: FireMessage.uid,
    }
  }

  componentDidMount() {
    FireMessage.get(message => this.setState(previous => ({
      messages: GiftedChat.append(previous.messages, message)
    })));
  }

  componentWillUnmount() {
    FireMessage.off();
  }

  render() {
    const chat = <GiftedChat messages={this.state.messages} onSend={FireMessage.send} user={this.user} />;

    if (Platform.OS === "android") {
      return (
        <KeyboardAvoidingView style={{ flex: 1}} behavior="padding" keyboardVerticalOffset={10} enabled>
          {chat}
        </KeyboardAvoidingView>
      );
    }

    return <SafeAreaView style={{ flex: 1}}>{chat}</SafeAreaView>;
  }
}

export default MessagesScreen;
// This is file FireMessage.js

class FireMessage {

  constructor() {
    this.init()
    this.checkAuth() 
  }

  init = () => {
    if (!firebase.apps.length && firebaseConfig.apps.length === 0) {
      firebase.initializeApp({
        apiKey: "xxxxxxxxxxx",
        authDomain: "xxxxxxxxxxx",
        databaseURL: "xxxxxxxxxx",
        projectId: "xxxxxxxx",
        storageBucket: "xxxxxxxxxx",
        messagingSenderId: "xxxxxxxx",
        appId: "xxxxxxxxxxx",
        measurementId: "xxxxxxxxx"
      });
    }
  };

  checkAuth = () => {
    firebase.auth().onAuthStateChanged(user => {
      if (!user) {
        firebase.auth().signInAnonymously();
      }
    });
  };

  send = messages => {
    messages.forEach(item => {
      const message = {
        text: item.text,
        timestamp: firebase.database.ServerValue.TIMESTAMP,
        user: item.user
      };

      this.db.push(message)
    });
  };

  parse = message => {
    const { user, text, timestamp } = message.val();
    const { key: _id } = message;
    const createdAt = new Date(timestamp);


    return {
      _id,
      createdAt,
      text,
      user
    };
  };
 
  get = callback => {
    this.db.on("child_added", snapshot => 
      callback(this.parse(snapshot)));
  };

  off() {
    this.db.off();
  }

  get db() {
    return firebase.database().ref("messages");
  }

  get uid() {
    return (firebase.auth().currentUser || {}).uid;
  }
}

export default new FireMessage();

Структура базы данных в реальном времени:

Структура базы данных сообщений

Структура базы данных пользователей


comment
Добро пожаловать в StackOverflow! Чтобы помочь нам лучше помочь вам, пожалуйста, очистите отступы вашего кода и поместите файлы в их собственные блоки кода. например если класс FireMessage находится в собственном файле, отделите его от вашего компонента. Тем, кто отвечает на ваш вопрос, часто помогает добавление имени файла в первой строке, например: // This is ./fire-message.js.   -  person samthecodingman    schedule 02.06.2021
comment
Спасибо за ваш быстрый ответ. Я пытался идентифицировать все, что мог. Я также разделил компоненты. Вы вообще можете помочь?   -  person AJDee    schedule 02.06.2021
comment
Спасибо за редактирование. Вы знаете, как я могу это решить?   -  person AJDee    schedule 02.06.2021
comment
Я недостаточно хорошо разбирался в реакции до того, как были введены хуки, и у меня нет времени, чтобы научиться этому. Вам необходимо выполнить ряд шагов: правильно войти в систему (идентификаторы пользователей при каждом входе меняются), обновить пользовательский интерфейс и базу данных для поддержки чатов (см. этот ответ для создания идентификаторов комнат и этот ответ для их защиты) и реализовать безопасный, доступная карта между именами пользователей и идентификаторами пользователей (см. этот ответ).   -  person samthecodingman    schedule 03.06.2021
comment
Спасибо. Как получить uid получателя, который не является текущим пользователем, вошедшим в систему? И где бы я это разместил, если вы не возражаете, если я спрошу?   -  person AJDee    schedule 04.06.2021
comment
Вам нужно будет добавить функцию поиска, чтобы найти пользователя, которому вы хотите отправить сообщение (например, имя пользователя). Независимо от того, где вы его разместите, ваш код нуждается в полной реструктуризации для поддержки обмена сообщениями один-к-одному, это не так просто, как перетаскивание. Ответы, которые я связал, - это всего лишь кусочки, вам решать, как их соединить вместе. Если вы не можете понять, как это собрать, наймите разработчика, который потратит на это время.   -  person samthecodingman    schedule 04.06.2021