From bf20c10f811869ac3d7d089e346614557345edf7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 23 Aug 2022 14:42:01 +1000 Subject: [PATCH] fix: make use of useSet to select in memberList --- .../leftpane/overlay/OverlayClosedGroup.tsx | 31 +++-------- .../section/CategoryConversations.tsx | 51 ++++++++++--------- ts/hooks/useSet.ts | 4 +- 3 files changed, 36 insertions(+), 50 deletions(-) diff --git a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx index 8936baf30..8df5d3cd2 100644 --- a/ts/components/leftpane/overlay/OverlayClosedGroup.tsx +++ b/ts/components/leftpane/overlay/OverlayClosedGroup.tsx @@ -17,6 +17,7 @@ import useKey from 'react-use/lib/useKey'; import styled from 'styled-components'; import { SessionSearchInput } from '../../SessionSearchInput'; import { getSearchResults, isSearching } from '../../../state/selectors/search'; +import { useSet } from '../../../hooks/useSet'; const StyledMemberListNoContacts = styled.div` font-family: var(--font-font-mono); @@ -44,28 +45,16 @@ export const OverlayClosedGroup = () => { const privateContactsPubkeys = useSelector(getPrivateContactsPubkeys); const [groupName, setGroupName] = useState(''); const [loading, setLoading] = useState(false); - const [selectedMemberIds, setSelectedMemberIds] = useState>([]); + const { + uniqueValues: selectedMemberIds, + addTo: addToSelected, + removeFrom: removeFromSelected, + } = useSet([]); function closeOverlay() { 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() { if (loading) { window?.log?.warn('Closed group creation already in progress'); @@ -132,12 +121,8 @@ export const OverlayClosedGroup = () => { pubkey={memberPubkey} isSelected={selectedMemberIds.some(m => m === memberPubkey)} key={memberPubkey} - onSelect={selectedMember => { - handleSelectMember(selectedMember); - }} - onUnselect={unselectedMember => { - handleUnselectMember(unselectedMember); - }} + onSelect={addToSelected} + onUnselect={removeFromSelected} /> ))} diff --git a/ts/components/settings/section/CategoryConversations.tsx b/ts/components/settings/section/CategoryConversations.tsx index ff00eebf1..fe47ec700 100644 --- a/ts/components/settings/section/CategoryConversations.tsx +++ b/ts/components/settings/section/CategoryConversations.tsx @@ -2,16 +2,14 @@ import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; import useUpdate from 'react-use/lib/useUpdate'; import { SettingsKey } from '../../../data/settings-key'; -import { unblockConvoById } from '../../../interactions/conversationInteractions'; -import { getConversationController } from '../../../session/conversations'; +import { useSet } from '../../../hooks/useSet'; import { ToastUtils } from '../../../session/utils'; import { toggleAudioAutoplay } from '../../../state/ducks/userConfig'; import { getBlockedPubkeys } from '../../../state/selectors/conversations'; import { getAudioAutoplay } from '../../../state/selectors/userConfig'; -import { SessionButtonColor, SessionButtonType } from '../../basic/SessionButton'; +import { MemberListItem } from '../../MemberListItem'; import { - SessionSettingButtonItem, SessionSettingsItemWrapper, SessionToggleWithDescription, } from '../SessionSettingListItem'; @@ -95,31 +93,34 @@ const NoBlockedContacts = () => { ); }; -const BlockedEntry = (props: { blockedEntry: string; title: string }) => { - return ( - { - await unblockConvoById(props.blockedEntry); - }} - /> - ); -}; - const BlockedContactsList = (props: { blockedNumbers: Array }) => { - const blockedEntries = props.blockedNumbers.map(blockedEntry => { - const currentModel = getConversationController().get(blockedEntry); - const title = - currentModel?.getNicknameOrRealUsernameOrPlaceholder() || window.i18n('anonymous'); + const { + uniqueValues: selectedIds, + addTo: addToSelected, + removeFrom: removeFromSelected, + } = useSet([]); - return ; + const blockedEntries = props.blockedNumbers.map(blockedEntry => { + return ( + + ); }); - return <>{blockedEntries}; + return ( + <> + + + ); }; export const CategoryConversations = () => { diff --git a/ts/hooks/useSet.ts b/ts/hooks/useSet.ts index d0030f85e..07f34ab34 100644 --- a/ts/hooks/useSet.ts +++ b/ts/hooks/useSet.ts @@ -1,5 +1,5 @@ import { useCallback, useState } from 'react'; -import _ from 'lodash'; +import { isEqual } from 'lodash'; export function useSet(initialValues: Array = []) { const [uniqueValues, setUniqueValues] = useState>(initialValues); @@ -18,7 +18,7 @@ export function useSet(initialValues: Array = []) { if (!uniqueValues.includes(valueToRemove)) { return; } - setUniqueValues(uniqueValues.filter(v => !_.isEqual(v, valueToRemove))); + setUniqueValues(uniqueValues.filter(v => !isEqual(v, valueToRemove))); }, [uniqueValues, setUniqueValues] );