Skip to content

feat: Token Network Filter UI [Extension] #27884

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 43 commits into from
Oct 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
2f33dd5
feat: Init network filter
gambinish Oct 11, 2024
317cb44
chore: Add tokenNetworkFilter action
gambinish Oct 11, 2024
99ae620
chore: Add selected indicator on TokenNetworkList controls
gambinish Oct 11, 2024
ab6189f
chore: Subscribe to tokenNetworkFilter in token-list
gambinish Oct 11, 2024
90c9b0e
chore: Display multiAccountBalance, and selectedAccountBalance
gambinish Oct 11, 2024
a66c999
chore: Optimize multiAccountBalance with reduce function
gambinish Oct 11, 2024
7dd5a2c
chore: Cross chain balances do not yet exist, add todo
gambinish Oct 16, 2024
a838c74
chore: Polish styling of list items in dropdown
gambinish Oct 16, 2024
c91c747
chore: Cleanup
gambinish Oct 16, 2024
6ec980b
chore: Merge main, address conflicts
gambinish Oct 17, 2024
3b6d223
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 17, 2024
d670862
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 21, 2024
bf5913c
fix: Update unit tests in preferences-controller
gambinish Oct 21, 2024
85d5161
feat: Add filterAssets function
gambinish Oct 21, 2024
72ea2cf
chore: Polish filters to be layerable in order of importance, allowin…
gambinish Oct 21, 2024
8b52780
fix: Lint tsc, specifiy chain indication rather than arbitrary number
gambinish Oct 21, 2024
4349f4f
chore: Localize strings
gambinish Oct 21, 2024
8b83df4
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 22, 2024
bc82cb4
chore: Add localized Network string
gambinish Oct 22, 2024
42ad7d4
Merge branch 'feat/mmassets-432_network-filter-extension' of github.c…
gambinish Oct 22, 2024
c4ce6c7
chore: Add FILTER_TOKENS_TOGGLE feature flag
gambinish Oct 22, 2024
5be0713
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 22, 2024
023b0ca
fix: Show current selection on Network filter, and ellipsize when ove…
gambinish Oct 22, 2024
c9a2d8d
Merge branch 'feat/mmassets-432_network-filter-extension' of github.c…
gambinish Oct 22, 2024
ae96cea
fix: Lint
gambinish Oct 22, 2024
5b40705
fix: Remove duplicate locale string
gambinish Oct 22, 2024
f7f09da
fix: Cleanup
gambinish Oct 22, 2024
c6a408d
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 23, 2024
6934434
fix: Clean up filterAssets logic
gambinish Oct 24, 2024
15e4e47
Merge branch 'feat/mmassets-432_network-filter-extension' of github.c…
gambinish Oct 24, 2024
a2074cd
fix: Update network-filter Avatar rendering logic
gambinish Oct 24, 2024
6e80b34
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 24, 2024
836a11b
fix: Duplicate chainId
gambinish Oct 24, 2024
441d4cf
Merge branch 'feat/mmassets-432_network-filter-extension' of github.c…
gambinish Oct 24, 2024
9f9e10b
chore: Ensure correct isSelected boolean is present in ListItemSelector
gambinish Oct 28, 2024
1a44e12
fix: Lint
gambinish Oct 28, 2024
0b82390
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 28, 2024
1cdaa66
Fix: Lint unused variable import
gambinish Oct 28, 2024
f694ec0
Merge branch 'feat/mmassets-432_network-filter-extension' of github.c…
gambinish Oct 28, 2024
7bfb306
fix: Lint, simplify logic of selector comparison
gambinish Oct 28, 2024
cf78624
fix: Handle edge case where tokeNetworkFilter is undefined, this shou…
gambinish Oct 28, 2024
82255bc
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
gambinish Oct 28, 2024
d45f754
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
salimtb Oct 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions app/_locales/en/messages.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions app/scripts/controllers/preferences-controller.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,7 @@ describe('preferences controller', () => {
order: 'dsc',
sortCallback: 'stringNumeric',
},
tokenNetworkFilter: {},
});
});

Expand Down Expand Up @@ -779,6 +780,7 @@ describe('preferences controller', () => {
order: 'dsc',
sortCallback: 'stringNumeric',
},
tokenNetworkFilter: {},
});
});
});
Expand Down
2 changes: 2 additions & 0 deletions app/scripts/controllers/preferences-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ export type Preferences = {
order: string;
sortCallback: string;
};
tokenNetworkFilter: Record<string, boolean>;
shouldShowAggregatedBalancePopover: boolean;
};

