瀏覽代碼

Vamos a empezar con cambios para nueva coleccion de chats

ErnestoOrtiz2 3 年之前
父節點
當前提交
d3e386e40e
共有 5 個檔案被更改,包括 272 行新增1 行删除
  1. 2
    0
      App.js
  2. 137
    0
      package-lock.json
  3. 1
    0
      package.json
  4. 0
    1
      screens/main/Home_page.js
  5. 132
    0
      screens/main/RoomScreen.js

+ 2
- 0
App.js 查看文件

@@ -10,6 +10,7 @@ import { Text, View } from 'react-native';
10 10
 import { styles } from './config/styles';
11 11
 
12 12
 import HomeScreen from './screens/main/Home_page';
13
+import RoomScreen from './screens/main/RoomScreen'
13 14
 import { Provider} from 'react-redux'
14 15
 import { createStore, applyMiddleware } from 'redux';
15 16
 import rootReducer from './redux/reducers'
@@ -77,6 +78,7 @@ export class App extends Component {
77 78
         <NavigationContainer>
78 79
           <Stack.Navigator initialRouteName="Home">
79 80
             <Stack.Screen name="Home" component={HomeScreen} />
81
+            <Stack.Screen name="Room" component={RoomScreen} options={({ route }) => ({ title: route.params.thread.name })} />
80 82
           </Stack.Navigator>
81 83
         </NavigationContainer>
82 84
       </Provider>

+ 137
- 0
package-lock.json 查看文件

@@ -14,6 +14,7 @@
14 14
         "react": "16.13.1",
15 15
         "react-dom": "16.13.1",
16 16
         "react-native": "https://github.com/expo/react-native/archive/sdk-42.0.0.tar.gz",
17
+        "react-native-gifted-chat": "^0.16.3",
17 18
         "react-native-paper": "^4.9.2",
18 19
         "react-native-web": "~0.13.12",
19 20
         "react-redux": "^7.2.5",
@@ -9267,6 +9268,11 @@
9267 9268
         "react": "16.13.1"
9268 9269
       }
9269 9270
     },
9271
+    "node_modules/react-native-communications": {
9272
+      "version": "2.2.1",
9273
+      "resolved": "https://registry.npmjs.org/react-native-communications/-/react-native-communications-2.2.1.tgz",
9274
+      "integrity": "sha1-eIO1ayCgAu63kMET+GFuqGksp5U="
9275
+    },
9270 9276
     "node_modules/react-native-gesture-handler": {
9271 9277
       "version": "1.10.3",
9272 9278
       "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.10.3.tgz",
@@ -9295,6 +9301,77 @@
9295 9301
         "ua-parser-js": "^0.7.18"
9296 9302
       }
9297 9303
     },
