import React from 'react';
import {
FlatList,
View,
Platform,
Image,
TouchableOpacity,
Keyboard,
InteractionManager,
} from 'react-native';
import {
RkButton,
RkText,
RkTextInput,
RkAvoidKeyboard,
RkStyleSheet,
RkTheme,
} from 'react-native-ui-kitten';
import _ from 'lodash';
import { FontAwesome } from '../../assets/icons';
import { data } from '../../data';
import { Avatar } from '../../components/avatar';
import { scale } from '../../utils/scale';
import NavigationType from '../../config/navigation/propTypes';
const moment = require('moment');
export class Chat extends React.Component {
static propTypes = {
navigation: NavigationType.isRequired,
};
static navigationOptions = ({ navigation }) => {
const userId = navigation.state.params ? navigation.state.params.userId : undefined;
const user = data.getUser(userId);
return ({
headerTitle: Chat.renderNavigationTitle(navigation, user),
headerRight: Chat.renderNavigationAvatar(navigation, user),
});
};
constructor(props) {
super(props);
const userId = this.props.navigation.getParam('userId', undefined);
this.state = {
data: data.getConversation(userId),
};
}
componentDidMount() {
InteractionManager.runAfterInteractions(() => {
this.listRef.scrollToEnd();
});
}
setListRef = (ref) => {
this.listRef = ref;
};
extractItemKey = (item) => `${item.id}`;
scrollToEnd = () => {
if (Platform.OS === 'ios') {
this.listRef.scrollToEnd();
} else {
_.delay(this.listRef.scrollToEnd, 100);
}
};
onInputChanged = (text) => {
this.setState({ message: text });
};
onSendButtonPressed = () => {
if (!this.state.message) {
return;
}
this.state.data.messages.push({
id: this.state.data.messages.length, time: 0, type: 'out', text: this.state.message,
});
this.setState({ message: '' });
this.scrollToEnd(true);
};
static onNavigationTitlePressed = (navigation, user) => {
navigation.navigate('ProfileV1', { id: user.id });
};
static onNavigationAvatarPressed = (navigation, user) => {
navigation.navigate('ProfileV1', { id: user.id });
};
static renderNavigationTitle = (navigation, user) => (
Chat.onNavigationTitlePressed(navigation, user)}>
{`${user.firstName} ${user.lastName}`}
Online
);
static renderNavigationAvatar = (navigation, user) => (
Chat.onNavigationAvatarPressed(navigation, user)}>
);
renderDate = (date) => (
{moment().add(date, 'seconds').format('LT')}
);
renderItem = ({ item }) => {
const isIncoming = item.type === 'in';
const backgroundColor = isIncoming
? RkTheme.current.colors.chat.messageInBackground
: RkTheme.current.colors.chat.messageOutBackground;
const itemStyle = isIncoming ? styles.itemIn : styles.itemOut;
return (
{!isIncoming && this.renderDate(item.time)}
{item.text}
{isIncoming && this.renderDate(item.time)}
);
};
render = () => (
{FontAwesome.plus}
)
}
const styles = RkStyleSheet.create(theme => ({
header: {
alignItems: 'center',
},
avatar: {
marginRight: 16,
},
container: {
flex: 1,
backgroundColor: theme.colors.screen.base,
},
list: {
paddingHorizontal: 17,
},
footer: {
flexDirection: 'row',
minHeight: 60,
padding: 10,
backgroundColor: theme.colors.screen.alter,
},
item: {
marginVertical: 14,
flex: 1,
flexDirection: 'row',
},
itemIn: {},
itemOut: {
alignSelf: 'flex-end',
},
balloon: {
maxWidth: scale(250),
paddingHorizontal: 15,
paddingTop: 10,
paddingBottom: 15,
borderRadius: 20,
},
time: {
alignSelf: 'flex-end',
margin: 15,
},
plus: {
paddingVertical: 10,
paddingHorizontal: 10,
marginRight: 7,
},
send: {
width: 40,
height: 40,
marginLeft: 10,
},
}));