import { isString } from 'lodash';
import { useSelector } from 'react-redux';
import { AutoSizer, Index, List, ListRowProps } from 'react-virtualized';
import styled, { CSSProperties } from 'styled-components';
import {
DirectContactsByNameType,
getContactsCount,
getSortedContactsWithBreaks,
} from '../../../../state/selectors/conversations';
import { leftPaneListWidth } from '../../LeftPane';
import { StyledLeftPaneList } from '../../LeftPaneList';
import { StyledChooseActionTitle } from './ActionRow';
import { ContactRow, ContactRowBreak } from './ContactRow';
import { getThemeValue, pxValueToNumber } from '../../../../themes/globals';
import { SearchResultsMergedListItem } from '../../../../state/selectors/search';
import { Localizer } from '../../../basic/Localizer';
const StyledContactSection = styled.div`
display: flex;
flex-direction: column;
overflow: hidden;
flex: 1;
width: 100%;
.module-conversation-list-item __header__date,
.module-conversation-list-item __message {
display: none;
}
.module-conversation-list-item __buttons {
display: flex;
.session-button {
font-size: var(--font-size-xs);
padding: 6px;
height: auto;
margin: 0px;
line-height: 14px;
}
}
`;
const StyledContactsTitle = styled(StyledChooseActionTitle)`
padding: var(--margins-xs) var(--margins-lg);
`;
const StyledContactsEmpty = styled.div`
color: var(--text-secondary-color);
padding: var(--margins-xs) var(--margins-lg);
`;
const renderRow = (props: ListRowProps) => {
const { index, key, style, parent } = props;
// ugly, but it seems react-virtualized does not support very well functional components just yet
// https://stackoverflow.com/questions/54488954/how-to-pass-prop-into-rowrender-of-react-virtualized
const contactsByNameWithBreaks = (parent as any).props.contactsByNameWithBreaks as Array<
DirectContactsByNameType | string
>;
const item = contactsByNameWithBreaks?.[index];
if (!item) {
return null;
}
if (isString(item)) {
return ;
}
return ;
};
export function calcContactRowHeight(
items: Array,
params: Index,
overrides?: {
rowHeight?: number;
breakRowHeight?: number;
}
) {
return isString(items[params.index])
? overrides?.breakRowHeight || pxValueToNumber(getThemeValue('--contact-row-break-height'))
: overrides?.rowHeight || pxValueToNumber(getThemeValue('--contact-row-height'));
}
const ContactListItemSection = () => {
const contactsByNameWithBreaks = useSelector(getSortedContactsWithBreaks);
if (!contactsByNameWithBreaks) {
return null;
}
const length = Number(contactsByNameWithBreaks.length);
return (
{({ height }) => {
return (
calcContactRowHeight(contactsByNameWithBreaks, params)}
contactsByNameWithBreaks={contactsByNameWithBreaks}
rowRenderer={renderRow}
width={leftPaneListWidth}
autoHeight={false}
/>
);
}}
);
};
export const ContactsListWithBreaks = () => {
const contactsCount = useSelector(getContactsCount);
return (
{window.i18n('contactContacts')}
{contactsCount > 0 ? (
) : (
)}
);
};