9304
+    "node_modules/react-native-gifted-chat": {
9305
+      "version": "0.16.3",
9306
+      "resolved": "https://registry.npmjs.org/react-native-gifted-chat/-/react-native-gifted-chat-0.16.3.tgz",
9307
+      "integrity": "sha512-7EJKQPzzg1yIbLFNq9n5bGJWZ7Woi2bTeT7M4EVSChmFF/qyNos+gFxEcafPkEihEeIxeOne6hBQlYNKmDABgA==",
9308
+      "dependencies": {
9309
+        "@expo/react-native-action-sheet": "^3.6.0",
9310
+        "dayjs": "^1.8.26",
9311
+        "prop-types": "^15.7.2",
9312
+        "react-native-communications": "^2.2.1",
9313
+        "react-native-iphone-x-helper": "^1.2.1",
9314
+        "react-native-lightbox": "^0.8.1",
9315
+        "react-native-parsed-text": "0.0.22",
9316
+        "react-native-typing-animation": "^0.1.7",
9317
+        "uuid": "3.4.0"
9318
+      },
9319
+      "peerDependencies": {
9320
+        "dayjs": "*",
9321
+        "react": "*",
9322
+        "react-native": "*"
9323
+      }
9324
+    },
9325
+    "node_modules/react-native-gifted-chat/node_modules/@expo/react-native-action-sheet": {
9326
+      "version": "3.12.0",
9327
+      "resolved": "https://registry.npmjs.org/@expo/react-native-action-sheet/-/react-native-action-sheet-3.12.0.tgz",
9328
+      "integrity": "sha512-tuc8mJmDeCc1q/U2q+IJ9pKeIZL/JJoHYBf34Vor1aabfk8m+/LSDlCCi4MVFIU1fHHwgNQyuDbGhsanYPJFRw==",
9329
+      "dependencies": {
9330
+        "@types/hoist-non-react-statics": "^3.3.1",
9331
+        "hoist-non-react-statics": "^3.3.0"
9332
+      },
9333
+      "peerDependencies": {
9334
+        "react": ">=16.3.0"
9335
+      }
9336
+    },
9337
+    "node_modules/react-native-gifted-chat/node_modules/react-native-iphone-x-helper": {
9338
+      "version": "1.3.1",
9339
+      "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz",
9340
+      "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==",
9341
+      "peerDependencies": {
9342
+        "react-native": ">=0.42.0"
9343
+      }
9344
+    },
9345
+    "node_modules/react-native-gifted-chat/node_modules/react-native-parsed-text": {
9346
+      "version": "0.0.22",
9347
+      "resolved": "https://registry.npmjs.org/react-native-parsed-text/-/react-native-parsed-text-0.0.22.tgz",
9348
+      "integrity": "sha512-hfD83RDXZf9Fvth3DowR7j65fMnlqM9PpxZBGWkzVcUTFtqe6/yPcIoIAgrJbKn6YmtzkivmhWE2MCE4JKBXrQ==",
9349
+      "dependencies": {
9350
+        "prop-types": "^15.7.x"
9351
+      },
9352
+      "peerDependencies": {
9353
+        "react": "*",
9354
+        "react-native": "*"
9355
+      }
9356
+    },
9357
+    "node_modules/react-native-gifted-chat/node_modules/react-native-typing-animation": {
9358
+      "version": "0.1.7",
9359
+      "resolved": "https://registry.npmjs.org/react-native-typing-animation/-/react-native-typing-animation-0.1.7.tgz",
9360
+      "integrity": "sha512-4H3rF9M+I2yAZpYJcY0Mb29TXkn98QK12rrKSY6LZj1BQD9NNmRZuNXzwX4XHapsIz+N/J8M3p27FOQPbfzqeg==",
9361
+      "peerDependencies": {
9362
+        "prop-types": "*",
9363
+        "react": "*",
9364
+        "react-native": "*"
9365
+      }
9366
+    },
9367
+    "node_modules/react-native-lightbox": {
9368
+      "version": "0.8.1",
9369
+      "resolved": "https://registry.npmjs.org/react-native-lightbox/-/react-native-lightbox-0.8.1.tgz",
9370
+      "integrity": "sha512-TFZA6iKEEHpAUIXjMTRb6vx0/9rHgEKy3ZBiRAy295PwldYg5c8opwnbyURLIl522ykeqhVx9uGdXjSMIowLvA==",
9371
+      "dependencies": {
9372
+        "prop-types": "^15.7.2"
9373
+      }
9374
+    },
9298 9375
     "node_modules/react-native-paper": {
9299 9376
       "version": "4.9.2",
9300 9377
       "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-4.9.2.tgz",
@@ -19462,6 +19539,11 @@
19462 19539
         }
19463 19540
       }
19464 19541
     },
19542
+    "react-native-communications": {
19543
+      "version": "2.2.1",
19544
+      "resolved": "https://registry.npmjs.org/react-native-communications/-/react-native-communications-2.2.1.tgz",
19545
+      "integrity": "sha1-eIO1ayCgAu63kMET+GFuqGksp5U="
19546
+    },
19465 19547
     "react-native-gesture-handler": {
19466 19548
       "version": "1.10.3",
19467 19549
       "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.10.3.tgz",
@@ -19492,6 +19574,61 @@
19492 19574
         }
19493 19575
       }
19494 19576
     },
