blob: d0ab22758ffe407e61ef453ba86f339bee399851 [file] [log] [blame]
import React, { useEffect, useState } from 'react';
import MessageList from './MessageList';
import SendMessageForm from './SendMessageForm';
import authManager from '../AuthManager'
import Conversation from '../../../model/Conversation';
import LoadingPage from './loading';
import io from "socket.io-client";
const ConversationView = props => {
const [loadingMesages, setLoadingMesages] = useState(false)
const [socket, setSocket] = useState(undefined)
const [state, setState] = useState({
loaded: false,
error: false,
conversation: undefined
})
useEffect(() => {
const controller = new AbortController()
authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {signal: controller.signal})
.then(res => res.json())
.then(result => {
console.log(result)
setState({
loaded: true,
conversation: Conversation.from(props.accountId, result)
})
}, error => {
console.log(`get error ${error}`)
setState({
loaded: true,
error: true
})
})
return () => controller.abort()
}, [props.accountId, props.conversationId])
useEffect(() => {
console.log("io.connect")
const socket = io()
setSocket(socket)
return () => {
console.log("io.disconnect")
socket.disconnect()
setSocket(undefined)
}
}, [])
useEffect(() => {
if (!state.conversation)
return
console.log(`io set conversation ${state.conversation.getId()} `+ socket)
if (socket)
socket.emit('conversation', { accountId: state.conversation.getAccountId(), conversationId: state.conversation.getId() })
socket.off('newMessage')
socket.on('newMessage', (data) => {
console.log("newMessage")
console.log(data)
setState(state => {
if (state.conversation)
state.conversation.addMessage(data)
return {...state}
})
})
}, [state.conversation ? state.conversation.getId() : "", socket])
useEffect(() => {
if (!loadingMesages || !state.conversation)
return
console.log(`Load more messages`)
const controller = new AbortController()
authManager.fetch(`/api/accounts/${state.conversation.getAccountId()}/conversations/${state.conversation.getId()}/messages`, {signal: controller.signal})
.then(res => res.json())
.then(messages => {
console.log(messages)
setLoadingMesages(false)
setState(state => {
if (state.conversation)
state.conversation.addLoadedMessages(messages)
return {...state}
})
}).catch(e => console.log(e))
return () => controller.abort()
}, [state, loadingMesages])
const sendMessage = (message) => {
authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method:"POST",
body: JSON.stringify({ message })
})
}
if (state.loaded === false) {
return <LoadingPage />
} else if (state.error === true) {
return <div>Error loding {props.conversationId}</div>
} else {
return <div className="messenger">
<MessageList conversation={state.conversation} loading={loadingMesages} loadMore={() => setLoadingMesages(true)} messages={state.conversation.getMessages()} />
<SendMessageForm onSend={sendMessage} />
</div>
}
}
export default ConversationView