Commit b5f665bc authored by eddie's avatar eddie Committed by GitHub

fix: allow defaultTokens to reset state in Widget (#6131)

fix: tdp widget bug
parent bf337f28
...@@ -18,6 +18,25 @@ function missingDefaultToken(tokens: SwapTokens) { ...@@ -18,6 +18,25 @@ function missingDefaultToken(tokens: SwapTokens) {
return !tokens[Field.INPUT]?.equals(tokens.default) && !tokens[Field.OUTPUT]?.equals(tokens.default) return !tokens[Field.INPUT]?.equals(tokens.default) && !tokens[Field.OUTPUT]?.equals(tokens.default)
} }
function currenciesEqual(a: Currency | undefined, b: Currency | undefined) {
if (a && b) {
return a.equals(b)
} else {
return !a && !b
}
}
function tokensEqual(a: SwapTokens | undefined, b: SwapTokens | undefined) {
if (!a || !b) {
return !a && !b
}
return (
currenciesEqual(a[Field.INPUT], b[Field.INPUT]) &&
currenciesEqual(a[Field.OUTPUT], b[Field.OUTPUT]) &&
currenciesEqual(a.default, b.default)
)
}
/** /**
* Integrates the Widget's inputs. * Integrates the Widget's inputs.
* Treats the Widget as a controlled component, using the app's own token selector for selection. * Treats the Widget as a controlled component, using the app's own token selector for selection.
...@@ -37,18 +56,21 @@ export function useSyncWidgetInputs({ ...@@ -37,18 +56,21 @@ export function useSyncWidgetInputs({
const [type, setType] = useState<SwapValue['type']>(TradeType.EXACT_INPUT) const [type, setType] = useState<SwapValue['type']>(TradeType.EXACT_INPUT)
const [amount, setAmount] = useState<SwapValue['amount']>(EMPTY_AMOUNT) const [amount, setAmount] = useState<SwapValue['amount']>(EMPTY_AMOUNT)
const [tokens, setTokens] = useState<SwapTokens>(defaultTokens) const [tokens, setTokens] = useState<SwapTokens>({
...defaultTokens,
[Field.OUTPUT]: defaultTokens[Field.OUTPUT] ?? defaultTokens.default,
})
// The most recent set of defaults, which can be used to check when the defaults are actually changing.
const baseTokens = usePrevious(defaultTokens)
useEffect(() => { useEffect(() => {
if (!tokens[Field.INPUT] && !tokens[Field.OUTPUT]) { if (!tokensEqual(baseTokens, defaultTokens)) {
setTokens({ setTokens({
...tokens, ...defaultTokens,
[Field.INPUT]: defaultTokens[Field.INPUT] ?? tokens[Field.INPUT], [Field.OUTPUT]: defaultTokens[Field.OUTPUT] ?? defaultTokens.default,
[Field.OUTPUT]: defaultTokens[Field.OUTPUT] ?? tokens[Field.OUTPUT] ?? defaultTokens.default,
default: defaultTokens.default,
}) })
} }
}, [defaultTokens, tokens]) }, [baseTokens, defaultTokens])
useEffect(() => { useEffect(() => {
if (chainId !== previousChainId && !!previousChainId && isSupportedChain(chainId)) { if (chainId !== previousChainId && !!previousChainId && isSupportedChain(chainId)) {
...@@ -117,6 +139,7 @@ export function useSyncWidgetInputs({ ...@@ -117,6 +139,7 @@ export function useSyncWidgetInputs({
if (missingDefaultToken(update)) { if (missingDefaultToken(update)) {
onDefaultTokenChange?.(update[Field.OUTPUT] ?? selectingToken) onDefaultTokenChange?.(update[Field.OUTPUT] ?? selectingToken)
return
} }
setTokens(update) setTokens(update)
}, },
......
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