19577
+    "react-native-gifted-chat": {
19578
+      "version": "0.16.3",
19579
+      "resolved": "https://registry.npmjs.org/react-native-gifted-chat/-/react-native-gifted-chat-0.16.3.tgz",
19580
+      "integrity": "sha512-7EJKQPzzg1yIbLFNq9n5bGJWZ7Woi2bTeT7M4EVSChmFF/qyNos+gFxEcafPkEihEeIxeOne6hBQlYNKmDABgA==",
19581
+      "requires": {
19582
+        "@expo/react-native-action-sheet": "^3.6.0",
19583
+        "dayjs": "^1.8.26",
19584
+        "prop-types": "^15.7.2",
19585
+        "react-native-communications": "^2.2.1",
19586
+        "react-native-iphone-x-helper": "^1.2.1",
19587
+        "react-native-lightbox": "^0.8.1",
19588
+        "react-native-parsed-text": "0.0.22",
19589
+        "react-native-typing-animation": "^0.1.7",
19590
+        "uuid": "3.4.0"
19591
+      },
19592
+      "dependencies": {
19593
+        "@expo/react-native-action-sheet": {
19594
+          "version": "3.12.0",
19595
+          "resolved": "https://registry.npmjs.org/@expo/react-native-action-sheet/-/react-native-action-sheet-3.12.0.tgz",
19596
+          "integrity": "sha512-tuc8mJmDeCc1q/U2q+IJ9pKeIZL/JJoHYBf34Vor1aabfk8m+/LSDlCCi4MVFIU1fHHwgNQyuDbGhsanYPJFRw==",
19597
+          "requires": {
19598
+            "@types/hoist-non-react-statics": "^3.3.1",
19599
+            "hoist-non-react-statics": "^3.3.0"
19600
+          }
19601
+        },
19602
+        "react-native-iphone-x-helper": {
19603
+          "version": "1.3.1",
19604
+          "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz",
19605
+          "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==",
19606
+          "requires": {}
19607
+        },
19608
+        "react-native-parsed-text": {
19609
+          "version": "0.0.22",
19610
+          "resolved": "https://registry.npmjs.org/react-native-parsed-text/-/react-native-parsed-text-0.0.22.tgz",
19611
+          "integrity": "sha512-hfD83RDXZf9Fvth3DowR7j65fMnlqM9PpxZBGWkzVcUTFtqe6/yPcIoIAgrJbKn6YmtzkivmhWE2MCE4JKBXrQ==",
19612
+          "requires": {
19613
+            "prop-types": "^15.7.x"
19614
+          }
19615
+        },
19616
+        "react-native-typing-animation": {
19617
+          "version": "0.1.7",
19618
+          "resolved": "https://registry.npmjs.org/react-native-typing-animation/-/react-native-typing-animation-0.1.7.tgz",
19619
+          "integrity": "sha512-4H3rF9M+I2yAZpYJcY0Mb29TXkn98QK12rrKSY6LZj1BQD9NNmRZuNXzwX4XHapsIz+N/J8M3p27FOQPbfzqeg==",
19620
+          "requires": {}
19621
+        }
19622
+      }
19623
+    },
19624
+    "react-native-lightbox": {
19625
+      "version": "0.8.1",
19626
+      "resolved": "https://registry.npmjs.org/react-native-lightbox/-/react-native-lightbox-0.8.1.tgz",
19627
+      "integrity": "sha512-TFZA6iKEEHpAUIXjMTRb6vx0/9rHgEKy3ZBiRAy295PwldYg5c8opwnbyURLIl522ykeqhVx9uGdXjSMIowLvA==",
19628
+      "requires": {
19629
+        "prop-types": "^15.7.2"
19630
+      }
19631
+    },
19495 19632
     "react-native-paper": {
19496 19633
       "version": "4.9.2",
19497 19634
       "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-4.9.2.tgz",

+ 1
- 0
package.json 查看文件

@@ -17,6 +17,7 @@
17 17
     "react": "16.13.1",
18 18
     "react-dom": "16.13.1",
19 19
     "react-native": "https://github.com/expo/react-native/archive/sdk-42.0.0.tar.gz",
20
+    "react-native-gifted-chat": "^0.16.3",
20 21
     "react-native-paper": "^4.9.2",
21 22
     "react-native-web": "~0.13.12",
22 23
     "react-redux": "^7.2.5",

+ 0
- 1
screens/main/Home_page.js 查看文件

@@ -117,7 +117,6 @@ export function Home_page({navigation}) {
117 117
             >
118 118
             <List.Item
119 119
               title={item.name}
120
-              description='Item description'
121 120
               titleNumberOfLines={1}
122 121
               titleStyle={styles.listTitle}
123 122
               descriptionStyle={styles.listDescription}

+ 132
- 0
screens/main/RoomScreen.js 查看文件

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