No Description

RoomScreen.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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 { currentUser } = props;
  9. const { thread } = route.params;
  10. /*const [messages, setMessages] = useState([
  11. /**
  12. * Mock message data
  13. */
  14. // example of system message
  15. /* {
  16. _id: 0,
  17. text: 'New room created.',
  18. createdAt: new Date().getTime(),
  19. system: true
  20. },
  21. // example of chat message
  22. {
  23. _id: 1,
  24. text: 'Henlo!',
  25. createdAt: new Date().getTime(),
  26. user: {
  27. _id: 2,
  28. name: 'Test User'
  29. }
  30. }
  31. ]);*/
  32. const [messages, setMessages] = useState([])
  33. /** the useEffect is used when we first render the component
  34. * solo va a corrar al principio.
  35. */
  36. useEffect(() => {
  37. //readUser()
  38. const unsubscribe = firebase.firestore()
  39. .collection('Users')
  40. .doc(firebase.auth().currentUser.uid)
  41. .collection('THREADS')
  42. .doc(thread._id)
  43. .collection('MESSAGES')
  44. .onSnapshot(querySanpshot => {
  45. const messageFirestore = querySanpshot
  46. .docChanges() //para traer solo lo que haya cambiado
  47. .filter(({ type }) => type == 'added') //el objeto tiene un prop added, ese es el que queremos
  48. .map(({ doc }) => {
  49. const message = doc.data()
  50. return { ...message, createdAt: new Date().getTime() }
  51. })
  52. .sort((a, b) => b.createdAt - a.createdAt)
  53. appendMessages(messageFirestore) //Para meter el mensaje en el estado messages
  54. })
  55. return () => unsubscribe()
  56. }, [])
  57. const appendMessages = useCallback((messages) => {
  58. setMessages((previousMessages) => GiftedChat.append(previousMessages, messages))
  59. }, [messages])
  60. async function handleSend(messages) {
  61. const writes = messages.map(m => firebase.firestore()
  62. .collection('Users')
  63. .doc(firebase.auth().currentUser.uid)
  64. .collection('THREADS')
  65. .doc(thread._id)
  66. .collection('MESSAGES').add(m))
  67. await Promise.all(writes)
  68. }
  69. /*async function handleSend(messages, newMessage = []) {
  70. const text = messages[0].text;
  71. setMessages(GiftedChat.append(messages, newMessage));
  72. //aqui podemos usar current user que no lo hemos usado, ya tenemos conectado redux
  73. firebase.firestore()
  74. .collection('Users')
  75. .doc(firebase.auth().currentUser.uid)
  76. .collection('THREADS')
  77. .doc(thread._id)
  78. .collection('MESSAGES')
  79. .add({
  80. text,
  81. createdAt: new Date().getTime(),
  82. });
  83. //Esto se ve, pero no genraliza, solo funciona desde currentUser y se graba en la otra cuenta,
  84. //pero la otra cuenta no puede responder porque pasa a ser current user.
  85. //Ademas no guarda que usuario dijo que.
  86. firebase.firestore()
  87. .collection('Users')
  88. .doc('HGGAJlcIfwdpUoYfcBKLZFcDude2')
  89. .collection('THREADS')
  90. .doc(thread._id)
  91. .collection('MESSAGES')
  92. .add({
  93. text,
  94. createdAt: new Date().getTime(),
  95. });
  96. }*/
  97. // helper method that is sends a message
  98. /*function handleSend(newMessage = []) {
  99. setMessages(GiftedChat.append(messages, newMessage));
  100. }*/
  101. return (
  102. /*<GiftedChat
  103. messages={messages}
  104. onSend={newMessage => handleSend(messages, newMessage)}
  105. user={{ _id: 1 }}
  106. showUserAvatar
  107. alwaysShowSend
  108. scrollToBottom
  109. />*/
  110. <GiftedChat messages={messages} user={{ _id: 1 }} onSend={handleSend} />
  111. );
  112. }
  113. const mapStateToProps = (store) => ({
  114. currentUser: store.userState.currentUser,
  115. })
  116. const mapDispatchProps = (dispatch) => bindActionCreators({fetchUser}, dispatch);
  117. export default connect(mapStateToProps, mapDispatchProps)(RoomScreen);