| 
									
										
										
										
											2023-01-03 11:55:46 -08:00
										 |  |  | // Copyright 2020 Signal Messenger, LLC
 | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  | // SPDX-License-Identifier: AGPL-3.0-only
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  | import React, { useEffect, useState } from 'react'; | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  | import type { ReactNode } from 'react'; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-16 15:12:50 -04:00
										 |  |  | import type { | 
					
						
							|  |  |  |   ConversationType, | 
					
						
							|  |  |  |   ShowConversationType, | 
					
						
							|  |  |  | } from '../../state/ducks/conversations'; | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  | import type { BadgeType } from '../../badges/types'; | 
					
						
							|  |  |  | import type { HasStories } from '../../types/Stories'; | 
					
						
							| 
									
										
										
										
											2021-11-11 10:23:00 -06:00
										 |  |  | import type { LocalizerType, ThemeType } from '../../types/Util'; | 
					
						
							| 
									
										
										
										
											2022-08-22 13:44:23 -04:00
										 |  |  | import type { ViewUserStoriesActionCreatorType } from '../../state/ducks/stories'; | 
					
						
							|  |  |  | import { StoryViewModeType } from '../../types/Stories'; | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  | import * as log from '../../logging/log'; | 
					
						
							|  |  |  | import { About } from './About'; | 
					
						
							| 
									
										
										
										
											2022-12-09 13:37:45 -07:00
										 |  |  | import { Avatar, AvatarSize } from '../Avatar'; | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  | import { AvatarLightbox } from '../AvatarLightbox'; | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  | import { BadgeDialog } from '../BadgeDialog'; | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  | import { ConfirmationDialog } from '../ConfirmationDialog'; | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  | import { Modal } from '../Modal'; | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  | import { RemoveGroupMemberConfirmationDialog } from './RemoveGroupMemberConfirmationDialog'; | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  | import { SharedGroupNames } from '../SharedGroupNames'; | 
					
						
							|  |  |  | import { missingCaseError } from '../../util/missingCaseError'; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  | export type PropsDataType = { | 
					
						
							| 
									
										
										
										
											2021-11-30 10:29:57 -06:00
										 |  |  |   areWeASubscriber: boolean; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   areWeAdmin: boolean; | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |   badges: ReadonlyArray<BadgeType>; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   contact?: ConversationType; | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |   conversation?: ConversationType; | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  |   hasStories?: HasStories; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   readonly i18n: LocalizerType; | 
					
						
							| 
									
										
										
										
											2021-01-29 16:19:24 -05:00
										 |  |  |   isAdmin: boolean; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   isMember: boolean; | 
					
						
							| 
									
										
										
										
											2021-11-11 10:23:00 -06:00
										 |  |  |   theme: ThemeType; | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  | type PropsActionType = { | 
					
						
							|  |  |  |   hideContactModal: () => void; | 
					
						
							|  |  |  |   removeMemberFromGroup: (conversationId: string, contactId: string) => void; | 
					
						
							| 
									
										
										
										
											2022-06-16 15:12:50 -04:00
										 |  |  |   showConversation: ShowConversationType; | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |   toggleAdmin: (conversationId: string, contactId: string) => void; | 
					
						
							| 
									
										
										
										
											2021-10-07 17:45:58 -04:00
										 |  |  |   toggleSafetyNumberModal: (conversationId: string) => unknown; | 
					
						
							| 
									
										
										
										
											2022-09-26 10:24:52 -06:00
										 |  |  |   toggleAddUserToAnotherGroupModal: (conversationId: string) => void; | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |   updateConversationModelSharedGroups: (conversationId: string) => void; | 
					
						
							| 
									
										
										
										
											2022-08-22 13:44:23 -04:00
										 |  |  |   viewUserStories: ViewUserStoriesActionCreatorType; | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export type PropsType = PropsDataType & PropsActionType; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  | enum ContactModalView { | 
					
						
							|  |  |  |   Default, | 
					
						
							|  |  |  |   ShowingAvatar, | 
					
						
							|  |  |  |   ShowingBadges, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  | enum SubModalState { | 
					
						
							|  |  |  |   None = 'None', | 
					
						
							|  |  |  |   ToggleAdmin = 'ToggleAdmin', | 
					
						
							|  |  |  |   MemberRemove = 'MemberRemove', | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | export function ContactModal({ | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   areWeAdmin, | 
					
						
							| 
									
										
										
										
											2022-12-14 11:05:32 -08:00
										 |  |  |   areWeASubscriber, | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |   badges, | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   contact, | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |   conversation, | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  |   hasStories, | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |   hideContactModal, | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   i18n, | 
					
						
							| 
									
										
										
										
											2021-01-29 16:19:24 -05:00
										 |  |  |   isAdmin, | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   isMember, | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |   removeMemberFromGroup, | 
					
						
							| 
									
										
										
										
											2022-06-16 15:12:50 -04:00
										 |  |  |   showConversation, | 
					
						
							| 
									
										
										
										
											2021-11-11 10:23:00 -06:00
										 |  |  |   theme, | 
					
						
							| 
									
										
										
										
											2022-12-14 11:05:32 -08:00
										 |  |  |   toggleAddUserToAnotherGroupModal, | 
					
						
							| 
									
										
										
										
											2021-01-29 16:19:24 -05:00
										 |  |  |   toggleAdmin, | 
					
						
							| 
									
										
										
										
											2021-10-07 17:45:58 -04:00
										 |  |  |   toggleSafetyNumberModal, | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |   updateConversationModelSharedGroups, | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  |   viewUserStories, | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | }: PropsType): JSX.Element { | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |   if (!contact) { | 
					
						
							|  |  |  |     throw new Error('Contact modal opened without a matching contact'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |   const [view, setView] = useState(ContactModalView.Default); | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |   const [subModalState, setSubModalState] = useState<SubModalState>( | 
					
						
							|  |  |  |     SubModalState.None | 
					
						
							|  |  |  |   ); | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-05 20:17:05 -04:00
										 |  |  |   useEffect(() => { | 
					
						
							| 
									
										
										
										
											2022-03-21 11:41:48 -07:00
										 |  |  |     if (contact?.id) { | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |       // Kick off the expensive hydration of the current sharedGroupNames
 | 
					
						
							| 
									
										
										
										
											2022-03-21 11:41:48 -07:00
										 |  |  |       updateConversationModelSharedGroups(contact.id); | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-03-21 11:41:48 -07:00
										 |  |  |   }, [contact?.id, updateConversationModelSharedGroups]); | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   let modalNode: ReactNode; | 
					
						
							|  |  |  |   switch (subModalState) { | 
					
						
							|  |  |  |     case SubModalState.None: | 
					
						
							|  |  |  |       modalNode = undefined; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case SubModalState.ToggleAdmin: | 
					
						
							|  |  |  |       if (!conversation?.id) { | 
					
						
							|  |  |  |         log.warn('ContactModal: ToggleAdmin state - missing conversationId'); | 
					
						
							|  |  |  |         modalNode = undefined; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       modalNode = ( | 
					
						
							|  |  |  |         <ConfirmationDialog | 
					
						
							| 
									
										
										
										
											2022-09-27 13:24:21 -07:00
										 |  |  |           dialogName="ContactModal.toggleAdmin" | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |           actions={[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               action: () => toggleAdmin(conversation.id, contact.id), | 
					
						
							|  |  |  |               text: isAdmin | 
					
						
							|  |  |  |                 ? i18n('ContactModal--rm-admin') | 
					
						
							|  |  |  |                 : i18n('ContactModal--make-admin'), | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |           ]} | 
					
						
							|  |  |  |           i18n={i18n} | 
					
						
							|  |  |  |           onClose={() => setSubModalState(SubModalState.None)} | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |           {isAdmin | 
					
						
							|  |  |  |             ? i18n('ContactModal--rm-admin-info', [contact.title]) | 
					
						
							|  |  |  |             : i18n('ContactModal--make-admin-info', [contact.title])} | 
					
						
							|  |  |  |         </ConfirmationDialog> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case SubModalState.MemberRemove: | 
					
						
							|  |  |  |       if (!contact || !conversation?.id) { | 
					
						
							|  |  |  |         log.warn( | 
					
						
							|  |  |  |           'ContactModal: MemberRemove state - missing contact or conversationId' | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |         modalNode = undefined; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       modalNode = ( | 
					
						
							|  |  |  |         <RemoveGroupMemberConfirmationDialog | 
					
						
							|  |  |  |           conversation={contact} | 
					
						
							|  |  |  |           group={conversation} | 
					
						
							|  |  |  |           i18n={i18n} | 
					
						
							|  |  |  |           onClose={() => { | 
					
						
							|  |  |  |             setSubModalState(SubModalState.None); | 
					
						
							|  |  |  |           }} | 
					
						
							|  |  |  |           onRemove={() => { | 
					
						
							|  |  |  |             removeMemberFromGroup(conversation?.id, contact.id); | 
					
						
							|  |  |  |           }} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: { | 
					
						
							|  |  |  |       const state: never = subModalState; | 
					
						
							|  |  |  |       log.warn(`ContactModal: unexpected ${state}!`); | 
					
						
							|  |  |  |       modalNode = undefined; | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |   switch (view) { | 
					
						
							|  |  |  |     case ContactModalView.Default: { | 
					
						
							|  |  |  |       const preferredBadge: undefined | BadgeType = badges[0]; | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |       return ( | 
					
						
							|  |  |  |         <Modal | 
					
						
							| 
									
										
										
										
											2022-09-27 13:24:21 -07:00
										 |  |  |           modalName="ContactModal" | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |           moduleClassName="ContactModal__modal" | 
					
						
							|  |  |  |           hasXButton | 
					
						
							| 
									
										
										
										
											2021-08-05 20:17:05 -04:00
										 |  |  |           i18n={i18n} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |           onClose={hideContactModal} | 
					
						
							| 
									
										
										
										
											2022-09-29 16:40:09 -06:00
										 |  |  |           padded={false} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |         > | 
					
						
							|  |  |  |           <div className="ContactModal"> | 
					
						
							|  |  |  |             <Avatar | 
					
						
							|  |  |  |               acceptedMessageRequest={contact.acceptedMessageRequest} | 
					
						
							|  |  |  |               avatarPath={contact.avatarPath} | 
					
						
							|  |  |  |               badge={preferredBadge} | 
					
						
							|  |  |  |               color={contact.color} | 
					
						
							|  |  |  |               conversationType="direct" | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |               i18n={i18n} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |               isMe={contact.isMe} | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  |               onClick={() => { | 
					
						
							|  |  |  |                 if (conversation && hasStories) { | 
					
						
							| 
									
										
										
										
											2022-08-22 13:44:23 -04:00
										 |  |  |                   viewUserStories({ | 
					
						
							|  |  |  |                     conversationId: conversation.id, | 
					
						
							|  |  |  |                     storyViewMode: StoryViewModeType.User, | 
					
						
							|  |  |  |                   }); | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                   setView(ContactModalView.ShowingAvatar); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               }} | 
					
						
							|  |  |  |               onClickBadge={() => setView(ContactModalView.ShowingBadges)} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |               profileName={contact.profileName} | 
					
						
							|  |  |  |               sharedGroupNames={contact.sharedGroupNames} | 
					
						
							| 
									
										
										
										
											2022-12-09 13:37:45 -07:00
										 |  |  |               size={AvatarSize.EIGHTY} | 
					
						
							| 
									
										
										
										
											2022-07-21 20:44:35 -04:00
										 |  |  |               storyRing={hasStories} | 
					
						
							| 
									
										
										
										
											2021-11-11 10:23:00 -06:00
										 |  |  |               theme={theme} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |               title={contact.title} | 
					
						
							|  |  |  |               unblurredAvatarPath={contact.unblurredAvatarPath} | 
					
						
							|  |  |  |             /> | 
					
						
							|  |  |  |             <div className="ContactModal__name">{contact.title}</div> | 
					
						
							|  |  |  |             <div className="module-about__container"> | 
					
						
							|  |  |  |               <About text={contact.about} /> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |             {contact.phoneNumber && ( | 
					
						
							|  |  |  |               <div className="ContactModal__info">{contact.phoneNumber}</div> | 
					
						
							|  |  |  |             )} | 
					
						
							|  |  |  |             {!contact.isMe && ( | 
					
						
							|  |  |  |               <div className="ContactModal__info"> | 
					
						
							|  |  |  |                 <SharedGroupNames | 
					
						
							|  |  |  |                   i18n={i18n} | 
					
						
							|  |  |  |                   sharedGroupNames={contact.sharedGroupNames || []} | 
					
						
							|  |  |  |                 /> | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |               </div> | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |             )} | 
					
						
							|  |  |  |             <div className="ContactModal__button-container"> | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |               <button | 
					
						
							|  |  |  |                 type="button" | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                 className="ContactModal__button ContactModal__send-message" | 
					
						
							|  |  |  |                 onClick={() => { | 
					
						
							|  |  |  |                   hideContactModal(); | 
					
						
							| 
									
										
										
										
											2022-06-16 15:12:50 -04:00
										 |  |  |                   showConversation({ conversationId: contact.id }); | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                 }} | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |               > | 
					
						
							| 
									
										
										
										
											2021-09-21 18:37:10 -04:00
										 |  |  |                 <div className="ContactModal__bubble-icon"> | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                   <div className="ContactModal__send-message__bubble-icon" /> | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |                 </div> | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                 <span>{i18n('ContactModal--message')}</span> | 
					
						
							| 
									
										
										
										
											2020-11-11 09:36:05 -08:00
										 |  |  |               </button> | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |               {!contact.isMe && ( | 
					
						
							|  |  |  |                 <button | 
					
						
							|  |  |  |                   type="button" | 
					
						
							|  |  |  |                   className="ContactModal__button ContactModal__safety-number" | 
					
						
							|  |  |  |                   onClick={() => { | 
					
						
							|  |  |  |                     hideContactModal(); | 
					
						
							|  |  |  |                     toggleSafetyNumberModal(contact.id); | 
					
						
							|  |  |  |                   }} | 
					
						
							|  |  |  |                 > | 
					
						
							|  |  |  |                   <div className="ContactModal__bubble-icon"> | 
					
						
							|  |  |  |                     <div className="ContactModal__safety-number__bubble-icon" /> | 
					
						
							|  |  |  |                   </div> | 
					
						
							|  |  |  |                   <span>{i18n('showSafetyNumber')}</span> | 
					
						
							|  |  |  |                 </button> | 
					
						
							|  |  |  |               )} | 
					
						
							| 
									
										
										
										
											2022-09-26 10:24:52 -06:00
										 |  |  |               {!contact.isMe && isMember && conversation?.id && ( | 
					
						
							|  |  |  |                 <button | 
					
						
							|  |  |  |                   type="button" | 
					
						
							|  |  |  |                   className="ContactModal__button" | 
					
						
							|  |  |  |                   onClick={() => { | 
					
						
							|  |  |  |                     hideContactModal(); | 
					
						
							|  |  |  |                     toggleAddUserToAnotherGroupModal(contact.id); | 
					
						
							|  |  |  |                   }} | 
					
						
							|  |  |  |                 > | 
					
						
							|  |  |  |                   <div className="ContactModal__bubble-icon"> | 
					
						
							|  |  |  |                     <div className="ContactModal__add-to-another-group__bubble-icon" /> | 
					
						
							|  |  |  |                   </div> | 
					
						
							|  |  |  |                   Add to another group | 
					
						
							|  |  |  |                 </button> | 
					
						
							|  |  |  |               )} | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |               {!contact.isMe && areWeAdmin && isMember && conversation?.id && ( | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                 <> | 
					
						
							|  |  |  |                   <button | 
					
						
							|  |  |  |                     type="button" | 
					
						
							|  |  |  |                     className="ContactModal__button ContactModal__make-admin" | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |                     onClick={() => setSubModalState(SubModalState.ToggleAdmin)} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                   > | 
					
						
							|  |  |  |                     <div className="ContactModal__bubble-icon"> | 
					
						
							|  |  |  |                       <div className="ContactModal__make-admin__bubble-icon" /> | 
					
						
							|  |  |  |                     </div> | 
					
						
							|  |  |  |                     {isAdmin ? ( | 
					
						
							|  |  |  |                       <span>{i18n('ContactModal--rm-admin')}</span> | 
					
						
							|  |  |  |                     ) : ( | 
					
						
							|  |  |  |                       <span>{i18n('ContactModal--make-admin')}</span> | 
					
						
							|  |  |  |                     )} | 
					
						
							|  |  |  |                   </button> | 
					
						
							|  |  |  |                   <button | 
					
						
							|  |  |  |                     type="button" | 
					
						
							|  |  |  |                     className="ContactModal__button ContactModal__remove-from-group" | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |                     onClick={() => setSubModalState(SubModalState.MemberRemove)} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |                   > | 
					
						
							|  |  |  |                     <div className="ContactModal__bubble-icon"> | 
					
						
							|  |  |  |                       <div className="ContactModal__remove-from-group__bubble-icon" /> | 
					
						
							|  |  |  |                     </div> | 
					
						
							|  |  |  |                     <span>{i18n('ContactModal--remove-from-group')}</span> | 
					
						
							|  |  |  |                   </button> | 
					
						
							|  |  |  |                 </> | 
					
						
							|  |  |  |               )} | 
					
						
							|  |  |  |             </div> | 
					
						
							| 
									
										
										
										
											2022-03-14 18:32:07 -07:00
										 |  |  |             {modalNode} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |           </div> | 
					
						
							|  |  |  |         </Modal> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     case ContactModalView.ShowingAvatar: | 
					
						
							|  |  |  |       return ( | 
					
						
							|  |  |  |         <AvatarLightbox | 
					
						
							|  |  |  |           avatarColor={contact.color} | 
					
						
							|  |  |  |           avatarPath={contact.avatarPath} | 
					
						
							|  |  |  |           conversationTitle={contact.title} | 
					
						
							|  |  |  |           i18n={i18n} | 
					
						
							|  |  |  |           onClose={() => setView(ContactModalView.Default)} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     case ContactModalView.ShowingBadges: | 
					
						
							|  |  |  |       return ( | 
					
						
							|  |  |  |         <BadgeDialog | 
					
						
							| 
									
										
										
										
											2021-11-30 10:29:57 -06:00
										 |  |  |           areWeASubscriber={areWeASubscriber} | 
					
						
							| 
									
										
										
										
											2021-11-02 18:01:13 -05:00
										 |  |  |           badges={badges} | 
					
						
							|  |  |  |           firstName={contact.firstName} | 
					
						
							|  |  |  |           i18n={i18n} | 
					
						
							|  |  |  |           onClose={() => setView(ContactModalView.Default)} | 
					
						
							|  |  |  |           title={contact.title} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       throw missingCaseError(view); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-11-17 16:45:19 -08:00
										 |  |  | } |