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/FriendRequest.tsx

211 lines
5.5 KiB
TypeScript

import React from 'react';
import classNames from 'classnames';
import { LocalizerType } from '../../types/Util';
import { MessageBody } from './MessageBody';
import { Timestamp } from './Timestamp';
interface Props {
text: string;
direction: 'incoming' | 'outgoing';
status: string;
friendStatus: 'pending' | 'accepted' | 'declined' | 'expired';
i18n: LocalizerType;
isBlocked: boolean;
timestamp: number;
onAccept: () => void;
onDecline: () => void;
onDeleteConversation: () => void;
onRetrySend: () => void;
onBlockUser: () => void;
onUnblockUser: () => void;
}
export class FriendRequest extends React.Component<Props> {
public getStringId() {
const { friendStatus } = this.props;
switch (friendStatus) {
case 'pending':
return 'friendRequestPending';
case 'accepted':
return 'friendRequestAccepted';
case 'declined':
return 'friendRequestDeclined';
case 'expired':
return 'friendRequestExpired';
default:
throw new Error(`Invalid friend request status: ${friendStatus}`);
}
}
public renderContents() {
const { direction, i18n, text } = this.props;
const id = this.getStringId();
return (
<div>
<div
className={`module-friend-request__title module-friend-request__title--${direction}`}
>
{i18n(id)}
</div>
<div dir="auto">
<MessageBody text={text || ''} i18n={i18n} />
</div>
</div>
);
}
public renderButtons() {
const {
i18n,
friendStatus,
direction,
status,
onAccept,
onDecline,
onDeleteConversation,
onRetrySend,
isBlocked,
onBlockUser,
onUnblockUser,
} = this.props;
if (direction === 'incoming') {
if (friendStatus === 'pending') {
return (
<div
className={classNames(
'module-message__metadata',
'module-friend-request__buttonContainer',
`module-friend-request__buttonContainer--${direction}`
)}
>
<button onClick={onAccept}>Accept</button>
<button onClick={onDecline}>Decline</button>
</div>
);
} else if (friendStatus === 'declined') {
const blockTitle = isBlocked ? i18n('unblockUser') : i18n('blockUser');
const blockHandler = isBlocked ? onUnblockUser : onBlockUser;
return (
<div
className={classNames(
'module-message__metadata',
'module-friend-request__buttonContainer',
`module-friend-request__buttonContainer--${direction}`
)}
>
<button onClick={onDeleteConversation}>Delete Conversation</button>
<button onClick={blockHandler}>{blockTitle}</button>
</div>
);
}
} else {
// Render the retry button if we errored
if (status === 'error' && friendStatus === 'pending') {
return (
<div
className={classNames(
'module-message__metadata',
'module-friend-request__buttonContainer',
`module-friend-request__buttonContainer--${direction}`
)}
>
<button onClick={onRetrySend}>Retry Send</button>
</div>
);
}
}
return null;
}
public renderError(isCorrectSide: boolean) {
const { status, direction } = this.props;
if (!isCorrectSide || status !== 'error') {
return null;
}
return (
<div className="module-message__error-container">
<div
className={classNames(
'module-message__error',
`module-message__error--${direction}`
)}
/>
</div>
);
}
// Renders 'sending', 'read' icons
public renderStatusIndicator() {
const { direction, status, i18n, text, timestamp } = this.props;
if (status === 'error') {
return null;
}
const withImageNoCaption = Boolean(!text);
return (
<div className="module-message__metadata">
<Timestamp
i18n={i18n}
timestamp={timestamp}
extended={true}
direction={direction}
withImageNoCaption={withImageNoCaption}
module="module-message__metadata__date"
/>
<span className="module-message__metadata__spacer" />
<div
className={classNames(
'module-message__metadata__status-icon',
`module-message__metadata__status-icon--${status}`
)}
/>
</div>
);
}
public render() {
const { direction } = this.props;
return (
<div className={'loki-message-wrapper'}>
<div
className={classNames(
`module-message module-message--${direction}`,
'module-message-friend-request'
)}
>
{this.renderError(direction === 'incoming')}
<div
className={classNames(
'module-message__container',
`module-message__container--${direction}`,
'module-message-friend-request__container'
)}
>
<div
className={classNames(
'module-message__text',
`module-message__text--${direction}`
)}
>
{this.renderContents()}
{this.renderStatusIndicator()}
{this.renderButtons()}
</div>
</div>
{this.renderError(direction === 'outgoing')}
</div>
</div>
);
}
}