import React, { Component } from 'react'; import { ActivityIndicator, Button, FlatList, StyleSheet, Text, TextInput, View, } from 'react-native'; import KeyboardSpacer from '../../components/KeyboardSpacer'; import Backend from '../../lib/Backend'; export default class ChatScreen extends Component { static navigationOptions = ({ navigation }) => ({ title: `Chat with ${navigation.state.params.name}`, }); constructor(props) { super(props); this.state = { messages: [], myMessage: '', isLoading: true, }; } async componentDidMount() { let chat; try { chat = await Backend.fetchChat(this.props.navigation.state.params.name); } catch (err) { // Here we would handle the fact the request failed, e.g. // set state to display "Messages could not be loaded". // We should also check network connection first before making any // network requests - maybe we're offline? See React Native's NetInfo // module. this.setState({ isLoading: false, }); return; } this.setState((prevState) => ({ messages: chat.messages, isLoading: false, })); } onAddMessage = async () => { // Optimistically update the UI this.addMessageLocal(); // Send the request try { await Backend.sendMessage({ name: this.props.navigation.state.params.name, // TODO Is reading state like this outside of setState OK? // Can it contain a stale value? message: this.state.myMessage, }); } catch (err) { // Here we would handle the request failure, e.g. call setState // to display a visual hint showing the message could not be sent. } } addMessageLocal = () => { this.setState((prevState) => { if (!prevState.myMessage) { return prevState; } const messages = [ ...prevState.messages, { name: 'Me', text: prevState.myMessage, } ]; return { messages: messages, myMessage: '', }; }); this.textInput.clear(); } onMyMessageChange = (event) => { this.setState({myMessage: event.nativeEvent.text}); } renderItem = ({ item }) => ( {item.name} {item.text} ) render() { if (this.state.isLoading) { return ( ); } return ( index} style={styles.listView} /> { this.textInput = textInput; }} style={styles.textInput} placeholder="Type a message..." text={this.state.myMessage} onSubmitEditing={this.onAddMessage} onChange={this.onMyMessageChange} /> {this.state.myMessage !== '' && (