No Description

RoomScreen.js 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import React, { useState, useEffect, useCallback } from 'react';
  2. import { GiftedChat } from 'react-native-gifted-chat';
  3. import firebase from 'firebase';
  4. import { connect } from 'react-redux'
  5. import { bindActionCreators } from 'redux'
  6. import { fetchUser } from '../../redux/actions/index'
  7. export function RoomScreen({ route }) {
  8. const { thread } = route.params;
  9. const [messages, setMessages] = useState([])
  10. useEffect(() => {
  11. const unsubscribe = firebase.firestore()
  12. .collection('THREADS')
  13. .doc(thread._id)
  14. .collection('MESSAGES')
  15. .onSnapshot(querySanpshot => {
  16. const messageFirestore = querySanpshot
  17. .docChanges() //para traer solo lo que haya cambiado
  18. .filter(({ type }) => type == 'added') //el objeto tiene un prop added, ese es el que queremos
  19. .map(({ doc }) => {
  20. const message = doc.data()
  21. return { ...message, createdAt: new Date().getTime() }
  22. })
  23. .sort((a, b) => b.createdAt - a.createdAt)
  24. appendMessages(messageFirestore) //Para meter el mensaje en el estado messages
  25. })
  26. return () => unsubscribe()
  27. }, [])
  28. const appendMessages = useCallback((messages) => {
  29. setMessages((previousMessages) => GiftedChat.append(previousMessages, messages))
  30. }, [messages])
  31. async function handleSend(messages) {
  32. const writes = messages.map(m => firebase.firestore()
  33. .collection('THREADS')
  34. .doc(thread._id)
  35. .collection('MESSAGES').add(m))
  36. await Promise.all(writes)
  37. }
  38. return (
  39. <GiftedChat messages={messages} user={{ _id: 1 }} onSend={handleSend} />
  40. );
  41. }
  42. const mapStateToProps = (store) => ({
  43. currentUser: store.userState.currentUser,
  44. })
  45. const mapDispatchProps = (dispatch) => bindActionCreators({fetchUser}, dispatch);
  46. export default connect(mapStateToProps, mapDispatchProps)(RoomScreen);