blob: 5c5a936d242a6caa1add722df8328b0e8abcd460 [file] [log] [blame]
Adrien Béraud5e9e19b2021-04-22 01:38:53 -04001import React, { useEffect, useState } from 'react';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04002import MessageList from './MessageList';
3import SendMessageForm from './SendMessageForm';
4import authManager from '../AuthManager'
5import Conversation from '../../../model/Conversation';
Adrien Béraud150b4782021-04-21 19:40:59 -04006import LoadingPage from './loading';
Adrien Béraudabba2e52021-04-24 21:39:56 -04007import io from "socket.io-client";
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04008
Adrien Béraud5e9e19b2021-04-22 01:38:53 -04009const ConversationView = props => {
Adrien Béraudabba2e52021-04-24 21:39:56 -040010 const [loadingMesages, setLoadingMesages] = useState(false)
11 const [socket, setSocket] = useState(undefined)
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040012 const [state, setState] = useState({
Adrien Béraud4e287b92021-04-24 16:15:56 -040013 loaded: false,
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040014 error: false,
15 conversation: undefined
16 })
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040017
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040018 useEffect(() => {
19 const controller = new AbortController()
20 authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {signal: controller.signal})
21 .then(res => res.json())
22 .then(result => {
23 console.log(result)
24 setState({
25 loaded: true,
Adrien Béraudabba2e52021-04-24 21:39:56 -040026 conversation: Conversation.from(props.accountId, result)
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040027 })
28 }, error => {
29 console.log(`get error ${error}`)
30 setState({
31 loaded: true,
32 error: true
33 })
34 })
35 return () => controller.abort()
36 }, [props.accountId, props.conversationId])
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040037
Adrien Béraudabba2e52021-04-24 21:39:56 -040038 useEffect(() => {
39 console.log("io.connect")
40 const socket = io()
41 setSocket(socket)
42 return () => {
43 console.log("io.disconnect")
44 socket.disconnect()
45 setSocket(undefined)
46 }
47 }, [])
48
49 useEffect(() => {
50 if (!state.conversation)
51 return
52 console.log(`io set conversation ${state.conversation.getId()} `+ socket)
53 if (socket)
54 socket.emit('conversation', { accountId: state.conversation.getAccountId(), conversationId: state.conversation.getId() })
55 socket.off('newMessage')
56 socket.on('newMessage', (data) => {
57 console.log("newMessage")
58 console.log(data)
59 setState(state => {
60 if (state.conversation)
61 state.conversation.addMessage(data)
62 return {...state}
63 })
64 })
65 }, [state.conversation ? state.conversation.getId() : "", socket])
66
67 useEffect(() => {
68 if (!loadingMesages || !state.conversation)
69 return
70 console.log(`Load more messages`)
71 const controller = new AbortController()
72 authManager.fetch(`/api/accounts/${state.conversation.getAccountId()}/conversations/${state.conversation.getId()}/messages`, {signal: controller.signal})
73 .then(res => res.json())
74 .then(messages => {
75 console.log(messages)
76 setLoadingMesages(false)
77 if (state.conversation)
78 state.conversation.addLoadedMessages(messages)
79 setState(state)
80 }).catch(e => console.log(e))
81 return () => controller.abort()
82 }, [state, loadingMesages])
83
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040084 const sendMessage = (message) => {
85 authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {
86 headers: {
87 'Accept': 'application/json',
88 'Content-Type': 'application/json'
89 },
90 method:"POST",
91 body: JSON.stringify({ message })
92 })
93 }
94
95 if (state.loaded === false) {
96 return <LoadingPage />
97 } else if (state.error === true) {
98 return <div>Error loding {props.conversationId}</div>
99 } else {
Adrien Béraud4e287b92021-04-24 16:15:56 -0400100 return <div className="messenger">
Adrien Béraudabba2e52021-04-24 21:39:56 -0400101 <MessageList conversation={state.conversation} loading={loadingMesages} loadMore={() => setLoadingMesages(true)} messages={state.conversation.getMessages()} />
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400102 <SendMessageForm onSend={sendMessage} />
Adrien Béraud4e287b92021-04-24 16:15:56 -0400103 </div>
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400104 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400105}
106
107export default ConversationView