mirror of
https://github.com/oxen-io/session-desktop.git
synced 2023-12-14 02:12:57 +01:00
165 lines
4.8 KiB
TypeScript
165 lines
4.8 KiB
TypeScript
import React, { useState } from 'react';
|
|
|
|
import useUpdate from 'react-use/lib/useUpdate';
|
|
import styled from 'styled-components';
|
|
import { useSet } from '../../hooks/useSet';
|
|
import { ToastUtils } from '../../session/utils';
|
|
import { BlockedNumberController } from '../../util';
|
|
import { SessionButton, SessionButtonColor } from '../basic/SessionButton';
|
|
import { SpacerLG } from '../basic/Text';
|
|
import { SessionIconButton } from '../icon';
|
|
import { MemberListItem } from '../MemberListItem';
|
|
import { SettingsTitleAndDescription } from './SessionSettingListItem';
|
|
|
|
const BlockedEntriesContainer = styled.div`
|
|
flex-shrink: 1;
|
|
overflow: auto;
|
|
min-height: 40px;
|
|
max-height: 100%;
|
|
`;
|
|
|
|
const BlockedEntriesRoundedContainer = styled.div`
|
|
overflow: hidden;
|
|
background: var(--background-secondary-color);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 16px;
|
|
padding: var(--margins-lg);
|
|
margin: 0 var(--margins-lg);
|
|
`;
|
|
|
|
const BlockedContactsSection = styled.div`
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 80px;
|
|
|
|
background: var(--settings-tab-background-color);
|
|
color: var(--settings-tab-text-color);
|
|
border-top: 1px solid var(--border-color);
|
|
border-bottom: 1px solid var(--border-color);
|
|
|
|
margin-bottom: var(--margins-lg);
|
|
`;
|
|
|
|
const BlockedContactListTitle = styled.div`
|
|
display: flex;
|
|
justify-content: space-between;
|
|
min-height: 45px;
|
|
align-items: center;
|
|
`;
|
|
|
|
const BlockedContactListTitleButtons = styled.div`
|
|
display: flex;
|
|
align-items: center;
|
|
`;
|
|
|
|
export const StyledBlockedSettingItem = styled.div<{ clickable: boolean }>`
|
|
font-size: var(--font-size-md);
|
|
padding: var(--margins-lg);
|
|
|
|
cursor: ${props => (props.clickable ? 'pointer' : 'unset')};
|
|
`;
|
|
|
|
const BlockedEntries = (props: {
|
|
blockedNumbers: Array<string>;
|
|
selectedIds: Array<string>;
|
|
addToSelected: (id: string) => void;
|
|
removeFromSelected: (id: string) => void;
|
|
}) => {
|
|
const { addToSelected, blockedNumbers, removeFromSelected, selectedIds } = props;
|
|
return (
|
|
<BlockedEntriesRoundedContainer>
|
|
<BlockedEntriesContainer>
|
|
{blockedNumbers.map(blockedEntry => {
|
|
return (
|
|
<MemberListItem
|
|
pubkey={blockedEntry}
|
|
isSelected={selectedIds.includes(blockedEntry)}
|
|
key={blockedEntry}
|
|
onSelect={addToSelected}
|
|
onUnselect={removeFromSelected}
|
|
disableBg={true}
|
|
/>
|
|
);
|
|
})}
|
|
</BlockedEntriesContainer>
|
|
</BlockedEntriesRoundedContainer>
|
|
);
|
|
};
|
|
|
|
const NoBlockedContacts = () => {
|
|
return <div>{window.i18n('noBlockedContacts')}</div>;
|
|
};
|
|
|
|
export const BlockedContactsList = () => {
|
|
const [expanded, setExpanded] = useState(false);
|
|
const {
|
|
uniqueValues: selectedIds,
|
|
addTo: addToSelected,
|
|
removeFrom: removeFromSelected,
|
|
empty: emptySelected,
|
|
} = useSet<string>([]);
|
|
|
|
const forceUpdate = useUpdate();
|
|
|
|
const hasAtLeastOneSelected = Boolean(selectedIds.length);
|
|
const blockedNumbers = BlockedNumberController.getBlockedNumbers();
|
|
const noBlockedNumbers = !blockedNumbers.length;
|
|
|
|
function toggleUnblockList() {
|
|
if (blockedNumbers.length) {
|
|
setExpanded(!expanded);
|
|
}
|
|
}
|
|
|
|
async function unBlockThoseUsers() {
|
|
if (selectedIds.length) {
|
|
await BlockedNumberController.unblockAll(selectedIds);
|
|
emptySelected();
|
|
ToastUtils.pushToastSuccess('unblocked', window.i18n('unblocked'));
|
|
forceUpdate();
|
|
}
|
|
}
|
|
|
|
return (
|
|
<BlockedContactsSection>
|
|
<StyledBlockedSettingItem clickable={!noBlockedNumbers}>
|
|
<BlockedContactListTitle onClick={toggleUnblockList}>
|
|
<SettingsTitleAndDescription title={window.i18n('blockedSettingsTitle')} />
|
|
{noBlockedNumbers ? (
|
|
<NoBlockedContacts />
|
|
) : (
|
|
<BlockedContactListTitleButtons>
|
|
{hasAtLeastOneSelected && expanded ? (
|
|
<SessionButton
|
|
buttonColor={SessionButtonColor.Danger}
|
|
text={window.i18n('unblock')}
|
|
onClick={unBlockThoseUsers}
|
|
dataTestId="unblock-button-settings-screen"
|
|
/>
|
|
) : null}
|
|
<SpacerLG />
|
|
<SessionIconButton
|
|
iconSize={'large'}
|
|
iconType={'chevron'}
|
|
onClick={toggleUnblockList}
|
|
iconRotation={expanded ? 0 : 180}
|
|
dataTestId="reveal-blocked-user-settings"
|
|
/>
|
|
</BlockedContactListTitleButtons>
|
|
)}
|
|
</BlockedContactListTitle>
|
|
</StyledBlockedSettingItem>
|
|
{expanded && !noBlockedNumbers ? (
|
|
<>
|
|
<BlockedEntries
|
|
blockedNumbers={blockedNumbers}
|
|
selectedIds={selectedIds}
|
|
addToSelected={addToSelected}
|
|
removeFromSelected={removeFromSelected}
|
|
/>
|
|
<SpacerLG />
|
|
</>
|
|
) : null}
|
|
</BlockedContactsSection>
|
|
);
|
|
};
|