Merge pull request #16329 from brave/feat-wallet-asset-discovery-loading-skeleton

feat(wallet): Add Asset Discovery Loading Skeleton
This commit is contained in:
Douglas Daniel
2022-12-13 13:03:46 -07:00
committed by GitHub
10 changed files with 89 additions and 17 deletions
@@ -71,6 +71,7 @@
setAccountTransactions,
setAllNetworks,
setAllTokensList,
setAssetAutoDiscoveryCompleted,
setCoinMarkets,
setDefaultAccounts,
setDefaultNetworks,
@@ -268,6 +268,7 @@ handler.on(WalletActions.initialized.type, async (store: Store, payload: WalletI
await store.dispatch(refreshBalances())
await store.dispatch(refreshPrices())
await store.dispatch(refreshTokenPriceHistory(state.selectedPortfolioTimeline))
await braveWalletService.discoverAssetsOnAllSupportedChains()
}
// This can be 0 when the wallet is locked
@@ -25,6 +25,7 @@ export const isWalletCreated = ({ wallet }: State) => wallet.isWalletCreated
export const isWalletLocked = ({ wallet }: State) => wallet.isWalletLocked
export const passwordAttempts = ({ wallet }: State) => wallet.passwordAttempts
export const selectedPortfolioTimeline = ({ wallet }: State) => wallet.selectedPortfolioTimeline
export const assetAutoDiscoveryCompleted = ({ wallet }: State) => wallet.assetAutoDiscoveryCompleted
// unsafe selectors (will cause re-render if not strictly equal "===") (objects and lists)
export const accounts = ({ wallet }: State) => wallet.accounts
@@ -124,7 +124,8 @@ const defaultState: WalletState = {
solFeeEstimates: undefined,
onRampCurrencies: [] as BraveWallet.OnRampCurrency[],
selectedCurrency: undefined,
passwordAttempts: 0
passwordAttempts: 0,
assetAutoDiscoveryCompleted: false
}
// async actions
@@ -351,6 +352,10 @@ export const createWalletSlice = (initialState: WalletState = defaultState) => {
state.fullTokenList = payload
},
setAssetAutoDiscoveryCompleted (state: WalletState, { payload }: PayloadAction<BraveWallet.BlockchainToken[]>) {
state.assetAutoDiscoveryCompleted = true
},
setCoinMarkets (state: WalletState, { payload }: PayloadAction<GetCoinMarketsResponse>) {
state.coinMarketData = payload.success
? payload.values.map(coin => {
@@ -122,7 +122,7 @@ export class WalletApiProxy {
store.dispatch(WalletActions.getAllNetworks())
},
onDiscoverAssetsCompleted: function (discoveredAssets) {
// TODO: Handle this event.
store.dispatch(WalletActions.setAssetAutoDiscoveryCompleted(discoveredAssets))
}
})
this.braveWalletService.addObserver(braveWalletServiceObserverReceiver.$.bindNewPipeAndPassRemote())
@@ -0,0 +1,39 @@
// Copyright (c) 2022 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// you can obtain one at https://mozilla.org/MPL/2.0/.
import * as React from 'react'
// Components
import { LoadingSkeleton } from '../../shared'
// Styled Components
import { StyledWrapper, NameAndIcon, NameColumn, Spacer, BalanceColumn } from './style'
import { IconsWrapper } from '../../shared/style'
export const PortfolioAssetItemLoadingSkeleton = () => {
return (
<StyledWrapper disabled={true}>
<NameAndIcon>
<IconsWrapper>
<LoadingSkeleton
circle={true}
width={40}
height={40}
/>
</IconsWrapper>
<NameColumn>
<LoadingSkeleton width={60} height={18} />
<Spacer />
<LoadingSkeleton width={120} height={18} />
</NameColumn>
</NameAndIcon>
<BalanceColumn>
<LoadingSkeleton width={60} height={18} />
<Spacer />
<LoadingSkeleton width={60} height={18} />
</BalanceColumn>
</StyledWrapper>
)
}
@@ -6,15 +6,18 @@
import * as React from 'react'
import { Redirect, useParams, useLocation } from 'react-router'
import {
useDispatch,
useSelector
useDispatch
} from 'react-redux'
import { create } from 'ethereum-blockies'
// Selectors
import { useSafeWalletSelector, useUnsafeWalletSelector } from '../../../../common/hooks/use-safe-selector'
import { WalletSelectors } from '../../../../common/selectors'
// Types
import {
BraveWallet,
CoinTypesMap,
WalletState,
WalletRoutes,
AccountButtonOptionsObjectType
} from '../../../../constants/types'
@@ -44,6 +47,7 @@ import { TransactionPlaceholderText, Spacer } from '../portfolio/style'
// Components
import { BackButton } from '../../../shared'
import { PortfolioTransactionItem } from '../../portfolio-transaction-item/index'
import { PortfolioAssetItemLoadingSkeleton } from '../../portfolio-asset-item/portfolio-asset-item-loading-skeleton'
import { PortfolioAssetItem } from '../../portfolio-asset-item/index'
import { CopyTooltip } from '../../../shared/copy-tooltip/copy-tooltip'
import { AccountListItemOptionButton } from '../../account-list-item/account-list-item-option-button'
@@ -71,10 +75,15 @@ export const Account = ({
// redux
const dispatch = useDispatch()
const accounts = useSelector(({ wallet }: { wallet: WalletState }) => wallet.accounts)
const transactions = useSelector(({ wallet }: { wallet: WalletState }) => wallet.transactions)
const userVisibleTokensInfo = useSelector(({ wallet }: { wallet: WalletState }) => wallet.userVisibleTokensInfo)
const networkList = useSelector(({ wallet }: { wallet: WalletState }) => wallet.networkList)
// unsafe selectors
const networkList = useUnsafeWalletSelector(WalletSelectors.networkList)
const userVisibleTokensInfo = useUnsafeWalletSelector(WalletSelectors.userVisibleTokensInfo)
const accounts = useUnsafeWalletSelector(WalletSelectors.accounts)
const transactions = useUnsafeWalletSelector(WalletSelectors.transactions)
// safe selectors
const assetAutoDiscoveryCompleted = useSafeWalletSelector(WalletSelectors.assetAutoDiscoveryCompleted)
// custom hooks
const scrollIntoView = useScrollIntoView()
@@ -224,6 +233,10 @@ export const Account = ({
/>
)}
{!assetAutoDiscoveryCompleted &&
<PortfolioAssetItemLoadingSkeleton />
}
<Spacer />
{nonFungibleTokens?.length !== 0 &&
@@ -5,14 +5,16 @@
import * as React from 'react'
import { useHistory } from 'react-router'
import { useSelector } from 'react-redux'
// Selectors
import { useSafeWalletSelector, useUnsafeWalletSelector } from '../../../../../../common/hooks/use-safe-selector'
import { WalletSelectors } from '../../../../../../common/selectors'
// Types
import {
BraveWallet,
UserAssetInfoType,
WalletRoutes,
WalletState
WalletRoutes
} from '../../../../../../constants/types'
import { RenderTokenFunc } from './virtualized-tokens-list'
@@ -26,6 +28,7 @@ import NetworkFilterSelector from '../../../../network-filter-selector/index'
import { AccountFilterSelector } from '../../../../account-filter-selector/account-filter-selector'
import { AssetFilterSelector } from '../../../../asset-filter-selector/asset-filter-selector'
import { NFTGridView } from '../nft-grid-view/nft-grid-view'
import { PortfolioAssetItemLoadingSkeleton } from '../../../../portfolio-asset-item/portfolio-asset-item-loading-skeleton'
// Hooks
import usePricing from '../../../../../../common/hooks/pricing'
@@ -66,9 +69,12 @@ export const TokenLists = ({
// routing
const history = useHistory()
// redux
const tokenSpotPrices = useSelector(({ wallet }: { wallet: WalletState }) => wallet.transactionSpotPrices)
const selectedAssetFilter = useSelector(({ wallet }: { wallet: WalletState }) => wallet.selectedAssetFilter)
// unsafe selectors
const tokenSpotPrices = useUnsafeWalletSelector(WalletSelectors.transactionSpotPrices)
const selectedAssetFilter = useUnsafeWalletSelector(WalletSelectors.selectedAssetFilter)
// safe selectors
const assetAutoDiscoveryCompleted = useSafeWalletSelector(WalletSelectors.assetAutoDiscoveryCompleted)
// hooks
const { computeFiatAmount } = usePricing(tokenSpotPrices)
@@ -156,6 +162,9 @@ export const TokenLists = ({
{nonFungibleTokens.map((token, index) => renderToken({ index, item: token, viewMode: 'list' }))}
</>
}
{!assetAutoDiscoveryCompleted &&
<PortfolioAssetItemLoadingSkeleton />
}
</>
) : (
<NFTGridView
@@ -167,7 +176,8 @@ export const TokenLists = ({
selectedAssetFilter.id,
sortedFungibleTokensList,
renderToken,
nonFungibleTokens
nonFungibleTokens,
assetAutoDiscoveryCompleted
])
// effects
@@ -257,6 +257,7 @@ export interface WalletState {
onRampCurrencies: BraveWallet.OnRampCurrency[]
selectedCurrency: BraveWallet.OnRampCurrency | undefined
passwordAttempts: number
assetAutoDiscoveryCompleted: boolean
}
export interface PanelState {
@@ -396,5 +396,6 @@ export const mockWalletState: WalletState = {
selectedCurrency: mockCurrency,
passwordAttempts: 0,
isLoadingCoinMarketData: false,
coinMarketData: mockCoinMarketData
coinMarketData: mockCoinMarketData,
assetAutoDiscoveryCompleted: false
}