Advertisement
Guest User

Untitled

a guest
Aug 1st, 2019
1,048
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React from 'react';
  2. import { StyleSheet } from 'react-native';
  3. import Toolbar from './toolbar/Toolbar';
  4. import PropTypes from 'prop-types';
  5. import { connect } from 'react-redux';
  6. import { addMessage, clearMessages, getLastMessage, getMessages } from '../../../../actions';
  7. import { pop } from '../../../../NavigationService';
  8. import firebase from 'react-native-firebase';
  9. import FastImage from 'react-native-fast-image';
  10. import bStyles from '../../../general/BaseStyles';
  11. import imgs from '../../../../assets/image/imgs';
  12. import { Bubble, Composer, Day, GiftedChat, InputToolbar, LoadEarlier, Send, Time } from 'react-native-gifted-chat';
  13. import i18n from 'i18n-js';
  14. import { SafeAreaView } from 'react-navigation';
  15. import DefaultPreference from 'react-native-default-preference';
  16. import getPlatformFont from '../../../../assets/font/getFontByPlatform';
  17.  
  18. class ChatScreen extends React.Component {
  19.     notificationListener;
  20.  
  21.     constructor(props) {
  22.         super(props);
  23.         this.state = {
  24.             userId: -1,
  25.             sentMessages: [],
  26.         };
  27.     }
  28.  
  29.     componentWillMount() {
  30.         DefaultPreference.get('user_id')
  31.             .then(result => this.setState({ userId: Number.parseInt(result) }))
  32.             .catch();
  33.     }
  34.  
  35.     componentDidMount() {
  36.         const orderId = this.props.navigation.getParam('orderId', -1);
  37.         this.props.getMessages(orderId);
  38.         this.notificationListener = firebase.notifications().onNotification(notification => {
  39.             const {
  40.                 _data: {
  41.                     order_id,
  42.                     type,
  43.                 },
  44.             } = notification;
  45.             type === 'new_message' && this.props.getLastMessage(order_id);
  46.         });
  47.     }
  48.  
  49.     componentWillReceiveProps(nextProps) {
  50.         const orderId = this.props.navigation.getParam('orderId', -1);
  51.         const { sentMessageId } = this.props;
  52.         const {
  53.             sentMessageId: nextSentMessageId,
  54.         } = nextProps;
  55.  
  56.         nextSentMessageId && sentMessageId !== nextSentMessageId && this.props.getLastMessage(orderId);
  57.     }
  58.  
  59.     componentWillUnmount() {
  60.         this.props.clearMessages();
  61.         this.notificationListener && this.notificationListener();
  62.     }
  63.  
  64.     render() {
  65.         const name = this.props.navigation.getParam('name', '');
  66.         const avatarUrl = this.props.navigation.getParam('avatarUrl', '');
  67.         const {
  68.             loading,
  69.             loadedAllData,
  70.             messages,
  71.         } = this.props;
  72.         const {
  73.             userId,
  74.         } = this.state;
  75.  
  76.         return (
  77.             <SafeAreaView style={styles.container}>
  78.                 <FastImage style={bStyles.imageBackground}
  79.                            source={imgs.background}/>
  80.                 <Toolbar onBackPress={this.handleBackPress}
  81.                          title={name}
  82.                          avatarUrl={avatarUrl}/>
  83.                 <GiftedChat
  84.                     messages={messages}
  85.                     listViewProps={{
  86.                         initialNumToRender: 20,
  87.                     }}
  88.                     renderAvatar={null}
  89.                     onSend={this.handleSend}
  90.                     user={{ _id: userId }}
  91.                     isAnimated={false}
  92.                     keyboardShouldPersistTaps={'never'}
  93.                     placeholder={i18n.t('Type your message here')}
  94.                     loadEarlier={!loadedAllData}
  95.                     onLoadEarlier={this.handleLoadEarlier}
  96.                     renderDay={this.renderDay}
  97.                     isLoadingEarlier={loading}
  98.                     renderBubble={this.renderBubble}
  99.                     textInputProps={{
  100.                         autoCapitalize: 'none',
  101.                         keyboardAppearance: 'dark',
  102.                         autoCorrect: false,
  103.                     }}
  104.                     renderInputToolbar={this.renderInputToolbar}
  105.                     renderSend={this.renderSend}
  106.                     renderComposer={this.renderComposer}
  107.                     renderTime={this.renderTime}
  108.                     renderLoadEarlier={this.renderLoadEarlier}/>
  109.             </SafeAreaView>
  110.         );
  111.     }
  112.  
  113.     handleBackPress = () => {
  114.         pop();
  115.     };
  116.  
  117.     handleSend = (messages) => {
  118.         this.setState({
  119.             sentMessages: messages,
  120.         });
  121.         messages.forEach(message => {
  122.             const orderId = this.props.navigation.getParam('orderId', -1);
  123.             const { text } = message;
  124.             this.props.addMessage(orderId, text);
  125.         });
  126.     };
  127.  
  128.     handleLoadEarlier = () => {
  129.         const orderId = this.props.navigation.getParam('orderId', -1);
  130.         this.props.getMessages(orderId);
  131.     };
  132.  
  133.     renderLoadEarlier = props => {
  134.         return (
  135.             <LoadEarlier {...props}
  136.                          textStyle={styles.loadEarlierText}/>
  137.         );
  138.     };
  139.  
  140.     renderBubble = props => {
  141.         return (
  142.             <Bubble
  143.                 {...props}
  144.                 wrapperStyle={{
  145.                     left: styles.left,
  146.                     right: styles.right,
  147.                 }}
  148.                 textStyle={{
  149.                     right: styles.bubbleRightText,
  150.                     left: styles.bubbleLeftText,
  151.                 }}
  152.             />
  153.         );
  154.     };
  155.  
  156.     renderDay = props => {
  157.         return (
  158.             <Day
  159.                 {...props}
  160.                 textStyle={styles.dayText}/>
  161.         );
  162.     };
  163.  
  164.     renderTime = props => {
  165.         return (
  166.             <Time {...props}
  167.                   textStyle={{
  168.                       left: styles.timeTextLeft,
  169.                       right: styles.timeTextRight,
  170.                   }}/>
  171.         );
  172.     };
  173.  
  174.     renderInputToolbar = props => {
  175.         return (
  176.             <InputToolbar
  177.                 {...props}
  178.                 containerStyle={styles.inputContainer}
  179.                 primaryStyle={styles.inputPrimary}/>
  180.         );
  181.     };
  182.  
  183.     renderSend = props => {
  184.         return (
  185.             <Send
  186.                 {...props}
  187.                 containerStyle={styles.sendContainer}
  188.                 children={<FastImage source={imgs.send}
  189.                                      style={styles.send}/>}/>
  190.         );
  191.     };
  192.  
  193.     renderComposer = props => {
  194.         return (
  195.             <Composer {...props}
  196.                       textInputStyle={styles.composerText}
  197.                       placeholderTextColor={'grey'}/>
  198.         );
  199.     };
  200. }
  201.  
  202. ChatScreen.propTypes = {
  203.     orderId: PropTypes.number,
  204.     name: PropTypes.string,
  205.     avatarUrl: PropTypes.string,
  206. };
  207.  
  208. const styles = StyleSheet.create({
  209.     container: {
  210.         flex: 1,
  211.         backgroundColor: 'rgba(0, 0, 0, 0.9)',
  212.     },
  213.     left: {
  214.         backgroundColor: '#e5e6ea',
  215.     },
  216.     right: {
  217.         backgroundColor: '#d1b624',
  218.     },
  219.     inputContainer: {
  220.         backgroundColor: 'rgba(0, 0, 0, 0.9)',
  221.         minHeight: 44,
  222.     },
  223.     inputPrimary: {
  224.         backgroundColor: '#f9f9f9',
  225.         marginVertical: 4,
  226.         marginHorizontal: 16,
  227.         borderRadius: 24,
  228.         alignItems: 'center',
  229.     },
  230.     sendContainer: {
  231.         width: 36,
  232.         height: 36,
  233.         borderRadius: 18,
  234.         backgroundColor: '#f9f9f9',
  235.         alignItems: 'center',
  236.         justifyContent: 'center',
  237.     },
  238.     send: {
  239.         width: 20,
  240.         height: 20,
  241.     },
  242.     composerText: {
  243.         color: 'black',
  244.         fontSize: 14,
  245.         ...getPlatformFont('open_sans_regular'),
  246.     },
  247.     timeTextLeft: {
  248.         color: 'grey',
  249.         fontSize: 10,
  250.         ...getPlatformFont('open_sans_regular'),
  251.     },
  252.     timeTextRight: {
  253.         color: 'white',
  254.         fontSize: 10,
  255.         ...getPlatformFont('open_sans_regular'),
  256.     },
  257.     dayText: {
  258.         color: 'grey',
  259.         fontSize: 13,
  260.         ...getPlatformFont('open_sans_bold'),
  261.     },
  262.     bubbleLeftText: {
  263.         color: 'black',
  264.         fontSize: 14,
  265.         ...getPlatformFont('open_sans_regular'),
  266.     },
  267.     bubbleRightText: {
  268.         color: 'white',
  269.         fontSize: 14,
  270.         ...getPlatformFont('open_sans_regular'),
  271.     },
  272.     loadEarlierText: {
  273.         color: 'white',
  274.         fontSize: 12,
  275.         ...getPlatformFont('open_sans_bold'),
  276.     },
  277. });
  278.  
  279. const mapStateToProps = state => {
  280.     return {
  281.         messages: state.messages.data,
  282.         sentMessageId: state.addMessage.data.message_id,
  283.         loading: state.messages.isLoading,
  284.         loadedAllData: state.messages.loadedAllData,
  285.     };
  286. };
  287.  
  288. const mapDispatchToProps = {
  289.     getMessages,
  290.     addMessage,
  291.     clearMessages,
  292.     getLastMessage,
  293. };
  294.  
  295. export default connect(mapStateToProps, mapDispatchToProps)(ChatScreen);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement