You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/conversation/message/message-item/GroupInvitation.tsx

133 lines
3.6 KiB
TypeScript

import classNames from 'classnames';
import styled from 'styled-components';
import { useMemo } from 'react';
import { acceptOpenGroupInvitation } from '../../../../interactions/messageInteractions';
import { SessionIconButton } from '../../../icon';
import { ExpirableReadableMessage } from './ExpirableReadableMessage';
import {
useMessageCommunityInvitationFullUrl,
useMessageCommunityInvitationCommunityName,
useMessageDirection,
} from '../../../../state/selectors';
import type { WithMessageId } from '../../../../session/types/with';
const StyledCommunityInvitation = styled.div`
background-color: var(--message-bubbles-received-background-color);
&.invitation-outgoing {
background-color: var(--message-bubbles-sent-background-color);
align-self: flex-end;
.contents {
.group-details {
color: var(--message-bubbles-sent-text-color);
}
.session-icon-button {
background-color: var(--transparent-color);
}
}
}
display: inline-block;
padding: 4px;
margin: var(--margins-xs) calc(var(--margins-lg) + var(--margins-md)) 0 var(--margins-lg);
border-radius: var(--border-radius-message-box);
align-self: flex-start;
box-shadow: none;
.contents {
display: flex;
align-items: center;
margin: 6px;
.invite-group-avatar {
height: 48px;
width: 48px;
}
.group-details {
display: inline-flex;
flex-direction: column;
color: var(--message-bubbles-received-text-color);
padding: 0px 12px;
.group-name {
font-weight: bold;
font-size: 18px;
}
}
.session-icon-button {
background-color: var(--primary-color);
}
}
`;
const StyledIconContainer = styled.div`
background-color: var(--message-link-preview-background-color);
border-radius: 100%;
`;
export const CommunityInvitation = ({ messageId }: WithMessageId) => {
const messageDirection = useMessageDirection(messageId);
const classes = ['group-invitation'];
const fullUrl = useMessageCommunityInvitationFullUrl(messageId);
const communityName = useMessageCommunityInvitationCommunityName(messageId);
const hostname = useMemo(() => {
try {
const url = new URL(fullUrl || '');
return url.origin;
} catch (e) {
window?.log?.warn('failed to get hostname from open groupv2 invitation', fullUrl);
return '';
}
}, [fullUrl]);
if (messageDirection === 'outgoing') {
classes.push('invitation-outgoing');
}
if (!fullUrl || !hostname) {
return null;
}
return (
<ExpirableReadableMessage
messageId={messageId}
key={`readable-message-${messageId}`}
dataTestId="control-message"
>
<StyledCommunityInvitation className={classNames(classes)}>
<div className="contents">
<StyledIconContainer>
<SessionIconButton
iconColor={
messageDirection === 'outgoing'
? 'var(--message-bubbles-sent-text-color)'
: 'var(--message-bubbles-received-text-color)'
}
iconType={messageDirection === 'outgoing' ? 'communities' : 'plus'}
iconSize={'large'}
onClick={() => {
acceptOpenGroupInvitation(fullUrl, communityName);
}}
/>
</StyledIconContainer>
<span className="group-details">
<span className="group-name">{communityName}</span>
<span className="group-type">{window.i18n('communityInvitation')}</span>
<span className="group-address">{hostname}</span>
</span>
</div>
</StyledCommunityInvitation>
</ExpirableReadableMessage>
);
};