blob: c9449cd9a1a68751d35aecf9af5890ac7d23430a [file] [log] [blame]
simon07b4eb02022-09-29 17:50:26 -04001import { Stack } from '@mui/material';
simond47ef9e2022-09-28 22:24:28 -04002import { useEffect, useState } from 'react';
simon07b4eb02022-09-29 17:50:26 -04003import { useParams } from 'react-router';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -04004
simon07b4eb02022-09-29 17:50:26 -04005import Contact from '../../../model/Contact';
6import Conversation from '../../../model/Conversation';
7import { useAppSelector } from '../../redux/hooks';
8import authManager from '../AuthManager';
Adrien Béraud6ecaa402021-04-06 17:37:25 -04009//import Sound from 'react-sound';
Adrien Béraud995e8022021-04-08 13:46:51 -040010import ConversationList from '../components/ConversationList';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040011import ConversationView from '../components/ConversationView';
simon07b4eb02022-09-29 17:50:26 -040012import Header from '../components/Header';
Adrien Béraud150b4782021-04-21 19:40:59 -040013import LoadingPage from '../components/loading';
simon07b4eb02022-09-29 17:50:26 -040014import NewContactForm from '../components/NewContactForm';
simonfe1de722022-10-02 00:21:43 -040015import AddContactPage from './AddContactPage';
ervinanoh34eb9472022-09-13 04:20:28 -040016
simonfe1de722022-10-02 00:21:43 -040017type MessengerProps = {
18 accountId?: string;
19 conversationId?: string;
20 contactId?: string;
21};
22
23const Messenger = (props: MessengerProps) => {
ervinanoh34eb9472022-09-13 04:20:28 -040024 const { refresh } = useAppSelector((state) => state.app);
25
simonfe1de722022-10-02 00:21:43 -040026 const [conversations, setConversations] = useState<Conversation[] | undefined>(undefined);
simond47ef9e2022-09-28 22:24:28 -040027 const [searchQuery, setSearchQuery] = useState('');
simonfe1de722022-10-02 00:21:43 -040028 const [searchResult, setSearchResults] = useState<Conversation | undefined>(undefined);
Larbi Gharibe9af9732021-03-31 15:08:01 +010029
simond47ef9e2022-09-28 22:24:28 -040030 const params = useParams();
31 const accountId = props.accountId || params.accountId;
32 const conversationId = props.conversationId || params.conversationId;
33 const contactId = props.contactId || params.contactId;
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040034
simonfe1de722022-10-02 00:21:43 -040035 if (accountId == null) {
36 throw new Error('Missing accountId');
37 }
38
Adrien Béraud4e287b92021-04-24 16:15:56 -040039 useEffect(() => {
simond47ef9e2022-09-28 22:24:28 -040040 console.log('REFRESH CONVERSATIONS FROM MESSENGER');
41 const controller = new AbortController();
42 authManager
43 .fetch(`/api/accounts/${accountId}/conversations`, { signal: controller.signal })
44 .then((res) => res.json())
simonfe1de722022-10-02 00:21:43 -040045 .then((result: Conversation[]) => {
simond47ef9e2022-09-28 22:24:28 -040046 console.log(result);
47 setConversations(Object.values(result).map((c) => Conversation.from(accountId, c)));
48 });
ervinanoh34eb9472022-09-13 04:20:28 -040049 // return () => controller.abort()
simond47ef9e2022-09-28 22:24:28 -040050 }, [accountId, refresh]);
Adrien Béraud995e8022021-04-08 13:46:51 -040051
Adrien Béraudabba2e52021-04-24 21:39:56 -040052 useEffect(() => {
simond47ef9e2022-09-28 22:24:28 -040053 if (!searchQuery) return;
54 const controller = new AbortController();
55 authManager
56 .fetch(`/api/accounts/${accountId}/ns/name/${searchQuery}`, { signal: controller.signal })
57 .then((response) => {
58 if (response.status === 200) {
59 return response.json();
60 } else {
simonfe1de722022-10-02 00:21:43 -040061 throw new Error(response.status.toString());
simond47ef9e2022-09-28 22:24:28 -040062 }
63 })
64 .then((response) => {
65 console.log(response);
66 const contact = new Contact(response.address);
67 contact.setRegisteredName(response.name);
68 setSearchResults(contact ? Conversation.fromSingleContact(accountId, contact) : undefined);
69 })
70 .catch((e) => {
71 setSearchResults(undefined);
72 });
73 // return () => controller.abort() // crash on React18
74 }, [accountId, searchQuery]);
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040075
simond47ef9e2022-09-28 22:24:28 -040076 console.log('Messenger render');
Adrien Béraud4e287b92021-04-24 16:15:56 -040077 return (
simond47ef9e2022-09-28 22:24:28 -040078 <Stack direction="row" height="100vh" width="100vw">
79 <Stack flexGrow={0} flexShrink={0} overflow="auto">
idillonbef18a52022-09-01 01:51:40 -040080 <Header />
81 <NewContactForm onChange={setSearchQuery} />
82 {contactId && <AddContactPage accountId={accountId} contactId={contactId} />}
simond47ef9e2022-09-28 22:24:28 -040083 {conversations ? (
84 <ConversationList search={searchResult} conversations={conversations} accountId={accountId} />
85 ) : (
86 <div className="rooms-list">
87 <LoadingPage />
88 </div>
89 )}
idillonbef18a52022-09-01 01:51:40 -040090 </Stack>
simond47ef9e2022-09-28 22:24:28 -040091 <Stack flexGrow={1}>
idillonbef18a52022-09-01 01:51:40 -040092 {conversationId && <ConversationView accountId={accountId} conversationId={conversationId} />}
93 </Stack>
94 </Stack>
simond47ef9e2022-09-28 22:24:28 -040095 );
96};
Larbi Gharibe9af9732021-03-31 15:08:01 +010097
simond47ef9e2022-09-28 22:24:28 -040098export default Messenger;