blob: 064efcf7216e891bac0d147aa89630afc40f2315 [file] [log] [blame]
simon26e79f72022-10-05 22:16:08 -04001/*
2 * Copyright (C) 2022 Savoir-faire Linux Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation; either version 3 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
13 *
14 * You should have received a copy of the GNU Affero General Public
15 * License along with this program. If not, see
16 * <https://www.gnu.org/licenses/>.
17 */
idillonae655dd2022-10-14 18:11:02 -040018import { Divider, Stack, Typography } from '@mui/material';
simonf9d78f22022-11-25 15:47:15 -050019import { ConversationMember } from 'jami-web-common';
simonf929a362022-11-18 16:53:45 -050020import { useContext, useMemo } from 'react';
idillonae655dd2022-10-14 18:11:02 -040021import { useTranslation } from 'react-i18next';
simon07b4eb02022-09-29 17:50:26 -040022
simon5da8ca62022-11-09 15:21:25 -050023import { useAuthContext } from '../contexts/AuthProvider';
simonf929a362022-11-18 16:53:45 -050024import { ConversationContext } from '../contexts/ConversationProvider';
simonff1cb352022-11-24 15:15:26 -050025import { useStartCall } from '../hooks/useStartCall';
idillon6847e252022-11-04 11:50:08 -040026import ChatInterface from '../pages/ChatInterface';
idillonae655dd2022-10-14 18:11:02 -040027import { translateEnumeration, TranslateEnumerationOptions } from '../utils/translations';
28import { AddParticipantButton, ShowOptionsMenuButton, StartAudioCallButton, StartVideoCallButton } from './Button';
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040029
simonf929a362022-11-18 16:53:45 -050030const ConversationView = () => {
idillonbef18a52022-09-01 01:51:40 -040031 return (
simon9f814a32022-11-22 21:40:53 -050032 <Stack flexGrow={1} height="100%">
simonf9d78f22022-11-25 15:47:15 -050033 <ConversationHeader />
idillonae655dd2022-10-14 18:11:02 -040034 <Divider
35 sx={{
36 borderTop: '1px solid #E5E5E5',
37 }}
38 />
simonf9d78f22022-11-25 15:47:15 -050039 <ChatInterface />
idillonbef18a52022-09-01 01:51:40 -040040 </Stack>
simond47ef9e2022-09-28 22:24:28 -040041 );
42};
Adrien Béraud35e7d7c2021-04-13 03:28:39 -040043
simonf9d78f22022-11-25 15:47:15 -050044const ConversationHeader = () => {
45 const { account } = useAuthContext();
46 const { conversation } = useContext(ConversationContext);
idillonae655dd2022-10-14 18:11:02 -040047 const { t } = useTranslation();
simonff1cb352022-11-24 15:15:26 -050048 const { conversationId } = useContext(ConversationContext);
idillonae655dd2022-10-14 18:11:02 -040049
simonf9d78f22022-11-25 15:47:15 -050050 const members = conversation.getMembers();
51 const adminTitle = conversation.infos.title as string;
52
idillonae655dd2022-10-14 18:11:02 -040053 const title = useMemo(() => {
54 if (adminTitle) {
55 return adminTitle;
56 }
57
58 const options: TranslateEnumerationOptions<ConversationMember> = {
59 elementPartialKey: 'member',
60 getElementValue: (member) => getMemberName(member),
61 translaters: [
62 () =>
63 // The user is chatting with themself
64 t('conversation_title_one', { member0: account?.getDisplayName() }),
65 (interpolations) => t('conversation_title_one', interpolations),
66 (interpolations) => t('conversation_title_two', interpolations),
67 (interpolations) => t('conversation_title_three', interpolations),
68 (interpolations) => t('conversation_title_four', interpolations),
69 (interpolations) => t('conversation_title_more', interpolations),
70 ],
71 };
72
73 return translateEnumeration<ConversationMember>(members, options);
74 }, [account, members, adminTitle, t]);
75
simonff1cb352022-11-24 15:15:26 -050076 const startCall = useStartCall();
77
idillonae655dd2022-10-14 18:11:02 -040078 return (
idillon6847e252022-11-04 11:50:08 -040079 <Stack direction="row" padding="16px" overflow="hidden">
idillonae655dd2022-10-14 18:11:02 -040080 <Stack flex={1} justifyContent="center" whiteSpace="nowrap" overflow="hidden">
81 <Typography variant="h3" textOverflow="ellipsis">
82 {title}
83 </Typography>
84 </Stack>
85 <Stack direction="row" spacing="20px">
simonff1cb352022-11-24 15:15:26 -050086 <StartAudioCallButton onClick={() => startCall(conversationId)} />
87 <StartVideoCallButton
88 onClick={() =>
89 startCall(conversationId, {
90 isVideoOn: true,
91 })
92 }
93 />
idillonae655dd2022-10-14 18:11:02 -040094 <AddParticipantButton />
95 <ShowOptionsMenuButton />
96 </Stack>
97 </Stack>
98 );
99};
100
101const getMemberName = (member: ConversationMember) => {
102 const contact = member.contact;
103 return contact.getDisplayName();
104};
105
simond47ef9e2022-09-28 22:24:28 -0400106export default ConversationView;