Commit 9c4f63f4 authored by Moody Salem's avatar Moody Salem Committed by GitHub

Match behavior query params (#785)

* Match the behavior of v1 interface for old query parameters in swap/send

* Handle matching input/output currencies better

* Another test
parent f2616756
import { ChainId, WETH } from '@uniswap/sdk'
import { createStore } from 'redux'
import { Field, setDefaultsFromURL } from './actions'
import reducer from './reducer'
describe('swap reducer', () => {
let store
beforeEach(() => {
store = createStore(reducer, {
[Field.OUTPUT]: { address: '' },
[Field.INPUT]: { address: '' },
typedValue: '',
independentField: Field.INPUT
})
})
describe('setDefaultsFromURL', () => {
test('ETH to DAI', () => {
store.dispatch(
setDefaultsFromURL({
chainId: ChainId.MAINNET,
queryString:
'?inputCurrency=ETH&outputCurrency=0x6b175474e89094c44da98b954eedeac495271d0f&exactAmount=20.5&exactField=outPUT'
})
)
expect(store.getState()).toEqual({
[Field.OUTPUT]: { address: '0x6B175474E89094C44Da98b954EedeAC495271d0F' },
[Field.INPUT]: { address: WETH[ChainId.MAINNET].address },
typedValue: '20.5',
independentField: Field.OUTPUT
})
})
test('output ETH only', () => {
store.dispatch(
setDefaultsFromURL({
chainId: ChainId.MAINNET,
queryString: '?outputCurrency=eth&exactAmount=20.5'
})
)
expect(store.getState()).toEqual({
[Field.OUTPUT]: { address: WETH[ChainId.MAINNET].address },
[Field.INPUT]: { address: '' },
typedValue: '20.5',
independentField: Field.INPUT
})
})
})
})
...@@ -26,30 +26,50 @@ const initialState: SwapState = { ...@@ -26,30 +26,50 @@ const initialState: SwapState = {
} }
} }
function parseTokenURL(input: any, chainId: number): string { function parseCurrencyFromURLParameter(urlParam: any, chainId: number): string {
if (typeof input !== 'string') return '' if (typeof urlParam === 'string') {
const valid = isAddress(input) const valid = isAddress(urlParam)
if (valid) return valid if (valid) return valid
if (input.toLowerCase() === 'eth') return WETH[chainId]?.address ?? '' if (urlParam.toLowerCase() === 'eth') return WETH[chainId]?.address ?? ''
return '' if (valid === false) return WETH[chainId]?.address ?? ''
}
return WETH[chainId]?.address
}
function parseTokenAmountURLParameter(urlParam: any): string {
return typeof urlParam === 'string' && !isNaN(parseFloat(urlParam)) ? urlParam : ''
}
function parseIndependentFieldURLParameter(urlParam: any): Field {
return typeof urlParam === 'string' && urlParam.toLowerCase() === 'output' ? Field.OUTPUT : Field.INPUT
} }
export default createReducer<SwapState>(initialState, builder => export default createReducer<SwapState>(initialState, builder =>
builder builder
.addCase(setDefaultsFromURL, (state, { payload: { queryString, chainId } }) => { .addCase(setDefaultsFromURL, (state, { payload: { queryString, chainId } }) => {
if (queryString && queryString.length > 1) { if (queryString && queryString.length > 1) {
const result = parse(queryString.substr(1), { parseArrays: false }) const parsedQs = parse(queryString.substr(1), { parseArrays: false })
const inToken = parseTokenURL(result.inputToken, chainId)
const outToken = parseTokenURL(result.outputToken, chainId) let inputCurrency = parseCurrencyFromURLParameter(parsedQs.inputCurrency, chainId)
let outputCurrency = parseCurrencyFromURLParameter(parsedQs.outputCurrency, chainId)
if (inputCurrency === outputCurrency) {
if (typeof parsedQs.inputCurrency === 'string') {
outputCurrency = ''
} else if (typeof parsedQs.outputCurrency === 'string') {
inputCurrency = ''
}
}
return { return {
[Field.INPUT]: { [Field.INPUT]: {
address: inToken address: inputCurrency
}, },
[Field.OUTPUT]: { [Field.OUTPUT]: {
address: inToken === outToken ? '' : outToken address: outputCurrency
}, },
typedValue: typeof result.amount === 'string' ? result.amount : '', typedValue: parseTokenAmountURLParameter(parsedQs.exactAmount),
independentField: result.exact === 'out' ? Field.OUTPUT : Field.INPUT independentField: parseIndependentFieldURLParameter(parsedQs.exactField)
} }
} }
......
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