blob: ea64d9bfe87e39a1c17c7a8c837523247fd2ba4f [file] [log] [blame]
Adrien Béraud4e287b92021-04-24 16:15:56 -04001import React, { useEffect, useState } from 'react';
Larbi Gharibe9af9732021-03-31 15:08:01 +01002import Header from '../components/Header'
Larbi Gharibe9af9732021-03-31 15:08:01 +01003import NewContactForm from '../components/NewContactForm'
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04004
Adrien Béraud6ecaa402021-04-06 17:37:25 -04005//import Sound from 'react-sound';
Adrien Béraud995e8022021-04-08 13:46:51 -04006import ConversationList from '../components/ConversationList';
Adrien Béraud995e8022021-04-08 13:46:51 -04007import authManager from '../AuthManager'
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04008import Conversation from '../../../model/Conversation'
9import Contact from '../../../model/Contact'
10import ConversationView from '../components/ConversationView';
11import AddContactPage from './addContactPage.jsx';
Adrien Béraud150b4782021-04-21 19:40:59 -040012import LoadingPage from '../components/loading';
Adrien Béraud4e287b92021-04-24 16:15:56 -040013import { useParams } from 'react-router';
idillonbef18a52022-09-01 01:51:40 -040014import { Stack } from '@mui/material';
ervinanoh34eb9472022-09-13 04:20:28 -040015import { useAppSelector } from '../../redux/hooks';
16
Larbi Gharibe9af9732021-03-31 15:08:01 +010017
Adrien Béraud6c934962021-06-07 10:13:26 -040018const Messenger = (props) => {
ervinanoh34eb9472022-09-13 04:20:28 -040019 const { refresh } = useAppSelector((state) => state.app);
20
Adrien Béraud4e287b92021-04-24 16:15:56 -040021 const [conversations, setConversations] = useState(undefined)
Adrien Béraudabba2e52021-04-24 21:39:56 -040022 const [searchQuery, setSearchQuery] = useState('')
Adrien Béraud4e287b92021-04-24 16:15:56 -040023 const [searchResult, setSearchResults] = useState(undefined)
Larbi Gharibe9af9732021-03-31 15:08:01 +010024
Adrien Béraud4e287b92021-04-24 16:15:56 -040025 const params = useParams()
26 const accountId = props.accountId || params.accountId
27 const conversationId = props.conversationId || params.conversationId
28 const contactId = props.contactId || params.contactId
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040029
Adrien Béraud4e287b92021-04-24 16:15:56 -040030 useEffect(() => {
ervinanoh34eb9472022-09-13 04:20:28 -040031 console.log("REFRESH CONVERSATIONS FROM MESSENGER")
Adrien Béraud4e287b92021-04-24 16:15:56 -040032 const controller = new AbortController()
33 authManager.fetch(`/api/accounts/${accountId}/conversations`, {signal: controller.signal})
34 .then(res => res.json())
35 .then(result => {
36 console.log(result)
37 setConversations(Object.values(result).map(c => Conversation.from(accountId, c)))
38 })
ervinanoh34eb9472022-09-13 04:20:28 -040039 // return () => controller.abort()
40 }, [accountId, refresh])
Adrien Béraud995e8022021-04-08 13:46:51 -040041
Adrien Béraudabba2e52021-04-24 21:39:56 -040042 useEffect(() => {
43 if (!searchQuery)
44 return
45 const controller = new AbortController()
46 authManager.fetch(`/api/accounts/${accountId}/ns/name/${searchQuery}`, {signal: controller.signal})
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040047 .then(response => {
48 if (response.status === 200) {
49 return response.json()
50 } else {
51 throw new Error(response.status)
52 }
53 }).then(response => {
54 console.log(response)
55 const contact = new Contact(response.address)
56 contact.setRegisteredName(response.name)
Adrien Béraud4e287b92021-04-24 16:15:56 -040057 setSearchResults(contact ? Conversation.fromSingleContact(accountId, contact) : undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040058 }).catch(e => {
Adrien Béraud4e287b92021-04-24 16:15:56 -040059 setSearchResults(undefined)
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040060 })
idillon28996962022-09-06 17:49:41 -040061 // return () => controller.abort() // crash on React18
Adrien Béraudabba2e52021-04-24 21:39:56 -040062 }, [accountId, searchQuery])
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040063
Adrien Béraud6c934962021-06-07 10:13:26 -040064 console.log("Messenger render")
Adrien Béraud4e287b92021-04-24 16:15:56 -040065 return (
idillonbef18a52022-09-01 01:51:40 -040066 <Stack
67 direction="row"
68 height="100vh"
69 width="100vw"
70 >
71 <Stack
72 flexGrow={0}
73 flexShrink={0}
74 overflow="auto"
75 >
76 <Header />
77 <NewContactForm onChange={setSearchQuery} />
78 {contactId && <AddContactPage accountId={accountId} contactId={contactId} />}
79 {conversations ?
80 <ConversationList search={searchResult} conversations={conversations} accountId={accountId} /> :
81 <div className="rooms-list"><LoadingPage /></div>
82 }
83 </Stack>
84 <Stack
85 flexGrow={1}
86 >
87 {conversationId && <ConversationView accountId={accountId} conversationId={conversationId} />}
88 </Stack>
89 </Stack>
Adrien Béraud4e287b92021-04-24 16:15:56 -040090 )
Larbi Gharibe9af9732021-03-31 15:08:01 +010091}
92
Adrien Béraud6c934962021-06-07 10:13:26 -040093export default Messenger