Compare commits
254 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
361e0ca8d7 | ||
|
|
cc0a757ddd | ||
|
|
31632d3c5b | ||
|
|
9cfbec4b8b | ||
|
|
b5ac5d882f | ||
|
|
130606cab4 | ||
|
|
fa56919a06 | ||
|
|
633f65676e | ||
|
|
9bccb7ae3a | ||
|
|
8a2e4123c6 | ||
|
|
e93ddbedfa | ||
|
|
1667b56a04 | ||
|
|
6e995d6c09 | ||
|
|
f096112716 | ||
|
|
50c7d36164 | ||
|
|
8a7f1d51ce | ||
|
|
8f59f501cc | ||
|
|
197947835b | ||
|
|
94081b29a3 | ||
|
|
69183ed8c2 | ||
|
|
05e741b6c9 | ||
|
|
dfe550c43b | ||
|
|
65dfb40e44 | ||
|
|
25f5ed9983 | ||
|
|
9b1ef415c6 | ||
|
|
70f481430a | ||
|
|
942211eb00 | ||
|
|
6589c41800 | ||
|
|
14bac770b6 | ||
|
|
c9dbe2f0ac | ||
|
|
775cf57c30 | ||
|
|
f4935e9264 | ||
|
|
6b3914b7b9 | ||
|
|
41efb6f617 | ||
|
|
52df5f14cf | ||
|
|
b48a7c529f | ||
|
|
2eca50be93 | ||
|
|
be2ce18bfa | ||
|
|
fe13b29e5e | ||
|
|
02aac08489 | ||
|
|
8f29980b94 | ||
|
|
bb542ef0fb | ||
|
|
c2fe17615f | ||
|
|
a4cab75d09 | ||
|
|
882457cfef | ||
|
|
9a1bb5dbfb | ||
|
|
767cc85b3e | ||
|
|
47d726e544 | ||
|
|
32118520cd | ||
|
|
ada8a3af92 | ||
|
|
63694b32c0 | ||
|
|
c9ab94d799 | ||
|
|
a990c4af70 | ||
|
|
b5cc33c1f5 | ||
|
|
31da6cdb9d | ||
|
|
4079d8a517 | ||
|
|
e93fbfd31b | ||
|
|
7817846368 | ||
|
|
fc6a69a9af | ||
|
|
93a774092f | ||
|
|
55563e9bb2 | ||
|
|
f44aae2f53 | ||
|
|
7d674c33e7 | ||
|
|
79e6337629 | ||
|
|
3c8e8604b8 | ||
|
|
b763659788 | ||
|
|
1ac2581419 | ||
|
|
9f556680ed | ||
|
|
3f242f1b44 | ||
|
|
126688c753 | ||
|
|
374cc361a6 | ||
|
|
0198d0baa1 | ||
|
|
da2d7ba648 | ||
|
|
37cf492dd5 | ||
|
|
9e93f809a0 | ||
|
|
d9bd392e6d | ||
|
|
c48adc519f | ||
|
|
9f8983a92e | ||
|
|
c9d3d81768 | ||
|
|
c6f73c35ee | ||
|
|
7a2777b814 | ||
|
|
014595cdfb | ||
|
|
1b27d8dab0 | ||
|
|
c4d12c86a8 | ||
|
|
8d2feeb89e | ||
|
|
576b399768 | ||
|
|
eb8ce85872 | ||
|
|
1644e4f9c6 | ||
|
|
574fab54d1 | ||
|
|
8e581c19ff | ||
|
|
8c2fa89e9e | ||
|
|
0ae7452eca | ||
|
|
4589beb789 | ||
|
|
55aee86971 | ||
|
|
a457af91b6 | ||
|
|
e61b5da3c5 | ||
|
|
b4f44744c1 | ||
|
|
27f4e2e750 | ||
|
|
01159c53d5 | ||
|
|
8d8d63b873 | ||
|
|
da9db4b5f1 | ||
|
|
1724bee0f5 | ||
|
|
48e526554b | ||
|
|
53add345de | ||
|
|
e28faf0da2 | ||
|
|
f79dc5fe82 | ||
|
|
a6f29cbff8 | ||
|
|
68f0d4b725 | ||
|
|
111e7dc929 | ||
|
|
39d61e4913 | ||
|
|
3e6d3ec1b5 | ||
|
|
3f65530bf4 | ||
|
|
dba0d20781 | ||
|
|
a0f3bd0dc6 | ||
|
|
bef85abfd4 | ||
|
|
9934dba805 | ||
|
|
72d94b2831 | ||
|
|
138697a30a | ||
|
|
0add8ae177 | ||
|
|
13f7859aaa | ||
|
|
3337b5de22 | ||
|
|
55ea6616a4 | ||
|
|
5dd1249ddd | ||
|
|
4ab2bd3474 | ||
|
|
9eb20624cb | ||
|
|
25c5cf04e6 | ||
|
|
1f70e63cd0 | ||
|
|
df88b0ddd1 | ||
|
|
679759c3a0 | ||
|
|
9b6003bdc5 | ||
|
|
2b32824c26 | ||
|
|
a4e4cf8ab9 | ||
|
|
f08cea1820 | ||
|
|
e2d35c56fc | ||
|
|
5f20040107 | ||
|
|
9344abd1cf | ||
|
|
426e31230d | ||
|
|
06c48559c5 | ||
|
|
0a33ed1a50 | ||
|
|
d5c490b871 | ||
|
|
099c2adea3 | ||
|
|
d387538576 | ||
|
|
a3a7d01ce9 | ||
|
|
549e67bcea | ||
|
|
932992b57f | ||
|
|
76a24376d4 | ||
|
|
f873b2249f | ||
|
|
22452c03b0 | ||
|
|
14e045b999 | ||
|
|
948781f927 | ||
|
|
2f72d6b77e | ||
|
|
a78209690d | ||
|
|
98a2f51125 | ||
|
|
a1043573af | ||
|
|
63760faa9d | ||
|
|
0566ec28be | ||
|
|
d4c1baba57 | ||
|
|
7e41b27cd3 | ||
|
|
1d18a5159f | ||
|
|
bb87d2dd03 | ||
|
|
0b27528a6a | ||
|
|
5788a273ba | ||
|
|
4d322b17da | ||
|
|
cb5b80b558 | ||
|
|
6964b519bc | ||
|
|
ee4ea2a1f0 | ||
|
|
3763ad15e0 | ||
|
|
557042a88f | ||
|
|
860413dd52 | ||
|
|
18d4cdcce4 | ||
|
|
55767de484 | ||
|
|
60d5cef69b | ||
|
|
ad2833a3ed | ||
|
|
e4a105714a | ||
|
|
3e842d3259 | ||
|
|
e9d18acd41 | ||
|
|
abeba3d6b6 | ||
|
|
84c4219c02 | ||
|
|
50b81c8334 | ||
|
|
8986b63335 | ||
|
|
631b4c08b6 | ||
|
|
b92f0b8d90 | ||
|
|
ce926e91b7 | ||
|
|
4857281a1e | ||
|
|
d2a872e7d2 | ||
|
|
73042f20fd | ||
|
|
29b5e583c5 | ||
|
|
d67f3158bd | ||
|
|
817732d62e | ||
|
|
562a54a175 | ||
|
|
cd1e0cf378 | ||
|
|
0c81b08d66 | ||
|
|
2662f8afbc | ||
|
|
355012eec9 | ||
|
|
68518d7ce0 | ||
|
|
2c9c99b868 | ||
|
|
7b78dfa2c4 | ||
|
|
e6cbab3c72 | ||
|
|
144f86bdfd | ||
|
|
6703743aef | ||
|
|
0320083909 | ||
|
|
b96f7d27ca | ||
|
|
45e85bc857 | ||
|
|
24e1a01b1a | ||
|
|
0e7a94313c | ||
|
|
35e80fa3ed | ||
|
|
4a70d8eb28 | ||
|
|
706d8724c1 | ||
|
|
6e363c1ff1 | ||
|
|
27007708ec | ||
|
|
c4739ea963 | ||
|
|
50954eff0f | ||
|
|
af112765e4 | ||
|
|
52b71004d0 | ||
|
|
2ba7c857cd | ||
|
|
67f3b40671 | ||
|
|
c2acf5c1a8 | ||
|
|
51cf8aa0da | ||
|
|
bc0e578610 | ||
|
|
1b13cac0fb | ||
|
|
14ed4dbb2e | ||
|
|
dc140901b3 | ||
|
|
07a92ba63b | ||
|
|
3f2f46df43 | ||
|
|
2dc5c0d386 | ||
|
|
38de86f4c9 | ||
|
|
b2196e7e48 | ||
|
|
30f66f7062 | ||
|
|
b87430277a | ||
|
|
b4c59cfc6e | ||
|
|
2326dfa108 | ||
|
|
97bf36efbf | ||
|
|
264acaae48 | ||
|
|
63e9f6e4d2 | ||
|
|
02d80e07dc | ||
|
|
ad53da5efe | ||
|
|
29223ce34f | ||
|
|
b88919ed69 | ||
|
|
ab80910553 | ||
|
|
1cdb8aa6a4 | ||
|
|
88976d0294 | ||
|
|
b908c81e2b | ||
|
|
5c20d0adb7 | ||
|
|
ca6295fcb7 | ||
|
|
e8af59198d | ||
|
|
cd4c43b482 | ||
|
|
c1e07f3713 | ||
|
|
bccda20473 | ||
|
|
bed8dd5110 | ||
|
|
6bcbabec23 | ||
|
|
71a490f2aa | ||
|
|
abcf1f5a5c | ||
|
|
65e5e9c98e | ||
|
|
fdabb90f0e |
2
.env
2
.env
@@ -1,4 +1,2 @@
|
|||||||
REACT_APP_INFURA_KEY="4bf032f2d38a4ed6bb975b80d6340847"
|
REACT_APP_INFURA_KEY="4bf032f2d38a4ed6bb975b80d6340847"
|
||||||
REACT_APP_WALLETCONNECT_BRIDGE_URL="https://uniswap.bridge.walletconnect.org"
|
REACT_APP_WALLETCONNECT_BRIDGE_URL="https://uniswap.bridge.walletconnect.org"
|
||||||
# Because we use storybook which has its own babel-loader dependency @ 8.2.2, where react-scripts uses 8.1.0
|
|
||||||
SKIP_PREFLIGHT_CHECK=true
|
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
"@typescript-eslint/ban-ts-comment": "off",
|
"@typescript-eslint/ban-ts-comment": "off",
|
||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/explicit-module-boundary-types": "off"
|
"@typescript-eslint/explicit-module-boundary-types": "off",
|
||||||
|
"react/react-in-jsx-scope": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
.github/workflows/crowdin-sync.yaml
vendored
2
.github/workflows/crowdin-sync.yaml
vendored
@@ -52,6 +52,6 @@ jobs:
|
|||||||
translation: 'src/locales/%locale%.po'
|
translation: 'src/locales/%locale%.po'
|
||||||
create_pull_request: false
|
create_pull_request: false
|
||||||
localization_branch_name: main
|
localization_branch_name: main
|
||||||
commit_message: "chore(i18n): synchronize translations from crowdin"
|
commit_message: "chore(i18n): synchronize translations from crowdin [skip ci]"
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
1
.github/workflows/integration-tests.yaml
vendored
1
.github/workflows/integration-tests.yaml
vendored
@@ -46,5 +46,6 @@ jobs:
|
|||||||
- run: yarn integration-test
|
- run: yarn integration-test
|
||||||
env:
|
env:
|
||||||
CYPRESS_INTEGRATION_TEST_PRIVATE_KEY: ${{ secrets.CYPRESS_INTEGRATION_TEST_PRIVATE_KEY }}
|
CYPRESS_INTEGRATION_TEST_PRIVATE_KEY: ${{ secrets.CYPRESS_INTEGRATION_TEST_PRIVATE_KEY }}
|
||||||
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -7,6 +7,7 @@
|
|||||||
/src/locales/**/*.ts
|
/src/locales/**/*.ts
|
||||||
/src/locales/**/*.json
|
/src/locales/**/*.json
|
||||||
/src/locales/**/en-US.po
|
/src/locales/**/en-US.po
|
||||||
|
/src/state/data/generated.ts
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
/node_modules
|
||||||
@@ -39,4 +40,4 @@ package-lock.json
|
|||||||
|
|
||||||
cypress/videos
|
cypress/videos
|
||||||
cypress/screenshots
|
cypress/screenshots
|
||||||
cypress/fixtures/example.json
|
cypress/fixtures/example.json
|
||||||
|
|||||||
1
.prettierignore
Normal file
1
.prettierignore
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/src/state/data/generated.ts
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
const { dirname, join, parse, resolve } = require('path')
|
|
||||||
const { existsSync } = require('fs')
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
stories: ['../src/**/*.stories.@(ts|tsx)'],
|
|
||||||
addons: ['@storybook/addon-links', '@storybook/addon-essentials', '@storybook/preset-create-react-app'],
|
|
||||||
typescript: {
|
|
||||||
check: true,
|
|
||||||
checkOptions: {},
|
|
||||||
reactDocgen: 'react-docgen-typescript',
|
|
||||||
reactDocgenTypescriptOptions: {
|
|
||||||
shouldExtractLiteralValuesFromEnum: true,
|
|
||||||
propFilter: (prop) => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
import { addons } from '@storybook/addons'
|
|
||||||
import { light } from './theme'
|
|
||||||
|
|
||||||
addons.setConfig({ theme: light })
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
import '../src/index.css'
|
|
||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import { createWeb3ReactRoot, Web3ReactProvider } from '@web3-react/core'
|
|
||||||
import React from 'react'
|
|
||||||
import { Provider as StoreProvider } from 'react-redux'
|
|
||||||
import { ThemeProvider as SCThemeProvider } from 'styled-components'
|
|
||||||
import { NetworkContextName } from '../src/constants/misc'
|
|
||||||
import store from '../src/state'
|
|
||||||
import { theme, ThemedGlobalStyle } from '../src/theme'
|
|
||||||
import getLibrary from '../src/utils/getLibrary'
|
|
||||||
import * as storybookThemes from './theme'
|
|
||||||
|
|
||||||
export const parameters = {
|
|
||||||
actions: { argTypesRegex: '^on[A-Z].*' },
|
|
||||||
dependencies: {
|
|
||||||
withStoriesOnly: true,
|
|
||||||
hideEmpty: true,
|
|
||||||
},
|
|
||||||
docs: {
|
|
||||||
theme: storybookThemes.light,
|
|
||||||
},
|
|
||||||
viewport: {
|
|
||||||
viewports: {
|
|
||||||
mobile: {
|
|
||||||
name: 'iPhone X',
|
|
||||||
styles: {
|
|
||||||
width: '375px',
|
|
||||||
height: '812px',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
tablet: {
|
|
||||||
name: 'iPad',
|
|
||||||
styles: {
|
|
||||||
width: '768px',
|
|
||||||
height: '1024px',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
laptop: {
|
|
||||||
name: 'Laptop',
|
|
||||||
styles: {
|
|
||||||
width: '1024px',
|
|
||||||
height: '768px',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
desktop: {
|
|
||||||
name: 'Desktop',
|
|
||||||
styles: {
|
|
||||||
width: '1440px',
|
|
||||||
height: '1024px',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export const globalTypes = {
|
|
||||||
theme: {
|
|
||||||
name: 'Theme',
|
|
||||||
description: 'Global theme for components',
|
|
||||||
defaultValue: 'light',
|
|
||||||
toolbar: {
|
|
||||||
icon: 'circlehollow',
|
|
||||||
items: ['light', 'dark'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
const Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName)
|
|
||||||
|
|
||||||
const withProviders = (Component: Story, context: Record<string, any>) => {
|
|
||||||
const THEME = theme(context.globals.theme === 'dark')
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Web3ReactProvider getLibrary={getLibrary}>
|
|
||||||
<Web3ProviderNetwork getLibrary={getLibrary}>
|
|
||||||
<StoreProvider store={store}>
|
|
||||||
<SCThemeProvider theme={THEME}>
|
|
||||||
<ThemedGlobalStyle />
|
|
||||||
<main>
|
|
||||||
<Component />
|
|
||||||
</main>
|
|
||||||
</SCThemeProvider>
|
|
||||||
</StoreProvider>
|
|
||||||
</Web3ProviderNetwork>
|
|
||||||
</Web3ReactProvider>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const decorators = [withProviders]
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import { create } from '@storybook/theming'
|
|
||||||
|
|
||||||
// this themes the storybook UI
|
|
||||||
const uniswapBaseTheme = {
|
|
||||||
brandTitle: 'Uniswap Design',
|
|
||||||
brandUrl: 'https://uniswap.org',
|
|
||||||
brandImage: 'https://ipfs.io/ipfs/QmNa8mQkrNKp1WEEeGjFezDmDeodkWRevGFN8JCV7b4Xir',
|
|
||||||
}
|
|
||||||
export const light = create({
|
|
||||||
base: 'light',
|
|
||||||
...uniswapBaseTheme,
|
|
||||||
})
|
|
||||||
|
|
||||||
// export const dark = create({
|
|
||||||
// base: 'dark',
|
|
||||||
// ...uniswapBaseTheme,
|
|
||||||
// })
|
|
||||||
@@ -6,6 +6,12 @@
|
|||||||
yarn install
|
yarn install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Generate locale files
|
||||||
|
|
||||||
|
```
|
||||||
|
yarn i18n:extract
|
||||||
|
```
|
||||||
|
|
||||||
## Run the interface
|
## Run the interface
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ or visit [app.uniswap.org](https://app.uniswap.org).
|
|||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
|
|
||||||
See [CONTRIBUTING](./CONTRIBUTING.md).
|
For steps on local deployment, development, and code contribution, please see [CONTRIBUTING](./CONTRIBUTING.md).
|
||||||
|
|
||||||
## Accessing Uniswap V2
|
## Accessing Uniswap V2
|
||||||
|
|
||||||
|
|||||||
10
codegen.yml
Normal file
10
codegen.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
schema: 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3'
|
||||||
|
documents: 'src/**/!(*.d).{ts,tsx}'
|
||||||
|
generates:
|
||||||
|
./src/state/data/generated.ts:
|
||||||
|
plugins:
|
||||||
|
- typescript
|
||||||
|
- typescript-operations
|
||||||
|
- typescript-rtk-query:
|
||||||
|
importBaseApiFrom: './slice'
|
||||||
|
exportHooks: true
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"projectId": "yp82ef",
|
||||||
"baseUrl": "http://localhost:3000",
|
"baseUrl": "http://localhost:3000",
|
||||||
"pluginsFile": false,
|
"pluginsFile": false,
|
||||||
"fixturesFolder": false,
|
"fixturesFolder": false,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ describe('Landing Page', () => {
|
|||||||
beforeEach(() => cy.visit('/'))
|
beforeEach(() => cy.visit('/'))
|
||||||
it('loads swap page', () => {
|
it('loads swap page', () => {
|
||||||
cy.get('#swap-page')
|
cy.get('#swap-page')
|
||||||
|
cy.screenshot()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('redirects to url /swap', () => {
|
it('redirects to url /swap', () => {
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ import { JsonRpcProvider } from '@ethersproject/providers'
|
|||||||
import { Wallet } from '@ethersproject/wallet'
|
import { Wallet } from '@ethersproject/wallet'
|
||||||
import { Eip1193Bridge } from '@ethersproject/experimental/lib/eip1193-bridge'
|
import { Eip1193Bridge } from '@ethersproject/experimental/lib/eip1193-bridge'
|
||||||
|
|
||||||
const TEST_PRIVATE_KEY = Cypress.env('INTEGRATION_TEST_PRIVATE_KEY')
|
// todo: figure out how env vars actually work in CI
|
||||||
|
// const TEST_PRIVATE_KEY = Cypress.env('INTEGRATION_TEST_PRIVATE_KEY')
|
||||||
|
const TEST_PRIVATE_KEY = '0xe580410d7c37d26c6ad1a837bbae46bc27f9066a466fb3a66e770523b4666d19'
|
||||||
|
|
||||||
// address of the above key
|
// address of the above key
|
||||||
export const TEST_ADDRESS_NEVER_USE = new Wallet(TEST_PRIVATE_KEY).address
|
export const TEST_ADDRESS_NEVER_USE = new Wallet(TEST_PRIVATE_KEY).address
|
||||||
|
|||||||
29
package.json
29
package.json
@@ -5,6 +5,10 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@ethersproject/experimental": "^5.2.0",
|
"@ethersproject/experimental": "^5.2.0",
|
||||||
|
"@graphql-codegen/cli": "1.21.5",
|
||||||
|
"@graphql-codegen/typescript": "1.22.3",
|
||||||
|
"@graphql-codegen/typescript-operations": "^1.18.2",
|
||||||
|
"@graphql-codegen/typescript-rtk-query": "^1.1.1",
|
||||||
"@lingui/cli": "^3.9.0",
|
"@lingui/cli": "^3.9.0",
|
||||||
"@lingui/loader": "^3.9.0",
|
"@lingui/loader": "^3.9.0",
|
||||||
"@lingui/macro": "^3.9.0",
|
"@lingui/macro": "^3.9.0",
|
||||||
@@ -14,17 +18,8 @@
|
|||||||
"@reach/dialog": "^0.10.3",
|
"@reach/dialog": "^0.10.3",
|
||||||
"@reach/portal": "^0.10.3",
|
"@reach/portal": "^0.10.3",
|
||||||
"@react-hook/window-scroll": "^1.3.0",
|
"@react-hook/window-scroll": "^1.3.0",
|
||||||
"@reduxjs/toolkit": "^1.3.5",
|
"@reduxjs/toolkit": "^1.6.0",
|
||||||
"@storybook/addon-actions": "^6.1.17",
|
"@rtk-query/graphql-request-base-query": "^1.0.3",
|
||||||
"@storybook/addon-essentials": "^6.1.17",
|
|
||||||
"@storybook/addon-links": "^6.1.17",
|
|
||||||
"@storybook/addons": "^6.1.17",
|
|
||||||
"@storybook/components": "^6.1.17",
|
|
||||||
"@storybook/preset-create-react-app": "^3.1.5",
|
|
||||||
"@storybook/preset-typescript": "^3.0.0",
|
|
||||||
"@storybook/react": "^6.1.17",
|
|
||||||
"@storybook/theming": "^6.1.17",
|
|
||||||
"@styled-system/css": "^5.1.5",
|
|
||||||
"@typechain/ethers-v5": "^7.0.0",
|
"@typechain/ethers-v5": "^7.0.0",
|
||||||
"@types/jest": "^25.2.1",
|
"@types/jest": "^25.2.1",
|
||||||
"@types/lingui__core": "^2.7.1",
|
"@types/lingui__core": "^2.7.1",
|
||||||
@@ -76,6 +71,8 @@
|
|||||||
"eslint-plugin-react": "^7.19.0",
|
"eslint-plugin-react": "^7.19.0",
|
||||||
"eslint-plugin-react-hooks": "^4.0.0",
|
"eslint-plugin-react-hooks": "^4.0.0",
|
||||||
"ethers": "^5.2.0",
|
"ethers": "^5.2.0",
|
||||||
|
"graphql": "^15.5.0",
|
||||||
|
"graphql-request": "^3.4.0",
|
||||||
"inter-ui": "^3.13.1",
|
"inter-ui": "^3.13.1",
|
||||||
"lightweight-charts": "^3.3.0",
|
"lightweight-charts": "^3.3.0",
|
||||||
"lodash.flatmap": "^4.5.0",
|
"lodash.flatmap": "^4.5.0",
|
||||||
@@ -102,6 +99,7 @@
|
|||||||
"react-virtualized-auto-sizer": "^1.0.2",
|
"react-virtualized-auto-sizer": "^1.0.2",
|
||||||
"react-window": "^1.8.5",
|
"react-window": "^1.8.5",
|
||||||
"rebass": "^4.0.7",
|
"rebass": "^4.0.7",
|
||||||
|
"redux-devtools-extension": "^2.13.9",
|
||||||
"redux-localstorage-simple": "^2.3.1",
|
"redux-localstorage-simple": "^2.3.1",
|
||||||
"serve": "^11.3.2",
|
"serve": "^11.3.2",
|
||||||
"start-server-and-test": "^1.11.0",
|
"start-server-and-test": "^1.11.0",
|
||||||
@@ -125,14 +123,15 @@
|
|||||||
"compile-contract-types": "yarn compile-external-abi-types && yarn compile-v3-contract-types",
|
"compile-contract-types": "yarn compile-external-abi-types && yarn compile-v3-contract-types",
|
||||||
"compile-external-abi-types": "typechain --target ethers-v5 --out-dir src/abis/types './src/abis/**/*.json'",
|
"compile-external-abi-types": "typechain --target ethers-v5 --out-dir src/abis/types './src/abis/**/*.json'",
|
||||||
"compile-v3-contract-types": "typechain --target ethers-v5 --out-dir src/types/v3 './node_modules/@uniswap/?(v3-core|v3-periphery)/artifacts/contracts/**/*.json'",
|
"compile-v3-contract-types": "typechain --target ethers-v5 --out-dir src/types/v3 './node_modules/@uniswap/?(v3-core|v3-periphery)/artifacts/contracts/**/*.json'",
|
||||||
"build": "yarn compile-contract-types && yarn i18n:extract && yarn i18n:compile && react-scripts build",
|
"build": "yarn compile-contract-types && yarn graphql:generate && yarn i18n:extract && yarn i18n:compile && react-scripts build",
|
||||||
"i18n:extract": "lingui extract --locale en-US",
|
"i18n:extract": "lingui extract --locale en-US",
|
||||||
"i18n:compile": "lingui compile",
|
"i18n:compile": "lingui compile",
|
||||||
"integration-test": "start-server-and-test 'serve build -l 3000' http://localhost:3000 'cypress run'",
|
"integration-test": "start-server-and-test 'serve build -l 3000' http://localhost:3000 'cypress run --record'",
|
||||||
|
"graphql:generate": "graphql-codegen --config codegen.yml",
|
||||||
"postinstall": "yarn compile-contract-types",
|
"postinstall": "yarn compile-contract-types",
|
||||||
"start": "yarn compile-contract-types && react-scripts start",
|
"start": "yarn compile-contract-types && react-scripts start",
|
||||||
"storybook": "start-storybook -p 6006",
|
"test": "react-scripts test --env=jsdom",
|
||||||
"test": "react-scripts test --env=jsdom"
|
"prestart": "yarn graphql:generate && touch src/locales/en-US.po"
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": "react-app",
|
"extends": "react-app",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html translate="no">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<link rel="shortcut icon" type="image/png" href="%PUBLIC_URL%/favicon.png" />
|
<link rel="shortcut icon" type="image/png" href="%PUBLIC_URL%/favicon.png" />
|
||||||
@@ -24,6 +24,66 @@
|
|||||||
Learn how to configure a non-root public URL by running `npm run build`.
|
Learn how to configure a non-root public URL by running `npm run build`.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
font-family: 'Inter', sans-serif;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
@supports (font-variation-settings: normal) {
|
||||||
|
* {
|
||||||
|
font-family: 'Inter var', sans-serif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 16px;
|
||||||
|
font-variant: none;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||||
|
font-feature-settings: 'ss01' on, 'ss02' on, 'cv01' on, 'cv03' on;
|
||||||
|
}
|
||||||
|
|
||||||
|
#background-radial-gradient {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
width: 200vw;
|
||||||
|
height: 200vh;
|
||||||
|
background: radial-gradient(50% 50% at 50% 50%, #fc077d10 0%, rgba(255, 255, 255, 0) 100%);
|
||||||
|
transform: translate(-50vw, -100vh);
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
min-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
html {
|
||||||
|
background-color: #212429;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
html {
|
||||||
|
background-color: #F7F8FA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<title>Uniswap Interface</title>
|
<title>Uniswap Interface</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
181
src/assets/svg/arbitrum_logo.svg
Normal file
181
src/assets/svg/arbitrum_logo.svg
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 470.287 514.251" enable-background="new 0 0 470.287 514.251" xml:space="preserve">
|
||||||
|
<g id="Background">
|
||||||
|
</g>
|
||||||
|
<g id="Logos_and_symbols">
|
||||||
|
<g id="SYMBOL_VER_3">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_3_3_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_4">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_4_1_">
|
||||||
|
<g id="SYMBOL_VER_4_3_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_5_1_">
|
||||||
|
</g>
|
||||||
|
<g id="off_2_1_">
|
||||||
|
</g>
|
||||||
|
<g id="VER_3_1_">
|
||||||
|
<g id="SYMBOL_VER_2_1_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="VER_3">
|
||||||
|
<g id="SYMBOL_VER_2">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="off_2">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_5">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1_3_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1_2_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1_1_">
|
||||||
|
<g id="_x31_-3">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_14_">
|
||||||
|
<path fill="#2D374B" d="M291.134,237.469l35.654-60.5l96.103,149.684l0.046,28.727l-0.313-197.672
|
||||||
|
c-0.228-4.832-2.794-9.252-6.887-11.859L242.715,46.324c-4.045-1.99-9.18-1.967-13.22,0.063c-0.546,0.272-1.06,0.57-1.548,0.895
|
||||||
|
l-0.604,0.379L59.399,144.983l-0.651,0.296c-0.838,0.385-1.686,0.875-2.48,1.444c-3.185,2.283-5.299,5.66-5.983,9.448
|
||||||
|
c-0.103,0.574-0.179,1.158-0.214,1.749l0.264,161.083l89.515-138.745c11.271-18.397,35.825-24.323,58.62-24.001l26.753,0.706
|
||||||
|
L67.588,409.765l18.582,10.697L245.692,157.22l70.51-0.256L157.091,426.849l66.306,38.138l7.922,4.556
|
||||||
|
c3.351,1.362,7.302,1.431,10.681,0.21l175.453-101.678l-33.544,19.438L291.134,237.469z M304.736,433.395l-66.969-105.108
|
||||||
|
l40.881-69.371l87.952,138.628L304.736,433.395z"/>
|
||||||
|
<polygon fill="#28A0F0" points="237.768,328.286 304.736,433.395 366.601,397.543 278.648,258.915 "/>
|
||||||
|
<path fill="#28A0F0" d="M422.937,355.379l-0.046-28.727l-96.103-149.684l-35.654,60.5l92.774,150.043l33.544-19.438
|
||||||
|
c3.29-2.673,5.281-6.594,5.49-10.825L422.937,355.379z"/>
|
||||||
|
<path fill="#FFFFFF" d="M20.219,382.469l47.369,27.296l157.634-252.801l-26.753-0.706c-22.795-0.322-47.35,5.604-58.62,24.001
|
||||||
|
L50.334,319.004l-30.115,46.271V382.469z"/>
|
||||||
|
<polygon fill="#FFFFFF" points="316.202,156.964 245.692,157.22 86.17,420.462 141.928,452.565 157.091,426.849 "/>
|
||||||
|
<path fill="#96BEDC" d="M452.65,156.601c-0.59-14.746-8.574-28.245-21.08-36.104L256.28,19.692
|
||||||
|
c-12.371-6.229-27.825-6.237-40.218-0.004c-1.465,0.739-170.465,98.752-170.465,98.752c-2.339,1.122-4.592,2.458-6.711,3.975
|
||||||
|
c-11.164,8.001-17.969,20.435-18.668,34.095v208.765l30.115-46.271L50.07,157.921c0.035-0.589,0.109-1.169,0.214-1.741
|
||||||
|
c0.681-3.79,2.797-7.171,5.983-9.456c0.795-0.569,172.682-100.064,173.228-100.337c4.04-2.029,9.175-2.053,13.22-0.063
|
||||||
|
l173.022,99.523c4.093,2.607,6.659,7.027,6.887,11.859v199.542c-0.209,4.231-1.882,8.152-5.172,10.825l-33.544,19.438
|
||||||
|
l-17.308,10.031l-61.864,35.852l-62.737,36.357c-3.379,1.221-7.33,1.152-10.681-0.21l-74.228-42.693l-15.163,25.717
|
||||||
|
l66.706,38.406c2.206,1.255,4.171,2.367,5.784,3.272c2.497,1.4,4.199,2.337,4.8,2.629c4.741,2.303,11.563,3.643,17.71,3.643
|
||||||
|
c5.636,0,11.132-1.035,16.332-3.072l182.225-105.531c10.459-8.104,16.612-20.325,17.166-33.564V156.601z"/>
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_13_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_6_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_4_">
|
||||||
|
</g>
|
||||||
|
<g id="One_color_version_-_White_3_">
|
||||||
|
<g id="Symbol_-_Original_15_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="One_color_version_-_White">
|
||||||
|
<g id="Symbol_-_Original">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Monochromatic_3_">
|
||||||
|
<g id="_x33__7_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Monochromatic">
|
||||||
|
<g id="_x33__3_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="_x33__2_">
|
||||||
|
</g>
|
||||||
|
<g id="_x33__1_">
|
||||||
|
</g>
|
||||||
|
<g id="_x33_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_10_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_1_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_2_">
|
||||||
|
</g>
|
||||||
|
<g id="_x34__1_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Monochromatic_2_">
|
||||||
|
<g id="_x33__6_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="One_color_version_-_White_2_">
|
||||||
|
<g id="Symbol_-_Original_11_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_5_">
|
||||||
|
<g id="Symbol_-_Original_12_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="One_color_version_-_White_1_">
|
||||||
|
<g id="Symbol_-_Original_9_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1_2_">
|
||||||
|
<g id="SYMBOL_VER_2_4_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2-1-1_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2-2-1_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2-3-1_4_">
|
||||||
|
</g>
|
||||||
|
<g id="New_Symbol_1_">
|
||||||
|
<g id="SYMBOL_VER_2-3-1_3_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="New_Symbol">
|
||||||
|
<g id="SYMBOL_VER_2-3-1_1_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2_2_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_4_2_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_3_2_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_3_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1-1_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1-1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1-1_2_2_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1-1_2">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_1-1-1_2_1_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_7_">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Original_8_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2-1-1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2-2-1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_2-3-1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_5-1_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_5-1">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_5-2_1_">
|
||||||
|
</g>
|
||||||
|
<g id="SYMBOL_VER_5-2">
|
||||||
|
</g>
|
||||||
|
<g id="Symbol_-_Monochromatic_1_">
|
||||||
|
<g id="_x33__4_">
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.3 KiB |
14
src/assets/svg/arbitrum_mask.svg
Normal file
14
src/assets/svg/arbitrum_mask.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 250 KiB |
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { CheckCircle, Triangle } from 'react-feather'
|
import { CheckCircle, Triangle } from 'react-feather'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useCallback, useContext } from 'react'
|
import { useCallback, useContext } from 'react'
|
||||||
import styled, { ThemeContext } from 'styled-components'
|
import styled, { ThemeContext } from 'styled-components'
|
||||||
import { SUPPORTED_WALLETS } from '../../constants/wallet'
|
import { SUPPORTED_WALLETS } from '../../constants/wallet'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
@@ -366,7 +366,7 @@ export default function AccountDetails({
|
|||||||
>
|
>
|
||||||
<LinkIcon size={16} />
|
<LinkIcon size={16} />
|
||||||
<span style={{ marginLeft: '4px' }}>
|
<span style={{ marginLeft: '4px' }}>
|
||||||
<Trans>View on Etherscan</Trans>
|
<Trans>View on Explorer</Trans>
|
||||||
</span>
|
</span>
|
||||||
</AddressLink>
|
</AddressLink>
|
||||||
)}
|
)}
|
||||||
@@ -392,7 +392,7 @@ export default function AccountDetails({
|
|||||||
>
|
>
|
||||||
<LinkIcon size={16} />
|
<LinkIcon size={16} />
|
||||||
<span style={{ marginLeft: '4px' }}>
|
<span style={{ marginLeft: '4px' }}>
|
||||||
<Trans>View on Etherscan</Trans>
|
<Trans>View on Explorer</Trans>
|
||||||
</span>
|
</span>
|
||||||
</AddressLink>
|
</AddressLink>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import React, { useContext, useCallback } from 'react'
|
import { t, Trans } from '@lingui/macro'
|
||||||
|
import { useContext, useCallback, ReactNode } from 'react'
|
||||||
import styled, { ThemeContext } from 'styled-components'
|
import styled, { ThemeContext } from 'styled-components'
|
||||||
import useENS from '../../hooks/useENS'
|
import useENS from '../../hooks/useENS'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
@@ -40,7 +41,7 @@ const Input = styled.input<{ error?: boolean }>`
|
|||||||
width: 0;
|
width: 0;
|
||||||
background-color: ${({ theme }) => theme.bg1};
|
background-color: ${({ theme }) => theme.bg1};
|
||||||
transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};
|
transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};
|
||||||
color: ${({ error, theme }) => (error ? theme.red1 : theme.primary1)};
|
color: ${({ error, theme }) => (error ? theme.red1 : theme.text1)};
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
@@ -67,10 +68,16 @@ const Input = styled.input<{ error?: boolean }>`
|
|||||||
|
|
||||||
export default function AddressInputPanel({
|
export default function AddressInputPanel({
|
||||||
id,
|
id,
|
||||||
|
className = 'recipient-address-input',
|
||||||
|
label,
|
||||||
|
placeholder,
|
||||||
value,
|
value,
|
||||||
onChange,
|
onChange,
|
||||||
}: {
|
}: {
|
||||||
id?: string
|
id?: string
|
||||||
|
className?: string
|
||||||
|
label?: ReactNode
|
||||||
|
placeholder?: string
|
||||||
// the typed string value
|
// the typed string value
|
||||||
value: string
|
value: string
|
||||||
// triggers whenever the typed value changes
|
// triggers whenever the typed value changes
|
||||||
@@ -99,25 +106,25 @@ export default function AddressInputPanel({
|
|||||||
<AutoColumn gap="md">
|
<AutoColumn gap="md">
|
||||||
<RowBetween>
|
<RowBetween>
|
||||||
<TYPE.black color={theme.text2} fontWeight={500} fontSize={14}>
|
<TYPE.black color={theme.text2} fontWeight={500} fontSize={14}>
|
||||||
Recipient
|
{label ?? <Trans>Recipient</Trans>}
|
||||||
</TYPE.black>
|
</TYPE.black>
|
||||||
{address && chainId && (
|
{address && chainId && (
|
||||||
<ExternalLink
|
<ExternalLink
|
||||||
href={getExplorerLink(chainId, name ?? address, ExplorerDataType.ADDRESS)}
|
href={getExplorerLink(chainId, name ?? address, ExplorerDataType.ADDRESS)}
|
||||||
style={{ fontSize: '14px' }}
|
style={{ fontSize: '14px' }}
|
||||||
>
|
>
|
||||||
(View on Etherscan)
|
<Trans>(View on Explorer)</Trans>
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
)}
|
)}
|
||||||
</RowBetween>
|
</RowBetween>
|
||||||
<Input
|
<Input
|
||||||
className="recipient-address-input"
|
className={className}
|
||||||
type="text"
|
type="text"
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
autoCorrect="off"
|
autoCorrect="off"
|
||||||
autoCapitalize="off"
|
autoCapitalize="off"
|
||||||
spellCheck="false"
|
spellCheck="false"
|
||||||
placeholder="Wallet Address or ENS name"
|
placeholder={placeholder ?? t`Wallet Address or ENS name`}
|
||||||
error={error}
|
error={error}
|
||||||
pattern="^(0x[a-fA-F0-9]{40})$"
|
pattern="^(0x[a-fA-F0-9]{40})$"
|
||||||
onChange={handleInput}
|
onChange={handleInput}
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import React, { PropsWithChildren } from 'react'
|
|
||||||
import Component, { BadgeProps, BadgeVariant } from './index'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'Badge',
|
|
||||||
argTypes: {
|
|
||||||
variant: {
|
|
||||||
name: 'variant',
|
|
||||||
type: { name: 'string', require: false },
|
|
||||||
defaultValue: BadgeVariant.DEFAULT,
|
|
||||||
description: 'badge variant',
|
|
||||||
control: {
|
|
||||||
type: 'select',
|
|
||||||
options: Object.values(BadgeVariant),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
args: {
|
|
||||||
children: '🦄 UNISWAP 🦄',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
const Template: Story<PropsWithChildren<BadgeProps>> = (args) => <Component {...args}>{args.children}</Component>
|
|
||||||
|
|
||||||
export const DefaultBadge = Template.bind({})
|
|
||||||
DefaultBadge.args = {
|
|
||||||
variant: BadgeVariant.DEFAULT,
|
|
||||||
}
|
|
||||||
|
|
||||||
export const WarningBadge = Template.bind({})
|
|
||||||
WarningBadge.args = {
|
|
||||||
variant: BadgeVariant.WARNING,
|
|
||||||
}
|
|
||||||
|
|
||||||
export const NegativeBadge = Template.bind({})
|
|
||||||
NegativeBadge.args = {
|
|
||||||
variant: BadgeVariant.NEGATIVE,
|
|
||||||
}
|
|
||||||
|
|
||||||
export const PositiveBadge = Template.bind({})
|
|
||||||
PositiveBadge.args = {
|
|
||||||
variant: BadgeVariant.POSITIVE,
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
|
|
||||||
import Badge, { BadgeVariant } from 'components/Badge'
|
import Badge, { BadgeVariant } from 'components/Badge'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { ReactNode, useMemo } from 'react'
|
import { ReactNode, useMemo } from 'react'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
|
|
||||||
|
|||||||
@@ -1,153 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import styled from 'styled-components/macro'
|
|
||||||
import React from 'react'
|
|
||||||
import {
|
|
||||||
ButtonConfirmed,
|
|
||||||
ButtonDropdown,
|
|
||||||
ButtonDropdownGrey,
|
|
||||||
ButtonDropdownLight,
|
|
||||||
ButtonEmpty,
|
|
||||||
ButtonError,
|
|
||||||
ButtonGray,
|
|
||||||
ButtonLight,
|
|
||||||
ButtonOutlined,
|
|
||||||
ButtonPink,
|
|
||||||
ButtonPrimary,
|
|
||||||
ButtonRadio,
|
|
||||||
ButtonSecondary,
|
|
||||||
ButtonUNIGradient,
|
|
||||||
ButtonWhite,
|
|
||||||
} from './index'
|
|
||||||
|
|
||||||
const wrapperCss = styled.main`
|
|
||||||
font-size: 2em;
|
|
||||||
margin: 3em;
|
|
||||||
max-width: 300px;
|
|
||||||
`
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'Buttons',
|
|
||||||
argTypes: {
|
|
||||||
disabled: { control: { type: 'boolean' } },
|
|
||||||
onClick: { action: 'clicked' },
|
|
||||||
},
|
|
||||||
decorators: [
|
|
||||||
(Component: Story) => (
|
|
||||||
<div css={wrapperCss}>
|
|
||||||
<Component />
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
const Unicorn = () => (
|
|
||||||
<span role="img" aria-label="unicorn">
|
|
||||||
🦄
|
|
||||||
</span>
|
|
||||||
)
|
|
||||||
|
|
||||||
export const Radio = () => (
|
|
||||||
<ButtonRadio>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonRadio>
|
|
||||||
)
|
|
||||||
export const DropdownLight = () => (
|
|
||||||
<ButtonDropdownLight>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonDropdownLight>
|
|
||||||
)
|
|
||||||
export const DropdownGrey = () => (
|
|
||||||
<ButtonDropdownGrey>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonDropdownGrey>
|
|
||||||
)
|
|
||||||
export const Dropdown = () => (
|
|
||||||
<ButtonDropdown>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonDropdown>
|
|
||||||
)
|
|
||||||
export const Error = () => (
|
|
||||||
<ButtonError>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonError>
|
|
||||||
)
|
|
||||||
export const Confirmed = () => (
|
|
||||||
<ButtonConfirmed>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonConfirmed>
|
|
||||||
)
|
|
||||||
export const White = () => (
|
|
||||||
<ButtonWhite>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonWhite>
|
|
||||||
)
|
|
||||||
export const Empty = () => (
|
|
||||||
<ButtonEmpty>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonEmpty>
|
|
||||||
)
|
|
||||||
export const Outlined = () => (
|
|
||||||
<ButtonOutlined>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonOutlined>
|
|
||||||
)
|
|
||||||
export const UNIGradient = () => (
|
|
||||||
<ButtonUNIGradient>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonUNIGradient>
|
|
||||||
)
|
|
||||||
export const Pink = () => (
|
|
||||||
<ButtonPink>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonPink>
|
|
||||||
)
|
|
||||||
export const Secondary = () => (
|
|
||||||
<ButtonSecondary>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonSecondary>
|
|
||||||
)
|
|
||||||
export const Gray = () => (
|
|
||||||
<ButtonGray>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonGray>
|
|
||||||
)
|
|
||||||
export const Light = () => (
|
|
||||||
<ButtonLight>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonLight>
|
|
||||||
)
|
|
||||||
export const Primary = () => (
|
|
||||||
<ButtonPrimary>
|
|
||||||
<Unicorn />
|
|
||||||
UNISWAP
|
|
||||||
<Unicorn />
|
|
||||||
</ButtonPrimary>
|
|
||||||
)
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { darken } from 'polished'
|
import { darken } from 'polished'
|
||||||
|
|
||||||
@@ -72,14 +71,12 @@ export const ButtonPrimary = styled(Base)`
|
|||||||
}
|
}
|
||||||
&:disabled {
|
&:disabled {
|
||||||
background-color: ${({ theme, altDisabledStyle, disabled }) =>
|
background-color: ${({ theme, altDisabledStyle, disabled }) =>
|
||||||
altDisabledStyle ? (disabled ? theme.primary1 : theme.primary1) : theme.primary1};
|
altDisabledStyle ? (disabled ? theme.primary1 : theme.bg2) : theme.bg2};
|
||||||
color: white;
|
color: ${({ theme }) => theme.text2};
|
||||||
cursor: auto;
|
cursor: auto;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
outline: none;
|
outline: none;
|
||||||
opacity: 0.4;
|
|
||||||
opacity: ${({ altDisabledStyle }) => (altDisabledStyle ? '0.5' : '0.4')};
|
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import ReactConfetti from 'react-confetti'
|
import ReactConfetti from 'react-confetti'
|
||||||
import { useWindowSize } from '../../hooks/useWindowSize'
|
import { useWindowSize } from '../../hooks/useWindowSize'
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Currency, CurrencyAmount, Percent } from '@uniswap/sdk-core'
|
import { Currency, CurrencyAmount, Percent } from '@uniswap/sdk-core'
|
||||||
import React, { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
import useTheme from '../../hooks/useTheme'
|
import useTheme from '../../hooks/useTheme'
|
||||||
import { TYPE } from '../../theme'
|
import { TYPE } from '../../theme'
|
||||||
import { warningSeverity } from '../../utils/prices'
|
import { warningSeverity } from '../../utils/prices'
|
||||||
@@ -18,10 +18,10 @@ export function FiatValue({
|
|||||||
if (!priceImpact) return undefined
|
if (!priceImpact) return undefined
|
||||||
if (priceImpact.lessThan('0')) return theme.green1
|
if (priceImpact.lessThan('0')) return theme.green1
|
||||||
const severity = warningSeverity(priceImpact)
|
const severity = warningSeverity(priceImpact)
|
||||||
if (severity < 1) return theme.text4
|
if (severity < 1) return theme.text3
|
||||||
if (severity < 3) return theme.yellow1
|
if (severity < 3) return theme.yellow1
|
||||||
return theme.red1
|
return theme.red1
|
||||||
}, [priceImpact, theme.green1, theme.red1, theme.text4, theme.yellow1])
|
}, [priceImpact, theme.green1, theme.red1, theme.text3, theme.yellow1])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TYPE.body fontSize={14} color={fiatValue ? theme.text2 : theme.text4}>
|
<TYPE.body fontSize={14} color={fiatValue ? theme.text2 : theme.text4}>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Pair } from '@uniswap/v2-sdk'
|
import { Pair } from '@uniswap/v2-sdk'
|
||||||
import { Currency, CurrencyAmount, Percent, Token } from '@uniswap/sdk-core'
|
import { Currency, CurrencyAmount, Percent, Token } from '@uniswap/sdk-core'
|
||||||
import React, { useState, useCallback, ReactNode } from 'react'
|
import { useState, useCallback, ReactNode } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { darken } from 'polished'
|
import { darken } from 'polished'
|
||||||
import { useCurrencyBalance } from '../../state/wallet/hooks'
|
import { useCurrencyBalance } from '../../state/wallet/hooks'
|
||||||
@@ -130,7 +130,7 @@ const StyledBalanceMax = styled.button<{ disabled?: boolean }>`
|
|||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
color: ${({ theme }) => theme.primary1};
|
color: ${({ theme }) => theme.primaryText1};
|
||||||
opacity: ${({ disabled }) => (!disabled ? 1 : 0.4)};
|
opacity: ${({ disabled }) => (!disabled ? 1 : 0.4)};
|
||||||
pointer-events: ${({ disabled }) => (!disabled ? 'initial' : 'none')};
|
pointer-events: ${({ disabled }) => (!disabled ? 'initial' : 'none')};
|
||||||
margin-left: 0.25rem;
|
margin-left: 0.25rem;
|
||||||
@@ -160,6 +160,8 @@ interface CurrencyInputPanelProps {
|
|||||||
priceImpact?: Percent
|
priceImpact?: Percent
|
||||||
id: string
|
id: string
|
||||||
showCommonBases?: boolean
|
showCommonBases?: boolean
|
||||||
|
showCurrencyAmount?: boolean
|
||||||
|
disableNonToken?: boolean
|
||||||
renderBalance?: (amount: CurrencyAmount<Currency>) => ReactNode
|
renderBalance?: (amount: CurrencyAmount<Currency>) => ReactNode
|
||||||
locked?: boolean
|
locked?: boolean
|
||||||
}
|
}
|
||||||
@@ -174,6 +176,8 @@ export default function CurrencyInputPanel({
|
|||||||
otherCurrency,
|
otherCurrency,
|
||||||
id,
|
id,
|
||||||
showCommonBases,
|
showCommonBases,
|
||||||
|
showCurrencyAmount,
|
||||||
|
disableNonToken,
|
||||||
renderBalance,
|
renderBalance,
|
||||||
fiatValue,
|
fiatValue,
|
||||||
priceImpact,
|
priceImpact,
|
||||||
@@ -298,6 +302,8 @@ export default function CurrencyInputPanel({
|
|||||||
selectedCurrency={currency}
|
selectedCurrency={currency}
|
||||||
otherSelectedCurrency={otherCurrency}
|
otherSelectedCurrency={otherCurrency}
|
||||||
showCommonBases={showCommonBases}
|
showCommonBases={showCommonBases}
|
||||||
|
showCurrencyAmount={showCurrencyAmount}
|
||||||
|
disableNonToken={disableNonToken}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</InputPanel>
|
</InputPanel>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { WrappedTokenInfo } from '../../state/lists/wrappedTokenInfo'
|
|||||||
import Logo from '../Logo'
|
import Logo from '../Logo'
|
||||||
|
|
||||||
export const getTokenLogoURL = (address: string) =>
|
export const getTokenLogoURL = (address: string) =>
|
||||||
`https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/${address}/logo.png`
|
`https://raw.githubusercontent.com/uniswap/assets/master/blockchains/ethereum/assets/${address}/logo.png`
|
||||||
|
|
||||||
const StyledEthereumLogo = styled.img<{ size: string }>`
|
const StyledEthereumLogo = styled.img<{ size: string }>`
|
||||||
width: ${({ size }) => size};
|
width: ${({ size }) => size};
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import React from 'react'
|
|
||||||
import { DAI, WBTC } from '../../constants/tokens'
|
|
||||||
import Component, { DoubleCurrencyLogoProps } from './index'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'DoubleCurrencyLogo',
|
|
||||||
decorators: [],
|
|
||||||
}
|
|
||||||
|
|
||||||
const Template: Story<DoubleCurrencyLogoProps> = (args) => <Component {...args} />
|
|
||||||
|
|
||||||
export const DoubleCurrencyLogo = Template.bind({})
|
|
||||||
DoubleCurrencyLogo.args = {
|
|
||||||
currency0: DAI,
|
|
||||||
currency1: WBTC,
|
|
||||||
size: 220,
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Currency } from '@uniswap/sdk-core'
|
import { Currency } from '@uniswap/sdk-core'
|
||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import CurrencyLogo from '../CurrencyLogo'
|
import CurrencyLogo from '../CurrencyLogo'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import { FeeAmount } from '@uniswap/v3-sdk'
|
import { FeeAmount } from '@uniswap/v3-sdk'
|
||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import { AutoColumn } from 'components/Column'
|
import { AutoColumn } from 'components/Column'
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import JSBI from 'jsbi'
|
import JSBI from 'jsbi'
|
||||||
import React from 'react'
|
|
||||||
import { Currency, CurrencyAmount, Fraction } from '@uniswap/sdk-core'
|
import { Currency, CurrencyAmount, Fraction } from '@uniswap/sdk-core'
|
||||||
|
|
||||||
const CURRENCY_AMOUNT_MIN = new Fraction(JSBI.BigInt(1), JSBI.BigInt(1000000))
|
const CURRENCY_AMOUNT_MIN = new Fraction(JSBI.BigInt(1), JSBI.BigInt(1000000))
|
||||||
|
|||||||
219
src/components/Header/NetworkCard.tsx
Normal file
219
src/components/Header/NetworkCard.tsx
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
import { Trans } from '@lingui/macro'
|
||||||
|
import arbitrumLogoUrl from 'assets/svg/arbitrum_logo.svg'
|
||||||
|
import { YellowCard } from 'components/Card'
|
||||||
|
import { useOnClickOutside } from 'hooks/useOnClickOutside'
|
||||||
|
import { useActiveWeb3React } from 'hooks/web3'
|
||||||
|
import { transparentize } from 'polished'
|
||||||
|
import React, { useEffect, useRef, useState } from 'react'
|
||||||
|
import { ArrowDownCircle } from 'react-feather'
|
||||||
|
import { ApplicationModal } from 'state/application/actions'
|
||||||
|
import { useModalOpen, useToggleModal } from 'state/application/hooks'
|
||||||
|
import styled, { css } from 'styled-components'
|
||||||
|
import { ExternalLink } from 'theme'
|
||||||
|
import { switchToNetwork } from 'utils/switchToNetwork'
|
||||||
|
import { NETWORK_LABELS, SupportedChainId } from '../../constants/chains'
|
||||||
|
|
||||||
|
const BaseWrapper = css`
|
||||||
|
position: relative;
|
||||||
|
${({ theme }) => theme.mediaWidth.upToMedium`
|
||||||
|
margin-left: 12px;
|
||||||
|
`};
|
||||||
|
${({ theme }) => theme.mediaWidth.upToSmall`
|
||||||
|
margin: 0 0.5rem 0 0;
|
||||||
|
width: initial;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
flex-shrink: 1;
|
||||||
|
`};
|
||||||
|
`
|
||||||
|
const ArbitrumWrapper = styled.div`
|
||||||
|
${BaseWrapper}
|
||||||
|
`
|
||||||
|
const BaseMenuItem = css`
|
||||||
|
align-items: center;
|
||||||
|
background-color: ${({ theme }) => transparentize(0.9, theme.primary1)};
|
||||||
|
border-radius: 12px;
|
||||||
|
color: ${({ theme }) => theme.text2};
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
flex-direction: row;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 12px;
|
||||||
|
:hover {
|
||||||
|
color: ${({ theme }) => theme.text1};
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const DisabledMenuItem = styled.div`
|
||||||
|
${BaseMenuItem}
|
||||||
|
align-items: center;
|
||||||
|
background-color: ${({ theme }) => theme.bg2};
|
||||||
|
cursor: auto;
|
||||||
|
display: flex;
|
||||||
|
font-size: 10px;
|
||||||
|
font-style: italic;
|
||||||
|
justify-content: center;
|
||||||
|
:hover,
|
||||||
|
:active,
|
||||||
|
:focus {
|
||||||
|
color: ${({ theme }) => theme.text2};
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const FallbackWrapper = styled(YellowCard)`
|
||||||
|
${BaseWrapper}
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
`
|
||||||
|
const Icon = styled.img`
|
||||||
|
width: 17px;
|
||||||
|
`
|
||||||
|
const L1Tag = styled.div`
|
||||||
|
color: #c4d9f8;
|
||||||
|
opacity: 40%;
|
||||||
|
`
|
||||||
|
const L2Tag = styled.div`
|
||||||
|
background-color: ${({ theme }) => theme.primary1};
|
||||||
|
border-radius: 6px;
|
||||||
|
color: white;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 2px 6px;
|
||||||
|
`
|
||||||
|
const MenuFlyout = styled.span`
|
||||||
|
background-color: ${({ theme }) => theme.bg2};
|
||||||
|
box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),
|
||||||
|
0px 24px 32px rgba(0, 0, 0, 0.01);
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 8px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
font-size: 1rem;
|
||||||
|
position: absolute;
|
||||||
|
left: 0rem;
|
||||||
|
top: 3rem;
|
||||||
|
z-index: 100;
|
||||||
|
width: 237px;
|
||||||
|
${({ theme }) => theme.mediaWidth.upToMedium`
|
||||||
|
top: -14.25rem;
|
||||||
|
`};
|
||||||
|
> {
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
> :not(:first-child) {
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
> :not(:last-child) {
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const LinkOutCircle = styled(ArrowDownCircle)`
|
||||||
|
transform: rotate(230deg);
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
`
|
||||||
|
const MenuItem = styled(ExternalLink)`
|
||||||
|
${BaseMenuItem}
|
||||||
|
`
|
||||||
|
const ButtonMenuItem = styled.button`
|
||||||
|
${BaseMenuItem}
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
`
|
||||||
|
const NetworkInfo = styled.button`
|
||||||
|
align-items: center;
|
||||||
|
background-color: ${({ theme }) => theme.bg2};
|
||||||
|
border-radius: 8px;
|
||||||
|
border: none;
|
||||||
|
color: ${({ theme }) => theme.text1};
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
font-weight: 500;
|
||||||
|
height: 100%;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 0;
|
||||||
|
padding: 8px;
|
||||||
|
width: 172px;
|
||||||
|
|
||||||
|
:hover,
|
||||||
|
:focus {
|
||||||
|
cursor: pointer;
|
||||||
|
outline: none;
|
||||||
|
background-color: ${({ theme }) => theme.bg3};
|
||||||
|
}
|
||||||
|
`
|
||||||
|
export default function NetworkCard() {
|
||||||
|
const { chainId, library } = useActiveWeb3React()
|
||||||
|
const node = useRef<HTMLDivElement>(null)
|
||||||
|
const open = useModalOpen(ApplicationModal.ARBITRUM_OPTIONS)
|
||||||
|
const toggle = useToggleModal(ApplicationModal.ARBITRUM_OPTIONS)
|
||||||
|
useOnClickOutside(node, open ? toggle : undefined)
|
||||||
|
|
||||||
|
const [implements3085, setImplements3085] = useState(false)
|
||||||
|
useEffect(() => {
|
||||||
|
// metamask is currently the only known implementer of this EIP
|
||||||
|
// here we proceed w/ a noop feature check to ensure the user's version of metamask supports network switching
|
||||||
|
// if not, we hide the UI
|
||||||
|
if (!library?.provider?.request || !chainId || !library?.provider?.isMetaMask) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switchToNetwork({ library, chainId })
|
||||||
|
.then((x) => x ?? setImplements3085(true))
|
||||||
|
.catch(() => setImplements3085(false))
|
||||||
|
}, [library, chainId])
|
||||||
|
|
||||||
|
if (!chainId || chainId === SupportedChainId.MAINNET || !NETWORK_LABELS[chainId] || !library) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chainId === SupportedChainId.ARBITRUM_ONE) {
|
||||||
|
return (
|
||||||
|
<ArbitrumWrapper ref={node}>
|
||||||
|
<NetworkInfo onClick={toggle}>
|
||||||
|
<Icon src={arbitrumLogoUrl} />
|
||||||
|
<span>Arbitrum</span>
|
||||||
|
<L2Tag>L2 Alpha</L2Tag>
|
||||||
|
</NetworkInfo>
|
||||||
|
{open && (
|
||||||
|
<MenuFlyout>
|
||||||
|
<MenuItem href="https://bridge.arbitrum.io/">
|
||||||
|
<div>
|
||||||
|
<Trans>Arbitrum Token Bridge</Trans>
|
||||||
|
</div>
|
||||||
|
<LinkOutCircle />
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem href="https://explorer.arbitrum.io/">
|
||||||
|
<div>
|
||||||
|
<Trans>Arbitrum Explorer</Trans>
|
||||||
|
</div>
|
||||||
|
<LinkOutCircle />
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem href="https://offchainlabs.com/">
|
||||||
|
<div>
|
||||||
|
<Trans>Learn more</Trans>
|
||||||
|
</div>
|
||||||
|
<LinkOutCircle />
|
||||||
|
</MenuItem>
|
||||||
|
{implements3085 ? (
|
||||||
|
<ButtonMenuItem onClick={() => switchToNetwork({ library, chainId: SupportedChainId.MAINNET })}>
|
||||||
|
<div>
|
||||||
|
<Trans>Switch to Ethereum</Trans>
|
||||||
|
</div>
|
||||||
|
<L1Tag>L1</L1Tag>
|
||||||
|
</ButtonMenuItem>
|
||||||
|
) : (
|
||||||
|
<DisabledMenuItem>
|
||||||
|
<Trans>Change your network to go back to L1</Trans>
|
||||||
|
</DisabledMenuItem>
|
||||||
|
)}
|
||||||
|
</MenuFlyout>
|
||||||
|
)}
|
||||||
|
</ArbitrumWrapper>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return <FallbackWrapper title={NETWORK_LABELS[chainId]}>{NETWORK_LABELS[chainId]}</FallbackWrapper>
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import styled, { keyframes } from 'styled-components'
|
import styled, { keyframes } from 'styled-components'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ const StyledPolling = styled.div`
|
|||||||
`
|
`
|
||||||
const StyledPollingNumber = styled(TYPE.small)<{ breathe: boolean; hovering: boolean }>`
|
const StyledPollingNumber = styled(TYPE.small)<{ breathe: boolean; hovering: boolean }>`
|
||||||
transition: opacity 0.25s ease;
|
transition: opacity 0.25s ease;
|
||||||
opacity: ${({ breathe, hovering }) => (hovering ? 0.7 : breathe ? 1 : 0.2)};
|
opacity: ${({ breathe, hovering }) => (hovering ? 0.7 : breathe ? 1 : 0.5)};
|
||||||
:hover {
|
:hover {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
import { AlertTriangle, X } from 'react-feather'
|
import { AlertTriangle, X } from 'react-feather'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
|
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
|
||||||
import React, { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { X } from 'react-feather'
|
import { X } from 'react-feather'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import tokenLogo from '../../assets/images/token-logo.png'
|
import tokenLogo from '../../assets/images/token-logo.png'
|
||||||
|
|||||||
@@ -1,32 +1,28 @@
|
|||||||
import useScrollPosition from '@react-hook/window-scroll'
|
|
||||||
import React, { useState } from 'react'
|
|
||||||
import { Text } from 'rebass'
|
|
||||||
import { NavLink } from 'react-router-dom'
|
|
||||||
import { darken } from 'polished'
|
|
||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
|
import useScrollPosition from '@react-hook/window-scroll'
|
||||||
|
import { darken } from 'polished'
|
||||||
|
import { useState } from 'react'
|
||||||
import { Moon, Sun } from 'react-feather'
|
import { Moon, Sun } from 'react-feather'
|
||||||
|
import { NavLink } from 'react-router-dom'
|
||||||
|
import { Text } from 'rebass'
|
||||||
|
import { useShowClaimPopup, useToggleSelfClaimModal } from 'state/application/hooks'
|
||||||
|
import { useUserHasAvailableClaim } from 'state/claim/hooks'
|
||||||
|
import { useUserHasSubmittedClaim } from 'state/transactions/hooks'
|
||||||
|
import { useDarkModeManager } from 'state/user/hooks'
|
||||||
|
import { useETHBalances } from 'state/wallet/hooks'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
import Logo from '../../assets/svg/logo.svg'
|
import Logo from '../../assets/svg/logo.svg'
|
||||||
import LogoDark from '../../assets/svg/logo_white.svg'
|
import LogoDark from '../../assets/svg/logo_white.svg'
|
||||||
|
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
import { useDarkModeManager } from '../../state/user/hooks'
|
import { ExternalLink, TYPE } from '../../theme'
|
||||||
import { useETHBalances } from '../../state/wallet/hooks'
|
|
||||||
import { CardNoise } from '../earn/styled'
|
|
||||||
import { TYPE, ExternalLink } from '../../theme'
|
|
||||||
|
|
||||||
import { YellowCard } from '../Card'
|
|
||||||
import Menu from '../Menu'
|
|
||||||
|
|
||||||
import Row, { RowFixed } from '../Row'
|
|
||||||
import Web3Status from '../Web3Status'
|
|
||||||
import ClaimModal from '../claim/ClaimModal'
|
import ClaimModal from '../claim/ClaimModal'
|
||||||
import { useToggleSelfClaimModal, useShowClaimPopup } from '../../state/application/hooks'
|
import { CardNoise } from '../earn/styled'
|
||||||
import { useUserHasAvailableClaim } from '../../state/claim/hooks'
|
import Menu from '../Menu'
|
||||||
import { useUserHasSubmittedClaim } from '../../state/transactions/hooks'
|
|
||||||
import { Dots } from '../swap/styleds'
|
|
||||||
import Modal from '../Modal'
|
import Modal from '../Modal'
|
||||||
|
import Row, { RowFixed } from '../Row'
|
||||||
|
import { Dots } from '../swap/styleds'
|
||||||
|
import Web3Status from '../Web3Status'
|
||||||
|
import NetworkCard from './NetworkCard'
|
||||||
import UniBalanceContent from './UniBalanceContent'
|
import UniBalanceContent from './UniBalanceContent'
|
||||||
|
|
||||||
const HeaderFrame = styled.div<{ showBackground: boolean }>`
|
const HeaderFrame = styled.div<{ showBackground: boolean }>`
|
||||||
@@ -169,19 +165,6 @@ const HideSmall = styled.span`
|
|||||||
`};
|
`};
|
||||||
`
|
`
|
||||||
|
|
||||||
const NetworkCard = styled(YellowCard)`
|
|
||||||
border-radius: 12px;
|
|
||||||
padding: 8px 12px;
|
|
||||||
${({ theme }) => theme.mediaWidth.upToSmall`
|
|
||||||
margin: 0;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
width: initial;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
flex-shrink: 1;
|
|
||||||
`};
|
|
||||||
`
|
|
||||||
|
|
||||||
const BalanceText = styled(Text)`
|
const BalanceText = styled(Text)`
|
||||||
${({ theme }) => theme.mediaWidth.upToExtraSmall`
|
${({ theme }) => theme.mediaWidth.upToExtraSmall`
|
||||||
display: none;
|
display: none;
|
||||||
@@ -301,15 +284,8 @@ export const StyledMenuButton = styled.button`
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
const NETWORK_LABELS: { [chainId: number]: string } = {
|
|
||||||
[4]: 'Rinkeby',
|
|
||||||
[3]: 'Ropsten',
|
|
||||||
[5]: 'Görli',
|
|
||||||
[42]: 'Kovan',
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Header() {
|
export default function Header() {
|
||||||
const { account, chainId } = useActiveWeb3React()
|
const { account } = useActiveWeb3React()
|
||||||
|
|
||||||
const userEthBalance = useETHBalances(account ? [account] : [])?.[account ?? '']
|
const userEthBalance = useETHBalances(account ? [account] : [])?.[account ?? '']
|
||||||
// const [isDark] = useDarkModeManager()
|
// const [isDark] = useDarkModeManager()
|
||||||
@@ -367,9 +343,7 @@ export default function Header() {
|
|||||||
<HeaderControls>
|
<HeaderControls>
|
||||||
<HeaderElement>
|
<HeaderElement>
|
||||||
<HideSmall>
|
<HideSmall>
|
||||||
{chainId && NETWORK_LABELS[chainId] && (
|
<NetworkCard />
|
||||||
<NetworkCard title={NETWORK_LABELS[chainId]}>{NETWORK_LABELS[chainId]}</NetworkCard>
|
|
||||||
)}
|
|
||||||
</HideSmall>
|
</HideSmall>
|
||||||
{availableClaim && !showClaimPopup && (
|
{availableClaim && !showClaimPopup && (
|
||||||
<UNIWrapper onClick={toggleClaimModal}>
|
<UNIWrapper onClick={toggleClaimModal}>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import Tooltip from 'components/Tooltip'
|
import Tooltip from 'components/Tooltip'
|
||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
const TextWrapper = styled.span<{ margin: boolean; link?: boolean; fontSize?: string; adjustSize?: boolean }>`
|
const TextWrapper = styled.span<{ margin: boolean; link?: boolean; fontSize?: string; adjustSize?: boolean }>`
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useRef } from 'react'
|
import { useEffect, useRef } from 'react'
|
||||||
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useCallback, useEffect, ReactNode } from 'react'
|
import { useState, useCallback, useEffect, ReactNode } from 'react'
|
||||||
import { LightCard } from 'components/Card'
|
import { LightCard } from 'components/Card'
|
||||||
import { RowBetween } from 'components/Row'
|
import { RowBetween } from 'components/Row'
|
||||||
import { Input as NumericalInput } from '../NumericalInput'
|
import { Input as NumericalInput } from '../NumericalInput'
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import React from 'react'
|
|
||||||
// import Row, { RowFixed } from 'components/Row'
|
|
||||||
import styled from 'styled-components/macro'
|
|
||||||
import Component, { LineChartProps } from './'
|
|
||||||
import { dummyData } from './data'
|
|
||||||
// import { AutoColumn } from 'components/Column'
|
|
||||||
// import { TYPE } from 'theme'
|
|
||||||
// import DoubleCurrencyLogo from 'components/DoubleLogo'
|
|
||||||
// import { MKR } from 'constants'
|
|
||||||
// import { ETHER } from '@uniswap/sdk'
|
|
||||||
// import LineChart from '.'
|
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
|
||||||
margin: 1em 2em;
|
|
||||||
max-width: 500px;
|
|
||||||
& > * {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
`
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'Charts',
|
|
||||||
argTypes: {
|
|
||||||
disabled: { control: { type: 'boolean' } },
|
|
||||||
onClick: { action: 'clicked' },
|
|
||||||
},
|
|
||||||
decorators: [
|
|
||||||
(Component: Story) => (
|
|
||||||
<Wrapper>
|
|
||||||
<Component />
|
|
||||||
</Wrapper>
|
|
||||||
),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
const Template: Story<LineChartProps> = (args) => <Component {...args}>{args.children}</Component>
|
|
||||||
|
|
||||||
export const Basic = Template.bind({})
|
|
||||||
Basic.args = { data: dummyData }
|
|
||||||
|
|
||||||
// const Full = () => {
|
|
||||||
// const [value, setValue] = useState<number | undefined>(dummyData[dummyData.length - 1].value)
|
|
||||||
|
|
||||||
// const dummyUSDPrice = 410 // used for conversion
|
|
||||||
|
|
||||||
// const TopLeftContent = () => (
|
|
||||||
// <AutoColumn gap="md">
|
|
||||||
// <RowFixed align="center">
|
|
||||||
// <DoubleCurrencyLogo currency0={MKR} currency1={ETHER} size={20} />{' '}
|
|
||||||
// <TYPE.main fontSize="20px" color="white" ml="10px">
|
|
||||||
// ETH / MKR
|
|
||||||
// </TYPE.main>
|
|
||||||
// </RowFixed>
|
|
||||||
// <Row>
|
|
||||||
// <TYPE.main fontSize="20px" color="white">
|
|
||||||
// {value} MKR
|
|
||||||
// </TYPE.main>
|
|
||||||
// <TYPE.main color="#565A69" fontSize="20px" ml="10px">
|
|
||||||
// ($
|
|
||||||
// {value
|
|
||||||
// ? (value * dummyUSDPrice).toLocaleString('USD', {
|
|
||||||
// currency: 'USD',
|
|
||||||
// minimumFractionDigits: 2
|
|
||||||
// })
|
|
||||||
// : null}{' '}
|
|
||||||
// )
|
|
||||||
// </TYPE.main>
|
|
||||||
// </Row>
|
|
||||||
// </AutoColumn>
|
|
||||||
// )
|
|
||||||
|
|
||||||
// return (
|
|
||||||
// <Wrapper>
|
|
||||||
// <LineChart data={dummyData} setValue={setValue} topLeft={<TopLeftContent />} />
|
|
||||||
// </Wrapper>
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
|
|
||||||
// export const FullVersion = Template.bind(() => <LineChart data={dummyData} />)
|
|
||||||
// Full.args = { data: dummyData }
|
|
||||||
// Full.decorators = [
|
|
||||||
// (Story: any) => {
|
|
||||||
// return (
|
|
||||||
// <Wrapper>
|
|
||||||
// <LineChart data={dummyData} />
|
|
||||||
// </Wrapper>
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
// ]
|
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
|
|
||||||
import styled, { keyframes } from 'styled-components'
|
import styled, { keyframes } from 'styled-components'
|
||||||
|
|
||||||
const rotate = keyframes`
|
const rotate = keyframes`
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import { Slash } from 'react-feather'
|
import { Slash } from 'react-feather'
|
||||||
import { ImageProps } from 'rebass'
|
import { ImageProps } from 'rebass'
|
||||||
import useTheme from '../../hooks/useTheme'
|
import useTheme from '../../hooks/useTheme'
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
|
||||||
import Component from './index'
|
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
|
||||||
max-width: 150px;
|
|
||||||
`
|
|
||||||
export default {
|
|
||||||
title: 'Menu',
|
|
||||||
decorators: [
|
|
||||||
() => (
|
|
||||||
<Wrapper>
|
|
||||||
<Component />
|
|
||||||
</Wrapper>
|
|
||||||
),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
const Template: Story<any> = (args) => <Component {...args} />
|
|
||||||
|
|
||||||
export const Menu = Template.bind({})
|
|
||||||
Menu.args = {}
|
|
||||||
@@ -30,7 +30,7 @@ const StyledDialogContent = styled(({ minHeight, maxHeight, mobile, isOpen, ...r
|
|||||||
)).attrs({
|
)).attrs({
|
||||||
'aria-label': 'dialog',
|
'aria-label': 'dialog',
|
||||||
})`
|
})`
|
||||||
overflow-y: ${({ mobile }) => (mobile ? 'scroll' : 'hidden')};
|
overflow-y: auto;
|
||||||
|
|
||||||
&[data-reach-dialog-content] {
|
&[data-reach-dialog-content] {
|
||||||
margin: 0 0 2rem 0;
|
margin: 0 0 2rem 0;
|
||||||
@@ -39,7 +39,7 @@ const StyledDialogContent = styled(({ minHeight, maxHeight, mobile, isOpen, ...r
|
|||||||
box-shadow: 0 4px 8px 0 ${({ theme }) => transparentize(0.95, theme.shadow1)};
|
box-shadow: 0 4px 8px 0 ${({ theme }) => transparentize(0.95, theme.shadow1)};
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
width: 50vw;
|
width: 50vw;
|
||||||
overflow-y: ${({ mobile }) => (mobile ? 'scroll' : 'hidden')};
|
overflow-y: auto;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
|
||||||
align-self: ${({ mobile }) => (mobile ? 'flex-end' : 'center')};
|
align-self: ${({ mobile }) => (mobile ? 'flex-end' : 'center')};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useContext } from 'react'
|
import { useContext } from 'react'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ export function SubmittedView({
|
|||||||
style={{ marginLeft: '4px' }}
|
style={{ marginLeft: '4px' }}
|
||||||
>
|
>
|
||||||
<TYPE.subHeader>
|
<TYPE.subHeader>
|
||||||
<Trans>View transaction on Etherscan</Trans>
|
<Trans>View transaction on Explorer</Trans>
|
||||||
</TYPE.subHeader>
|
</TYPE.subHeader>
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { darken } from 'polished'
|
import { darken } from 'polished'
|
||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import { NavLink, Link as HistoryLink } from 'react-router-dom'
|
import { NavLink, Link as HistoryLink, useLocation } from 'react-router-dom'
|
||||||
import { Percent } from '@uniswap/sdk-core'
|
import { Percent } from '@uniswap/sdk-core'
|
||||||
|
|
||||||
import { ArrowLeft } from 'react-feather'
|
import { ArrowLeft } from 'react-feather'
|
||||||
import { RowBetween } from '../Row'
|
import Row, { RowBetween } from '../Row'
|
||||||
import SettingsTab from '../Settings'
|
import SettingsTab from '../Settings'
|
||||||
|
|
||||||
import { useAppDispatch } from 'state/hooks'
|
import { useAppDispatch } from 'state/hooks'
|
||||||
@@ -80,7 +79,7 @@ export function FindPoolTabs({ origin }: { origin: string }) {
|
|||||||
<StyledArrowLeft />
|
<StyledArrowLeft />
|
||||||
</HistoryLink>
|
</HistoryLink>
|
||||||
<ActiveText>
|
<ActiveText>
|
||||||
<Trans>Import Pool</Trans>
|
<Trans>Import V2 Pool</Trans>
|
||||||
</ActiveText>
|
</ActiveText>
|
||||||
</RowBetween>
|
</RowBetween>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
@@ -90,24 +89,29 @@ export function FindPoolTabs({ origin }: { origin: string }) {
|
|||||||
export function AddRemoveTabs({
|
export function AddRemoveTabs({
|
||||||
adding,
|
adding,
|
||||||
creating,
|
creating,
|
||||||
positionID,
|
|
||||||
defaultSlippage,
|
defaultSlippage,
|
||||||
|
positionID,
|
||||||
}: {
|
}: {
|
||||||
adding: boolean
|
adding: boolean
|
||||||
creating: boolean
|
creating: boolean
|
||||||
positionID?: string | undefined
|
|
||||||
defaultSlippage: Percent
|
defaultSlippage: Percent
|
||||||
|
positionID?: string | undefined
|
||||||
}) {
|
}) {
|
||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
|
|
||||||
// reset states on back
|
// reset states on back
|
||||||
const dispatch = useAppDispatch()
|
const dispatch = useAppDispatch()
|
||||||
|
const location = useLocation()
|
||||||
|
|
||||||
|
// detect if back should redirect to v3 or v2 pool page
|
||||||
|
const poolLink = location.pathname.includes('add/v2')
|
||||||
|
? '/pool/v2'
|
||||||
|
: '/pool' + (!!positionID ? `/${positionID.toString()}` : '')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Tabs>
|
<Tabs>
|
||||||
<RowBetween style={{ padding: '1rem 1rem 0 1rem' }}>
|
<RowBetween style={{ padding: '1rem 1rem 0 1rem' }}>
|
||||||
<HistoryLink
|
<HistoryLink
|
||||||
to={'/pool' + (!!positionID ? `/${positionID.toString()}` : '')}
|
to={poolLink}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (adding) {
|
if (adding) {
|
||||||
// not 100% sure both of these are needed
|
// not 100% sure both of these are needed
|
||||||
@@ -132,3 +136,16 @@ export function AddRemoveTabs({
|
|||||||
</Tabs>
|
</Tabs>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function CreateProposalTabs() {
|
||||||
|
return (
|
||||||
|
<Tabs>
|
||||||
|
<Row style={{ padding: '1rem 1rem 0 1rem' }}>
|
||||||
|
<HistoryLink to="/vote">
|
||||||
|
<StyledArrowLeft />
|
||||||
|
</HistoryLink>
|
||||||
|
<ActiveText style={{ marginLeft: 'auto', marginRight: 'auto' }}>Create Proposal</ActiveText>
|
||||||
|
</Row>
|
||||||
|
</Tabs>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
|
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
|
||||||
import React, { useCallback, useEffect } from 'react'
|
import { useCallback, useEffect } from 'react'
|
||||||
import ReactGA from 'react-ga'
|
import ReactGA from 'react-ga'
|
||||||
import { Heart, X } from 'react-feather'
|
import { Heart, X } from 'react-feather'
|
||||||
import styled, { keyframes } from 'styled-components'
|
import styled, { keyframes } from 'styled-components'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useCallback, useContext, useEffect } from 'react'
|
import { useCallback, useContext, useEffect } from 'react'
|
||||||
import { X } from 'react-feather'
|
import { X } from 'react-feather'
|
||||||
import { useSpring } from 'react-spring/web'
|
import { useSpring } from 'react-spring/web'
|
||||||
import styled, { ThemeContext } from 'styled-components'
|
import styled, { ThemeContext } from 'styled-components'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useContext } from 'react'
|
import { useContext } from 'react'
|
||||||
import { AlertCircle, CheckCircle } from 'react-feather'
|
import { AlertCircle, CheckCircle } from 'react-feather'
|
||||||
import styled, { ThemeContext } from 'styled-components'
|
import styled, { ThemeContext } from 'styled-components'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
@@ -34,7 +34,7 @@ export default function TransactionPopup({
|
|||||||
<TYPE.body fontWeight={500}>{summary ?? 'Hash: ' + hash.slice(0, 8) + '...' + hash.slice(58, 65)}</TYPE.body>
|
<TYPE.body fontWeight={500}>{summary ?? 'Hash: ' + hash.slice(0, 8) + '...' + hash.slice(58, 65)}</TYPE.body>
|
||||||
{chainId && (
|
{chainId && (
|
||||||
<ExternalLink href={getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)}>
|
<ExternalLink href={getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)}>
|
||||||
View on Etherscan
|
View on Explorer
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
)}
|
)}
|
||||||
</AutoColumn>
|
</AutoColumn>
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { useActivePopups } from '../../state/application/hooks'
|
import { useActivePopups } from '../../state/application/hooks'
|
||||||
import { AutoColumn } from '../Column'
|
import { AutoColumn } from '../Column'
|
||||||
@@ -33,7 +32,7 @@ const MobilePopupInner = styled.div`
|
|||||||
|
|
||||||
const FixedPopupColumn = styled(AutoColumn)<{ extraPadding: boolean }>`
|
const FixedPopupColumn = styled(AutoColumn)<{ extraPadding: boolean }>`
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: ${({ extraPadding }) => (extraPadding ? '72px' : '88px')};
|
top: ${({ extraPadding }) => (extraPadding ? '80px' : '88px')};
|
||||||
right: 1rem;
|
right: 1rem;
|
||||||
max-width: 355px !important;
|
max-width: 355px !important;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import { Token } from '@uniswap/sdk-core'
|
import { Token } from '@uniswap/sdk-core'
|
||||||
import { Link } from 'react-router-dom'
|
import { Link } from 'react-router-dom'
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import JSBI from 'jsbi'
|
import JSBI from 'jsbi'
|
||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import { Percent, CurrencyAmount, Token } from '@uniswap/sdk-core'
|
import { Percent, CurrencyAmount, Token } from '@uniswap/sdk-core'
|
||||||
import { Pair } from '@uniswap/v2-sdk'
|
import { Pair } from '@uniswap/v2-sdk'
|
||||||
import { ChevronDown, ChevronUp } from 'react-feather'
|
import { ChevronDown, ChevronUp } from 'react-feather'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import JSBI from 'jsbi'
|
|||||||
import { Percent, CurrencyAmount, Token } from '@uniswap/sdk-core'
|
import { Percent, CurrencyAmount, Token } from '@uniswap/sdk-core'
|
||||||
import { Pair } from '@uniswap/v2-sdk'
|
import { Pair } from '@uniswap/v2-sdk'
|
||||||
import { darken } from 'polished'
|
import { darken } from 'polished'
|
||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import { ChevronDown, ChevronUp } from 'react-feather'
|
import { ChevronDown, ChevronUp } from 'react-feather'
|
||||||
import { Link } from 'react-router-dom'
|
import { Link } from 'react-router-dom'
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
// import { Story } from '@storybook/react/types-6-0'
|
|
||||||
// import React from 'react'
|
|
||||||
// import { Position } from 'types/position'
|
|
||||||
// import { basisPointsToPercent } from 'utils'
|
|
||||||
// import { DAI, WBTC } from '../../constants'
|
|
||||||
// import Component, { PositionListProps } from './index'
|
|
||||||
// import { CurrencyAmount } from '@uniswap/sdk-core'
|
|
||||||
// import JSBI from 'jsbi'
|
|
||||||
|
|
||||||
// const FEE_BIPS = {
|
|
||||||
// FIVE: basisPointsToPercent(5),
|
|
||||||
// THIRTY: basisPointsToPercent(30),
|
|
||||||
// ONE_HUNDRED: basisPointsToPercent(100),
|
|
||||||
// }
|
|
||||||
// const daiAmount = CurrencyAmount.fromRawAmount(DAI, JSBI.BigInt(500 * 10 ** 18))
|
|
||||||
// const wbtcAmount = CurrencyAmount.fromRawAmount(WBTC, JSBI.BigInt(10 ** 7))
|
|
||||||
// const positions = [
|
|
||||||
// {
|
|
||||||
// feesEarned: {
|
|
||||||
// DAI: 1000,
|
|
||||||
// WBTC: 0.005,
|
|
||||||
// },
|
|
||||||
// feeLevel: FEE_BIPS.FIVE,
|
|
||||||
// tokenAmount0: daiAmount,
|
|
||||||
// tokenAmount1: wbtcAmount,
|
|
||||||
// tickLower: 40000,
|
|
||||||
// tickUpper: 60000,
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// feesEarned: {
|
|
||||||
// DAI: 1000,
|
|
||||||
// WBTC: 0.005,
|
|
||||||
// },
|
|
||||||
// feeLevel: FEE_BIPS.THIRTY,
|
|
||||||
// tokenAmount0: daiAmount,
|
|
||||||
// tokenAmount1: wbtcAmount,
|
|
||||||
// tickLower: 45000,
|
|
||||||
// tickUpper: 55000,
|
|
||||||
// },
|
|
||||||
// ]
|
|
||||||
// const positions: Position[] = []
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'PositionList',
|
|
||||||
}
|
|
||||||
|
|
||||||
// const Template: Story<PositionListProps> = (args) => <Component {...args} />
|
|
||||||
|
|
||||||
// export const PositionList = Template.bind({})
|
|
||||||
// PositionList.args = {
|
|
||||||
// positions,
|
|
||||||
// showUnwrapped: true,
|
|
||||||
// }
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
// import { Story } from '@storybook/react/types-6-0'
|
|
||||||
// import { FeeAmount, MAX_TICK, MIN_TICK, TICK_SPACINGS } from '@uniswap/v3-sdk'
|
|
||||||
// import { BigNumber } from 'ethers'
|
|
||||||
// import React from 'react'
|
|
||||||
// import { Position } from 'types/position'
|
|
||||||
// import Component, { PositionListItemProps } from './index'
|
|
||||||
|
|
||||||
// const position: Position = {
|
|
||||||
// nonce: BigNumber.from(0),
|
|
||||||
// operator: '',
|
|
||||||
// token0: '',
|
|
||||||
// token1: '',
|
|
||||||
// fee: FeeAmount.LOW,
|
|
||||||
// tickLower: MIN_TICK(TICK_SPACINGS[FeeAmount.LOW]),
|
|
||||||
// tickUpper: MAX_TICK(TICK_SPACINGS[FeeAmount.LOW]),
|
|
||||||
// liquidity,
|
|
||||||
// feeGrowthInside0LastX128fee
|
|
||||||
// feeGrowthInside0LastX128
|
|
||||||
// feeGrowthInside1LastX128
|
|
||||||
// tokensOwed0
|
|
||||||
// tokensOwed1
|
|
||||||
// }
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'PositionListItem',
|
|
||||||
}
|
|
||||||
|
|
||||||
// const Template: Story<PositionListItemProps> = (args) => <Component {...args} />
|
|
||||||
|
|
||||||
// export const PositionListItem = Template.bind({})
|
|
||||||
// PositionListItem.args = {position}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { Position } from '@uniswap/v3-sdk'
|
import { Position } from '@uniswap/v3-sdk'
|
||||||
import Badge from 'components/Badge'
|
import Badge from 'components/Badge'
|
||||||
import DoubleCurrencyLogo from 'components/DoubleLogo'
|
import DoubleCurrencyLogo from 'components/DoubleLogo'
|
||||||
@@ -8,14 +8,14 @@ import { Link } from 'react-router-dom'
|
|||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { HideSmall, MEDIA_WIDTHS, SmallOnly } from 'theme'
|
import { HideSmall, MEDIA_WIDTHS, SmallOnly } from 'theme'
|
||||||
import { PositionDetails } from 'types/position'
|
import { PositionDetails } from 'types/position'
|
||||||
import { WETH9, Price, Token, Percent } from '@uniswap/sdk-core'
|
import { Price, Token, Percent } from '@uniswap/sdk-core'
|
||||||
import { formatPrice } from 'utils/formatCurrencyAmount'
|
import { formatPrice } from 'utils/formatCurrencyAmount'
|
||||||
import Loader from 'components/Loader'
|
import Loader from 'components/Loader'
|
||||||
import { unwrappedToken } from 'utils/unwrappedToken'
|
import { unwrappedToken } from 'utils/unwrappedToken'
|
||||||
import RangeBadge from 'components/Badge/RangeBadge'
|
import RangeBadge from 'components/Badge/RangeBadge'
|
||||||
import { RowFixed } from 'components/Row'
|
import { RowFixed } from 'components/Row'
|
||||||
import HoverInlineText from 'components/HoverInlineText'
|
import HoverInlineText from 'components/HoverInlineText'
|
||||||
import { DAI, USDC, USDT, WBTC } from '../../constants/tokens'
|
import { DAI, USDC, USDT, WBTC, WETH9_EXTENDED } from '../../constants/tokens'
|
||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
|
|
||||||
const LinkRow = styled(Link)`
|
const LinkRow = styled(Link)`
|
||||||
@@ -146,7 +146,7 @@ export function getPriceOrderingFromPositionForUI(position?: Position): {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if token1 is an ETH-/BTC-stable asset, set it as the base token
|
// if token1 is an ETH-/BTC-stable asset, set it as the base token
|
||||||
const bases = [...Object.values(WETH9), WBTC]
|
const bases = [...Object.values(WETH9_EXTENDED), WBTC]
|
||||||
if (bases.some((base) => base.equals(token1))) {
|
if (bases.some((base) => base.equals(token1))) {
|
||||||
return {
|
return {
|
||||||
priceLower: position.token0PriceUpper.invert(),
|
priceLower: position.token0PriceUpper.invert(),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useCallback, useContext, ReactNode } from 'react'
|
import { useState, useCallback, useContext, ReactNode } from 'react'
|
||||||
import { Position } from '@uniswap/v3-sdk'
|
import { Position } from '@uniswap/v3-sdk'
|
||||||
import { LightCard } from 'components/Card'
|
import { LightCard } from 'components/Card'
|
||||||
import { AutoColumn } from 'components/Column'
|
import { AutoColumn } from 'components/Column'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useContext } from 'react'
|
import { useContext } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { AutoColumn } from '../Column'
|
import { AutoColumn } from '../Column'
|
||||||
import { ThemeContext } from 'styled-components'
|
import { ThemeContext } from 'styled-components'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { ReactNode, useCallback, useState } from 'react'
|
import { ReactNode, useCallback, useState } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import Tooltip from '../Tooltip'
|
import Tooltip from '../Tooltip'
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import React from 'react'
|
|
||||||
import { Currency, Price, Token } from '@uniswap/sdk-core'
|
import { Currency, Price, Token } from '@uniswap/sdk-core'
|
||||||
import StepCounter from 'components/InputStepCounter/InputStepCounter'
|
import StepCounter from 'components/InputStepCounter/InputStepCounter'
|
||||||
import { RowBetween } from 'components/Row'
|
import { RowBetween } from 'components/Row'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React from 'react'
|
import { Trans } from '@lingui/macro'
|
||||||
import { Currency } from '@uniswap/sdk-core'
|
import { Currency } from '@uniswap/sdk-core'
|
||||||
import { ToggleElement, ToggleWrapper } from 'components/Toggle/MultiToggle'
|
import { ToggleElement, ToggleWrapper } from 'components/Toggle/MultiToggle'
|
||||||
|
|
||||||
@@ -19,13 +19,13 @@ export default function RateToggle({
|
|||||||
const isSorted = tokenA && tokenB && tokenA.sortsBefore(tokenB)
|
const isSorted = tokenA && tokenB && tokenA.sortsBefore(tokenB)
|
||||||
|
|
||||||
return tokenA && tokenB ? (
|
return tokenA && tokenB ? (
|
||||||
<div style={{ width: 'fit-content', display: 'flex', alignItems: 'center' }}>
|
<div style={{ width: 'fit-content', display: 'flex', alignItems: 'center' }} onClick={handleRateToggle}>
|
||||||
<ToggleWrapper width="fit-content">
|
<ToggleWrapper width="fit-content">
|
||||||
<ToggleElement isActive={isSorted} fontSize="12px" onClick={handleRateToggle}>
|
<ToggleElement isActive={isSorted} fontSize="12px">
|
||||||
{isSorted ? currencyA.symbol + ' price ' : currencyB.symbol + ' price '}
|
<Trans>{isSorted ? currencyA.symbol : currencyB.symbol} price</Trans>
|
||||||
</ToggleElement>
|
</ToggleElement>
|
||||||
<ToggleElement isActive={!isSorted} fontSize="12px" onClick={handleRateToggle}>
|
<ToggleElement isActive={!isSorted} fontSize="12px">
|
||||||
{isSorted ? currencyB.symbol + ' price ' : currencyA.symbol + ' price '}
|
<Trans>{isSorted ? currencyB.symbol : currencyA.symbol} price</Trans>
|
||||||
</ToggleElement>
|
</ToggleElement>
|
||||||
</ToggleWrapper>
|
</ToggleWrapper>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import React from 'react'
|
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
import { Currency } from '@uniswap/sdk-core'
|
import { Currency } from '@uniswap/sdk-core'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
@@ -23,8 +22,9 @@ const BaseWrapper = styled.div<{ disable?: boolean }>`
|
|||||||
background-color: ${({ theme, disable }) => !disable && theme.bg2};
|
background-color: ${({ theme, disable }) => !disable && theme.bg2};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
color: ${({ theme, disable }) => disable && theme.text3};
|
||||||
background-color: ${({ theme, disable }) => disable && theme.bg3};
|
background-color: ${({ theme, disable }) => disable && theme.bg3};
|
||||||
opacity: ${({ disable }) => disable && '0.4'};
|
filter: ${({ disable }) => disable && 'grayscale(1)'};
|
||||||
`
|
`
|
||||||
|
|
||||||
export default function CommonBases({
|
export default function CommonBases({
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core'
|
import { Currency, CurrencyAmount, Token } from '@uniswap/sdk-core'
|
||||||
import React, { CSSProperties, MutableRefObject, useCallback, useMemo } from 'react'
|
import { CSSProperties, MutableRefObject, useCallback, useMemo } from 'react'
|
||||||
import { FixedSizeList } from 'react-window'
|
import { FixedSizeList } from 'react-window'
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
@@ -104,12 +104,14 @@ function CurrencyRow({
|
|||||||
isSelected,
|
isSelected,
|
||||||
otherSelected,
|
otherSelected,
|
||||||
style,
|
style,
|
||||||
|
showCurrencyAmount,
|
||||||
}: {
|
}: {
|
||||||
currency: Currency
|
currency: Currency
|
||||||
onSelect: () => void
|
onSelect: () => void
|
||||||
isSelected: boolean
|
isSelected: boolean
|
||||||
otherSelected: boolean
|
otherSelected: boolean
|
||||||
style: CSSProperties
|
style: CSSProperties
|
||||||
|
showCurrencyAmount?: boolean
|
||||||
}) {
|
}) {
|
||||||
const { account } = useActiveWeb3React()
|
const { account } = useActiveWeb3React()
|
||||||
const key = currencyKey(currency)
|
const key = currencyKey(currency)
|
||||||
@@ -141,9 +143,11 @@ function CurrencyRow({
|
|||||||
</TYPE.darkGray>
|
</TYPE.darkGray>
|
||||||
</Column>
|
</Column>
|
||||||
<TokenTags currency={currency} />
|
<TokenTags currency={currency} />
|
||||||
<RowFixed style={{ justifySelf: 'flex-end' }}>
|
{showCurrencyAmount && (
|
||||||
{balance ? <Balance balance={balance} /> : account ? <Loader /> : null}
|
<RowFixed style={{ justifySelf: 'flex-end' }}>
|
||||||
</RowFixed>
|
{balance ? <Balance balance={balance} /> : account ? <Loader /> : null}
|
||||||
|
</RowFixed>
|
||||||
|
)}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -189,6 +193,7 @@ export default function CurrencyList({
|
|||||||
fixedListRef,
|
fixedListRef,
|
||||||
showImportView,
|
showImportView,
|
||||||
setImportToken,
|
setImportToken,
|
||||||
|
showCurrencyAmount,
|
||||||
}: {
|
}: {
|
||||||
height: number
|
height: number
|
||||||
currencies: Currency[]
|
currencies: Currency[]
|
||||||
@@ -199,6 +204,7 @@ export default function CurrencyList({
|
|||||||
fixedListRef?: MutableRefObject<FixedSizeList | undefined>
|
fixedListRef?: MutableRefObject<FixedSizeList | undefined>
|
||||||
showImportView: () => void
|
showImportView: () => void
|
||||||
setImportToken: (token: Token) => void
|
setImportToken: (token: Token) => void
|
||||||
|
showCurrencyAmount?: boolean
|
||||||
}) {
|
}) {
|
||||||
const itemData: (Currency | BreakLine)[] = useMemo(() => {
|
const itemData: (Currency | BreakLine)[] = useMemo(() => {
|
||||||
if (otherListTokens && otherListTokens?.length > 0) {
|
if (otherListTokens && otherListTokens?.length > 0) {
|
||||||
@@ -237,13 +243,22 @@ export default function CurrencyList({
|
|||||||
isSelected={isSelected}
|
isSelected={isSelected}
|
||||||
onSelect={handleSelect}
|
onSelect={handleSelect}
|
||||||
otherSelected={otherSelected}
|
otherSelected={otherSelected}
|
||||||
|
showCurrencyAmount={showCurrencyAmount}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[currencies.length, onCurrencySelect, otherCurrency, selectedCurrency, setImportToken, showImportView]
|
[
|
||||||
|
currencies.length,
|
||||||
|
onCurrencySelect,
|
||||||
|
otherCurrency,
|
||||||
|
selectedCurrency,
|
||||||
|
setImportToken,
|
||||||
|
showImportView,
|
||||||
|
showCurrencyAmount,
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
const itemKey = useCallback((index: number, data: typeof itemData) => {
|
const itemKey = useCallback((index: number, data: typeof itemData) => {
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Currency, Ether, Token } from '@uniswap/sdk-core'
|
import { Currency, Token } from '@uniswap/sdk-core'
|
||||||
import React, { KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
import { KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
||||||
import ReactGA from 'react-ga'
|
import ReactGA from 'react-ga'
|
||||||
import { t, Trans } from '@lingui/macro'
|
import { t, Trans } from '@lingui/macro'
|
||||||
import { FixedSizeList } from 'react-window'
|
import { FixedSizeList } from 'react-window'
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
|
import { ExtendedEther } from '../../constants/tokens'
|
||||||
import { useActiveWeb3React } from '../../hooks/web3'
|
import { useActiveWeb3React } from '../../hooks/web3'
|
||||||
import { useAllTokens, useToken, useIsUserAddedToken, useSearchInactiveTokenLists } from '../../hooks/Tokens'
|
import { useAllTokens, useToken, useIsUserAddedToken, useSearchInactiveTokenLists } from '../../hooks/Tokens'
|
||||||
import { CloseIcon, TYPE, ButtonText, IconWrapper } from '../../theme'
|
import { CloseIcon, TYPE, ButtonText, IconWrapper } from '../../theme'
|
||||||
@@ -47,6 +48,8 @@ interface CurrencySearchProps {
|
|||||||
onCurrencySelect: (currency: Currency) => void
|
onCurrencySelect: (currency: Currency) => void
|
||||||
otherSelectedCurrency?: Currency | null
|
otherSelectedCurrency?: Currency | null
|
||||||
showCommonBases?: boolean
|
showCommonBases?: boolean
|
||||||
|
showCurrencyAmount?: boolean
|
||||||
|
disableNonToken?: boolean
|
||||||
showManageView: () => void
|
showManageView: () => void
|
||||||
showImportView: () => void
|
showImportView: () => void
|
||||||
setImportToken: (token: Token) => void
|
setImportToken: (token: Token) => void
|
||||||
@@ -57,6 +60,8 @@ export function CurrencySearch({
|
|||||||
onCurrencySelect,
|
onCurrencySelect,
|
||||||
otherSelectedCurrency,
|
otherSelectedCurrency,
|
||||||
showCommonBases,
|
showCommonBases,
|
||||||
|
showCurrencyAmount,
|
||||||
|
disableNonToken,
|
||||||
onDismiss,
|
onDismiss,
|
||||||
isOpen,
|
isOpen,
|
||||||
showManageView,
|
showManageView,
|
||||||
@@ -105,7 +110,7 @@ export function CurrencySearch({
|
|||||||
|
|
||||||
const filteredSortedTokens = useSortedTokensByQuery(sortedTokens, debouncedQuery)
|
const filteredSortedTokens = useSortedTokensByQuery(sortedTokens, debouncedQuery)
|
||||||
|
|
||||||
const ether = useMemo(() => chainId && Ether.onChain(chainId), [chainId])
|
const ether = useMemo(() => chainId && ExtendedEther.onChain(chainId), [chainId])
|
||||||
|
|
||||||
const filteredSortedTokensWithETH: Currency[] = useMemo(() => {
|
const filteredSortedTokensWithETH: Currency[] = useMemo(() => {
|
||||||
const s = debouncedQuery.toLowerCase().trim()
|
const s = debouncedQuery.toLowerCase().trim()
|
||||||
@@ -202,7 +207,7 @@ export function CurrencySearch({
|
|||||||
{({ height }) => (
|
{({ height }) => (
|
||||||
<CurrencyList
|
<CurrencyList
|
||||||
height={height}
|
height={height}
|
||||||
currencies={filteredSortedTokensWithETH}
|
currencies={disableNonToken ? filteredSortedTokens : filteredSortedTokensWithETH}
|
||||||
otherListTokens={filteredInactiveTokens}
|
otherListTokens={filteredInactiveTokens}
|
||||||
onCurrencySelect={handleCurrencySelect}
|
onCurrencySelect={handleCurrencySelect}
|
||||||
otherCurrency={otherSelectedCurrency}
|
otherCurrency={otherSelectedCurrency}
|
||||||
@@ -210,6 +215,7 @@ export function CurrencySearch({
|
|||||||
fixedListRef={fixedList}
|
fixedListRef={fixedList}
|
||||||
showImportView={showImportView}
|
showImportView={showImportView}
|
||||||
setImportToken={setImportToken}
|
setImportToken={setImportToken}
|
||||||
|
showCurrencyAmount={showCurrencyAmount}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</AutoSizer>
|
</AutoSizer>
|
||||||
@@ -223,12 +229,12 @@ export function CurrencySearch({
|
|||||||
)}
|
)}
|
||||||
<Footer>
|
<Footer>
|
||||||
<Row justify="center">
|
<Row justify="center">
|
||||||
<ButtonText onClick={showManageView} color={theme.blue1} className="list-token-manage-button">
|
<ButtonText onClick={showManageView} color={theme.primary1} className="list-token-manage-button">
|
||||||
<RowFixed>
|
<RowFixed>
|
||||||
<IconWrapper size="16px" marginRight="6px">
|
<IconWrapper size="16px" marginRight="6px" stroke={theme.primaryText1}>
|
||||||
<Edit />
|
<Edit />
|
||||||
</IconWrapper>
|
</IconWrapper>
|
||||||
<TYPE.main color={theme.blue1}>
|
<TYPE.main color={theme.primaryText1}>
|
||||||
<Trans>Manage Token Lists</Trans>
|
<Trans>Manage Token Lists</Trans>
|
||||||
</TYPE.main>
|
</TYPE.main>
|
||||||
</RowFixed>
|
</RowFixed>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Currency, Token } from '@uniswap/sdk-core'
|
import { Currency, Token } from '@uniswap/sdk-core'
|
||||||
import React, { useCallback, useEffect, useState } from 'react'
|
import { useCallback, useEffect, useState } from 'react'
|
||||||
import useLast from '../../hooks/useLast'
|
import useLast from '../../hooks/useLast'
|
||||||
import { WrappedTokenInfo } from '../../state/lists/wrappedTokenInfo'
|
import { WrappedTokenInfo } from '../../state/lists/wrappedTokenInfo'
|
||||||
import Modal from '../Modal'
|
import Modal from '../Modal'
|
||||||
@@ -17,6 +17,8 @@ interface CurrencySearchModalProps {
|
|||||||
onCurrencySelect: (currency: Currency) => void
|
onCurrencySelect: (currency: Currency) => void
|
||||||
otherSelectedCurrency?: Currency | null
|
otherSelectedCurrency?: Currency | null
|
||||||
showCommonBases?: boolean
|
showCommonBases?: boolean
|
||||||
|
showCurrencyAmount?: boolean
|
||||||
|
disableNonToken?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum CurrencyModalView {
|
export enum CurrencyModalView {
|
||||||
@@ -33,6 +35,8 @@ export default function CurrencySearchModal({
|
|||||||
selectedCurrency,
|
selectedCurrency,
|
||||||
otherSelectedCurrency,
|
otherSelectedCurrency,
|
||||||
showCommonBases = false,
|
showCommonBases = false,
|
||||||
|
showCurrencyAmount = true,
|
||||||
|
disableNonToken = false,
|
||||||
}: CurrencySearchModalProps) {
|
}: CurrencySearchModalProps) {
|
||||||
const [modalView, setModalView] = useState<CurrencyModalView>(CurrencyModalView.manage)
|
const [modalView, setModalView] = useState<CurrencyModalView>(CurrencyModalView.manage)
|
||||||
const lastOpen = useLast(isOpen)
|
const lastOpen = useLast(isOpen)
|
||||||
@@ -74,6 +78,8 @@ export default function CurrencySearchModal({
|
|||||||
selectedCurrency={selectedCurrency}
|
selectedCurrency={selectedCurrency}
|
||||||
otherSelectedCurrency={otherSelectedCurrency}
|
otherSelectedCurrency={otherSelectedCurrency}
|
||||||
showCommonBases={showCommonBases}
|
showCommonBases={showCommonBases}
|
||||||
|
showCurrencyAmount={showCurrencyAmount}
|
||||||
|
disableNonToken={disableNonToken}
|
||||||
showImportView={() => setModalView(CurrencyModalView.importToken)}
|
showImportView={() => setModalView(CurrencyModalView.importToken)}
|
||||||
setImportToken={setImportToken}
|
setImportToken={setImportToken}
|
||||||
showManageView={() => setModalView(CurrencyModalView.manage)}
|
showManageView={() => setModalView(CurrencyModalView.manage)}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useCallback } from 'react'
|
import { useState, useCallback } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import ReactGA from 'react-ga'
|
import ReactGA from 'react-ga'
|
||||||
import { TYPE, CloseIcon } from 'theme'
|
import { TYPE, CloseIcon } from 'theme'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { CSSProperties } from 'react'
|
import { CSSProperties } from 'react'
|
||||||
import { Token } from '@uniswap/sdk-core'
|
import { Token } from '@uniswap/sdk-core'
|
||||||
import { AutoRow, RowFixed } from 'components/Row'
|
import { AutoRow, RowFixed } from 'components/Row'
|
||||||
import { AutoColumn } from 'components/Column'
|
import { AutoColumn } from 'components/Column'
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { TokenList } from '@uniswap/token-lists/dist/types'
|
import { TokenList } from '@uniswap/token-lists/dist/types'
|
||||||
import React from 'react'
|
|
||||||
import { Token, Currency } from '@uniswap/sdk-core'
|
import { Token, Currency } from '@uniswap/sdk-core'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { TYPE, CloseIcon } from 'theme'
|
import { TYPE, CloseIcon } from 'theme'
|
||||||
@@ -18,6 +17,7 @@ import { ExternalLink } from '../../theme/components'
|
|||||||
import ListLogo from 'components/ListLogo'
|
import ListLogo from 'components/ListLogo'
|
||||||
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
||||||
import { PaddedColumn } from './styleds'
|
import { PaddedColumn } from './styleds'
|
||||||
|
import { Plural, Trans } from '@lingui/macro'
|
||||||
|
|
||||||
const Wrapper = styled.div`
|
const Wrapper = styled.div`
|
||||||
position: relative;
|
position: relative;
|
||||||
@@ -59,7 +59,9 @@ export function ImportToken({ tokens, list, onBack, onDismiss, handleCurrencySel
|
|||||||
<PaddedColumn gap="14px" style={{ width: '100%', flex: '1 1' }}>
|
<PaddedColumn gap="14px" style={{ width: '100%', flex: '1 1' }}>
|
||||||
<RowBetween>
|
<RowBetween>
|
||||||
{onBack ? <ArrowLeft style={{ cursor: 'pointer' }} onClick={onBack} /> : <div />}
|
{onBack ? <ArrowLeft style={{ cursor: 'pointer' }} onClick={onBack} /> : <div />}
|
||||||
<TYPE.mediumHeader>Import {tokens.length > 1 ? 'Tokens' : 'Token'}</TYPE.mediumHeader>
|
<TYPE.mediumHeader>
|
||||||
|
<Plural value={tokens.length} one="Import token" other="Import tokens" />
|
||||||
|
</TYPE.mediumHeader>
|
||||||
{onDismiss ? <CloseIcon onClick={onDismiss} /> : <div />}
|
{onDismiss ? <CloseIcon onClick={onDismiss} /> : <div />}
|
||||||
</RowBetween>
|
</RowBetween>
|
||||||
</PaddedColumn>
|
</PaddedColumn>
|
||||||
@@ -68,9 +70,10 @@ export function ImportToken({ tokens, list, onBack, onDismiss, handleCurrencySel
|
|||||||
<AutoColumn justify="center" style={{ textAlign: 'center', gap: '16px', padding: '1rem' }}>
|
<AutoColumn justify="center" style={{ textAlign: 'center', gap: '16px', padding: '1rem' }}>
|
||||||
<AlertCircle size={48} stroke={theme.text2} strokeWidth={1} />
|
<AlertCircle size={48} stroke={theme.text2} strokeWidth={1} />
|
||||||
<TYPE.body fontWeight={400} fontSize={16}>
|
<TYPE.body fontWeight={400} fontSize={16}>
|
||||||
{
|
<Trans>
|
||||||
"This token doesn't appear on the active token list(s). Make sure this is the token that you want to trade."
|
This token doesn't appear on the active token list(s). Make sure this is the token that you want to
|
||||||
}
|
trade.
|
||||||
|
</Trans>
|
||||||
</TYPE.body>
|
</TYPE.body>
|
||||||
</AutoColumn>
|
</AutoColumn>
|
||||||
{tokens.map((token) => {
|
{tokens.map((token) => {
|
||||||
@@ -101,7 +104,7 @@ export function ImportToken({ tokens, list, onBack, onDismiss, handleCurrencySel
|
|||||||
<RowFixed>
|
<RowFixed>
|
||||||
{list.logoURI && <ListLogo logoURI={list.logoURI} size="16px" />}
|
{list.logoURI && <ListLogo logoURI={list.logoURI} size="16px" />}
|
||||||
<TYPE.small ml="6px" fontSize={14} color={theme.text3}>
|
<TYPE.small ml="6px" fontSize={14} color={theme.text3}>
|
||||||
via {list.name} token list
|
<Trans>via {list.name} token list</Trans>
|
||||||
</TYPE.small>
|
</TYPE.small>
|
||||||
</RowFixed>
|
</RowFixed>
|
||||||
) : (
|
) : (
|
||||||
@@ -109,7 +112,7 @@ export function ImportToken({ tokens, list, onBack, onDismiss, handleCurrencySel
|
|||||||
<RowFixed>
|
<RowFixed>
|
||||||
<AlertCircle stroke={theme.red1} size="10px" />
|
<AlertCircle stroke={theme.red1} size="10px" />
|
||||||
<TYPE.body color={theme.red1} ml="4px" fontSize="10px" fontWeight={500}>
|
<TYPE.body color={theme.red1} ml="4px" fontSize="10px" fontWeight={500}>
|
||||||
Unknown Source
|
<Trans>Unknown Source</Trans>
|
||||||
</TYPE.body>
|
</TYPE.body>
|
||||||
</RowFixed>
|
</RowFixed>
|
||||||
</WarningWrapper>
|
</WarningWrapper>
|
||||||
@@ -129,7 +132,7 @@ export function ImportToken({ tokens, list, onBack, onDismiss, handleCurrencySel
|
|||||||
}}
|
}}
|
||||||
className=".token-dismiss-button"
|
className=".token-dismiss-button"
|
||||||
>
|
>
|
||||||
Import
|
<Trans>Import</Trans>
|
||||||
</ButtonPrimary>
|
</ButtonPrimary>
|
||||||
</AutoColumn>
|
</AutoColumn>
|
||||||
</Wrapper>
|
</Wrapper>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import { PaddedColumn, Separator } from './styleds'
|
import { PaddedColumn, Separator } from './styleds'
|
||||||
import { RowBetween } from 'components/Row'
|
import { RowBetween } from 'components/Row'
|
||||||
import { ArrowLeft } from 'react-feather'
|
import { ArrowLeft } from 'react-feather'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { memo, useCallback, useMemo, useRef, useState, useEffect } from 'react'
|
import { memo, useCallback, useMemo, useRef, useState, useEffect } from 'react'
|
||||||
import { Settings, CheckCircle } from 'react-feather'
|
import { Settings, CheckCircle } from 'react-feather'
|
||||||
import ReactGA from 'react-ga'
|
import ReactGA from 'react-ga'
|
||||||
import { useAppDispatch, useAppSelector } from 'state/hooks'
|
import { useAppDispatch, useAppSelector } from 'state/hooks'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useRef, RefObject, useCallback, useState, useMemo } from 'react'
|
import { useRef, RefObject, useCallback, useState, useMemo } from 'react'
|
||||||
import Column from 'components/Column'
|
import Column from 'components/Column'
|
||||||
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
||||||
import { PaddedColumn, Separator, SearchInput } from './styleds'
|
import { PaddedColumn, Separator, SearchInput } from './styleds'
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { RowFixed } from '../Row'
|
import { RowFixed } from '../Row'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { t, Trans } from '@lingui/macro'
|
import { t, Trans } from '@lingui/macro'
|
||||||
import React, { useContext, useRef, useState } from 'react'
|
import { useContext, useRef, useState } from 'react'
|
||||||
import { Settings, X } from 'react-feather'
|
import { Settings, X } from 'react-feather'
|
||||||
import ReactGA from 'react-ga'
|
import ReactGA from 'react-ga'
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useCallback } from 'react'
|
import { useCallback } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
const StyledRangeInput = styled.input<{ size: number }>`
|
const StyledRangeInput = styled.input<{ size: number }>`
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import React, { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
|
import ReactGA from 'react-ga'
|
||||||
import { useLocation } from 'react-router'
|
import { useLocation } from 'react-router'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { DEFAULT_LOCALE, LOCALE_LABEL, SupportedLocale } from '../../constants/locales'
|
import { DEFAULT_LOCALE, LOCALE_LABEL, SupportedLocale } from '../../constants/locales'
|
||||||
@@ -38,7 +39,21 @@ export function SwitchLocaleLink() {
|
|||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<Trans>
|
<Trans>
|
||||||
Uniswap available in: {<StyledInternalLink to={target}>{LOCALE_LABEL[targetLocale]}</StyledInternalLink>}
|
Uniswap available in:{' '}
|
||||||
|
{
|
||||||
|
<StyledInternalLink
|
||||||
|
onClick={() => {
|
||||||
|
ReactGA.event({
|
||||||
|
category: 'Localization',
|
||||||
|
action: 'Switch Locale',
|
||||||
|
label: `${activeLocale} -> ${targetLocale}`,
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
to={target}
|
||||||
|
>
|
||||||
|
{LOCALE_LABEL[targetLocale]}
|
||||||
|
</StyledInternalLink>
|
||||||
|
}
|
||||||
</Trans>
|
</Trans>
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
|
|||||||
146
src/components/TextInput/index.tsx
Normal file
146
src/components/TextInput/index.tsx
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
import React, { memo, useCallback, useRef } from 'react'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
|
||||||
|
const Input = styled.input<{ error?: boolean; fontSize?: string }>`
|
||||||
|
font-size: ${({ fontSize }) => fontSize || '1.25rem'};
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
width: 0;
|
||||||
|
background-color: ${({ theme }) => theme.bg1};
|
||||||
|
transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};
|
||||||
|
color: ${({ error, theme }) => (error ? theme.red1 : theme.text1)};
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0px;
|
||||||
|
-webkit-appearance: textfield;
|
||||||
|
|
||||||
|
::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-outer-spin-button,
|
||||||
|
::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::placeholder {
|
||||||
|
color: ${({ theme }) => theme.text4};
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
const TextAreaInput = styled.textarea<{ error?: boolean; fontSize?: string }>`
|
||||||
|
font-size: ${({ fontSize }) => fontSize || '1.25rem'};
|
||||||
|
outline: none;
|
||||||
|
border: none;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
width: 0;
|
||||||
|
resize: none;
|
||||||
|
background-color: ${({ theme }) => theme.bg1};
|
||||||
|
transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};
|
||||||
|
color: ${({ error, theme }) => (error ? theme.red1 : theme.text1)};
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 100%;
|
||||||
|
line-height: 1.2;
|
||||||
|
padding: 0px;
|
||||||
|
-webkit-appearance: textfield;
|
||||||
|
|
||||||
|
::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-outer-spin-button,
|
||||||
|
::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::placeholder {
|
||||||
|
color: ${({ theme }) => theme.text4};
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
export const TextInput = ({
|
||||||
|
className,
|
||||||
|
value,
|
||||||
|
onUserInput,
|
||||||
|
placeholder,
|
||||||
|
fontSize,
|
||||||
|
}: {
|
||||||
|
className?: string
|
||||||
|
value: string
|
||||||
|
onUserInput: (value: string) => void
|
||||||
|
placeholder: string
|
||||||
|
fontSize: string
|
||||||
|
}) => {
|
||||||
|
const handleInput = useCallback(
|
||||||
|
(event) => {
|
||||||
|
onUserInput(event.target.value)
|
||||||
|
},
|
||||||
|
[onUserInput]
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={className}>
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
autoComplete="off"
|
||||||
|
autoCorrect="off"
|
||||||
|
autoCapitalize="off"
|
||||||
|
spellCheck="false"
|
||||||
|
placeholder={placeholder || ''}
|
||||||
|
onChange={handleInput}
|
||||||
|
value={value}
|
||||||
|
fontSize={fontSize}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ResizingTextArea = memo(
|
||||||
|
({
|
||||||
|
className,
|
||||||
|
value,
|
||||||
|
onUserInput,
|
||||||
|
placeholder,
|
||||||
|
fontSize,
|
||||||
|
}: {
|
||||||
|
className?: string
|
||||||
|
value: string
|
||||||
|
onUserInput: (value: string) => void
|
||||||
|
placeholder: string
|
||||||
|
fontSize: string
|
||||||
|
}) => {
|
||||||
|
const inputRef = useRef<HTMLTextAreaElement>(document.createElement('textarea'))
|
||||||
|
|
||||||
|
const handleInput = useCallback(
|
||||||
|
(event) => {
|
||||||
|
inputRef.current.style.height = 'auto'
|
||||||
|
inputRef.current.style.height = inputRef.current.scrollHeight + 'px'
|
||||||
|
onUserInput(event.target.value)
|
||||||
|
},
|
||||||
|
[onUserInput]
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TextAreaInput
|
||||||
|
style={{ height: 'auto', minHeight: '500px' }}
|
||||||
|
className={className}
|
||||||
|
autoComplete="off"
|
||||||
|
autoCorrect="off"
|
||||||
|
autoCapitalize="off"
|
||||||
|
spellCheck="false"
|
||||||
|
placeholder={placeholder || ''}
|
||||||
|
onChange={handleInput}
|
||||||
|
value={value}
|
||||||
|
fontSize={fontSize}
|
||||||
|
ref={inputRef}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
ResizingTextArea.displayName = 'ResizingTextArea'
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import React from 'react'
|
|
||||||
import Component from './index'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'ThemeColorPalette',
|
|
||||||
}
|
|
||||||
|
|
||||||
const Template: Story<any> = (_args: any, context: Record<string, any>) => {
|
|
||||||
const isDarkMode = context.globals.theme === 'dark'
|
|
||||||
return <Component isDarkMode={isDarkMode} />
|
|
||||||
}
|
|
||||||
|
|
||||||
export const Palette = Template.bind({})
|
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import { readableColor } from 'polished'
|
import { readableColor } from 'polished'
|
||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { colors } from 'theme'
|
import { colors } from 'theme'
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { TYPE } from '../../theme'
|
import { TYPE } from '../../theme'
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
import { Story } from '@storybook/react/types-6-0'
|
|
||||||
import styled from 'styled-components/macro'
|
|
||||||
import React, { useState } from 'react'
|
|
||||||
import MultiToggle from './MultiToggle'
|
|
||||||
|
|
||||||
const wrapperCss = styled.main`
|
|
||||||
font-size: 2em;
|
|
||||||
margin: 3em;
|
|
||||||
max-width: 300px;
|
|
||||||
`
|
|
||||||
|
|
||||||
export default {
|
|
||||||
title: 'Toggles',
|
|
||||||
argTypes: {
|
|
||||||
width: { control: { type: 'string' } },
|
|
||||||
},
|
|
||||||
decorators: [
|
|
||||||
(Component: Story) => (
|
|
||||||
<div css={wrapperCss}>
|
|
||||||
<Component />
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
export const MultiToggleExample = () => {
|
|
||||||
const [active, setActive] = useState(0)
|
|
||||||
|
|
||||||
function doSomethingWithIndex(index: number) {
|
|
||||||
// here's where youd update state based on index choice
|
|
||||||
// switch(index){} ...
|
|
||||||
setActive(index)
|
|
||||||
}
|
|
||||||
return <MultiToggle toggle={doSomethingWithIndex} activeIndex={active} options={['option1', 'option2', 'option3']} />
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
export const ToggleWrapper = styled.button<{ width?: string }>`
|
export const ToggleWrapper = styled.button<{ width?: string }>`
|
||||||
@@ -31,32 +30,3 @@ export const ToggleElement = styled.span<{ isActive?: boolean; fontSize?: string
|
|||||||
color: ${({ theme, isActive }) => (isActive ? theme.text2 : theme.text3)};
|
color: ${({ theme, isActive }) => (isActive ? theme.text2 : theme.text3)};
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
export const ToggleText = styled.div`
|
|
||||||
color: ${({ theme }) => theme.text3};
|
|
||||||
font-size: 12px;
|
|
||||||
margin-right: 0.5rem;
|
|
||||||
width: 100%;
|
|
||||||
white-space: nowrap;
|
|
||||||
padding: 0 0 0 4px;
|
|
||||||
`
|
|
||||||
|
|
||||||
export interface ToggleProps {
|
|
||||||
options: string[]
|
|
||||||
activeIndex: number
|
|
||||||
toggle: (index: number) => void
|
|
||||||
id?: string
|
|
||||||
width?: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function MultiToggle({ id, options, activeIndex, toggle, width }: ToggleProps) {
|
|
||||||
return (
|
|
||||||
<ToggleWrapper id={id} width={width}>
|
|
||||||
{options.map((option, index) => (
|
|
||||||
<ToggleElement key={id + '-' + index} isActive={index === activeIndex} onClick={() => toggle(index)}>
|
|
||||||
{option}
|
|
||||||
</ToggleElement>
|
|
||||||
))}
|
|
||||||
</ToggleWrapper>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,54 +1,57 @@
|
|||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
import React from 'react'
|
import { darken } from 'polished'
|
||||||
|
import { ReactNode } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|
||||||
const ToggleElement = styled.span<{ isActive?: boolean; isOnSwitch?: boolean }>`
|
const ToggleElement = styled.span<{ isActive?: boolean; isOnSwitch?: boolean }>`
|
||||||
padding: 0.25rem 0.5rem;
|
padding: 0.25rem 0.6rem;
|
||||||
border-radius: 14px;
|
border-radius: 9px;
|
||||||
background: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.primary1 : theme.text4) : 'none')};
|
background: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.primary1 : theme.bg4) : 'none')};
|
||||||
color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.text2) : theme.text3)};
|
color: ${({ theme, isActive }) => (isActive ? theme.white : theme.text2)};
|
||||||
font-size: 1rem;
|
|
||||||
font-weight: 400;
|
|
||||||
|
|
||||||
padding: 0.35rem 0.6rem;
|
|
||||||
border-radius: 12px;
|
|
||||||
background: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.primary1 : theme.text4) : 'none')};
|
|
||||||
color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.text2) : theme.text2)};
|
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
font-weight: ${({ isOnSwitch }) => (isOnSwitch ? '500' : '400')};
|
font-weight: ${({ isOnSwitch }) => (isOnSwitch ? '500' : '400')};
|
||||||
:hover {
|
:hover {
|
||||||
user-select: ${({ isOnSwitch }) => (isOnSwitch ? 'none' : 'initial')};
|
user-select: ${({ isOnSwitch }) => (isOnSwitch ? 'none' : 'initial')};
|
||||||
background: ${({ theme, isActive, isOnSwitch }) =>
|
background: ${({ theme, isActive, isOnSwitch }) =>
|
||||||
isActive ? (isOnSwitch ? theme.primary1 : theme.text3) : 'none'};
|
isActive ? (isOnSwitch ? darken(0.05, theme.primary1) : darken(0.05, theme.bg4)) : 'none'};
|
||||||
color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.text2) : theme.text3)};
|
color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.white) : theme.text3)};
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
const StyledToggle = styled.button<{ isActive?: boolean; activeElement?: boolean }>`
|
const StyledToggle = styled.button<{ isActive?: boolean; activeElement?: boolean }>`
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
border: none;
|
border: 2px solid;
|
||||||
background: ${({ theme }) => theme.bg3};
|
border-color: ${({ theme, isActive }) => (isActive ? theme.primary1 : theme.bg3)};
|
||||||
|
background: ${({ theme }) => theme.bg1};
|
||||||
display: flex;
|
display: flex;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
outline: none;
|
outline: none;
|
||||||
padding: 0;
|
padding: 2px;
|
||||||
`
|
`
|
||||||
|
|
||||||
export interface ToggleProps {
|
export interface ToggleProps {
|
||||||
id?: string
|
id?: string
|
||||||
isActive: boolean
|
isActive: boolean
|
||||||
toggle: () => void
|
toggle: () => void
|
||||||
|
checked?: ReactNode
|
||||||
|
unchecked?: ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Toggle({ id, isActive, toggle }: ToggleProps) {
|
export default function Toggle({
|
||||||
|
id,
|
||||||
|
isActive,
|
||||||
|
toggle,
|
||||||
|
checked = <Trans>On</Trans>,
|
||||||
|
unchecked = <Trans>Off</Trans>,
|
||||||
|
}: ToggleProps) {
|
||||||
return (
|
return (
|
||||||
<StyledToggle id={id} isActive={isActive} onClick={toggle}>
|
<StyledToggle id={id} isActive={isActive} onClick={toggle}>
|
||||||
<ToggleElement isActive={isActive} isOnSwitch={true}>
|
<ToggleElement isActive={isActive} isOnSwitch={true}>
|
||||||
<Trans>On</Trans>
|
{checked}
|
||||||
</ToggleElement>
|
</ToggleElement>
|
||||||
<ToggleElement isActive={!isActive} isOnSwitch={false}>
|
<ToggleElement isActive={!isActive} isOnSwitch={false}>
|
||||||
<Trans>Off</Trans>
|
{unchecked}
|
||||||
</ToggleElement>
|
</ToggleElement>
|
||||||
</StyledToggle>
|
</StyledToggle>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Token } from '@uniswap/sdk-core'
|
import { Token } from '@uniswap/sdk-core'
|
||||||
import React from 'react'
|
|
||||||
import Modal from '../Modal'
|
import Modal from '../Modal'
|
||||||
import { ImportToken } from 'components/SearchModal/ImportToken'
|
import { ImportToken } from 'components/SearchModal/ImportToken'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { ReactNode, useCallback, useState } from 'react'
|
import { ReactNode, useCallback, useState } from 'react'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import Popover, { PopoverProps } from '../Popover'
|
import Popover, { PopoverProps } from '../Popover'
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Currency } from '@uniswap/sdk-core'
|
import { Currency } from '@uniswap/sdk-core'
|
||||||
import React, { ReactNode, useContext } from 'react'
|
import { ReactNode, useContext } from 'react'
|
||||||
import styled, { ThemeContext } from 'styled-components'
|
import styled, { ThemeContext } from 'styled-components'
|
||||||
import { getExplorerLink, ExplorerDataType } from '../../utils/getExplorerLink'
|
import { getExplorerLink, ExplorerDataType } from '../../utils/getExplorerLink'
|
||||||
import Modal from '../Modal'
|
import Modal from '../Modal'
|
||||||
@@ -116,7 +116,7 @@ export function TransactionSubmittedContent({
|
|||||||
{chainId && hash && (
|
{chainId && hash && (
|
||||||
<ExternalLink href={getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)}>
|
<ExternalLink href={getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)}>
|
||||||
<Text fontWeight={500} fontSize={14} color={theme.primary1}>
|
<Text fontWeight={500} fontSize={14} color={theme.primary1}>
|
||||||
<Trans>View on Etherscan</Trans>
|
<Trans>View on Explorer</Trans>
|
||||||
</Text>
|
</Text>
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { t, Trans } from '@lingui/macro'
|
import { t, Trans } from '@lingui/macro'
|
||||||
import React, { useState, useContext } from 'react'
|
import { useState, useContext } from 'react'
|
||||||
import { Percent } from '@uniswap/sdk-core'
|
import { Percent } from '@uniswap/sdk-core'
|
||||||
import styled, { ThemeContext } from 'styled-components'
|
import styled, { ThemeContext } from 'styled-components'
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { AbstractConnector } from '@web3-react/abstract-connector'
|
import { AbstractConnector } from '@web3-react/abstract-connector'
|
||||||
import React from 'react'
|
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { SUPPORTED_WALLETS } from '../../constants/wallet'
|
import { SUPPORTED_WALLETS } from '../../constants/wallet'
|
||||||
import Option from './Option'
|
import Option from './Option'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { AbstractConnector } from '@web3-react/abstract-connector'
|
|||||||
import { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'
|
import { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'
|
||||||
import { WalletConnectConnector } from '@web3-react/walletconnect-connector'
|
import { WalletConnectConnector } from '@web3-react/walletconnect-connector'
|
||||||
import { AutoRow } from 'components/Row'
|
import { AutoRow } from 'components/Row'
|
||||||
import React, { useEffect, useState } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import { isMobile } from 'react-device-detect'
|
import { isMobile } from 'react-device-detect'
|
||||||
import ReactGA from 'react-ga'
|
import ReactGA from 'react-ga'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { useWeb3React } from '@web3-react/core'
|
import { useWeb3React } from '@web3-react/core'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import { Trans } from '@lingui/macro'
|
import { Trans } from '@lingui/macro'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { AbstractConnector } from '@web3-react/abstract-connector'
|
import { AbstractConnector } from '@web3-react/abstract-connector'
|
||||||
import { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'
|
import { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'
|
||||||
import { darken, lighten } from 'polished'
|
import { darken, lighten } from 'polished'
|
||||||
import React, { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { Activity } from 'react-feather'
|
import { Activity } from 'react-feather'
|
||||||
import { t, Trans } from '@lingui/macro'
|
import { t, Trans } from '@lingui/macro'
|
||||||
import styled, { css } from 'styled-components'
|
import styled, { css } from 'styled-components'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
import { ExplorerDataType, getExplorerLink } from '../../utils/getExplorerLink'
|
||||||
import Modal from '../Modal'
|
import Modal from '../Modal'
|
||||||
import { AutoColumn, ColumnCenter } from '../Column'
|
import { AutoColumn, ColumnCenter } from '../Column'
|
||||||
@@ -192,7 +192,7 @@ export default function AddressClaimModal({ isOpen, onDismiss }: { isOpen: boole
|
|||||||
)}
|
)}
|
||||||
{attempting && hash && !claimConfirmed && chainId && hash && (
|
{attempting && hash && !claimConfirmed && chainId && hash && (
|
||||||
<ExternalLink href={getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)} style={{ zIndex: 99 }}>
|
<ExternalLink href={getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)} style={{ zIndex: 99 }}>
|
||||||
<Trans>View transaction on Etherscan</Trans>
|
<Trans>View transaction on Explorer</Trans>
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
)}
|
)}
|
||||||
</AutoColumn>
|
</AutoColumn>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import JSBI from 'jsbi'
|
import JSBI from 'jsbi'
|
||||||
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
|
import { CurrencyAmount, Token } from '@uniswap/sdk-core'
|
||||||
import { isAddress } from 'ethers/lib/utils'
|
import { isAddress } from 'ethers/lib/utils'
|
||||||
import React, { useEffect, useState } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import { Text } from 'rebass'
|
import { Text } from 'rebass'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
import Circle from '../../assets/images/blue-loader.svg'
|
import Circle from '../../assets/images/blue-loader.svg'
|
||||||
@@ -221,7 +221,7 @@ export default function ClaimModal() {
|
|||||||
href={getExplorerLink(chainId, claimTxn?.hash, ExplorerDataType.TRANSACTION)}
|
href={getExplorerLink(chainId, claimTxn?.hash, ExplorerDataType.TRANSACTION)}
|
||||||
style={{ zIndex: 99 }}
|
style={{ zIndex: 99 }}
|
||||||
>
|
>
|
||||||
<Trans>View transaction on Etherscan</Trans>
|
<Trans>View transaction on Explorer</Trans>
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
)}
|
)}
|
||||||
</AutoColumn>
|
</AutoColumn>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import Modal from '../Modal'
|
import Modal from '../Modal'
|
||||||
import { AutoColumn } from '../Column'
|
import { AutoColumn } from '../Column'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react'
|
|
||||||
import { AutoColumn } from '../Column'
|
import { AutoColumn } from '../Column'
|
||||||
import { RowBetween } from '../Row'
|
import { RowBetween } from '../Row'
|
||||||
import styled from 'styled-components/macro'
|
import styled from 'styled-components/macro'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState, useCallback } from 'react'
|
import { useState, useCallback } from 'react'
|
||||||
import { useV2LiquidityTokenPermit } from '../../hooks/useERC20Permit'
|
import { useV2LiquidityTokenPermit } from '../../hooks/useERC20Permit'
|
||||||
import useTransactionDeadline from '../../hooks/useTransactionDeadline'
|
import useTransactionDeadline from '../../hooks/useTransactionDeadline'
|
||||||
import { formatCurrencyAmount } from '../../utils/formatCurrencyAmount'
|
import { formatCurrencyAmount } from '../../utils/formatCurrencyAmount'
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user