frontend/ConversationScreen.js
2024-02-08 09:10:53 -05:00

118 lines
3.6 KiB
JavaScript

import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, FlatList, ActivityIndicator } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import io from 'socket.io-client'
import { useTailwind } from 'tailwind-rn';
function ConversationScreen({ route, navigation }) {
const { otherUserId } = route.params;
const [directMessages, setDirectMessages] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [newMessage, setNewMessage] = useState('');
const tailwind = useTailwind();
async function fetchDirectMessages() {
setIsLoading(true);
try {
const token = await AsyncStorage.getItem('token');
const apiUrl = await AsyncStorage.getItem('apiEndpoint')
const response = await fetch(`${apiUrl}/api/v1/app/dms/${otherUserId}`, {
headers: { 'Authorization': token },
});
if (!response.ok) {
throw new Error(`Failed to fetch direct messages: ${response.status}`);
}
const messages = await response.json();
setDirectMessages(messages);
} catch (error) {
console.error('Error:', error);
setErrorMessage(error.message);
} finally {
setIsLoading(false);
}
}
async function handleSendMessage() {
const token = await AsyncStorage.getItem('token');
const senderId = await AsyncStorage.getItem('userID');
const apiUrl = await AsyncStorage.getItem('apiEndpoint')
const response = await fetch(`${apiUrl}/api/v1/app/dms/send`, {
method: 'POST',
headers: {
'Authorization': token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ recipientId: otherUserId, text: newMessage, senderId: senderId }),
});
if (!response.ok) {
throw new Error(`Failed to send message: ${response.status}`);
}
const message = await response.json();
setNewMessage('');
}
useEffect(() => {
async function setupSocket() {
const senderId = await AsyncStorage.getItem('userID');
console.log('Sender ID:', senderId);
const apiUrl = await AsyncStorage.getItem('apiEndpoint')
const socket = io(apiUrl);
socket.emit('user connected', senderId);
socket.on('new_dm', (newDm) => {
setDirectMessages(prevMessages => [...prevMessages, newDm]);
});
}
async function setup() {
await fetchDirectMessages();
await setupSocket();
}
setup();
}, []);
return (
<View style={tailwind('flex-auto')}>
{/* Display a loading indicator while the messages are being fetched */}
{isLoading && <ActivityIndicator size="large" color="#0000ff" />}
{errorMessage !== '' && <Text>{errorMessage}</Text>}
{/* Render the list of direct messages */}
<View style={tailwind('flex-1')}>
<FlatList
style={tailwind('flex-1')}
contentContainerStyle={tailwind('pb-12')}
data={directMessages}
keyExtractor={(item) => item._id}
renderItem={({ item }) => (
<Text>
{item.sender.username}: {item.content}
</Text>
)}
/>
</View>
{/* Render the text input and send button */}
<View style={tailwind('flex-row items-center mb-3')}>
<TextInput
style={tailwind('flex-1 border border-gray-500 mr-3 px-2')}
value={newMessage}
onChangeText={setNewMessage}
placeholder="Type a message"
/>
<Button title="Send" onPress={handleSendMessage} />
</View>
</View>
);
}
export default ConversationScreen;