react-native-gifted-chat-video-support
Version:
The most complete chat UI for React Native , now support send video thanks to react-native-video-player
144 lines (129 loc) • 3.65 kB
JavaScript
/* eslint react-native/no-inline-styles: 0 */
import PropTypes from 'prop-types';
import React from 'react';
import { View, ViewPropTypes, StyleSheet } from 'react-native';
import Avatar from './Avatar';
import Bubble from './Bubble';
import SystemMessage from './SystemMessage';
import Day from './Day';
import { isSameUser, isSameDay } from './utils';
const styles = {
left: StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'flex-end',
justifyContent: 'flex-start',
marginLeft: 8,
marginRight: 0,
},
}),
right: StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'flex-end',
justifyContent: 'flex-end',
marginLeft: 0,
marginRight: 8,
},
}),
};
export default class Message extends React.PureComponent {
getInnerComponentProps() {
const { containerStyle, ...props } = this.props;
return {
...props,
isSameUser,
isSameDay,
};
}
renderDay() {
if (this.props.currentMessage.createdAt) {
const dayProps = this.getInnerComponentProps();
if (this.props.renderDay) {
return this.props.renderDay(dayProps);
}
return <Day {...dayProps} />;
}
return null;
}
renderBubble() {
const bubbleProps = this.getInnerComponentProps();
if (this.props.renderBubble) {
return this.props.renderBubble(bubbleProps);
}
return <Bubble {...bubbleProps} />;
}
renderSystemMessage() {
const systemMessageProps = this.getInnerComponentProps();
if (this.props.renderSystemMessage) {
return this.props.renderSystemMessage(systemMessageProps);
}
return <SystemMessage {...systemMessageProps} />;
}
renderAvatar() {
if (this.props.user._id === this.props.currentMessage.user._id && !this.props.showUserAvatar) {
return null;
}
const avatarProps = this.getInnerComponentProps();
const { currentMessage } = avatarProps;
if (currentMessage.user.avatar === null) {
return null;
}
return <Avatar {...avatarProps} />;
}
render() {
const sameUser = isSameUser(this.props.currentMessage, this.props.nextMessage);
return (
<View>
{this.renderDay()}
{this.props.currentMessage.system ? (
this.renderSystemMessage()
) : (
<View
style={[
styles[this.props.position].container,
{ marginBottom: sameUser ? 2 : 10 },
!this.props.inverted && { marginBottom: 2 },
this.props.containerStyle[this.props.position],
]}
>
{this.props.position === 'left' ? this.renderAvatar() : null}
{this.renderBubble()}
{this.props.position === 'right' ? this.renderAvatar() : null}
</View>
)}
</View>
);
}
}
Message.defaultProps = {
renderAvatar: undefined,
renderBubble: null,
renderDay: null,
renderSystemMessage: null,
position: 'left',
currentMessage: {},
nextMessage: {},
previousMessage: {},
user: {},
containerStyle: {},
showUserAvatar: true,
inverted: true,
};
Message.propTypes = {
renderAvatar: PropTypes.func,
showUserAvatar: PropTypes.bool,
renderBubble: PropTypes.func,
renderDay: PropTypes.func,
renderSystemMessage: PropTypes.func,
position: PropTypes.oneOf(['left', 'right']),
currentMessage: PropTypes.object,
nextMessage: PropTypes.object,
previousMessage: PropTypes.object,
user: PropTypes.object,
inverted: PropTypes.bool,
containerStyle: PropTypes.shape({
left: ViewPropTypes.style,
right: ViewPropTypes.style,
}),
};