Divide Conversation into ConversationInfos, ConversationMember, and ConversationSummary
- ConversationSummary is used to display ConversationList.
- Having the three separated will help managing queries.
- Adding ConversationSummary required to solve some inconsistencies in ConversationList, which was mixing contacts and conversations. ContactSearchResultList has been added as a quick fix . It will need more work.
- Some tools to uniformize conversation names have been introduced. They will need more work.
Note the diplaying of ConversationList is left broken in this commit.
Change-Id: I29337906cc43781a9c4790735490a6ee2cc51cb0
diff --git a/client/src/components/CallChatDrawer.tsx b/client/src/components/CallChatDrawer.tsx
index b87f37d..d094554 100644
--- a/client/src/components/CallChatDrawer.tsx
+++ b/client/src/components/CallChatDrawer.tsx
@@ -44,10 +44,7 @@
const CallChatDrawerHeader = () => {
const { setIsChatShown } = useCallContext();
- const { conversation } = useConversationContext();
-
- // TODO: Improve this to support multiple members
- const contact = conversation.getFirstMember().contact;
+ const { conversationDisplayName } = useConversationContext();
return (
<Stack direction="row" padding={2} spacing={2} alignItems="center">
@@ -58,7 +55,7 @@
/>
<Stack direction="column">
<Typography variant="h3" textOverflow="ellipsis">
- {contact.getDisplayName()}
+ {conversationDisplayName}
</Typography>
</Stack>
</Stack>
diff --git a/client/src/components/ContactSearchResultList.tsx b/client/src/components/ContactSearchResultList.tsx
new file mode 100644
index 0000000..cff4f6b
--- /dev/null
+++ b/client/src/components/ContactSearchResultList.tsx
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program. If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+import { Dialog, DialogProps, List, ListItem, ListItemAvatar, ListItemText } from '@mui/material';
+
+import { Contact } from '../models/contact';
+import AddContactPage from '../pages/AddContactPage';
+import ConversationAvatar from './ConversationAvatar';
+import { useDialogHandler } from './Dialog';
+
+type ContactSearchResultListProps = {
+ contacts: Contact[];
+};
+
+export default ({ contacts }: ContactSearchResultListProps) => {
+ return (
+ <List>
+ {contacts?.map((contact) => (
+ <ContactSearchResultListItem key={contact.uri} contact={contact} />
+ ))}
+ </List>
+ );
+};
+
+type ContactSearchResultListItemProps = {
+ contact: Contact;
+};
+
+const ContactSearchResultListItem = ({ contact }: ContactSearchResultListItemProps) => {
+ const dialogHandler = useDialogHandler();
+
+ return (
+ <>
+ <AddContactDialog {...dialogHandler.props} contactId={contact.uri} />
+ <ListItem
+ button
+ alignItems="flex-start"
+ key={contact.uri}
+ onClick={() => {
+ dialogHandler.openDialog();
+ }}
+ >
+ <ListItemAvatar>
+ <ConversationAvatar />
+ </ListItemAvatar>
+ <ListItemText primary={contact.getDisplayName()} secondary={contact.uri} />
+ </ListItem>
+ </>
+ );
+};
+
+type AddContactDialogProps = DialogProps & {
+ contactId: string;
+};
+
+const AddContactDialog = ({ contactId, ...props }: AddContactDialogProps) => {
+ return (
+ <Dialog {...props}>
+ <AddContactPage contactId={contactId} />
+ </Dialog>
+ );
+};
diff --git a/client/src/components/ConversationList.tsx b/client/src/components/ConversationList.tsx
index 08553b7..3f7603f 100644
--- a/client/src/components/ConversationList.tsx
+++ b/client/src/components/ConversationList.tsx
@@ -19,23 +19,19 @@
import List from '@mui/material/List';
import ListSubheader from '@mui/material/ListSubheader';
import Typography from '@mui/material/Typography';
-import { useContext, useEffect } from 'react';
+import { useContext } from 'react';
import { MessengerContext } from '../contexts/MessengerProvider';
-import { Conversation } from '../models/conversation';
-import { useAppSelector } from '../redux/hooks';
+import ContactSearchResultList from './ContactSearchResultList';
import ConversationListItem from './ConversationListItem';
+import LoadingPage from './Loading';
-type ConversationListProps = {
- conversations: Conversation[];
-};
-export default function ConversationList({ conversations }: ConversationListProps) {
- const { searchResult } = useContext(MessengerContext);
- const { refresh } = useAppSelector((state) => state.userInfo);
+export default function ConversationList() {
+ const { searchResult, conversationsSummaries } = useContext(MessengerContext);
- useEffect(() => {
- console.log('refresh list');
- }, [refresh]);
+ if (!conversationsSummaries) {
+ return <LoadingPage />;
+ }
return (
<div className="rooms-list">
@@ -43,14 +39,14 @@
{searchResult && (
<div>
<ListSubheader>Public directory</ListSubheader>
- <ConversationListItem conversation={searchResult} />
+ <ContactSearchResultList contacts={searchResult} />
<ListSubheader>Conversations</ListSubheader>
</div>
)}
- {conversations.map((conversation) => (
- <ConversationListItem key={conversation.id} conversation={conversation} />
+ {conversationsSummaries.map((conversationSummary) => (
+ <ConversationListItem key={conversationSummary.id} conversationSummary={conversationSummary} />
))}
- {conversations.length === 0 && (
+ {conversationsSummaries.length === 0 && (
<div className="list-placeholder">
<GroupIcon color="disabled" fontSize="large" />
<Typography className="subtitle" variant="subtitle2">
diff --git a/client/src/components/ConversationListItem.tsx b/client/src/components/ConversationListItem.tsx
index e4be263..f71705f 100644
--- a/client/src/components/ConversationListItem.tsx
+++ b/client/src/components/ConversationListItem.tsx
@@ -16,7 +16,7 @@
* <https://www.gnu.org/licenses/>.
*/
import { Box, ListItem, ListItemAvatar, ListItemText } from '@mui/material';
-import { ContactDetails } from 'jami-web-common';
+import { IConversationSummary } from 'jami-web-common';
import { QRCodeCanvas } from 'qrcode.react';
import { useCallback, useContext, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
@@ -25,62 +25,42 @@
import { useAuthContext } from '../contexts/AuthProvider';
import { CallManagerContext } from '../contexts/CallManagerProvider';
import { CallStatus, useCallContext } from '../contexts/CallProvider';
-import { useConversationContext } from '../contexts/ConversationProvider';
-import { MessengerContext } from '../contexts/MessengerProvider';
-import { Conversation } from '../models/conversation';
+import { useUrlParams } from '../hooks/useUrlParams';
import { setRefreshFromSlice } from '../redux/appSlice';
import { useAppDispatch } from '../redux/hooks';
+import { ConversationRouteParams } from '../router';
import ContextMenu, { ContextMenuHandler, useContextMenuHandler } from './ContextMenu';
import ConversationAvatar from './ConversationAvatar';
import { ConfirmationDialog, DialogContentList, InfosDialog, useDialogHandler } from './Dialog';
import { PopoverListItemData } from './PopoverList';
-import {
- AudioCallIcon,
- BlockContactIcon,
- CancelIcon,
- ContactDetailsIcon,
- MessageIcon,
- RemoveContactIcon,
- VideoCallIcon,
-} from './SvgIcon';
+import { AudioCallIcon, CancelIcon, MessageIcon, PersonIcon, VideoCallIcon } from './SvgIcon';
type ConversationListItemProps = {
- conversation: Conversation;
+ conversationSummary: IConversationSummary;
};
-export default function ConversationListItem({ conversation }: ConversationListItemProps) {
- const conversationContext = useConversationContext(true);
- const conversationId = conversationContext?.conversationId;
+export default function ConversationListItem({ conversationSummary }: ConversationListItemProps) {
+ const {
+ urlParams: { conversationId: selectedConversationId },
+ } = useUrlParams<ConversationRouteParams>();
const contextMenuHandler = useContextMenuHandler();
- const { newContactId, setNewContactId } = useContext(MessengerContext);
const callContext = useCallContext(true);
const { callData } = useContext(CallManagerContext);
const { t } = useTranslation();
-
- const pathId = conversationId ?? newContactId;
- const isSelected = conversation.getDisplayUri() === pathId;
-
const navigate = useNavigate();
- const userId = conversation?.getFirstMember()?.contact.uri;
+
+ const conversationId = conversationSummary.id;
+ const isSelected = conversationId === selectedConversationId;
const onClick = useCallback(() => {
- const newConversationId = conversation.id;
- if (newConversationId) {
- navigate(`/conversation/${newConversationId}`);
- } else {
- setNewContactId(userId);
+ if (conversationId) {
+ navigate(`/conversation/${conversationId}`);
}
- }, [navigate, conversation, userId, setNewContactId]);
+ }, [navigate, conversationId]);
- const getSecondaryText = () => {
- const propsConversationId = conversation.id;
-
- if (!propsConversationId) {
- return '';
- }
-
- if (!callContext || !callData || callData.conversationId !== propsConversationId) {
- return conversation.getDisplayUri();
+ const secondaryText = useMemo(() => {
+ if (!callContext || !callData || callData.conversationId !== conversationSummary.id) {
+ return conversationSummary.lastMessage.body;
}
if (callContext.callStatus === CallStatus.InCall) {
@@ -92,67 +72,56 @@
}
return callContext.callRole === 'caller' ? t('outgoing_call') : t('incoming_call');
- };
+ }, [conversationSummary, callContext, callData, t]);
+
+ const conversationName = useMemo(
+ () => conversationSummary.title ?? conversationSummary.membersNames.join(', '),
+ [conversationSummary]
+ );
return (
<Box onContextMenu={contextMenuHandler.handleAnchorPosition}>
<ConversationMenu
- userId={userId}
- conversation={conversation}
+ conversationId={conversationId}
+ conversationName={conversationName}
onMessageClick={onClick}
isSelected={isSelected}
contextMenuProps={contextMenuHandler.props}
/>
<ListItem button alignItems="flex-start" selected={isSelected} onClick={onClick}>
<ListItemAvatar>
- <ConversationAvatar displayName={conversation.getDisplayNameNoFallback()} />
+ <ConversationAvatar displayName={conversationName} />
</ListItemAvatar>
- <ListItemText primary={conversation.getDisplayName()} secondary={getSecondaryText()} />
+ <ListItemText primary={conversationName} secondary={secondaryText} />
</ListItem>
</Box>
);
}
interface ConversationMenuProps {
- userId: string;
- conversation: Conversation;
+ conversationId: string;
+ conversationName: string;
onMessageClick: () => void;
isSelected: boolean;
contextMenuProps: ContextMenuHandler['props'];
}
const ConversationMenu = ({
- userId,
- conversation,
+ conversationId,
+ conversationName,
onMessageClick,
isSelected,
contextMenuProps,
}: ConversationMenuProps) => {
const { t } = useTranslation();
- const { axiosInstance } = useAuthContext();
const { startCall } = useContext(CallManagerContext);
const [isSwarm] = useState(true);
const detailsDialogHandler = useDialogHandler();
- const blockContactDialogHandler = useDialogHandler();
- const removeContactDialogHandler = useDialogHandler();
+ const RemoveConversationDialogHandler = useDialogHandler();
const navigate = useNavigate();
- const getContactDetails = useCallback(async () => {
- const controller = new AbortController();
- try {
- const { data } = await axiosInstance.get<ContactDetails>(`/contacts/${userId}`, {
- signal: controller.signal,
- });
- console.log('CONTACT LIST - DETAILS: ', data);
- } catch (e) {
- console.log('ERROR GET CONTACT DETAILS: ', e);
- }
- }, [axiosInstance, userId]);
-
- const conversationId = conversation.id;
-
const menuOptions: PopoverListItemData[] = useMemo(
() => [
{
@@ -198,24 +167,16 @@
: []),
{
label: t('conversation_details'),
- Icon: ContactDetailsIcon,
+ Icon: PersonIcon,
onClick: () => {
detailsDialogHandler.openDialog();
- getContactDetails();
- },
- },
- {
- label: t('conversation_block'),
- Icon: BlockContactIcon,
- onClick: () => {
- blockContactDialogHandler.openDialog();
},
},
{
label: t('conversation_delete'),
- Icon: RemoveContactIcon,
+ Icon: CancelIcon,
onClick: () => {
- removeContactDialogHandler.openDialog();
+ RemoveConversationDialogHandler.openDialog();
},
},
],
@@ -223,10 +184,8 @@
navigate,
onMessageClick,
isSelected,
- getContactDetails,
detailsDialogHandler,
- blockContactDialogHandler,
- removeContactDialogHandler,
+ RemoveConversationDialogHandler,
t,
startCall,
conversationId,
@@ -237,108 +196,67 @@
<>
<ContextMenu {...contextMenuProps} items={menuOptions} />
- <DetailsDialog {...detailsDialogHandler.props} userId={userId} conversation={conversation} isSwarm={isSwarm} />
+ <DetailsDialog
+ {...detailsDialogHandler.props}
+ conversationId={conversationId}
+ conversationName={conversationName}
+ isSwarm={isSwarm}
+ />
- <RemoveContactDialog {...removeContactDialogHandler.props} userId={userId} conversation={conversation} />
-
- <BlockContactDialog {...blockContactDialogHandler.props} userId={userId} conversation={conversation} />
+ <RemoveConversationDialog {...RemoveConversationDialogHandler.props} conversationId={conversationId} />
</>
);
};
interface DetailsDialogProps {
- userId: string;
- conversation: Conversation;
+ conversationId: string;
+ conversationName: string;
open: boolean;
onClose: () => void;
isSwarm: boolean;
}
-const DetailsDialog = ({ userId, conversation, open, onClose, isSwarm }: DetailsDialogProps) => {
+const DetailsDialog = ({ conversationId, conversationName, open, onClose, isSwarm }: DetailsDialogProps) => {
const { t } = useTranslation();
const items = useMemo(
() => [
{
- label: t('conversation_details_username'),
- value: conversation.getDisplayNameNoFallback(),
+ label: t('conversation_details_name'),
+ value: conversationName,
},
{
label: t('conversation_details_identifier'),
- value: userId,
+ value: conversationId,
},
{
label: t('conversation_details_qr_code'),
- value: <QRCodeCanvas size={80} value={`${userId}`} />,
+ value: <QRCodeCanvas size={80} value={`${conversationId}`} />,
},
{
label: t('conversation_details_is_swarm'),
value: isSwarm ? t('conversation_details_is_swarm_true') : t('conversation_details_is_swarm_false'),
},
],
- [userId, conversation, isSwarm, t]
+ [conversationId, conversationName, isSwarm, t]
);
return (
<InfosDialog
open={open}
onClose={onClose}
- icon={
- <ConversationAvatar
- sx={{ width: 'inherit', height: 'inherit' }}
- displayName={conversation.getDisplayNameNoFallback()}
- />
- }
- title={conversation.getDisplayNameNoFallback() || ''}
+ icon={<ConversationAvatar sx={{ width: 'inherit', height: 'inherit' }} displayName={conversationName} />}
+ title={conversationName}
content={<DialogContentList title={t('conversation_details_informations')} items={items} />}
/>
);
};
-interface BlockContactDialogProps {
- userId: string;
- conversation: Conversation;
+interface RemoveConversationDialogProps {
+ conversationId: string;
open: boolean;
onClose: () => void;
}
-const BlockContactDialog = ({ userId, open, onClose }: BlockContactDialogProps) => {
- const { axiosInstance } = useAuthContext();
- const { t } = useTranslation();
- const dispatch = useAppDispatch();
-
- const block = async () => {
- const controller = new AbortController();
- try {
- await axiosInstance.post(`/contacts/${userId}/block`, {
- signal: controller.signal,
- });
- dispatch(setRefreshFromSlice());
- } catch (e) {
- console.error(`Error $block contact : `, e);
- dispatch(setRefreshFromSlice());
- }
- onClose();
- };
-
- return (
- <ConfirmationDialog
- open={open}
- onClose={onClose}
- title={t('dialog_confirm_title_default')}
- content={t('conversation_ask_confirm_block')}
- onConfirm={block}
- confirmButtonText={t('conversation_confirm_block')}
- />
- );
-};
-
-interface RemoveContactDialogProps {
- userId: string;
- conversation: Conversation;
- open: boolean;
- onClose: () => void;
-}
-
-const RemoveContactDialog = ({ userId, open, onClose }: RemoveContactDialogProps) => {
+const RemoveConversationDialog = ({ conversationId, open, onClose }: RemoveConversationDialogProps) => {
const { axiosInstance } = useAuthContext();
const { t } = useTranslation();
const dispatch = useAppDispatch();
@@ -346,12 +264,12 @@
const remove = async () => {
const controller = new AbortController();
try {
- await axiosInstance.delete(`/contacts/${userId}`, {
+ await axiosInstance.delete(`/conversations/${conversationId}`, {
signal: controller.signal,
});
dispatch(setRefreshFromSlice());
} catch (e) {
- console.error(`Error removing contact : `, e);
+ console.error(`Error removing conversation : `, e);
dispatch(setRefreshFromSlice());
}
onClose();
diff --git a/client/src/components/ConversationView.tsx b/client/src/components/ConversationView.tsx
index 51c0899..9216249 100644
--- a/client/src/components/ConversationView.tsx
+++ b/client/src/components/ConversationView.tsx
@@ -16,18 +16,14 @@
* <https://www.gnu.org/licenses/>.
*/
import { Divider, Stack, Typography } from '@mui/material';
-import { useContext, useMemo } from 'react';
-import { useTranslation } from 'react-i18next';
+import { useContext } from 'react';
-import { useAuthContext } from '../contexts/AuthProvider';
import { CallManagerContext } from '../contexts/CallManagerProvider';
import { useCallContext } from '../contexts/CallProvider';
import { useConversationContext } from '../contexts/ConversationProvider';
import { useWebRtcContext } from '../contexts/WebRtcProvider';
-import { ConversationMember } from '../models/conversation';
import CallInterface from '../pages/CallInterface';
import ChatInterface from '../pages/ChatInterface';
-import { translateEnumeration, TranslateEnumerationOptions } from '../utils/translations';
import { AddParticipantButton, ShowOptionsMenuButton, StartAudioCallButton, StartVideoCallButton } from './Button';
const ConversationView = () => {
@@ -54,42 +50,14 @@
};
const ConversationHeader = () => {
- const { account } = useAuthContext();
- const { conversation, conversationId } = useConversationContext();
+ const { conversationId, conversationDisplayName } = useConversationContext();
const { startCall } = useContext(CallManagerContext);
- const { t } = useTranslation();
-
- const members = conversation.members;
- const adminTitle = conversation.infos.title as string;
-
- const title = useMemo(() => {
- if (adminTitle) {
- return adminTitle;
- }
-
- const options: TranslateEnumerationOptions<ConversationMember> = {
- elementPartialKey: 'member',
- getElementValue: (member) => getMemberName(member),
- translaters: [
- () =>
- // The user is chatting with themself
- t('conversation_title_one', { member0: account?.getDisplayName() }),
- (interpolations) => t('conversation_title_one', interpolations),
- (interpolations) => t('conversation_title_two', interpolations),
- (interpolations) => t('conversation_title_three', interpolations),
- (interpolations) => t('conversation_title_four', interpolations),
- (interpolations) => t('conversation_title_more', interpolations),
- ],
- };
-
- return translateEnumeration<ConversationMember>(members, options);
- }, [account, members, adminTitle, t]);
return (
<Stack direction="row" padding="16px" overflow="hidden">
<Stack flex={1} justifyContent="center" whiteSpace="nowrap" overflow="hidden">
<Typography variant="h3" textOverflow="ellipsis">
- {title}
+ {conversationDisplayName}
</Typography>
</Stack>
<Stack direction="row" spacing="20px">
@@ -102,9 +70,4 @@
);
};
-const getMemberName = (member: ConversationMember) => {
- const contact = member.contact;
- return contact.getDisplayName();
-};
-
export default ConversationView;
diff --git a/client/src/components/ConversationsOverviewCard.tsx b/client/src/components/ConversationsOverviewCard.tsx
index 67b4b68..b9dafc9 100644
--- a/client/src/components/ConversationsOverviewCard.tsx
+++ b/client/src/components/ConversationsOverviewCard.tsx
@@ -16,32 +16,14 @@
* <https://www.gnu.org/licenses/>.
*/
import { Card, CardActionArea, CardContent, CircularProgress, Typography } from '@mui/material';
-import { IConversation } from 'jami-web-common';
-import { useEffect, useState } from 'react';
import { useNavigate } from 'react-router';
-import { useAuthContext } from '../contexts/AuthProvider';
+import { useConversationsSummariesQuery } from '../services/conversationQueries';
export default function ConversationsOverviewCard() {
- const { axiosInstance, account } = useAuthContext();
const navigate = useNavigate();
- const [conversationCount, setConversationCount] = useState<number | undefined>();
-
- const accountId = account.id;
-
- useEffect(() => {
- const controller = new AbortController();
- axiosInstance
- .get<IConversation[]>('/conversations', {
- signal: controller.signal,
- })
- .then(({ data }) => {
- console.log(data);
- setConversationCount(data.length);
- });
- return () => controller.abort(); // crash on React18
- }, [axiosInstance, accountId]);
+ const conversationSummariesQuery = useConversationsSummariesQuery();
return (
<Card onClick={() => navigate(`/`)}>
@@ -51,7 +33,7 @@
Conversations
</Typography>
<Typography gutterBottom variant="h5" component="h2">
- {conversationCount != null ? conversationCount : <CircularProgress size={24} />}
+ {conversationSummariesQuery?.data?.length ?? <CircularProgress size={24} />}
</Typography>
</CardContent>
</CardActionArea>
diff --git a/client/src/components/MessageList.tsx b/client/src/components/MessageList.tsx
index 356d3e6..66915ab 100644
--- a/client/src/components/MessageList.tsx
+++ b/client/src/components/MessageList.tsx
@@ -23,17 +23,17 @@
import { Waypoint } from 'react-waypoint';
import { useAuthContext } from '../contexts/AuthProvider';
-import { ConversationMember } from '../models/conversation';
+import { useConversationContext } from '../contexts/ConversationProvider';
import { MessageRow } from './Message';
import { ArrowDownIcon } from './SvgIcon';
interface MessageListProps {
- members: ConversationMember[];
messages: Message[];
}
-export default function MessageList({ members, messages }: MessageListProps) {
+export default function MessageList({ messages }: MessageListProps) {
const { account } = useAuthContext();
+ const { members } = useConversationContext();
const [showScrollButton, setShowScrollButton] = useState(false);
const listBottomRef = useRef<HTMLElement>();
diff --git a/client/src/components/SendMessageForm.tsx b/client/src/components/SendMessageForm.tsx
index 7bb7a7f..a94ab56 100644
--- a/client/src/components/SendMessageForm.tsx
+++ b/client/src/components/SendMessageForm.tsx
@@ -21,7 +21,8 @@
import { useTranslation } from 'react-i18next';
import { useAuthContext } from '../contexts/AuthProvider';
-import { ConversationMember } from '../models/conversation';
+import { useConversationContext } from '../contexts/ConversationProvider';
+import { ConversationMember } from '../models/conversation-member';
import { translateEnumeration, TranslateEnumerationOptions } from '../utils/translations';
import {
RecordVideoMessageButton,
@@ -32,12 +33,12 @@
} from './Button';
type SendMessageFormProps = {
- members: ConversationMember[];
onSend: (message: string) => void;
openFilePicker: () => void;
};
-export default function SendMessageForm({ members, onSend, openFilePicker }: SendMessageFormProps) {
+export default function SendMessageForm({ onSend, openFilePicker }: SendMessageFormProps) {
+ const { members } = useConversationContext();
const [currentMessage, setCurrentMessage] = useState('');
const placeholder = usePlaceholder(members);
@@ -97,7 +98,7 @@
return useMemo(() => {
const options: TranslateEnumerationOptions<ConversationMember> = {
elementPartialKey: 'member',
- getElementValue: (member) => getMemberName(member),
+ getElementValue: (member) => member.getDisplayName(),
translaters: [
() =>
// The user is chatting with themself
@@ -113,8 +114,3 @@
return translateEnumeration<ConversationMember>(members, options);
}, [account, members, t]);
};
-
-const getMemberName = (member: ConversationMember) => {
- const contact = member.contact;
- return contact.getDisplayName();
-};
diff --git a/client/src/components/SvgIcon.tsx b/client/src/components/SvgIcon.tsx
index 1ef5f9d..bfce146 100644
--- a/client/src/components/SvgIcon.tsx
+++ b/client/src/components/SvgIcon.tsx
@@ -223,28 +223,6 @@
);
};
-export const ContactDetailsIcon = (props: SvgIconProps) => {
- return (
- <SvgIcon {...props} viewBox="0 0 14.647 16">
- {/* <svg
- xmlns="http://www.w3.org/2000/svg"
- width="14.647"
- height="16"
- viewBox="0 0 14.647 16"
- >
- <defs>
- <style>.a{"fill:#005699;"}</style>
- </defs> */}
- <path
- className="a"
- d="M11.258,9.562A3.774,3.774,0,0,0,13.965,5.9,3.79,3.79,0,0,0,10.144,2,3.871,3.871,0,0,0,8.95,9.562,7.806,7.806,0,0,0,2.9,17.443a.557.557,0,1,0,1.114,0c0-3.821,2.786-6.925,6.209-6.925s6.209,3.1,6.209,6.925a.557.557,0,0,0,1.114,0C17.388,13.463,14.681,10.119,11.258,9.562ZM7.278,5.9a2.866,2.866,0,1,1,5.731,0,2.787,2.787,0,0,1-2.866,2.786A2.838,2.838,0,0,1,7.278,5.9Z"
- transform="translate(-2.9 -2)"
- />
- {/* </svg> */}
- </SvgIcon>
- );
-};
-
export const CrossedEyeIcon = (props: SvgIconProps) => {
return (
<SvgIcon {...props} viewBox="0 0 15.931 12.145">
@@ -544,10 +522,8 @@
export const PersonIcon = (props: SvgIconProps) => {
return (
- <SvgIcon {...props} viewBox="0 0 24 24">
- <g stroke="#03B9E9" strokeWidth="1.75" fill="none" fillRule="evenodd" strokeLinejoin="round">
- <path d="M17 6.5c0 2.48522308-2.0147769 4.5-4.5 4.5C10.01477692 11 8 8.98522308 8 6.5 8 4.0147769 10.01477692 2 12.5 2 14.9852231 2 17 4.0147769 17 6.5ZM3 22c0-5.5228267 4.02947764-10 9.00005436-10C16.9705224 12 21 16.4771733 21 22" />
- </g>
+ <SvgIcon {...props} viewBox="8.8 2 3 16">
+ <path d="M11.258,9.562A3.774,3.774,0,0,0,13.965,5.9,3.79,3.79,0,0,0,10.144,2,3.871,3.871,0,0,0,8.95,9.562,7.806,7.806,0,0,0,2.9,17.443a.557.557,0,1,0,1.114,0c0-3.821,2.786-6.925,6.209-6.925s6.209,3.1,6.209,6.925a.557.557,0,0,0,1.114,0C17.388,13.463,14.681,10.119,11.258,9.562ZM7.278,5.9a2.866,2.866,0,1,1,5.731,0,2.787,2.787,0,0,1-2.866,2.786A2.838,2.838,0,0,1,7.278,5.9Z" />
</SvgIcon>
);
};
@@ -580,31 +556,6 @@
);
};
-export const RemoveContactIcon = (props: SvgIconProps) => {
- return (
- <SvgIcon {...props} viewBox="0 0 16 16">
- {/* <svg
- xmlns="http://www.w3.org/2000/svg"
- width="16"
- height="16"
- viewBox="0 0 16 16"
- >
- <defs>
- <style>.a{"fill:#005699;"}</style>
- </defs> */}
- <g transform="translate(-2 -2)">
- <g transform="translate(2 2)">
- <path
- className="a"
- d="M8,0a8,8,0,1,0,8,8A8.024,8.024,0,0,0,8,0ZM8,1.04a6.5,6.5,0,0,1,4.48,1.68L2.72,12.48A6.9,6.9,0,0,1,1.68,5.12,7.081,7.081,0,0,1,8,1.04ZM8,14.96a7.274,7.274,0,0,1-4.56-1.68l9.84-9.76a6.9,6.9,0,0,1,1.04,7.36A7.032,7.032,0,0,1,8,14.96Z"
- />
- </g>
- </g>
- {/* </svg> */}
- </SvgIcon>
- );
-};
-
export const RoundCloseIcon = (props: SvgIconProps) => {
return (
<SvgIcon {...props} viewBox="0 0 24 24">