import React from 'react'; import classNames from 'classnames'; import { Avatar } from '../Avatar'; export interface Contact { id: string; selected: boolean; authorProfileName: string; authorPhoneNumber: string; authorName: string; authorColor: any; authorAvatarPath: string; checkmarked: boolean; existingMember: boolean; } interface MemberItemProps { member: Contact; selected: boolean; existingMember: boolean; onClicked: any; i18n: any; checkmarked: boolean; } class MemberItem extends React.Component<MemberItemProps> { constructor(props: any) { super(props); this.handleClick = this.handleClick.bind(this); } public render() { const name = this.props.member.authorProfileName; const pubkey = this.props.member.authorPhoneNumber; const selected = this.props.selected; const existingMember = this.props.existingMember; const shortPubkey = window.shortenPubkey(pubkey); let markType: 'none' | 'kicked' | 'added' | 'existing' = 'none'; if (this.props.checkmarked) { if (existingMember) { markType = 'kicked'; } else { markType = 'added'; } } else { if (existingMember) { markType = 'existing'; } else { markType = 'none'; } } const markClasses = ['check-mark']; switch (markType) { case 'none': markClasses.push('invisible'); break; case 'existing': markClasses.push('existing-member'); break; case 'kicked': markClasses.push('existing-member-kicked'); break; default: // do nothing } const mark = markType === 'kicked' ? '✘' : '✔'; return ( <div role="button" className={classNames( 'member-item', selected ? 'member-selected' : null )} onClick={this.handleClick} > {this.renderAvatar()} <span className="name-part">{name}</span> <span className="pubkey-part">{shortPubkey}</span> <span className={classNames(markClasses)}>{mark}</span> </div> ); } private handleClick() { this.props.onClicked(this.props.member); } private renderAvatar() { return ( <Avatar avatarPath={this.props.member.authorAvatarPath} color={this.props.member.authorColor} conversationType="direct" i18n={this.props.i18n} name={this.props.member.authorName} phoneNumber={this.props.member.authorPhoneNumber} profileName={this.props.member.authorProfileName} size={28} /> ); } } interface MemberListProps { members: Array<Contact>; selected: any; onMemberClicked: any; i18n: any; } export class MemberList extends React.Component<MemberListProps> { constructor(props: any) { super(props); this.handleMemberClicked = this.handleMemberClicked.bind(this); } public render() { const { members } = this.props; const itemList = members.map(item => { const selected = item === this.props.selected; return ( <MemberItem key={item.id} member={item} selected={selected} checkmarked={item.checkmarked} existingMember={item.existingMember} i18n={this.props.i18n} onClicked={this.handleMemberClicked} /> ); }); return <div>{itemList}</div>; } private handleMemberClicked(member: any) { this.props.onMemberClicked(member); } }