/* * Chat component within Main */ import React, { Component } from 'react'; import { Dimensions, View, Text, TextInput, Image, TouchableOpacity, AsyncStorage } from 'react-native'; import { Actions } from 'react-native-router-flux'; import Icon from 'react-native-vector-icons/MaterialIcons'; import { Fonts } from '../../utils/Fonts.js'; require('react-native'); // Socket.io imports import './UserAgent'; window.navigator.userAgent = "react-native"; const io = require('socket.io-client/dist/socket.io'); const windowWidth = Dimensions.get('window').width; const windowHeight = Dimensions.get('window').height; type Props = {}; export default class Chat extends Component { constructor(props) { super(props); this.state = { messageToSend : '', messagesDOM: [], prevMessageUser: null, userId: null, }; /** * todo fix AsyncStorage */ console.log(props); } componentDidMount() { this.socket = io('https://murmuring-sierra-86040.herokuapp.com', {jsonp: false}); this.socket.on('connect', () => { this.socket.emit('initial', this.props.position); fetch('https://murmuring-sierra-86040.herokuapp.com/userid') .then((response) => response.json()) .then((responseJson) => { console.log(responseJson); this.setState({userId: responseJson.userId}); }) .catch((error) => { console.log(error); this.setState({userId: 1}); // TODO: error popup }); }); this.socket.on('initMessages', (allMsg) => { console.log('Initial messages received: ' + allMsg); allMsg.map((msg) => { this.addMessage(msg); }); }); this.socket.on('newMessage', (msg) => { this.addMessage(msg); }); } addMessage = (msg) => { console.log('New message received: '); var oldDOM = this.state.messagesDOM; var newMessage = this.createMessage(msg); if (this.state.prevMessageUser != msg.userId && this.state.prevMessageUser) { var dotSeparator = ( . . ); oldDOM.push(dotSeparator); } oldDOM.push(newMessage); this.setState({ messagesDOM: oldDOM, prevMessageUser: msg.userId }); } sendMessage = () => { console.log(this.state.userId); console.log('Message to send: ' + this.state.messageToSend); this.socket.emit('newMessage', { userId: this.state.userId, text: this.state.messageToSend, lng: this.props.position.long, lat: this.props.position.lat, avatar: this.props.avatar }); this.setState({ messageToSend: '' }); } createMessage = (msg) => { var isUser = msg.userId == this.state.userId; var contStyle = isUser ? styles.userMsg : styles.otherMsg; var txtContStyle = isUser ? styles.userMsgBox : styles.otherMsgBox; var txtStyle = isUser ? styles.userTxt : null; var avatarLink = msg.avatar; var avatar = ( ); var avatarAlready = this.state.prevMessageUser == msg.userId; var result = ( {!isUser && !avatarAlready ? avatar : null} {msg.text} {isUser && !avatarAlready ? avatar : null} ); return result; } messageInput = (text) => { this.setState({ messageToSend : text }); } sendFieldStyle = () => { return this.state.messageToSend == '' ? styles.sendIcon : styles.sendIconColor; } render() { return ( {this.state.messagesDOM.length == 0 ? ( No one's talkin around you! Start it up! ) : ( {this.state.messagesDOM} ) } ); } } const styles = { container: { flex: 1, flexDirection: 'column', justifyContent: 'flex-end', backgroundColor: '#e8ebef' }, chatField: { flex: 8, flexDirection: 'column', justifyContent: 'flex-end' }, chatFieldEmpty: { flex: 8, flexDirection: 'column', justifyContent: 'center', alignItems: 'center' }, msgCont: { flexDirection: 'row', alignItems: 'center' }, userMsg: { alignSelf: 'flex-end' }, otherMsg: { alignSelf: 'flex-start' }, avatarAlready: { marginRight: 45, marginLeft: 45 }, avatar: { height: 35, width: 35, borderRadius: 100, margin: 5 }, msgTxtCont: { margin: 3, padding: 12, borderBottomRightRadius: 15, borderBottomLeftRadius: 15 }, userMsgBox: { backgroundColor: '#0e8f9e', borderTopLeftRadius: 15 }, otherMsgBox: { backgroundColor: 'white', borderTopRightRadius: 15 }, msgText: { fontFamily: Fonts.SunflowerLight, fontSize: 18 }, userTxt: { color: 'white' }, separatorCont: { justifyContent: 'center', alignItems: 'center' }, inputMsgField: { flex: 1, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', height: 50, backgroundColor: 'white', marginTop: 10 }, iconCont: { flex: 1, alignItems: 'center', justifyContent: 'center' }, inputCont: { flex: 6, alignSelf: 'flex-end', marginLeft: 10 }, inputField : { fontSize: 18, fontFamily: Fonts.SunflowerLight }, sendIcon: { fontSize: 25 }, sendIconColor: { fontSize: 25, color: '#0e8f9e' } }