mirror of
https://github.com/zhigang1992/react-native-gifted-chat.git
synced 2026-01-12 22:50:22 +08:00
* Updated CustomView * Added touchable to map element * Added map linking * Added CustomActions * Added AccessoryBar * Added Footer * removed comments * Fixed up utils * Added permission handling
211 lines
5.2 KiB
JavaScript
211 lines
5.2 KiB
JavaScript
import { AppLoading, Asset, Linking } from 'expo';
|
|
import React, { Component } from 'react';
|
|
import { StyleSheet, View } from 'react-native';
|
|
import { Bubble, GiftedChat, SystemMessage } from 'react-native-gifted-chat';
|
|
import Sentry from 'sentry-expo';
|
|
|
|
import AccessoryBar from './AccessoryBar';
|
|
import CustomActions from './CustomActions';
|
|
import CustomView from './CustomView';
|
|
import NavBar from './NavBar';
|
|
import messagesData from './data/messages';
|
|
import earlierMessages from './data/earlierMessages';
|
|
|
|
Sentry.config('https://2a164b1e89424a5aafc186da811308cb@sentry.io/276804').install();
|
|
|
|
const styles = StyleSheet.create({
|
|
container: { flex: 1 },
|
|
});
|
|
|
|
const filterBotMessages = (message) => !message.system && message.user && message.user._id && message.user._id === 2;
|
|
const findStep = (step) => (_, index) => index === step - 1;
|
|
|
|
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 = {
|
|
step: 0,
|
|
messages: [],
|
|
loadEarlier: true,
|
|
typingText: null,
|
|
isLoadingEarlier: false,
|
|
};
|
|
|
|
_isMounted = false;
|
|
|
|
async componentWillMount() {
|
|
this._isMounted = true;
|
|
// init with only system messages
|
|
this.setState({ messages: messagesData.filter((message) => message.system), appIsReady: true });
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this._isMounted = false;
|
|
}
|
|
|
|
onLoadEarlier = () => {
|
|
this.setState((previousState) => {
|
|
return {
|
|
isLoadingEarlier: true,
|
|
};
|
|
});
|
|
|
|
setTimeout(() => {
|
|
if (this._isMounted === true) {
|
|
this.setState((previousState) => {
|
|
return {
|
|
messages: GiftedChat.prepend(previousState.messages, earlierMessages),
|
|
loadEarlier: false,
|
|
isLoadingEarlier: false,
|
|
};
|
|
});
|
|
}
|
|
}, 1000); // simulating network
|
|
};
|
|
|
|
onSend = (messages = []) => {
|
|
const step = this.state.step + 1;
|
|
this.setState((previousState) => {
|
|
const sentMessages = [{ ...messages[0], sent: true, received: true }];
|
|
return {
|
|
messages: GiftedChat.append(previousState.messages, sentMessages),
|
|
step,
|
|
};
|
|
});
|
|
// for demo purpose
|
|
setTimeout(() => this.botSend(step), Math.round(Math.random() * 1000));
|
|
};
|
|
|
|
botSend = (step = 0) => {
|
|
const newMessage = messagesData
|
|
.reverse()
|
|
.filter(filterBotMessages)
|
|
.find(findStep(step));
|
|
if (newMessage) {
|
|
this.setState((previousState) => ({
|
|
messages: GiftedChat.append(previousState.messages, newMessage),
|
|
}));
|
|
}
|
|
};
|
|
|
|
parsePatterns = (linkStyle) => {
|
|
return [
|
|
{
|
|
pattern: /#(\w+)/,
|
|
style: { ...linkStyle, color: 'darkorange' },
|
|
onPress: () => Linking.openURL('http://gifted.chat'),
|
|
},
|
|
];
|
|
};
|
|
|
|
renderCustomView(props) {
|
|
return <CustomView {...props} />;
|
|
}
|
|
|
|
onReceive = (text) => {
|
|
this.setState((previousState) => {
|
|
return {
|
|
messages: GiftedChat.append(previousState.messages, {
|
|
_id: Math.round(Math.random() * 1000000),
|
|
text,
|
|
createdAt: new Date(),
|
|
user: otherUser,
|
|
}),
|
|
};
|
|
});
|
|
};
|
|
|
|
onSendFromUser = (messages = []) => {
|
|
const createdAt = new Date();
|
|
const messagesToUpload = messages.map((message) => ({
|
|
...message,
|
|
user,
|
|
createdAt,
|
|
_id: Math.round(Math.random() * 1000000),
|
|
}));
|
|
this.onSend(messagesToUpload);
|
|
};
|
|
|
|
renderAccessory = () => <AccessoryBar onSend={this.onSendFromUser} />;
|
|
|
|
renderCustomActions = (props) => {
|
|
return <CustomActions {...props} onSend={this.onSendFromUser} />;
|
|
};
|
|
|
|
renderBubble = (props) => {
|
|
return (
|
|
<Bubble
|
|
{...props}
|
|
wrapperStyle={{
|
|
left: {
|
|
backgroundColor: '#f0f0f0',
|
|
},
|
|
}}
|
|
/>
|
|
);
|
|
};
|
|
|
|
renderSystemMessage = (props) => {
|
|
return (
|
|
<SystemMessage
|
|
{...props}
|
|
containerStyle={{
|
|
marginBottom: 15,
|
|
}}
|
|
textStyle={{
|
|
fontSize: 14,
|
|
}}
|
|
/>
|
|
);
|
|
};
|
|
|
|
renderFooter = (props) => {
|
|
if (this.state.typingText) {
|
|
return (
|
|
<View style={styles.footerContainer}>
|
|
<Text style={styles.footerText}>{this.state.typingText}</Text>
|
|
</View>
|
|
);
|
|
}
|
|
return null;
|
|
};
|
|
|
|
render() {
|
|
if (!this.state.appIsReady) {
|
|
return <AppLoading />;
|
|
}
|
|
return (
|
|
<View style={styles.container} accessible accessibilityLabel="main" testID="main">
|
|
<NavBar />
|
|
<GiftedChat
|
|
messages={this.state.messages}
|
|
onSend={this.onSend}
|
|
keyboardShouldPersistTaps="never"
|
|
loadEarlier={this.state.loadEarlier}
|
|
onLoadEarlier={this.onLoadEarlier}
|
|
isLoadingEarlier={this.state.isLoadingEarlier}
|
|
parsePatterns={this.parsePatterns}
|
|
user={user}
|
|
renderAccessory={this.renderAccessory}
|
|
renderActions={this.renderCustomActions}
|
|
renderBubble={this.renderBubble}
|
|
renderSystemMessage={this.renderSystemMessage}
|
|
renderCustomView={this.renderCustomView}
|
|
renderFooter={this.renderFooter}
|
|
/>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
}
|