Commit f91fc3c6 authored by Zach Pomerantz's avatar Zach Pomerantz Committed by GitHub

fix: defer layout effects (#3687)

* fix: use effect for color

* chore: clean up token defaults

* fix: condition updaters on active tokens
parent e0e2b40f
...@@ -3,7 +3,7 @@ import { SupportedChainId } from 'constants/chains' ...@@ -3,7 +3,7 @@ import { SupportedChainId } from 'constants/chains'
import uriToHttp from 'lib/utils/uriToHttp' import uriToHttp from 'lib/utils/uriToHttp'
import Vibrant from 'node-vibrant/lib/bundle.js' import Vibrant from 'node-vibrant/lib/bundle.js'
import { shade } from 'polished' import { shade } from 'polished'
import { useLayoutEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { WrappedTokenInfo } from 'state/lists/wrappedTokenInfo' import { WrappedTokenInfo } from 'state/lists/wrappedTokenInfo'
import { hex } from 'wcag-contrast' import { hex } from 'wcag-contrast'
...@@ -64,7 +64,7 @@ async function getColorFromUriPath(uri: string): Promise<string | null> { ...@@ -64,7 +64,7 @@ async function getColorFromUriPath(uri: string): Promise<string | null> {
export function useColor(token?: Token) { export function useColor(token?: Token) {
const [color, setColor] = useState('#2172E5') const [color, setColor] = useState('#2172E5')
useLayoutEffect(() => { useEffect(() => {
let stale = false let stale = false
if (token) { if (token) {
...@@ -87,7 +87,7 @@ export function useColor(token?: Token) { ...@@ -87,7 +87,7 @@ export function useColor(token?: Token) {
export function useListColor(listImageUri?: string) { export function useListColor(listImageUri?: string) {
const [color, setColor] = useState('#2172E5') const [color, setColor] = useState('#2172E5')
useLayoutEffect(() => { useEffect(() => {
let stale = false let stale = false
if (listImageUri) { if (listImageUri) {
......
...@@ -8,7 +8,7 @@ import { usePendingTransactions } from 'lib/hooks/transactions' ...@@ -8,7 +8,7 @@ import { usePendingTransactions } from 'lib/hooks/transactions'
import useActiveWeb3React from 'lib/hooks/useActiveWeb3React' import useActiveWeb3React from 'lib/hooks/useActiveWeb3React'
import useHasFocus from 'lib/hooks/useHasFocus' import useHasFocus from 'lib/hooks/useHasFocus'
import useOnSupportedNetwork from 'lib/hooks/useOnSupportedNetwork' import useOnSupportedNetwork from 'lib/hooks/useOnSupportedNetwork'
import { useSyncTokenList } from 'lib/hooks/useTokenList' import { useIsTokenListLoaded, useSyncTokenList } from 'lib/hooks/useTokenList'
import { displayTxHashAtom } from 'lib/state/swap' import { displayTxHashAtom } from 'lib/state/swap'
import { SwapTransactionInfo, Transaction, TransactionType, WrapTransactionInfo } from 'lib/state/transactions' import { SwapTransactionInfo, Transaction, TransactionType, WrapTransactionInfo } from 'lib/state/transactions'
import { useState } from 'react' import { useState } from 'react'
...@@ -47,12 +47,11 @@ export interface SwapProps extends TokenDefaults, FeeOptions { ...@@ -47,12 +47,11 @@ export interface SwapProps extends TokenDefaults, FeeOptions {
onConnectWallet?: () => void onConnectWallet?: () => void
} }
function Updaters(props: SwapProps & { disabled: boolean }) { function Updaters(props: SwapProps) {
useSyncTokenList(props.tokenList)
useSyncTokenDefaults(props) useSyncTokenDefaults(props)
useSyncConvenienceFee(props) useSyncConvenienceFee(props)
return props.disabled ? null : <SwapInfoUpdater /> return <SwapInfoUpdater />
} }
export default function Swap(props: SwapProps) { export default function Swap(props: SwapProps) {
...@@ -68,11 +67,14 @@ export default function Swap(props: SwapProps) { ...@@ -68,11 +67,14 @@ export default function Swap(props: SwapProps) {
const onSupportedNetwork = useOnSupportedNetwork() const onSupportedNetwork = useOnSupportedNetwork()
const isDisabled = !(active && onSupportedNetwork) const isDisabled = !(active && onSupportedNetwork)
useSyncTokenList(props.tokenList)
const isUpdateable = useIsTokenListLoaded() && !isDisabled
const focused = useHasFocus(wrapper) const focused = useHasFocus(wrapper)
return ( return (
<> <>
<Updaters {...props} disabled={isDisabled} /> {isUpdateable && <Updaters {...props} />}
<Header title={<Trans>Swap</Trans>}> <Header title={<Trans>Swap</Trans>}>
{active && <Wallet disabled={!account} onClick={props.onConnectWallet} />} {active && <Wallet disabled={!account} onClick={props.onConnectWallet} />}
<Settings disabled={isDisabled} /> <Settings disabled={isDisabled} />
......
...@@ -3,7 +3,7 @@ import { Provider as Eip1193Provider } from '@web3-react/types' ...@@ -3,7 +3,7 @@ import { Provider as Eip1193Provider } from '@web3-react/types'
import { DEFAULT_LOCALE, SUPPORTED_LOCALES, SupportedLocale } from 'constants/locales' import { DEFAULT_LOCALE, SUPPORTED_LOCALES, SupportedLocale } from 'constants/locales'
import { Provider as AtomProvider } from 'jotai' import { Provider as AtomProvider } from 'jotai'
import { TransactionsUpdater } from 'lib/hooks/transactions' import { TransactionsUpdater } from 'lib/hooks/transactions'
import { ActiveWeb3Provider } from 'lib/hooks/useActiveWeb3React' import useActiveWeb3React, { ActiveWeb3Provider } from 'lib/hooks/useActiveWeb3React'
import { BlockUpdater } from 'lib/hooks/useBlockNumber' import { BlockUpdater } from 'lib/hooks/useBlockNumber'
import { Provider as I18nProvider } from 'lib/i18n' import { Provider as I18nProvider } from 'lib/i18n'
import { MulticallUpdater, store as multicallStore } from 'lib/state/multicall' import { MulticallUpdater, store as multicallStore } from 'lib/state/multicall'
...@@ -130,7 +130,7 @@ export default function Widget(props: PropsWithChildren<WidgetProps>) { ...@@ -130,7 +130,7 @@ export default function Widget(props: PropsWithChildren<WidgetProps>) {
<ReduxProvider store={multicallStore}> <ReduxProvider store={multicallStore}>
<AtomProvider> <AtomProvider>
<ActiveWeb3Provider provider={provider} jsonRpcEndpoint={jsonRpcEndpoint}> <ActiveWeb3Provider provider={provider} jsonRpcEndpoint={jsonRpcEndpoint}>
<Updaters /> {useActiveWeb3React().active && <Updaters />}
{children} {children}
</ActiveWeb3Provider> </ActiveWeb3Provider>
</AtomProvider> </AtomProvider>
......
...@@ -5,7 +5,7 @@ import useActiveWeb3React from 'lib/hooks/useActiveWeb3React' ...@@ -5,7 +5,7 @@ import useActiveWeb3React from 'lib/hooks/useActiveWeb3React'
import { useToken } from 'lib/hooks/useCurrency' import { useToken } from 'lib/hooks/useCurrency'
import useNativeCurrency from 'lib/hooks/useNativeCurrency' import useNativeCurrency from 'lib/hooks/useNativeCurrency'
import { Field, Swap, swapAtom } from 'lib/state/swap' import { Field, Swap, swapAtom } from 'lib/state/swap'
import { useCallback, useLayoutEffect, useState } from 'react' import { useCallback, useLayoutEffect, useRef } from 'react'
import useOnSupportedNetwork from '../useOnSupportedNetwork' import useOnSupportedNetwork from '../useOnSupportedNetwork'
...@@ -71,13 +71,11 @@ export default function useSyncTokenDefaults({ ...@@ -71,13 +71,11 @@ export default function useSyncTokenDefaults({
updateSwap((swap) => ({ ...swap, ...defaultSwapState })) updateSwap((swap) => ({ ...swap, ...defaultSwapState }))
}, [defaultInputAmount, defaultInputToken, defaultOutputAmount, defaultOutputToken, updateSwap]) }, [defaultInputAmount, defaultInputToken, defaultOutputAmount, defaultOutputToken, updateSwap])
const [previousChainId, setPreviousChainId] = useState(chainId) const lastChainId = useRef<number | undefined>(undefined)
useLayoutEffect(() => { useLayoutEffect(() => {
setPreviousChainId(chainId) if (chainId && chainId !== lastChainId.current) {
}, [chainId])
useLayoutEffect(() => {
if (chainId && chainId !== previousChainId) {
setToDefaults() setToDefaults()
} }
}, [chainId, previousChainId, setToDefaults]) lastChainId.current = chainId
}, [chainId, setToDefaults])
} }
import { Currency } from '@uniswap/sdk-core' import { Currency } from '@uniswap/sdk-core'
import { useTheme } from 'lib/theme' import { useTheme } from 'lib/theme'
import Vibrant from 'node-vibrant/lib/bundle.js' import Vibrant from 'node-vibrant/lib/bundle.js'
import { useEffect, useLayoutEffect, useState } from 'react' import { useEffect, useState } from 'react'
import useCurrencyLogoURIs from './useCurrencyLogoURIs' import useCurrencyLogoURIs from './useCurrencyLogoURIs'
...@@ -57,7 +57,7 @@ export default function useCurrencyColor(token?: Currency) { ...@@ -57,7 +57,7 @@ export default function useCurrencyColor(token?: Currency) {
const theme = useTheme() const theme = useTheme()
const logoURIs = useCurrencyLogoURIs(token) const logoURIs = useCurrencyLogoURIs(token)
useLayoutEffect(() => { useEffect(() => {
let stale = false let stale = false
if (theme.tokenColorExtraction && token) { if (theme.tokenColorExtraction && token) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment