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.
		
		
		
		
		
			
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import { Avatar, AvatarSize, CrownIcon } from './avatar/Avatar';
 | |
| import { useConversationUsernameOrShorten } from '../hooks/useParamSelector';
 | |
| import styled from 'styled-components';
 | |
| import { SessionRadio } from './basic/SessionRadio';
 | |
| 
 | |
| const AvatarContainer = styled.div`
 | |
|   position: relative;
 | |
| `;
 | |
| 
 | |
| const AvatarItem = (props: { memberPubkey: string; isAdmin: boolean }) => {
 | |
|   const { memberPubkey, isAdmin } = props;
 | |
|   return (
 | |
|     <AvatarContainer>
 | |
|       <Avatar size={AvatarSize.XS} pubkey={memberPubkey} />
 | |
|       {isAdmin && <CrownIcon />}
 | |
|     </AvatarContainer>
 | |
|   );
 | |
| };
 | |
| 
 | |
| const StyledSessionMemberItem = styled.button<{
 | |
|   inMentions?: boolean;
 | |
|   zombie?: boolean;
 | |
|   selected?: boolean;
 | |
|   disableBg?: boolean;
 | |
| }>`
 | |
|   cursor: pointer;
 | |
|   display: flex;
 | |
|   align-items: center;
 | |
|   justify-content: space-between;
 | |
|   flex-shrink: 0;
 | |
|   flex-grow: 1;
 | |
|   font-family: var(--font-default);
 | |
|   padding: 0px var(--margins-sm);
 | |
|   height: ${props => (props.inMentions ? '40px' : '50px')};
 | |
|   width: 100%;
 | |
|   transition: var(--default-duration);
 | |
|   opacity: ${props => (props.zombie ? 0.5 : 1)};
 | |
|   background-color: ${props =>
 | |
|     !props.disableBg && props.selected
 | |
|       ? 'var(--conversation-tab-background-selected-color) !important'
 | |
|       : null};
 | |
| 
 | |
|   :not(:last-child) {
 | |
|     border-bottom: 1px solid var(--border-color);
 | |
|   }
 | |
| `;
 | |
| 
 | |
| const StyledInfo = styled.div`
 | |
|   display: flex;
 | |
|   align-items: center;
 | |
|   min-width: 0;
 | |
| `;
 | |
| 
 | |
| const StyledName = styled.span`
 | |
|   font-weight: bold;
 | |
|   margin-inline-start: var(--margins-md);
 | |
|   margin-inline-end: var(--margins-md);
 | |
|   white-space: nowrap;
 | |
|   overflow: hidden;
 | |
|   text-overflow: ellipsis;
 | |
| `;
 | |
| 
 | |
| const StyledCheckContainer = styled.div`
 | |
|   display: flex;
 | |
|   align-items: center;
 | |
| `;
 | |
| 
 | |
| export const MemberListItem = (props: {
 | |
|   pubkey: string;
 | |
|   isSelected: boolean;
 | |
|   // this bool is used to make a zombie appear with less opacity than a normal member
 | |
|   isZombie?: boolean;
 | |
|   inMentions?: boolean; // set to true if we are rendering members but in the Mentions picker
 | |
|   disableBg?: boolean;
 | |
|   isAdmin?: boolean; // if true,  we add a small crown on top of their avatar
 | |
|   onSelect?: (pubkey: string) => void;
 | |
|   onUnselect?: (pubkey: string) => void;
 | |
|   dataTestId?: string;
 | |
| }) => {
 | |
|   const {
 | |
|     isSelected,
 | |
|     pubkey,
 | |
|     isZombie,
 | |
|     isAdmin,
 | |
|     onSelect,
 | |
|     onUnselect,
 | |
|     inMentions,
 | |
|     disableBg,
 | |
|     dataTestId,
 | |
|   } = props;
 | |
| 
 | |
|   const memberName = useConversationUsernameOrShorten(pubkey);
 | |
| 
 | |
|   return (
 | |
|     // tslint:disable-next-line: use-simple-attributes
 | |
|     <StyledSessionMemberItem
 | |
|       onClick={() => {
 | |
|         isSelected ? onUnselect?.(pubkey) : onSelect?.(pubkey);
 | |
|       }}
 | |
|       style={
 | |
|         !inMentions && !disableBg
 | |
|           ? {
 | |
|               backgroundColor: 'var(--background-primary-color)',
 | |
|             }
 | |
|           : {}
 | |
|       }
 | |
|       data-testid={dataTestId}
 | |
|       zombie={isZombie}
 | |
|       inMentions={inMentions}
 | |
|       selected={isSelected}
 | |
|       disableBg={disableBg}
 | |
|     >
 | |
|       <StyledInfo>
 | |
|         <AvatarItem memberPubkey={pubkey} isAdmin={isAdmin || false} />
 | |
|         <StyledName>{memberName}</StyledName>
 | |
|       </StyledInfo>
 | |
| 
 | |
|       {!inMentions && (
 | |
|         <StyledCheckContainer>
 | |
|           <SessionRadio active={isSelected} value={pubkey} inputName={pubkey} label="" />
 | |
|         </StyledCheckContainer>
 | |
|       )}
 | |
|     </StyledSessionMemberItem>
 | |
|   );
 | |
| };
 |