-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMessages.tsx
98 lines (89 loc) · 2.22 KB
/
Messages.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import React, { useCallback, useEffect, useState } from 'react';
import { StyleSheet, View, Text, TextInput, Button, ScrollView } from "react-native";
import { usePubNub } from 'pubnub-react';
const channel = 'awesomeChannel';
const channels = [channel];
export function Messages() {
const pubnub = usePubNub();
const [messages, setMessages] = useState<any[]>([]);
const [input, setInput] = useState('');
let messageList: ScrollView | null = null;
useEffect(() => {
pubnub.addListener({
message: messageEvent => {
setMessages([...messages, messageEvent.message]);
},
});
pubnub.subscribe({ channels });
}, [messages]);
const sendMessage = useCallback(
async message => {
if (message) {
await pubnub.publish({
channel: channel,
message,
});
setInput('');
}
},
[pubnub, setInput]
);
return (
<View>
<Text style={styles.MessagesHeader}>Messages</Text>
<ScrollView
style={styles.MessagesList}
ref={ref => {messageList = ref}}
onContentSizeChange={() => messageList ? messageList.scrollToEnd(): undefined}
>
{ messages.length > 0 ?
<View>
{
messages.map((message, messageIndex) => (
<View
key={`message-${messageIndex}`}
>
<Text>
{message}
</Text>
</View>
))
}
</View>
:
<Text>No Messages</Text>
}
</ScrollView>
<TextInput
style={styles.MessagesInput}
placeholder="Type your message"
value={input}
onChangeText={text => setInput(text)}
/>
<Button
title="Send Message"
color="blue"
onPress={e => {
e.preventDefault();
sendMessage(input);
}}
>
</Button>
</View>
);
}
const styles = StyleSheet.create({
MessagesHeader: {
backgroundColor: 'blue',
color: 'white',
textAlign: 'left'
},
MessagesList: {
borderBottomWidth: 1,
borderColor: 'grey',
height: 80
},
MessagesInput: {
backgroundColor: 'white',
}
});