Я пытаюсь достичь индивидуального обмена сообщениями в реакции на нативном коде с использованием базы данных 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();
Структура базы данных в реальном времени:
FireMessage
находится в собственном файле, отделите его от вашего компонента. Тем, кто отвечает на ваш вопрос, часто помогает добавление имени файла в первой строке, например:// This is ./fire-message.js
. - person samthecodingman   schedule 02.06.2021