blob: 621790574c3c19dacf6f371d826f4cc865aea7ec [file] [log] [blame]
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04001import CircularProgress from '@material-ui/core/CircularProgress';
Adrien Béraud5e9e19b2021-04-22 01:38:53 -04002import React, { useEffect, useState } from 'react';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04003import MessageList from './MessageList';
4import SendMessageForm from './SendMessageForm';
5import authManager from '../AuthManager'
6import Conversation from '../../../model/Conversation';
Adrien Béraud150b4782021-04-21 19:40:59 -04007import LoadingPage from './loading';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04008
Adrien Béraud5e9e19b2021-04-22 01:38:53 -04009const ConversationView = props => {
10 const [state, setState] = useState({
Adrien Béraud4e287b92021-04-24 16:15:56 -040011 loaded: false,
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040012 error: false,
13 conversation: undefined
14 })
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040015
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040016 useEffect(() => {
17 const controller = new AbortController()
18 authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {signal: controller.signal})
19 .then(res => res.json())
20 .then(result => {
21 console.log(result)
22 setState({
23 loaded: true,
24 conversation: Conversation.from(props.accountId, result)// result.map(account => Account.from(account)),
25 })
26 }, error => {
27 console.log(`get error ${error}`)
28 setState({
29 loaded: true,
30 error: true
31 })
32 })
33 return () => controller.abort()
34 }, [props.accountId, props.conversationId])
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040035
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040036 const sendMessage = (message) => {
37 authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {
38 headers: {
39 'Accept': 'application/json',
40 'Content-Type': 'application/json'
41 },
42 method:"POST",
43 body: JSON.stringify({ message })
44 })
45 }
46
Adrien Béraud4e287b92021-04-24 16:15:56 -040047 const loadMore = () => {
48 authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}/messages`)
49 .then(res => res.json())
50 .then(messages => {
51 console.log(messages)
52 state.conversation.addLoadedMessages(messages)
53 setState(state)
54 })
55 }
56
57 console.log("ConversationView render " + (state.conversation ? state.conversation.getMessages().length : "no conversation"))
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040058 if (state.loaded === false) {
59 return <LoadingPage />
60 } else if (state.error === true) {
61 return <div>Error loding {props.conversationId}</div>
62 } else {
Adrien Béraud4e287b92021-04-24 16:15:56 -040063 return <div className="messenger">
64 <MessageList conversation={state.conversation} loadMore={loadMore} messages={state.conversation.getMessages()} />
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040065 <SendMessageForm onSend={sendMessage} />
Adrien Béraud4e287b92021-04-24 16:15:56 -040066 </div>
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040067 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040068}
69
70export default ConversationView