blob: d0ab22758ffe407e61ef453ba86f339bee399851 [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)
Adrien Béraud86986032021-04-25 12:04:53 -040062 return {...state}
Adrien Béraudabba2e52021-04-24 21:39:56 -040063 })
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)
Adrien Béraud86986032021-04-25 12:04:53 -040077 setState(state => {
78 if (state.conversation)
Adrien Béraudabba2e52021-04-24 21:39:56 -040079 state.conversation.addLoadedMessages(messages)
Adrien Béraud86986032021-04-25 12:04:53 -040080 return {...state}
81 })
Adrien Béraudabba2e52021-04-24 21:39:56 -040082 }).catch(e => console.log(e))
83 return () => controller.abort()
84 }, [state, loadingMesages])
85
Adrien Béraud5e9e19b2021-04-22 01:38:53 -040086 const sendMessage = (message) => {
87 authManager.fetch(`/api/accounts/${props.accountId}/conversations/${props.conversationId}`, {
88 headers: {
89 'Accept': 'application/json',
90 'Content-Type': 'application/json'
91 },
92 method:"POST",
93 body: JSON.stringify({ message })
94 })
95 }
96
97 if (state.loaded === false) {
98 return <LoadingPage />
99 } else if (state.error === true) {
100 return <div>Error loding {props.conversationId}</div>
101 } else {
Adrien Béraud4e287b92021-04-24 16:15:56 -0400102 return <div className="messenger">
Adrien Béraudabba2e52021-04-24 21:39:56 -0400103 <MessageList conversation={state.conversation} loading={loadingMesages} loadMore={() => setLoadingMesages(true)} messages={state.conversation.getMessages()} />
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400104 <SendMessageForm onSend={sendMessage} />
Adrien Béraud4e287b92021-04-24 16:15:56 -0400105 </div>
Adrien Béraud5e9e19b2021-04-22 01:38:53 -0400106 }
Adrien Béraud35e7d7c2021-04-13 03:28:39 -0400107}
108
109export default ConversationView