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.
		
		
		
		
		
			
		
			
				
	
	
		
			226 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			226 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| 
 | |
| import {
 | |
|   AddressType,
 | |
|   Contact,
 | |
|   ContactType,
 | |
|   Email,
 | |
|   Phone,
 | |
|   PostalAddress,
 | |
| } from '../../types/Contact';
 | |
| import { missingCaseError } from '../../util/missingCaseError';
 | |
| 
 | |
| import {
 | |
|   renderAvatar,
 | |
|   renderContactShorthand,
 | |
|   renderName,
 | |
| } from './_contactUtil';
 | |
| 
 | |
| import { LocalizerType } from '../../types/Util';
 | |
| 
 | |
| interface Props {
 | |
|   contact: Contact;
 | |
|   hasSignalAccount: boolean;
 | |
|   i18n: LocalizerType;
 | |
|   onSendMessage: () => void;
 | |
| }
 | |
| 
 | |
| function getLabelForEmail(method: Email, i18n: LocalizerType): string {
 | |
|   switch (method.type) {
 | |
|     case ContactType.CUSTOM:
 | |
|       return method.label || i18n('email');
 | |
|     case ContactType.HOME:
 | |
|       return i18n('home');
 | |
|     case ContactType.MOBILE:
 | |
|       return i18n('mobile');
 | |
|     case ContactType.WORK:
 | |
|       return i18n('work');
 | |
|     default:
 | |
|       throw missingCaseError(method.type);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function getLabelForPhone(method: Phone, i18n: LocalizerType): string {
 | |
|   switch (method.type) {
 | |
|     case ContactType.CUSTOM:
 | |
|       return method.label || i18n('phone');
 | |
|     case ContactType.HOME:
 | |
|       return i18n('home');
 | |
|     case ContactType.MOBILE:
 | |
|       return i18n('mobile');
 | |
|     case ContactType.WORK:
 | |
|       return i18n('work');
 | |
|     default:
 | |
|       throw missingCaseError(method.type);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function getLabelForAddress(
 | |
|   address: PostalAddress,
 | |
|   i18n: LocalizerType
 | |
| ): string {
 | |
|   switch (address.type) {
 | |
|     case AddressType.CUSTOM:
 | |
|       return address.label || i18n('address');
 | |
|     case AddressType.HOME:
 | |
|       return i18n('home');
 | |
|     case AddressType.WORK:
 | |
|       return i18n('work');
 | |
|     default:
 | |
|       throw missingCaseError(address.type);
 | |
|   }
 | |
| }
 | |
| 
 | |
| export class ContactDetail extends React.Component<Props> {
 | |
|   public renderSendMessage({
 | |
|     hasSignalAccount,
 | |
|     i18n,
 | |
|     onSendMessage,
 | |
|   }: {
 | |
|     hasSignalAccount: boolean;
 | |
|     i18n: (key: string, values?: Array<string>) => string;
 | |
|     onSendMessage: () => void;
 | |
|   }) {
 | |
|     if (!hasSignalAccount) {
 | |
|       return null;
 | |
|     }
 | |
| 
 | |
|     // We don't want the overall click handler for this element to fire, so we stop
 | |
|     //   propagation before handing control to the caller's callback.
 | |
|     const onClick = (e: React.MouseEvent<{}>): void => {
 | |
|       e.stopPropagation();
 | |
|       onSendMessage();
 | |
|     };
 | |
| 
 | |
|     return (
 | |
|       <div
 | |
|         className="module-contact-detail__send-message"
 | |
|         role="button"
 | |
|         // tslint:disable-next-line react-this-binding-issue
 | |
|         onClick={onClick}
 | |
|       >
 | |
|         <button className="module-contact-detail__send-message__inner">
 | |
|           <div className="module-contact-detail__send-message__bubble-icon" />
 | |
|           {i18n('sendMessageToContact')}
 | |
|         </button>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   public renderEmail(items: Array<Email> | undefined, i18n: LocalizerType) {
 | |
|     if (!items || items.length === 0) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     return items.map((item: Email) => {
 | |
|       return (
 | |
|         <div
 | |
|           key={item.value}
 | |
|           className="module-contact-detail__additional-contact"
 | |
|         >
 | |
|           <div className="module-contact-detail__additional-contact__type">
 | |
|             {getLabelForEmail(item, i18n)}
 | |
|           </div>
 | |
|           {item.value}
 | |
|         </div>
 | |
|       );
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public renderPhone(items: Array<Phone> | undefined, i18n: LocalizerType) {
 | |
|     if (!items || items.length === 0) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     return items.map((item: Phone) => {
 | |
|       return (
 | |
|         <div
 | |
|           key={item.value}
 | |
|           className="module-contact-detail__additional-contact"
 | |
|         >
 | |
|           <div className="module-contact-detail__additional-contact__type">
 | |
|             {getLabelForPhone(item, i18n)}
 | |
|           </div>
 | |
|           {item.value}
 | |
|         </div>
 | |
|       );
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public renderAddressLine(value: string | undefined) {
 | |
|     if (!value) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     return <div>{value}</div>;
 | |
|   }
 | |
| 
 | |
|   public renderPOBox(poBox: string | undefined, i18n: LocalizerType) {
 | |
|     if (!poBox) {
 | |
|       return null;
 | |
|     }
 | |
| 
 | |
|     return (
 | |
|       <div>
 | |
|         {i18n('poBox')} {poBox}
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   public renderAddressLineTwo(address: PostalAddress) {
 | |
|     if (address.city || address.region || address.postcode) {
 | |
|       return (
 | |
|         <div>
 | |
|           {address.city} {address.region} {address.postcode}
 | |
|         </div>
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   public renderAddresses(
 | |
|     addresses: Array<PostalAddress> | undefined,
 | |
|     i18n: LocalizerType
 | |
|   ) {
 | |
|     if (!addresses || addresses.length === 0) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     return addresses.map((address: PostalAddress, index: number) => {
 | |
|       return (
 | |
|         <div key={index} className="module-contact-detail__additional-contact">
 | |
|           <div className="module-contact-detail__additional-contact__type">
 | |
|             {getLabelForAddress(address, i18n)}
 | |
|           </div>
 | |
|           {this.renderAddressLine(address.street)}
 | |
|           {this.renderPOBox(address.pobox, i18n)}
 | |
|           {this.renderAddressLine(address.neighborhood)}
 | |
|           {this.renderAddressLineTwo(address)}
 | |
|           {this.renderAddressLine(address.country)}
 | |
|         </div>
 | |
|       );
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public render() {
 | |
|     const { contact, hasSignalAccount, i18n, onSendMessage } = this.props;
 | |
|     const isIncoming = false;
 | |
|     const module = 'contact-detail';
 | |
| 
 | |
|     return (
 | |
|       <div className="module-contact-detail">
 | |
|         <div className="module-contact-detail__avatar">
 | |
|           {renderAvatar({ contact, i18n, size: 80 })}
 | |
|         </div>
 | |
|         {renderName({ contact, isIncoming, module })}
 | |
|         {renderContactShorthand({ contact, isIncoming, module })}
 | |
|         {this.renderSendMessage({ hasSignalAccount, i18n, onSendMessage })}
 | |
|         {this.renderPhone(contact.number, i18n)}
 | |
|         {this.renderEmail(contact.email, i18n)}
 | |
|         {this.renderAddresses(contact.address, i18n)}
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| }
 |