import { MaterialIcons } from '@expo/vector-icons'
import { AppLoading, Asset, Linking } from 'expo'
import React, { Component } from 'react'
import { StyleSheet, View, Text, Platform } from 'react-native'
import { Bubble, GiftedChat, SystemMessage, IMessage, Send } from './src'
import AccessoryBar from './example-expo/AccessoryBar'
import CustomActions from './example-expo/CustomActions'
import CustomView from './example-expo/CustomView'
import NavBar from './example-expo/NavBar'
import messagesData from './example-expo/data/messages'
import earlierMessages from './example-expo/data/earlierMessages'
const styles = StyleSheet.create({
container: { flex: 1 },
})
const filterBotMessages = message =>
!message.system && message.user && message.user._id && message.user._id === 2
const findStep = step => message => message._id === step
const user = {
_id: 1,
name: 'Developer',
}
const otherUser = {
_id: 2,
name: 'React Native',
avatar: 'https://facebook.github.io/react/img/logo_og.png',
}
export default class App extends Component {
state = {
inverted: false,
step: 0,
messages: [],
loadEarlier: true,
loadLater: true,
typingText: null,
isLoadingEarlier: false,
isLoadingLater: false,
appIsReady: false,
isTyping: false,
}
containerRef = null
_isMounted = false
componentDidMount() {
this._isMounted = true
// init with only system messages
this.setState({
messages: messagesData, // messagesData.filter(message => message.system),
appIsReady: true,
isTyping: false,
})
}
componentWillUnmount() {
this._isMounted = false
}
onLoadEarlier = () => {
this.setState(() => {
return {
isLoadingEarlier: true,
}
})
setTimeout(() => {
if (this._isMounted === true) {
this.setState((previousState: any) => {
return {
// messages: GiftedChat.prepend(
// previousState.messages,
// earlierMessages() as IMessage[],
// Platform.OS !== 'web',
// ),
loadEarlier: true,
isLoadingEarlier: false,
}
})
}
}, 1500) // simulating network
}
onLoadLater = () => {
this.setState(() => {
return {
isLoadingLater: true,
}
})
setTimeout(() => {
if (this._isMounted === true) {
this.setState((previousState: any) => {
return {
loadLater: true,
isLoadingLater: false,
}
})
}
}, 1500) // simulating network
}
onSend = (messages = []) => {
const step = this.state.step + 1
this.setState((previousState: any) => {
const sentMessages = [{ ...messages[0], sent: true, received: true }]
return {
messages: GiftedChat.append(
previousState.messages,
sentMessages,
Platform.OS !== 'web',
),
step,
}
})
// for demo purpose
// setTimeout(() => this.botSend(step), Math.round(Math.random() * 1000))
}
botSend = (step = 0) => {
const newMessage = (messagesData as IMessage[])
.reverse()
// .filter(filterBotMessages)
.find(findStep(step))
if (newMessage) {
this.setState((previousState: any) => ({
messages: GiftedChat.append(
previousState.messages,
[newMessage],
Platform.OS !== 'web',
),
}))
}
}
parsePatterns = (_linkStyle: any) => {
return [
{
pattern: /#(\w+)/,
style: { textDecorationLine: 'underline', color: 'darkorange' },
onPress: () => Linking.openURL('http://gifted.chat'),
},
]
}
renderCustomView(props) {
return
}
onReceive = (text: string) => {
this.setState((previousState: any) => {
return {
messages: GiftedChat.append(
previousState.messages as any,
[
{
_id: Math.round(Math.random() * 1000000),
text,
createdAt: new Date(),
user: otherUser,
},
],
Platform.OS !== 'web',
),
}
})
}
onSendFromUser = (messages: IMessage[] = []) => {
const createdAt = new Date()
const messagesToUpload = messages.map(message => ({
...message,
user,
createdAt,
_id: Math.round(Math.random() * 1000000),
}))
this.onSend(messagesToUpload)
}
setIsTyping = () => {
this.setState({
isTyping: !this.state.isTyping,
})
console.log('hi')
// this.containerRef.scrollToIndex({
// index: 10,
// viewOffset: 0,
// viewPosition: 1,
// })
}
renderAccessory = () => (
)
renderCustomActions = props =>
Platform.OS === 'web' ? null : (
)
renderBubble = (props: any) => {
return
}
renderSystemMessage = props => {
return (
)
}
onQuickReply = replies => {
const createdAt = new Date()
if (replies.length === 1) {
this.onSend([
{
createdAt,
_id: Math.round(Math.random() * 1000000),
text: replies[0].title,
user,
},
])
} else if (replies.length > 1) {
this.onSend([
{
createdAt,
_id: Math.round(Math.random() * 1000000),
text: replies.map(reply => reply.title).join(', '),
user,
},
])
} else {
console.warn('replies param is not set correctly')
}
}
renderQuickReplySend = () => {' custom send =>'}
renderSend = (props: Send['props']) => (
)
render() {
if (!this.state.appIsReady) {
return
}
return (
(this.containerRef = component)}
messages={this.state.messages}
onSend={this.onSend}
loadEarlier={this.state.loadEarlier}
onLoadEarlier={this.onLoadEarlier}
loadLater={this.state.loadLater}
onLoadLater={this.onLoadLater}
parsePatterns={this.parsePatterns}
user={user}
scrollToBottom
onLongPressAvatar={user => alert(JSON.stringify(user))}
onPressAvatar={() => alert('short press')}
onQuickReply={this.onQuickReply}
keyboardShouldPersistTaps='never'
renderAccessory={Platform.OS === 'web' ? null : this.renderAccessory}
renderActions={this.renderCustomActions}
renderBubble={this.renderBubble}
renderSystemMessage={this.renderSystemMessage}
renderCustomView={this.renderCustomView}
renderSend={this.renderSend}
quickReplyStyle={{ borderRadius: 2 }}
renderQuickReplySend={this.renderQuickReplySend}
inverted={Platform.OS !== 'web'}
timeTextStyle={{ left: { color: 'red' }, right: { color: 'yellow' } }}
isTyping={this.state.isTyping}
infiniteScroll
onEndReachedThreshold={0}
onStartReachedThreshold={0}
/>
)
}
}