Expand Down Expand Up @@ -222,6 +223,7 @@ export const getDefaultPreferencesControllerState =
order: 'dsc',
sortCallback: 'stringNumeric',
},
tokenNetworkFilter: {},
},
// ENS decentralized website resolution
ipfsGateway: IPFS_DEFAULT_GATEWAY_URL,
Expand Down
2 changes: 2 additions & 0 deletions builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@ env:
- BARAD_DUR: ''
# Determines if feature flagged Chain permissions
- CHAIN_PERMISSIONS: ''
# Determines if feature flagged Filter toggle
- FILTER_TOKENS_TOGGLE: ''
# Enables use of test gas fee flow to debug gas fee estimation
- TEST_GAS_FEE_FLOWS: false
# Temporary mechanism to enable security alerts API prior to release
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import React, { useRef, useState } from 'react';
import { useSelector } from 'react-redux';
import { getCurrentNetwork, getPreferences } from '../../../../../selectors';
import {
Box,
ButtonBase,
Expand All @@ -25,62 +27,124 @@ import {
ENVIRONMENT_TYPE_NOTIFICATION,
ENVIRONMENT_TYPE_POPUP,
} from '../../../../../../shared/constants/app';
import NetworkFilter from '../network-filter';

type AssetListControlBarProps = {
showTokensLinks?: boolean;
};

const AssetListControlBar = ({ showTokensLinks }: AssetListControlBarProps) => {
const t = useI18nContext();
const controlBarRef = useRef<HTMLDivElement>(null); // Create a ref
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
const popoverRef = useRef<HTMLDivElement>(null);
const currentNetwork = useSelector(getCurrentNetwork);
const { tokenNetworkFilter } = useSelector(getPreferences);
const [isTokenSortPopoverOpen, setIsTokenSortPopoverOpen] = useState(false);
const [isNetworkFilterPopoverOpen, setIsNetworkFilterPopoverOpen] =
useState(false);

const allNetworksFilterShown = Object.keys(tokenNetworkFilter ?? {}).length;

const windowType = getEnvironmentType();
const isFullScreen =
windowType !== ENVIRONMENT_TYPE_NOTIFICATION &&
windowType !== ENVIRONMENT_TYPE_POPUP;

const handleOpenPopover = () => {
setIsPopoverOpen(!isPopoverOpen);
const toggleTokenSortPopover = () => {
setIsNetworkFilterPopoverOpen(false);
setIsTokenSortPopoverOpen(!isTokenSortPopoverOpen);
};

const toggleNetworkFilterPopover = () => {
setIsTokenSortPopoverOpen(false);
setIsNetworkFilterPopoverOpen(!isNetworkFilterPopoverOpen);
};

const closePopover = () => {
setIsPopoverOpen(false);
setIsTokenSortPopoverOpen(false);
setIsNetworkFilterPopoverOpen(false);
};

return (
<Box
className="asset-list-control-bar"
ref={controlBarRef}
display={Display.Flex}
justifyContent={JustifyContent.spaceBetween}
marginLeft={4}
marginRight={4}
paddingTop={4}
ref={popoverRef}
>
<ButtonBase
data-testid="sort-by-popover-toggle"
className="asset-list-control-bar__button"
onClick={handleOpenPopover}
size={ButtonBaseSize.Sm}
endIconName={IconName.ArrowDown}
backgroundColor={
isPopoverOpen
? BackgroundColor.backgroundPressed
: BackgroundColor.backgroundDefault
<Box
display={Display.Flex}
justifyContent={
isFullScreen ? JustifyContent.flexStart : JustifyContent.spaceBetween
}
borderColor={BorderColor.borderMuted}
borderStyle={BorderStyle.solid}
color={TextColor.textDefault}
>
{t('sortBy')}
</ButtonBase>
<ImportControl showTokensLinks={showTokensLinks} />
{process.env.FILTER_TOKENS_TOGGLE && (
<ButtonBase
data-testid="sort-by-popover-toggle"
className="asset-list-control-bar__button"
onClick={toggleNetworkFilterPopover}
size={ButtonBaseSize.Sm}
endIconName={IconName.ArrowDown}
backgroundColor={
isNetworkFilterPopoverOpen
? BackgroundColor.backgroundPressed
: BackgroundColor.backgroundDefault
}
borderColor={BorderColor.borderMuted}
borderStyle={BorderStyle.solid}
color={TextColor.textDefault}
marginRight={isFullScreen ? 2 : null}
ellipsis
>
{allNetworksFilterShown
? currentNetwork?.nickname ?? t('currentNetwork')
: t('allNetworks')}
</ButtonBase>
)}

<ButtonBase
data-testid="sort-by-popover-toggle"
className="asset-list-control-bar__button"
onClick={toggleTokenSortPopover}
size={ButtonBaseSize.Sm}
endIconName={IconName.ArrowDown}
backgroundColor={
isTokenSortPopoverOpen
? BackgroundColor.backgroundPressed
: BackgroundColor.backgroundDefault
}
borderColor={BorderColor.borderMuted}
borderStyle={BorderStyle.solid}
color={TextColor.textDefault}
marginRight={isFullScreen ? 2 : null}
>
{t('sortBy')}
</ButtonBase>

<ImportControl showTokensLinks={showTokensLinks} />
</Box>

<Popover
onClickOutside={closePopover}
isOpen={isNetworkFilterPopoverOpen}
position={PopoverPosition.BottomStart}
referenceElement={popoverRef.current}
matchWidth={!isFullScreen}
style={{
zIndex: 10,
display: 'flex',
flexDirection: 'column',
padding: 0,
minWidth: isFullScreen ? '325px' : '',
}}
>
<NetworkFilter handleClose={closePopover} />
</Popover>
<Popover
onClickOutside={closePopover}
isOpen={isPopoverOpen}
isOpen={isTokenSortPopoverOpen}
position={PopoverPosition.BottomStart}
referenceElement={controlBarRef.current}
referenceElement={popoverRef.current}
matchWidth={!isFullScreen}
style={{
zIndex: 10,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
padding-top: 8px;
padding-bottom: 8px;

&__button {
// using percentage here to allow for full network name to show when full screen, but ellipsize on extension view
max-width: 35%;
}

&__button:hover {
background-color: var(--color-background-hover);
}
Expand Down
27 changes: 27 additions & 0 deletions ui/components/app/assets/asset-list/network-filter/index.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
.selectable-list-item-wrapper {
position: relative;
}

.selectable-list-item {
cursor: pointer;
padding: 16px;

&--selected {
background: var(--color-primary-muted);
}

&:not(.selectable-list-item--selected) {
&:hover,
&:focus-within {
background: var(--color-background-default-hover);
}
}

&__selected-indicator {
width: 4px;
height: calc(100% - 8px);
position: absolute;
top: 4px;
left: 4px;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './network-filter';
Loading