fix: make use of useSet to select in memberList

pull/2425/head
Audric Ackermann 3 years ago
parent ef10e0f1d9
commit bf20c10f81

@ -17,6 +17,7 @@ import useKey from 'react-use/lib/useKey';
import styled from 'styled-components'; import styled from 'styled-components';
import { SessionSearchInput } from '../../SessionSearchInput'; import { SessionSearchInput } from '../../SessionSearchInput';
import { getSearchResults, isSearching } from '../../../state/selectors/search'; import { getSearchResults, isSearching } from '../../../state/selectors/search';
import { useSet } from '../../../hooks/useSet';
const StyledMemberListNoContacts = styled.div` const StyledMemberListNoContacts = styled.div`
font-family: var(--font-font-mono); font-family: var(--font-font-mono);
@ -44,28 +45,16 @@ export const OverlayClosedGroup = () => {
const privateContactsPubkeys = useSelector(getPrivateContactsPubkeys); const privateContactsPubkeys = useSelector(getPrivateContactsPubkeys);
const [groupName, setGroupName] = useState(''); const [groupName, setGroupName] = useState('');
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [selectedMemberIds, setSelectedMemberIds] = useState<Array<string>>([]); const {
uniqueValues: selectedMemberIds,
addTo: addToSelected,
removeFrom: removeFromSelected,
} = useSet<string>([]);
function closeOverlay() { function closeOverlay() {
dispatch(resetOverlayMode()); dispatch(resetOverlayMode());
} }
function handleSelectMember(memberId: string) {
if (selectedMemberIds.includes(memberId)) {
return;
}
setSelectedMemberIds([...selectedMemberIds, memberId]);
}
function handleUnselectMember(unselectId: string) {
setSelectedMemberIds(
selectedMemberIds.filter(id => {
return id !== unselectId;
})
);
}
async function onEnterPressed() { async function onEnterPressed() {
if (loading) { if (loading) {
window?.log?.warn('Closed group creation already in progress'); window?.log?.warn('Closed group creation already in progress');
@ -132,12 +121,8 @@ export const OverlayClosedGroup = () => {
pubkey={memberPubkey} pubkey={memberPubkey}
isSelected={selectedMemberIds.some(m => m === memberPubkey)} isSelected={selectedMemberIds.some(m => m === memberPubkey)}
key={memberPubkey} key={memberPubkey}
onSelect={selectedMember => { onSelect={addToSelected}
handleSelectMember(selectedMember); onUnselect={removeFromSelected}
}}
onUnselect={unselectedMember => {
handleUnselectMember(unselectedMember);
}}
/> />
))} ))}
</div> </div>

@ -2,16 +2,14 @@ import React from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
import useUpdate from 'react-use/lib/useUpdate'; import useUpdate from 'react-use/lib/useUpdate';
import { SettingsKey } from '../../../data/settings-key'; import { SettingsKey } from '../../../data/settings-key';
import { unblockConvoById } from '../../../interactions/conversationInteractions'; import { useSet } from '../../../hooks/useSet';
import { getConversationController } from '../../../session/conversations';
import { ToastUtils } from '../../../session/utils'; import { ToastUtils } from '../../../session/utils';
import { toggleAudioAutoplay } from '../../../state/ducks/userConfig'; import { toggleAudioAutoplay } from '../../../state/ducks/userConfig';
import { getBlockedPubkeys } from '../../../state/selectors/conversations'; import { getBlockedPubkeys } from '../../../state/selectors/conversations';
import { getAudioAutoplay } from '../../../state/selectors/userConfig'; import { getAudioAutoplay } from '../../../state/selectors/userConfig';
import { SessionButtonColor, SessionButtonType } from '../../basic/SessionButton'; import { MemberListItem } from '../../MemberListItem';
import { import {
SessionSettingButtonItem,
SessionSettingsItemWrapper, SessionSettingsItemWrapper,
SessionToggleWithDescription, SessionToggleWithDescription,
} from '../SessionSettingListItem'; } from '../SessionSettingListItem';
@ -95,31 +93,34 @@ const NoBlockedContacts = () => {
); );
}; };
const BlockedEntry = (props: { blockedEntry: string; title: string }) => {
return (
<SessionSettingButtonItem
key={props.blockedEntry}
buttonColor={SessionButtonColor.Danger}
buttonType={SessionButtonType.Square}
buttonText={window.i18n('unblockUser')}
title={props.title}
onClick={async () => {
await unblockConvoById(props.blockedEntry);
}}
/>
);
};
const BlockedContactsList = (props: { blockedNumbers: Array<string> }) => { const BlockedContactsList = (props: { blockedNumbers: Array<string> }) => {
const blockedEntries = props.blockedNumbers.map(blockedEntry => { const {
const currentModel = getConversationController().get(blockedEntry); uniqueValues: selectedIds,
const title = addTo: addToSelected,
currentModel?.getNicknameOrRealUsernameOrPlaceholder() || window.i18n('anonymous'); removeFrom: removeFromSelected,
} = useSet<string>([]);
return <BlockedEntry key={blockedEntry} blockedEntry={blockedEntry} title={title} />; const blockedEntries = props.blockedNumbers.map(blockedEntry => {
return (
<MemberListItem
pubkey={blockedEntry}
isSelected={selectedIds.includes(blockedEntry)}
key={blockedEntry}
onSelect={addToSelected}
onUnselect={removeFromSelected}
/>
);
}); });
return <>{blockedEntries}</>; return (
<>
<SessionSettingsItemWrapper
title={window.i18n('blockedSettingsTitle')}
inline={false}
children={blockedEntries}
/>
</>
);
}; };
export const CategoryConversations = () => { export const CategoryConversations = () => {

@ -1,5 +1,5 @@
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
import _ from 'lodash'; import { isEqual } from 'lodash';
export function useSet<T>(initialValues: Array<T> = []) { export function useSet<T>(initialValues: Array<T> = []) {
const [uniqueValues, setUniqueValues] = useState<Array<T>>(initialValues); const [uniqueValues, setUniqueValues] = useState<Array<T>>(initialValues);
@ -18,7 +18,7 @@ export function useSet<T>(initialValues: Array<T> = []) {
if (!uniqueValues.includes(valueToRemove)) { if (!uniqueValues.includes(valueToRemove)) {
return; return;
} }
setUniqueValues(uniqueValues.filter(v => !_.isEqual(v, valueToRemove))); setUniqueValues(uniqueValues.filter(v => !isEqual(v, valueToRemove)));
}, },
[uniqueValues, setUniqueValues] [uniqueValues, setUniqueValues]
); );

Loading…
Cancel
Save