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/leftpane/overlay/choose-action/ContactRow.tsx

97 lines
2.6 KiB
TypeScript

import React from 'react';
import { useDispatch } from 'react-redux';
import styled, { CSSProperties } from 'styled-components';
import { useAvatarPath } from '../../../../hooks/useParamSelector';
import { openConversationWithMessages } from '../../../../state/ducks/conversations';
import { updateUserDetailsModal } from '../../../../state/ducks/modalDialog';
import { Avatar, AvatarSize } from '../../../avatar/Avatar';
type Props = { id: string; displayName?: string; style: CSSProperties };
const StyledAvatarItem = styled.div`
padding-right: var(--margins-sm);
`;
const AvatarItem = (props: Pick<Props, 'displayName' | 'id'>) => {
const { id, displayName } = props;
const avatarPath = useAvatarPath(id);
const dispatch = useDispatch();
function onPrivateAvatarClick() {
dispatch(
updateUserDetailsModal({
conversationId: id,
userName: displayName || '',
authorAvatarPath: avatarPath,
})
);
}
return (
<StyledAvatarItem>
<Avatar size={AvatarSize.S} pubkey={id} onAvatarClick={onPrivateAvatarClick} />
</StyledAvatarItem>
);
};
const StyledContactRowName = styled.div`
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: var(--font-size-lg);
`;
const StyledRowContainer = styled.div`
display: flex;
align-items: center;
padding: 0 var(--margins-lg);
transition: background-color var(--default-duration) linear;
cursor: pointer;
border-bottom: 1px var(--color-session-border) solid;
&:first-child {
border-top: 1px var(--color-session-border) solid;
}
:hover {
background-color: var(--color-clickable-hovered);
}
`;
const StyledBreak = styled.div`
display: flex;
align-items: center;
padding: 0 var(--margins-lg);
color: var(--color-text-subtle);
font-size: var(--font-size-md);
height: 30px; // should also be changed in rowHeight
border-bottom: 1px var(--color-session-border) solid;
`;
export const ContactRowBreak = (props: { char: string; key: string; style: CSSProperties }) => {
const { char, key, style } = props;
return (
<StyledBreak key={key} style={style}>
{char}
</StyledBreak>
);
};
export const ContactRow = (props: Props) => {
const { id, style, displayName } = props;
return (
<StyledRowContainer
style={style}
onClick={() => openConversationWithMessages({ conversationKey: id, messageId: null })}
>
<AvatarItem id={id} displayName={displayName} />
<StyledContactRowName data-testid="module-conversation__user__profile-name">
{displayName || id}
</StyledContactRowName>
</StyledRowContainer>
);
};