diff --git a/apps/mobile/src/components/AnimatedRefreshIcon.tsx b/apps/mobile/src/components/AnimatedRefreshIcon.tsx index 67cf8b705f..34d5b57a97 100644 --- a/apps/mobile/src/components/AnimatedRefreshIcon.tsx +++ b/apps/mobile/src/components/AnimatedRefreshIcon.tsx @@ -33,6 +33,7 @@ export function AnimatedRefreshIcon({ eventElementId={eventElementId} eventName={eventName} eventContext={contexts.Posts} + disabled={isSyncing} style={[{ opacity: isSyncing ? 0.3 : 1 }, style]} /> ); diff --git a/apps/mobile/src/components/Community/CommunityPostBottomSheet.tsx b/apps/mobile/src/components/Community/CommunityPostBottomSheet.tsx index ffd3809406..bbdb7ea115 100644 --- a/apps/mobile/src/components/Community/CommunityPostBottomSheet.tsx +++ b/apps/mobile/src/components/Community/CommunityPostBottomSheet.tsx @@ -41,7 +41,7 @@ export default function CommunityPostBottomSheet({ communityRef, onRefresh }: Pr const { chain } = extractRelevantMetadataFromCommunity(community); const handleSync = useCallback(async () => { - if (!chain) return; + if (!chain || chain === 'All Networks') return; await syncTokens(chain); diff --git a/apps/mobile/src/components/Login/AuthProvider/Farcaster/FarcasterAuthProvider.tsx b/apps/mobile/src/components/Login/AuthProvider/Farcaster/FarcasterAuthProvider.tsx index 1a8cb9b988..7b6c1c864a 100644 --- a/apps/mobile/src/components/Login/AuthProvider/Farcaster/FarcasterAuthProvider.tsx +++ b/apps/mobile/src/components/Login/AuthProvider/Farcaster/FarcasterAuthProvider.tsx @@ -13,7 +13,6 @@ import { NeynarPayloadVariables } from 'shared/hooks/useAuthPayloadQuery'; import useCreateNonce from 'shared/hooks/useCreateNonce'; import { useGetUsersByWalletAddressesImperatively } from 'shared/hooks/useGetUserByWalletAddress'; import { removeNullValues } from 'shared/relay/removeNullValues'; -import { Chain } from 'shared/utils/chains'; import { useLogin } from 'src/hooks/useLogin'; import { useBottomSheetModalActions } from '~/contexts/BottomSheetModalContext'; @@ -127,7 +126,7 @@ export function useLoginWithFarcaster() { signature: req.signature, custodyPubKey: { pubKey: req.custody, - chain: 'Ethereum' as Chain, + chain: 'Ethereum', }, }, }; diff --git a/apps/mobile/src/components/NftSelector/NftSelectorToolbar.tsx b/apps/mobile/src/components/NftSelector/NftSelectorToolbar.tsx index 53355f9029..4387127664 100644 --- a/apps/mobile/src/components/NftSelector/NftSelectorToolbar.tsx +++ b/apps/mobile/src/components/NftSelector/NftSelectorToolbar.tsx @@ -28,7 +28,7 @@ const NETWORKS: { ...chains.map((chain) => ({ label: chain.name, id: chain.name, - icon: getChainIconComponent(chain), + icon: getChainIconComponent(chain.name), hasCreatorSupport: chain.hasCreatorSupport, })), ]; diff --git a/apps/mobile/src/components/NftSelector/useNftSelector.ts b/apps/mobile/src/components/NftSelector/useNftSelector.ts index b70d1f1ac2..b00a323411 100644 --- a/apps/mobile/src/components/NftSelector/useNftSelector.ts +++ b/apps/mobile/src/components/NftSelector/useNftSelector.ts @@ -1,4 +1,5 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; +import { AvailableChains, chains } from 'shared/utils/chains'; import { useSyncTokensActions } from '~/contexts/SyncTokensContext'; import { @@ -9,21 +10,27 @@ import { export function useNftSelector() { const [searchQuery, setSearchQuery] = useState(''); const [ownershipTypeFilter, setFilter] = useState<'Collected' | 'Created'>('Collected'); - const [networkFilter, setNetworkFilter] = useState('Ethereum'); + const [networkFilter, setNetworkFilter] = useState('All Networks'); const [sortView, setSortView] = useState('Recently added'); const [isDraggableMode, setIsDraggableMode] = useState(false); const { syncTokens, syncCreatedTokens, isSyncing, isSyncingCreatedTokens } = useSyncTokensActions(); + const availableChains = useMemo(() => { + return chains + .filter((chain) => chain.name !== 'All Networks') + .map((chain) => chain.name as AvailableChains); + }, []); + const handleSync = useCallback(async () => { if (ownershipTypeFilter === 'Collected') { - await syncTokens(networkFilter); + await syncTokens(networkFilter === 'All Networks' ? availableChains : networkFilter); } - if (ownershipTypeFilter === 'Created') { + if (ownershipTypeFilter === 'Created' && networkFilter !== 'All Networks') { await syncCreatedTokens(networkFilter); } - }, [ownershipTypeFilter, syncTokens, networkFilter, syncCreatedTokens]); + }, [ownershipTypeFilter, networkFilter, syncTokens, availableChains, syncCreatedTokens]); return { searchQuery, diff --git a/apps/mobile/src/screens/NftSelectorScreen/NftSelectorPickerGrid.tsx b/apps/mobile/src/screens/NftSelectorScreen/NftSelectorPickerGrid.tsx index 4ffd5144fb..242383e282 100644 --- a/apps/mobile/src/screens/NftSelectorScreen/NftSelectorPickerGrid.tsx +++ b/apps/mobile/src/screens/NftSelectorScreen/NftSelectorPickerGrid.tsx @@ -6,6 +6,7 @@ import { View, ViewProps } from 'react-native'; import SkeletonPlaceholder from 'react-native-skeleton-placeholder'; import { useFragment, useLazyLoadQuery, useRelayEnvironment } from 'react-relay'; import { fetchQuery, graphql } from 'relay-runtime'; +import { Chain } from 'shared/utils/chains'; import { TokenFailureBoundary } from '~/components/Boundaries/TokenFailureBoundary/TokenFailureBoundary'; import { Button } from '~/components/Button'; @@ -30,10 +31,7 @@ import { } from '~/generated/NftSelectorPickerGridTokensFragment.graphql'; import { NftSelectorPickerGridTokensQuery } from '~/generated/NftSelectorPickerGridTokensQuery.graphql'; import { LoginStackNavigatorProp } from '~/navigation/types'; -import { - NetworkChoice, - NftSelectorSortView, -} from '~/screens/NftSelectorScreen/NftSelectorFilterBottomSheet'; +import { NftSelectorSortView } from '~/screens/NftSelectorScreen/NftSelectorFilterBottomSheet'; import { NftSelectorPickerSingularAsset } from '~/screens/NftSelectorScreen/NftSelectorPickerSingularAsset'; import { contexts } from '~/shared/analytics/constants'; import { removeNullValues } from '~/shared/relay/removeNullValues'; @@ -46,7 +44,7 @@ type NftSelectorPickerGridProps = { searchCriteria: { searchQuery: string; ownerFilter: 'Collected' | 'Created'; - networkFilter: NetworkChoice; + networkFilter: Chain; sortView: NftSelectorSortView; }; @@ -179,31 +177,37 @@ export function NftSelectorPickerGrid({ // [GAL-4202] this logic could be consolidated across web editor + web selector + mobile selector // but also don't overdo it if there's sufficient differentiation between web and mobile UX const filteredTokens = useMemo(() => { - return tokensData - .filter((token) => { - const isSpam = token.definition?.contract?.isSpam || token.isSpamByUser; - - return !isSpam; - }) - .filter((token) => { - if (!searchCriteria.searchQuery) { - return true; - } + let filtered = tokensData; - return token.definition?.community?.name - ?.toLowerCase() - .includes(searchCriteria.searchQuery.toLowerCase()); - }) - .filter((token) => { - return token.definition?.chain === searchCriteria.networkFilter; - }) - .filter((token) => { - if (searchCriteria.ownerFilter === 'Collected') { - return token.ownerIsHolder; - } + // Filter out spam tokens + filtered = filtered.filter((token) => { + const isSpam = token.definition?.contract?.isSpam || token.isSpamByUser; + return !isSpam; + }); - return token.ownerIsCreator; - }); + // Filter by search query if present + if (searchCriteria.searchQuery) { + const searchQueryLower = searchCriteria.searchQuery.toLowerCase(); + filtered = filtered.filter((token) => + token.definition?.community?.name?.toLowerCase().includes(searchQueryLower) + ); + } + + // Filter by network if not 'All Networks' + if (searchCriteria.networkFilter !== 'All Networks') { + filtered = filtered.filter( + (token) => token.definition?.chain === searchCriteria.networkFilter + ); + } + + // Filter by owner status + if (searchCriteria.ownerFilter === 'Collected') { + filtered = filtered.filter((token) => token.ownerIsHolder); + } else if (searchCriteria.ownerFilter === 'Created') { + filtered = filtered.filter((token) => token.ownerIsCreator); + } + + return filtered; }, [ searchCriteria.networkFilter, searchCriteria.ownerFilter, diff --git a/apps/mobile/src/utils/getChainIconComponent.tsx b/apps/mobile/src/utils/getChainIconComponent.tsx index e232bc5bbd..021f16245b 100644 --- a/apps/mobile/src/utils/getChainIconComponent.tsx +++ b/apps/mobile/src/utils/getChainIconComponent.tsx @@ -6,12 +6,16 @@ import { OptimismIcon } from 'src/icons/OptimismIcon'; import { PoapIcon } from 'src/icons/PoapIcon'; import { PolygonIcon } from 'src/icons/PolygonIcon'; import { TezosIcon } from 'src/icons/TezosIcon'; +import { WorldIcon } from 'src/icons/WorldIcon'; import { ZoraIcon } from 'src/icons/ZoraIcon'; -import { ChainMetadata } from '~/shared/utils/chains'; +import { Chain } from '~/shared/utils/chains'; + +export function getChainIconComponent(chain: Chain) { + switch (chain) { + case 'All Networks': + return ; -export function getChainIconComponent(chain: ChainMetadata) { - switch (chain.name) { case 'Ethereum': return ; diff --git a/apps/web/public/icons/all_logo.svg b/apps/web/public/icons/all_logo.svg new file mode 100644 index 0000000000..ffd5e16c16 --- /dev/null +++ b/apps/web/public/icons/all_logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/apps/web/src/components/GalleryEditor/PiecesSidebar/AddWalletSidebar.tsx b/apps/web/src/components/GalleryEditor/PiecesSidebar/AddWalletSidebar.tsx index d4f0af73d8..1ead4baaec 100644 --- a/apps/web/src/components/GalleryEditor/PiecesSidebar/AddWalletSidebar.tsx +++ b/apps/web/src/components/GalleryEditor/PiecesSidebar/AddWalletSidebar.tsx @@ -58,7 +58,9 @@ export function AddWalletSidebar({ handleRefresh, selectedChain, queryRef }: Pro diff --git a/apps/web/src/components/GalleryEditor/PiecesSidebar/PiecesSidebar.tsx b/apps/web/src/components/GalleryEditor/PiecesSidebar/PiecesSidebar.tsx index a8fba81119..0637b0eda6 100644 --- a/apps/web/src/components/GalleryEditor/PiecesSidebar/PiecesSidebar.tsx +++ b/apps/web/src/components/GalleryEditor/PiecesSidebar/PiecesSidebar.tsx @@ -19,7 +19,7 @@ import { RefreshIcon } from '~/icons/RefreshIcon'; import { contexts, flows } from '~/shared/analytics/constants'; import useExperience from '~/shared/hooks/useExperience'; import colors from '~/shared/theme/colors'; -import { ChainMetadata, chainsMap } from '~/shared/utils/chains'; +import { AvailableChains, ChainMetadata, chains, chainsMap } from '~/shared/utils/chains'; import { doesUserOwnWalletFromChainFamily } from '~/shared/utils/doesUserOwnWalletFromChainFamily'; import OnboardingDialog from '../GalleryOnboardingGuide/OnboardingDialog'; @@ -95,16 +95,15 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { rawTokensToDisplay: allTokens, }); - const [selectedChain, setSelectedChain] = useState(chainsMap['Ethereum']); + const [selectedChain, setSelectedChain] = useState(chainsMap['All Networks']); const [selectedWallet, setSelectedWallet] = useState('All'); const [selectedView, setSelectedView] = useState('Collected'); const navbarHeight = useGlobalNavbarHeight(); - const ownsWalletFromSelectedChainFamily = doesUserOwnWalletFromChainFamily( - selectedChain.name, - query - ); + const ownsWalletFromSelectedChainFamily = + selectedChain.name === 'All Networks' || + doesUserOwnWalletFromChainFamily(selectedChain.name, query); const handleAddBlankBlockClick = useCallback(() => { addWhitespace(); @@ -114,11 +113,19 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { // there's also wallet-specific token filtering happening in a child component, which should be lifted up here const tokensToDisplay = useMemo(() => { return tokenSearchResults.filter((token) => { + const isSpam = + token.isSpamByUser === null ? token.definition.contract?.isSpam : token.isSpamByUser; + // If we're searching, we want to search across all chains; the chain selector will be hidden during search if (isSearching) { return true; } + // Check if network is 'All Networks', then return true for all tokens except spam + if (selectedChain.name === 'All Networks') { + return !isSpam; + } + if (token.definition.chain !== selectedChain.name) { return false; } @@ -145,8 +152,6 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { } // ...but incorporate with spam filtering logic for Collected view - const isSpam = - token.isSpamByUser !== null ? token.isSpamByUser : token.definition.contract?.isSpam; if (selectedView === 'Hidden') { return isSpam; } @@ -155,7 +160,7 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { }, [tokenSearchResults, isSearching, selectedChain, selectedView, selectedWallet]); const isRefreshDisabledAtUserLevel = isRefreshDisabledForUser(query.viewer?.user?.dbid ?? ''); - const refreshDisabled = + const shouldDisableRefresh = isRefreshDisabledAtUserLevel || !doesUserOwnWalletFromChainFamily(selectedChain.name, query) || isLocked; @@ -199,8 +204,14 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { setSelectedWallet('All'); }, []); + const availableChains = useMemo(() => { + return chains + .filter((chain) => chain.name !== 'All Networks') + .map((chain) => chain.name as AvailableChains); + }, []); + const handleRefresh = useCallback(async () => { - if (refreshDisabled) { + if (shouldDisableRefresh) { return; } @@ -208,8 +219,11 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { return; } - await syncTokens({ type: selectedView, chain: selectedChain.name }); - }, [refreshDisabled, selectedView, syncTokens, selectedChain.name]); + await syncTokens({ + type: selectedView, + chain: selectedChain.name === 'All Networks' ? availableChains : selectedChain.name, + }); + }, [shouldDisableRefresh, selectedView, syncTokens, selectedChain.name, availableChains]); // Auto-sync tokens when the chain changes, and there are 0 tokens to display useEffect(() => { @@ -280,6 +294,7 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { isSearching={isSearching} selectedView={selectedView} onSelectedViewChange={handleSelectedViewChange} + isAllNetworksSelected={selectedChain.name === 'All Networks'} />
@@ -336,7 +351,7 @@ export function PiecesSidebar({ tokensRef, queryRef }: Props) { eventContext={contexts.Editor} onClick={handleRefresh} variant="primary" - disabled={refreshDisabled} + disabled={shouldDisableRefresh} > {isLocked ? ( diff --git a/apps/web/src/components/GalleryEditor/PiecesSidebar/SidebarViewSelector.tsx b/apps/web/src/components/GalleryEditor/PiecesSidebar/SidebarViewSelector.tsx index f8e1a634f3..daf39667b1 100644 --- a/apps/web/src/components/GalleryEditor/PiecesSidebar/SidebarViewSelector.tsx +++ b/apps/web/src/components/GalleryEditor/PiecesSidebar/SidebarViewSelector.tsx @@ -17,12 +17,14 @@ type SidebarViewSelectorProps = { isSearching: boolean; selectedView: TokenFilterType; onSelectedViewChange: (selectedView: TokenFilterType) => void; + isAllNetworksSelected: boolean; }; export function SidebarViewSelector({ isSearching, selectedView, onSelectedViewChange, + isAllNetworksSelected, }: SidebarViewSelectorProps) { const [isDropdownOpen, setIsDropdownOpen] = useState(false); @@ -60,12 +62,14 @@ export function SidebarViewSelector({ name="Token Type" eventContext={contexts.Editor} label="Created" + disabled={isAllNetworksSelected} /> onSelectView('Hidden')} name="Token Type" eventContext={contexts.Editor} label="Hidden" + disabled={isAllNetworksSelected} /> diff --git a/apps/web/src/components/NftSelector/NftSelector.tsx b/apps/web/src/components/NftSelector/NftSelector.tsx index 6f139c1a21..d44de41fac 100644 --- a/apps/web/src/components/NftSelector/NftSelector.tsx +++ b/apps/web/src/components/NftSelector/NftSelector.tsx @@ -11,6 +11,7 @@ import { RefreshIcon } from '~/icons/RefreshIcon'; import { contexts } from '~/shared/analytics/constants'; import { GalleryElementTrackingProps, useTrack } from '~/shared/contexts/AnalyticsContext'; import { removeNullValues } from '~/shared/relay/removeNullValues'; +import { chains } from '~/shared/utils/chains'; import { doesUserOwnWalletFromChainFamily } from '~/shared/utils/doesUserOwnWalletFromChainFamily'; import breakpoints from '../core/breakpoints'; @@ -145,11 +146,19 @@ function NftSelectorInner({ onSelectToken, headerText, preSelectedContract, even const tokensToDisplay = useMemo(() => { // Filter tokens const filteredTokens = tokenSearchResults.filter((token) => { + const isSpam = + token.isSpamByUser === null ? token.definition.contract?.isSpam : token.isSpamByUser; + // If we're searching, we want to search across all chains; the chain selector will be hidden during search if (isSearching) { return true; } + // Check if network is 'All Networks', then return true for all tokens + if (network === 'All Networks') { + return !isSpam; + } + if (token.definition.chain !== network) { return false; } @@ -167,8 +176,6 @@ function NftSelectorInner({ onSelectToken, headerText, preSelectedContract, even } // ...but incorporate with spam filtering logic for Collected view - const isSpam = - token.isSpamByUser !== null ? token.isSpamByUser : token.definition.contract?.isSpam; if (filterType === 'Hidden') { return isSpam; } @@ -214,6 +221,10 @@ function NftSelectorInner({ onSelectToken, headerText, preSelectedContract, even const refreshDisabled = isRefreshDisabledAtUserLevel || !ownsWalletFromSelectedChainFamily || isLocked; + const availableChains = chains + .filter((chain) => chain.name !== 'All Networks') + .map((chain) => chain.name as Exclude<(typeof chains)[number]['name'], 'All Networks'>); + const handleRefresh = useCallback(async () => { if (refreshDisabled) { return; @@ -227,9 +238,11 @@ function NftSelectorInner({ onSelectToken, headerText, preSelectedContract, even if (filterType === 'Hidden') { return; } - - await syncTokens({ type: filterType, chain: network }); - }, [refreshDisabled, track, eventFlow, filterType, syncTokens, network]); + await syncTokens({ + type: filterType, + chain: network === 'All Networks' ? availableChains : network, + }); + }, [refreshDisabled, track, eventFlow, filterType, syncTokens, network, availableChains]); const [syncCreatedTokensForExistingContract, isContractRefreshing] = useSyncCreatedTokensForExistingContract(); diff --git a/apps/web/src/components/NftSelector/NftSelectorFilter/NftSelectorFilterNetwork.tsx b/apps/web/src/components/NftSelector/NftSelectorFilter/NftSelectorFilterNetwork.tsx index bf7882d850..a965eb6a3e 100644 --- a/apps/web/src/components/NftSelector/NftSelectorFilter/NftSelectorFilterNetwork.tsx +++ b/apps/web/src/components/NftSelector/NftSelectorFilter/NftSelectorFilterNetwork.tsx @@ -134,5 +134,5 @@ const Selector = styled(HStack)` const Container = styled.div` position: relative; - width: 133px; + width: 153px; `; diff --git a/apps/web/src/components/WalletSelector/multichain/FarcasterLoginView.tsx b/apps/web/src/components/WalletSelector/multichain/FarcasterLoginView.tsx index 10f20de49e..522056af87 100644 --- a/apps/web/src/components/WalletSelector/multichain/FarcasterLoginView.tsx +++ b/apps/web/src/components/WalletSelector/multichain/FarcasterLoginView.tsx @@ -11,7 +11,6 @@ import { useReportError } from 'shared/contexts/ErrorReportingContext'; import useCreateNonce from 'shared/hooks/useCreateNonce'; import { useGetUsersByWalletAddressesImperatively } from 'shared/hooks/useGetUserByWalletAddress'; import { removeNullValues } from 'shared/relay/removeNullValues'; -import { Chain } from 'shared/utils/chains'; import styled from 'styled-components'; import Loader from '~/components/core/Loader/Loader'; @@ -109,11 +108,11 @@ export function FarcasterLoginView() { signature: req.signature, custodyPubKey: { pubKey: req.custody, - chain: 'Ethereum' as Chain, + chain: 'Ethereum', }, primaryPubKey: { pubKey: primaryFarcasterAddress, - chain: 'Ethereum' as Chain, + chain: 'Ethereum', }, }, }; diff --git a/apps/web/src/components/core/Dropdown/DropdownItem.tsx b/apps/web/src/components/core/Dropdown/DropdownItem.tsx index 7348bea7a1..28ccb9659d 100644 --- a/apps/web/src/components/core/Dropdown/DropdownItem.tsx +++ b/apps/web/src/components/core/Dropdown/DropdownItem.tsx @@ -38,6 +38,9 @@ export function DropdownItem({ const handleClick = useCallback>( (event) => { + if (disabled) { + return; + } track('Dropdown Item Click', { id: `${name} Dropdown Item`, name: `${name} Dropdown Item Click`, @@ -49,7 +52,7 @@ export function DropdownItem({ onClick?.(event); }, - [track, name, eventContext, eventFlow, label, eventSelection, properties, onClick] + [track, name, eventContext, eventFlow, label, eventSelection, properties, onClick, disabled] ); if (label) { diff --git a/apps/web/src/contexts/postComposer/PostComposerContext.tsx b/apps/web/src/contexts/postComposer/PostComposerContext.tsx index 37e15fc358..70c7a2b1e1 100644 --- a/apps/web/src/contexts/postComposer/PostComposerContext.tsx +++ b/apps/web/src/contexts/postComposer/PostComposerContext.tsx @@ -85,7 +85,7 @@ const PostComposerProvider = memo(({ children }: Props) => { const [filterType, setFilterType] = useState('Collected'); const [sortType, setSortType] = useState('Recently added'); - const [network, setNetwork] = useState('Ethereum'); + const [network, setNetwork] = useState('All Networks'); const [selectedContract, setSelectedContract] = useState(null); const isMobile = useIsMobileWindowWidth(); diff --git a/apps/web/src/scenes/CommunityPage/CommunityPageOwnershipRequiredModal.tsx b/apps/web/src/scenes/CommunityPage/CommunityPageOwnershipRequiredModal.tsx index af5604d450..effae08882 100644 --- a/apps/web/src/scenes/CommunityPage/CommunityPageOwnershipRequiredModal.tsx +++ b/apps/web/src/scenes/CommunityPage/CommunityPageOwnershipRequiredModal.tsx @@ -41,7 +41,7 @@ export default function CommunityPageOwnershipRequiredModal({ // Acknowledgment: This could let a user refresh a chain they can't access in the Editor const handleRefreshCollectionClick = useCallback(async () => { - if (!chain) { + if (!chain || chain === 'All Networks') { return; } diff --git a/packages/shared/src/utils/chains.ts b/packages/shared/src/utils/chains.ts index b86b3325f6..10210849ba 100644 --- a/packages/shared/src/utils/chains.ts +++ b/packages/shared/src/utils/chains.ts @@ -1,6 +1,15 @@ import keyBy from 'lodash.keyby'; export const chains = [ + { + name: 'All Networks', + shortName: 'ALL', + icon: '/icons/all_logo.svg', + baseChain: 'N/A', + hasCreatorSupport: false, + isEnabled: true, + shouldAutoRefresh: false, + }, { name: 'Ethereum', shortName: 'ETH', @@ -77,6 +86,7 @@ export const chains = [ export type Chain = (typeof chains)[number]['name']; export type LowercaseChain = Lowercase; +export type AvailableChains = Exclude<(typeof chains)[number]['name'], 'All Networks'>; export type ChainMetadata = (typeof chains)[number]; diff --git a/packages/shared/src/utils/doesUserOwnWalletFromChainFamily.ts b/packages/shared/src/utils/doesUserOwnWalletFromChainFamily.ts index 63eb6092ec..c75ddf231e 100644 --- a/packages/shared/src/utils/doesUserOwnWalletFromChainFamily.ts +++ b/packages/shared/src/utils/doesUserOwnWalletFromChainFamily.ts @@ -2,12 +2,9 @@ import { graphql } from 'react-relay'; import { readInlineData } from 'relay-runtime'; -import { - Chain, - doesUserOwnWalletFromChainFamilyFragment$key, -} from '~/generated/doesUserOwnWalletFromChainFamilyFragment.graphql'; +import { doesUserOwnWalletFromChainFamilyFragment$key } from '~/generated/doesUserOwnWalletFromChainFamilyFragment.graphql'; -import { chainsMap } from './chains'; +import { Chain, chainsMap } from './chains'; export function doesUserOwnWalletFromChainFamily( _chain: Chain, @@ -31,15 +28,12 @@ export function doesUserOwnWalletFromChainFamily( ); return query.viewer?.user?.wallets?.some((wallet) => { - if (_chain === '%future added value') { - return false; + if (_chain === 'All Networks') { + return true; } if (!wallet?.chain) { return false; } - if (wallet.chain === '%future added value') { - return false; - } - return chainsMap[wallet.chain].baseChain === chainsMap[_chain].baseChain; + return chainsMap[wallet.chain as Chain].baseChain === chainsMap[_chain].baseChain; }); }