From 7b7f40239eabb6bc29be776c587b2a4d8c7ace5a Mon Sep 17 00:00:00 2001 From: Piotr Matlak Date: Wed, 28 Aug 2024 12:08:34 +0200 Subject: [PATCH 1/2] update mobile navbar, fix lint --- src/components/Header/Header.stories.tsx | 10 ++- .../ChangeWalletButton.stories.tsx | 20 +++++ .../HeaderButton/HeaderButton.stories.tsx | 85 ------------------ .../SelectChainButton.stories.tsx | 27 ++++++ .../SelectNetworkButton.stories.tsx | 21 +++++ .../HeaderButton/SelectRPCButton.stories.tsx | 27 ++++++ .../Inputs/RangeInput/RangeInput.stories.tsx | 63 ++++++------- src/components/Modals/RoutesModal/index.tsx | 29 +++--- src/components/Modals/RoutesModal/style.ts | 40 +++++---- .../DepositSelector.stories.tsx | 72 ++++++++------- .../FeeSwitch/FeeSwitch.stories.tsx | 29 +++--- .../NewPosition/PoolInit/PoolInit.stories.tsx | 43 ++++++--- .../RangeSelector/RangeSelector.stories.tsx | 51 +++++++---- .../SinglePositionPlot.stories.tsx | 10 ++- .../Stats/PoolListItem/PoolListItem.tsx | 2 +- .../Stats/TokenListItem/TokenListItem.tsx | 2 +- .../ExchangeRate/ExchangeRate.stories.tsx | 14 ++- src/components/Swap/Swap.stories.tsx | 30 +++++-- .../Swap/TokensInfo/TokensInfo.stories.tsx | 14 ++- .../TransactionDetailsBox.stories.tsx | 2 +- src/pages/StatsPage/index.tsx | 4 +- src/static/png/coming-soon.png | Bin 0 -> 21444 bytes src/static/png/work-in-progress.png | Bin 23049 -> 0 bytes 23 files changed, 353 insertions(+), 242 deletions(-) create mode 100644 src/components/Header/HeaderButton/ChangeWalletButton.stories.tsx delete mode 100644 src/components/Header/HeaderButton/HeaderButton.stories.tsx create mode 100644 src/components/Header/HeaderButton/SelectChainButton.stories.tsx create mode 100644 src/components/Header/HeaderButton/SelectNetworkButton.stories.tsx create mode 100644 src/components/Header/HeaderButton/SelectRPCButton.stories.tsx create mode 100644 src/static/png/coming-soon.png delete mode 100644 src/static/png/work-in-progress.png diff --git a/src/components/Header/Header.stories.tsx b/src/components/Header/Header.stories.tsx index 110788b6..3232ccc4 100644 --- a/src/components/Header/Header.stories.tsx +++ b/src/components/Header/Header.stories.tsx @@ -4,6 +4,8 @@ import Header from './Header' import { MemoryRouter } from 'react-router-dom' import { Network } from '@invariant-labs/a0-sdk' import { Chain } from '@store/consts/types' +import { Provider } from 'react-redux' +import { store } from '@store/index' const meta = { title: 'Layout/Header', @@ -11,9 +13,11 @@ const meta = { args: {}, decorators: [ Story => ( - - - + + + + + ) ] } satisfies Meta diff --git a/src/components/Header/HeaderButton/ChangeWalletButton.stories.tsx b/src/components/Header/HeaderButton/ChangeWalletButton.stories.tsx new file mode 100644 index 00000000..d09bc322 --- /dev/null +++ b/src/components/Header/HeaderButton/ChangeWalletButton.stories.tsx @@ -0,0 +1,20 @@ +import type { Meta, StoryObj } from '@storybook/react' +import ChangeWalletButton from './ChangeWalletButton' +import { fn } from '@storybook/test' + +const meta = { + title: 'Buttons/ChangeWalletButton', + component: ChangeWalletButton +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Primary: Story = { + args: { + name: 'Change Wallet', + onConnect: fn(), + connected: false, + onDisconnect: fn() + } +} diff --git a/src/components/Header/HeaderButton/HeaderButton.stories.tsx b/src/components/Header/HeaderButton/HeaderButton.stories.tsx deleted file mode 100644 index 821a509e..00000000 --- a/src/components/Header/HeaderButton/HeaderButton.stories.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { RPC } from '@store/consts/static' -import type { StoryObj } from '@storybook/react' -import { fn } from '@storybook/test' -import ChangeWalletButton from './ChangeWalletButton' -import SelectNetworkButton from './SelectNetworkButton' -import SelectRPCButton from './SelectRPCButton' - -import { Network } from '@invariant-labs/a0-sdk' -import { action } from '@storybook/addon-actions' - -const meta = { - title: 'Buttons/HeaderButtons', - argTypes: { - onConnect: { action: 'connect' }, - onDisconnect: { action: 'disconnect' }, - onSelect: { action: 'select' }, - onRPC: { action: 'rpc' }, - onNetworkSelect: { action: 'network' }, - onFaucet: { action: 'faucet' }, - onLanding: { action: 'landing' } - } -} - -export default meta -type Story = StoryObj - -export const ConnectWallet: Story = { - render: () => ( -
- -
- ) -} - -export const WalletConnected: Story = { - render: () => ( -
- -
- ) -} - -export const SelectNetwork: Story = { - render: () => ( -
- action('chosen: ' + networkType + ' ' + rpc)()} - /> -
- ) -} - -export const SelectRPC: Story = { - render: () => ( -
- action('chosen: ' + networkType + ' ' + rpc)()} - /> -
- ) -} diff --git a/src/components/Header/HeaderButton/SelectChainButton.stories.tsx b/src/components/Header/HeaderButton/SelectChainButton.stories.tsx new file mode 100644 index 00000000..9c4991f3 --- /dev/null +++ b/src/components/Header/HeaderButton/SelectChainButton.stories.tsx @@ -0,0 +1,27 @@ +import type { Meta, StoryObj } from '@storybook/react' +import SelectChainButton from './SelectChainButton' +import { fn } from '@storybook/test' +import { Chain } from '@store/consts/types' + +const meta = { + title: 'Buttons/SelectChainButton', + component: SelectChainButton +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Primary: Story = { + args: { + activeChain: { + name: Chain.AlephZero, + address: 'https://azero.invariant.app/swap' + }, + chains: [ + { name: Chain.AlephZero, address: 'https://azero.invariant.app/swap' }, + { name: Chain.Eclipse, address: 'https://eclipse.invariant.app/swap' } + ], + onSelect: fn(), + disabled: false + } +} diff --git a/src/components/Header/HeaderButton/SelectNetworkButton.stories.tsx b/src/components/Header/HeaderButton/SelectNetworkButton.stories.tsx new file mode 100644 index 00000000..9432f332 --- /dev/null +++ b/src/components/Header/HeaderButton/SelectNetworkButton.stories.tsx @@ -0,0 +1,21 @@ +import type { Meta, StoryObj } from '@storybook/react' +import SelectNetworkButton from './SelectNetworkButton' +import { Network } from '@invariant-labs/a0-sdk' +import { RPC } from '@store/consts/static' +import { action } from '@storybook/addon-actions' + +const meta = { + title: 'Buttons/SelectNetworkButton', + component: SelectNetworkButton +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Primary: Story = { + args: { + name: Network.Testnet, + networks: [{ networkType: Network.Testnet, rpc: RPC.TEST }], + onSelect: (networkType, rpc) => action('chosen: ' + networkType + ' ' + rpc)() + } +} diff --git a/src/components/Header/HeaderButton/SelectRPCButton.stories.tsx b/src/components/Header/HeaderButton/SelectRPCButton.stories.tsx new file mode 100644 index 00000000..e1e16ccb --- /dev/null +++ b/src/components/Header/HeaderButton/SelectRPCButton.stories.tsx @@ -0,0 +1,27 @@ +import type { Meta, StoryObj } from '@storybook/react' +import SelectRPCButton from './SelectRPCButton' +import { Network } from '@invariant-labs/a0-sdk' +import { RPC } from '@store/consts/static' +import { action } from '@storybook/addon-actions' + +const meta = { + title: 'Buttons/SelectRPCButton', + component: SelectRPCButton +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Primary: Story = { + args: { + rpc: RPC.TEST, + networks: [ + { + networkType: Network.Testnet, + rpc: RPC.TEST, + rpcName: 'Testnet' + } + ], + onSelect: (networkType, rpc) => action('chosen: ' + networkType + ' ' + rpc)() + } +} diff --git a/src/components/Inputs/RangeInput/RangeInput.stories.tsx b/src/components/Inputs/RangeInput/RangeInput.stories.tsx index 36683f88..6efd4603 100644 --- a/src/components/Inputs/RangeInput/RangeInput.stories.tsx +++ b/src/components/Inputs/RangeInput/RangeInput.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react' import { fn } from '@storybook/test' -import RangeInput from './RangeInput' +import RangeInput, { IRangeInput } from './RangeInput' // Assuming RangeInputProps is exported import { useState } from 'react' const meta = { @@ -12,6 +12,37 @@ const meta = { export default meta type Story = StoryObj +const RangeInputWrapper: React.FC = args => { + const [val, setVal] = useState('100') + + return ( +
+ { + setVal((+val - 0.01).toFixed(2).toString()) + }} + increaseValue={() => { + setVal((+val + 0.01).toFixed(2).toString()) + }} + setValue={value => { + setVal(value) + }} + onBlur={() => { + setVal((+val).toFixed(2).toString()) + }} + style={{ width: 200, maxHeight: 300, margin: 'auto' }} + /> +
+ ) +} + export const Primary: Story = { args: { currentValue: '10', @@ -25,33 +56,5 @@ export const Primary: Story = { tokenFromSymbol: 'USDC', tokenToSymbol: 'USDT' }, - render: args => { - const [val, setVal] = useState('100') - return ( -
- { - setVal((+val - 0.01).toFixed(2).toString()) - }} - increaseValue={() => { - setVal((+val + 0.01).toFixed(2).toString()) - }} - setValue={value => { - setVal(value) - }} - onBlur={() => { - setVal((+val).toFixed(2).toString()) - }} - style={{ width: 200, maxHeight: 300, margin: 'auto' }} - /> -
- ) - } + render: args => } diff --git a/src/components/Modals/RoutesModal/index.tsx b/src/components/Modals/RoutesModal/index.tsx index 4364401d..cbac0a7d 100644 --- a/src/components/Modals/RoutesModal/index.tsx +++ b/src/components/Modals/RoutesModal/index.tsx @@ -2,6 +2,7 @@ import React from 'react' import { Link } from 'react-router-dom' import useStyles from './style' import { Grid, Popover, Typography } from '@mui/material' +import classNames from 'classnames' export interface IRoutesModal { routes: string[] @@ -47,30 +48,34 @@ export const RoutesModal: React.FC = ({ horizontal: 'center' }}> + Navigation {routes.map(route => ( pathRegex.test(current))) + ? classes.current + : null + )} onClick={() => { onSelect(route) handleClose() }}> - pathRegex.test(current))) - ? classes.current - : classes.name - }> - {route} - + {route} ))} + {(typeof onFaucet !== 'undefined' || + typeof onRPC !== 'undefined' || + typeof onChainSelect !== 'undefined') && ( + Wallet + )} {typeof onFaucet !== 'undefined' ? ( { width: 160, borderRadius: 20, marginTop: 24, - padding: 8 + padding: '8px 12px' }, listItem: { paddingTop: 2, - color: colors.invariant.lightGrey, + color: colors.invariant.textGrey, + padding: 8, + background: colors.invariant.component, borderRadius: 11, - textAlign: 'center', width: '100%', paddingBlock: 8, cursor: 'pointer', '&:not(:last-child)': { marginBottom: 8 - }, - '&:hover': { - background: colors.invariant.light, - - '& p': { - color: colors.white.main, - ...typography.heading4 - } } }, name: { textTransform: 'capitalize', - color: colors.invariant.light, - ...typography.heading4 + color: colors.invariant.textGrey, + ...typography.body3 }, current: { - textTransform: 'capitalize', - ...typography.heading4, - color: colors.white.main + background: colors.invariant.light, + color: colors.white.main, + + '& a p': { + color: colors.white.main, + visibility: 'visible' + }, + '& *': { + visibility: 'visible' + } }, paper: { background: 'transparent', @@ -46,6 +46,14 @@ const useStyles = makeStyles()(() => { }, link: { textDecoration: 'none' + }, + subtitle: { + ...typography.caption2, + color: colors.invariant.textGrey, + opacity: 0.4, + background: colors.invariant.component, + borderRadius: 11, + padding: 4 } } }) diff --git a/src/components/NewPosition/DepositSelector/DepositSelector.stories.tsx b/src/components/NewPosition/DepositSelector/DepositSelector.stories.tsx index d016bd53..0866b03f 100644 --- a/src/components/NewPosition/DepositSelector/DepositSelector.stories.tsx +++ b/src/components/NewPosition/DepositSelector/DepositSelector.stories.tsx @@ -1,12 +1,16 @@ import type { Meta, StoryObj } from '@storybook/react' import { fn } from '@storybook/test' import { useState } from 'react' -import DepositSelector from './DepositSelector' +import DepositSelector, { IDepositSelector } from './DepositSelector' +import { SwapToken } from '@store/selectors/wallet' +import { Provider } from 'react-redux' +import { store } from '@store/index' +import { MemoryRouter } from 'react-router-dom' -const tokens: any = { +const tokens: Record = { So11111111111111111111111111111111111111112: { - balance: 111, - decimals: 6, + balance: 111 as any, + decimals: 6 as any, symbol: 'SOL', assetAddress: 'So11111111111111111111111111111111111111112', name: 'Wrapped Solana', @@ -14,8 +18,8 @@ const tokens: any = { 'https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/So11111111111111111111111111111111111111112/logo.png' }, '9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E': { - balance: 1000, - decimals: 6, + balance: 1000 as any, + decimals: 6 as any, symbol: 'BTC', assetAddress: '9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E', name: 'BTC', @@ -23,8 +27,8 @@ const tokens: any = { 'https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E/logo.png' }, EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: { - balance: 222, - decimals: 6, + balance: 222 as any, + decimals: 6 as any, symbol: 'USDC', assetAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', name: 'USD coin', @@ -35,12 +39,36 @@ const tokens: any = { const meta = { title: 'Components/DepositSelector', - component: DepositSelector + component: DepositSelector, + decorators: [ + Story => ( + + + + + + ) + ] } satisfies Meta export default meta type Story = StoryObj +const PrimaryComponent: React.FC = args => { + const [feeTierIndex, setFeeTierIndex] = useState(0) + + return ( + { + setFeeTierIndex(fee) + }} + feeTierIndex={feeTierIndex} + poolIndex={0} + /> + ) +} + export const Primary: Story = { args: { commonTokens: [ @@ -48,15 +76,7 @@ export const Primary: Story = { '9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E', 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' ], - concentrationArray: [ - 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141 - ], + concentrationArray: Array.from({ length: 141 }, (_, i) => i + 2), concentrationIndex: 0, feeTiers: [0.02, 0.04, 0.1, 0.3, 1, 2, 5], handleAddToken: fn(), @@ -68,7 +88,7 @@ export const Primary: Story = { onAddLiquidity: fn(), onHideUnknownTokensChange: fn(), onReverseTokens: fn(), - poolIndex: 0 as any, + poolIndex: 0, positionOpeningMethod: 'range', progress: 'success', setPositionTokens: fn(), @@ -95,17 +115,5 @@ export const Primary: Story = { isGetLiquidityError: false, ticksLoading: false }, - render: args => { - const [feeTierIndex, setFeeTierIndex] = useState(0) - return ( - { - setFeeTierIndex(fee) - }} - feeTierIndex={feeTierIndex} - poolIndex={0} - /> - ) - } + render: args => } diff --git a/src/components/NewPosition/FeeSwitch/FeeSwitch.stories.tsx b/src/components/NewPosition/FeeSwitch/FeeSwitch.stories.tsx index 914201c3..e6fcf830 100644 --- a/src/components/NewPosition/FeeSwitch/FeeSwitch.stories.tsx +++ b/src/components/NewPosition/FeeSwitch/FeeSwitch.stories.tsx @@ -11,6 +11,21 @@ const meta = { export default meta type Story = StoryObj +const PrimaryComponent: React.FC = args => { + const [currentTier, setCurrentTier] = useState(0) + + return ( + { + setCurrentTier(a) + }} + showOnlyPercents + /> + ) +} + export const Primary: Story = { args: { currentValue: 0, @@ -18,17 +33,5 @@ export const Primary: Story = { onSelect: fn(), bestTierIndex: 2 }, - render: args => { - const [currentTier, setCurrentTier] = useState(0) - return ( - { - setCurrentTier(a) - }} - showOnlyPercents - /> - ) - } + render: args => } diff --git a/src/components/NewPosition/PoolInit/PoolInit.stories.tsx b/src/components/NewPosition/PoolInit/PoolInit.stories.tsx index 96154a4b..67ddad62 100644 --- a/src/components/NewPosition/PoolInit/PoolInit.stories.tsx +++ b/src/components/NewPosition/PoolInit/PoolInit.stories.tsx @@ -2,15 +2,42 @@ import type { Meta, StoryObj } from '@storybook/react' import PoolInit from './PoolInit' import { fn } from '@storybook/test' import { useState } from 'react' +import { Provider } from 'react-redux' +import { MemoryRouter } from 'react-router-dom' +import { store } from '@store/index' const meta = { title: 'Components/PoolInit', - component: PoolInit + component: PoolInit, + decorators: [ + Story => ( + + + + + + ) + ] } satisfies Meta export default meta type Story = StoryObj +const PrimaryComponent: React.FC = args => { + const [midPrice, setMidPrice] = useState(0n) + + return ( + + ) +} + export const Primary: Story = { args: { currentPairReversed: false, @@ -29,17 +56,5 @@ export const Primary: Story = { setConcentrationIndex: fn(), positionOpeningMethod: 'range' }, - render: args => { - const [midPrice, setMidPrice] = useState(0n) - return ( - - ) - } + render: args => } diff --git a/src/components/NewPosition/RangeSelector/RangeSelector.stories.tsx b/src/components/NewPosition/RangeSelector/RangeSelector.stories.tsx index 591a4f18..1be8529c 100644 --- a/src/components/NewPosition/RangeSelector/RangeSelector.stories.tsx +++ b/src/components/NewPosition/RangeSelector/RangeSelector.stories.tsx @@ -2,15 +2,44 @@ import type { Meta, StoryObj } from '@storybook/react' import { fn } from '@storybook/test' import { useState } from 'react' import RangeSelector from './RangeSelector' +import { Provider } from 'react-redux' +import { store } from '@store/index' +import { MemoryRouter } from 'react-router-dom' const meta = { title: 'Components/RangeSelector', - component: RangeSelector + component: RangeSelector, + decorators: [ + Story => ( + + + + + + ) + ] } satisfies Meta export default meta type Story = StoryObj +const PrimaryComponent: React.FC = args => { + const [concentrationIndex, setConcentrationIndex] = useState(2) + + return ( + + ) +} + export const Primary: Story = { args: { currentPairReversed: false, @@ -19,7 +48,7 @@ export const Primary: Story = { concentrationArray: [0.1, 0.2, 0.3, 0.4, 0.5], concentrationIndex: 2, data: [{ x: 0, y: 0, index: 0 as any }], - getTicksInsideRange: fn(), + getTicksInsideRange: () => ({ leftInRange: 0n as any, rightInRange: 100n as any }), minimumSliderIndex: 0, onChangeRange: fn(), poolIndex: 0, @@ -27,7 +56,7 @@ export const Primary: Story = { setConcentrationIndex: fn(), ticksLoading: false, tickSpacing: 1 as any, - tokenASymbol: 'BTC', + tokenASymbol: 'SOL', tokenBSymbol: 'ETH', xDecimal: 9 as any, yDecimal: 12 as any, @@ -39,19 +68,5 @@ export const Primary: Story = { onlyUserPositions: false, setOnlyUserPositions: fn() }, - render: args => { - const [concentrationIndex, setConcentrationIndex] = useState(2) - return ( - - ) - } + render: args => } diff --git a/src/components/PositionDetails/SinglePositionPlot/SinglePositionPlot.stories.tsx b/src/components/PositionDetails/SinglePositionPlot/SinglePositionPlot.stories.tsx index 3bd3c391..73a88469 100644 --- a/src/components/PositionDetails/SinglePositionPlot/SinglePositionPlot.stories.tsx +++ b/src/components/PositionDetails/SinglePositionPlot/SinglePositionPlot.stories.tsx @@ -2,15 +2,19 @@ import type { Meta, StoryObj } from '@storybook/react' import { fn } from '@storybook/test' import { MemoryRouter } from 'react-router-dom' import SinglePositionPlot from './SinglePositionPlot' +import { Provider } from 'react-redux' +import { store } from '@store/index' const meta = { title: 'Components/SinglePositionPlot', component: SinglePositionPlot, decorators: [ Story => ( - - - + + + + + ) ] } satisfies Meta diff --git a/src/components/Stats/PoolListItem/PoolListItem.tsx b/src/components/Stats/PoolListItem/PoolListItem.tsx index 931147b6..cbc66df2 100644 --- a/src/components/Stats/PoolListItem/PoolListItem.tsx +++ b/src/components/Stats/PoolListItem/PoolListItem.tsx @@ -8,7 +8,7 @@ import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp' import { useNavigate } from 'react-router-dom' import icons from '@static/icons' -export enum SortType { +enum SortType { NAME_ASC, NAME_DESC, FEE_ASC, diff --git a/src/components/Stats/TokenListItem/TokenListItem.tsx b/src/components/Stats/TokenListItem/TokenListItem.tsx index 076ea915..80678262 100644 --- a/src/components/Stats/TokenListItem/TokenListItem.tsx +++ b/src/components/Stats/TokenListItem/TokenListItem.tsx @@ -6,7 +6,7 @@ import { useStyles } from './style' import { Grid, Typography, useMediaQuery } from '@mui/material' import { formatNumbers, showPrefix } from '@utils/utils' -export enum SortType { +enum SortType { NAME_ASC, NAME_DESC, PRICE_ASC, diff --git a/src/components/Swap/ExchangeRate/ExchangeRate.stories.tsx b/src/components/Swap/ExchangeRate/ExchangeRate.stories.tsx index 6e371787..a7f335a0 100644 --- a/src/components/Swap/ExchangeRate/ExchangeRate.stories.tsx +++ b/src/components/Swap/ExchangeRate/ExchangeRate.stories.tsx @@ -1,10 +1,22 @@ +import { store } from '@store/index' import ExchangeRate from './ExchangeRate' import type { Meta, StoryObj } from '@storybook/react' import { fn } from '@storybook/test' +import { Provider } from 'react-redux' +import { MemoryRouter } from 'react-router-dom' const meta = { title: 'Components/ExchangeRate', - component: ExchangeRate + component: ExchangeRate, + decorators: [ + Story => ( + + + + + + ) + ] } satisfies Meta export default meta diff --git a/src/components/Swap/Swap.stories.tsx b/src/components/Swap/Swap.stories.tsx index 2bff7e08..b1f1e933 100644 --- a/src/components/Swap/Swap.stories.tsx +++ b/src/components/Swap/Swap.stories.tsx @@ -2,10 +2,22 @@ import { Status } from '@store/reducers/wallet' import type { Meta, StoryObj } from '@storybook/react' import { fn } from '@storybook/test' import Swap from './Swap' +import { Provider } from 'react-redux' +import { store } from '@store/index' +import { MemoryRouter } from 'react-router-dom' const meta = { title: 'Components/Swap', - component: Swap + component: Swap, + decorators: [ + Story => ( + + + + + + ) + ] } satisfies Meta export default meta @@ -49,7 +61,7 @@ export const Primary: Story = { amountOut: 1000000000000 as any, priceImpact: 1.23, targetSqrtPrice: 1000000000000000000000000 as any, - fee: 200000000n, + fee: 200000000 as any, errors: [] }, simulateSwap: fn(), @@ -60,21 +72,21 @@ export const Primary: Story = { diff --git a/src/components/Swap/TokensInfo/TokensInfo.stories.tsx b/src/components/Swap/TokensInfo/TokensInfo.stories.tsx index ffaf3256..26d26cf3 100644 --- a/src/components/Swap/TokensInfo/TokensInfo.stories.tsx +++ b/src/components/Swap/TokensInfo/TokensInfo.stories.tsx @@ -2,10 +2,22 @@ import type { Meta, StoryObj } from '@storybook/react' import TokensInfo from './TokensInfo' import { fn } from '@storybook/test' import { BTC, ETH } from '@store/consts/static' +import { Provider } from 'react-redux' +import { store } from '@store/index' +import { MemoryRouter } from 'react-router-dom' const meta = { title: 'Components/TokensInfo', - component: TokensInfo + component: TokensInfo, + decorators: [ + Story => ( + + + + + + ) + ] } satisfies Meta export default meta diff --git a/src/components/Swap/TransactionDetailsBox/TransactionDetailsBox.stories.tsx b/src/components/Swap/TransactionDetailsBox/TransactionDetailsBox.stories.tsx index 38e14d6e..fbcbe07e 100644 --- a/src/components/Swap/TransactionDetailsBox/TransactionDetailsBox.stories.tsx +++ b/src/components/Swap/TransactionDetailsBox/TransactionDetailsBox.stories.tsx @@ -19,6 +19,6 @@ export const Primary: Story = { isLoadingRate: false }, render: args => { - return + return } } diff --git a/src/pages/StatsPage/index.tsx b/src/pages/StatsPage/index.tsx index b650c2a9..a4f6ecca 100644 --- a/src/pages/StatsPage/index.tsx +++ b/src/pages/StatsPage/index.tsx @@ -1,6 +1,6 @@ import { Grid } from '@mui/material' import { useStyles } from './styles' -import workInProgress from '../../static/png/work-in-progress.png' +import comingSoon from '../../static/png/coming-soon.png' // import WrappedStats from '@containers/WrappedStats/WrappedStats' export const StatsPage: React.FC = () => { @@ -8,7 +8,7 @@ export const StatsPage: React.FC = () => { return ( - Work in progress icon + Coming soon {/* */} ) diff --git a/src/static/png/coming-soon.png b/src/static/png/coming-soon.png new file mode 100644 index 0000000000000000000000000000000000000000..a36b3cc7d92a538f0c1ed0341a9899a29c417c0a GIT binary patch literal 21444 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 literal 0 HcmV?d00001 diff --git a/src/static/png/work-in-progress.png b/src/static/png/work-in-progress.png deleted file mode 100644 index b47503f6bb447b3ea7a55fc200211685d6fac76c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23049 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 Date: Wed, 28 Aug 2024 12:51:41 +0200 Subject: [PATCH 2/2] fix sortType imports --- src/components/Stats/PoolList/PoolList.tsx | 21 +++--- .../Stats/PoolListItem/PoolListItem.tsx | 58 +++++++--------- .../Stats.PoolListItem.stories.tsx | 5 +- .../Stats.TokenListItem.stories.tsx | 5 +- .../Stats/TokenListItem/TokenListItem.tsx | 68 ++++++++----------- .../Stats/TokensList/TokensList.tsx | 25 +++---- src/store/consts/static.ts | 26 +++++++ 7 files changed, 107 insertions(+), 101 deletions(-) diff --git a/src/components/Stats/PoolList/PoolList.tsx b/src/components/Stats/PoolList/PoolList.tsx index b42c78d0..51601fe6 100644 --- a/src/components/Stats/PoolList/PoolList.tsx +++ b/src/components/Stats/PoolList/PoolList.tsx @@ -1,9 +1,10 @@ import React, { useMemo, useEffect } from 'react' -import PoolListItem, { SortType } from '@components/Stats/PoolListItem/PoolListItem' +import PoolListItem from '@components/Stats/PoolListItem/PoolListItem' import { useStyles } from './style' import { Grid } from '@mui/material' import { PaginationList } from '@components/PaginationList/PaginationList' +import { SortTypePoolList } from '@store/consts/static' interface PoolListInterface { data: Array<{ @@ -26,29 +27,29 @@ interface PoolListInterface { const PoolList: React.FC = ({ data }) => { const { classes } = useStyles() const [page, setPage] = React.useState(1) - const [sortType, setSortType] = React.useState(SortType.VOLUME_DESC) + const [sortType, setSortType] = React.useState(SortTypePoolList.VOLUME_DESC) const sortedData = useMemo(() => { switch (sortType) { - case SortType.NAME_ASC: + case SortTypePoolList.NAME_ASC: return data.sort((a, b) => `${a.symbolFrom}/${a.symbolTo}`.localeCompare(`${b.symbolFrom}/${b.symbolTo}`) ) - case SortType.NAME_DESC: + case SortTypePoolList.NAME_DESC: return data.sort((a, b) => `${b.symbolFrom}/${b.symbolTo}`.localeCompare(`${a.symbolFrom}/${a.symbolTo}`) ) - case SortType.FEE_ASC: + case SortTypePoolList.FEE_ASC: return data.sort((a, b) => a.fee - b.fee) - case SortType.FEE_DESC: + case SortTypePoolList.FEE_DESC: return data.sort((a, b) => b.fee - a.fee) - case SortType.VOLUME_ASC: + case SortTypePoolList.VOLUME_ASC: return data.sort((a, b) => (a.volume === b.volume ? a.TVL - b.TVL : a.volume - b.volume)) - case SortType.VOLUME_DESC: + case SortTypePoolList.VOLUME_DESC: return data.sort((a, b) => (a.volume === b.volume ? b.TVL - a.TVL : b.volume - a.volume)) - case SortType.TVL_ASC: + case SortTypePoolList.TVL_ASC: return data.sort((a, b) => (a.TVL === b.TVL ? a.volume - b.volume : a.TVL - b.TVL)) - case SortType.TVL_DESC: + case SortTypePoolList.TVL_DESC: return data.sort((a, b) => (a.TVL === b.TVL ? b.volume - a.volume : b.TVL - a.TVL)) // case SortType.APY_ASC: // return data.sort((a, b) => a.apy - b.apy) diff --git a/src/components/Stats/PoolListItem/PoolListItem.tsx b/src/components/Stats/PoolListItem/PoolListItem.tsx index cbc66df2..a7e4d614 100644 --- a/src/components/Stats/PoolListItem/PoolListItem.tsx +++ b/src/components/Stats/PoolListItem/PoolListItem.tsx @@ -7,19 +7,7 @@ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown' import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp' import { useNavigate } from 'react-router-dom' import icons from '@static/icons' - -enum SortType { - NAME_ASC, - NAME_DESC, - FEE_ASC, - FEE_DESC, - VOLUME_ASC, - VOLUME_DESC, - TVL_ASC, - TVL_DESC - // APY_ASC, - // APY_DESC -} +import { SortTypePoolList } from '@store/consts/static' interface IProps { TVL?: number @@ -31,8 +19,8 @@ interface IProps { iconFrom?: string iconTo?: string tokenIndex?: number - sortType?: SortType - onSort?: (type: SortType) => void + sortType?: SortTypePoolList + onSort?: (type: SortTypePoolList) => void hideBottomLine?: boolean // apy?: number // apyData?: { @@ -157,16 +145,16 @@ const PoolListItem: React.FC = ({ { - if (sortType === SortType.NAME_ASC) { - onSort?.(SortType.NAME_DESC) + if (sortType === SortTypePoolList.NAME_ASC) { + onSort?.(SortTypePoolList.NAME_DESC) } else { - onSort?.(SortType.NAME_ASC) + onSort?.(SortTypePoolList.NAME_ASC) } }}> Name - {sortType === SortType.NAME_ASC ? ( + {sortType === SortTypePoolList.NAME_ASC ? ( - ) : sortType === SortType.NAME_DESC ? ( + ) : sortType === SortTypePoolList.NAME_DESC ? ( ) : null} @@ -191,48 +179,48 @@ const PoolListItem: React.FC = ({ { - if (sortType === SortType.FEE_ASC) { - onSort?.(SortType.FEE_DESC) + if (sortType === SortTypePoolList.FEE_ASC) { + onSort?.(SortTypePoolList.FEE_DESC) } else { - onSort?.(SortType.FEE_ASC) + onSort?.(SortTypePoolList.FEE_ASC) } }}> Fee - {sortType === SortType.FEE_ASC ? ( + {sortType === SortTypePoolList.FEE_ASC ? ( - ) : sortType === SortType.FEE_DESC ? ( + ) : sortType === SortTypePoolList.FEE_DESC ? ( ) : null} { - if (sortType === SortType.VOLUME_DESC) { - onSort?.(SortType.VOLUME_ASC) + if (sortType === SortTypePoolList.VOLUME_DESC) { + onSort?.(SortTypePoolList.VOLUME_ASC) } else { - onSort?.(SortType.VOLUME_DESC) + onSort?.(SortTypePoolList.VOLUME_DESC) } }}> Volume 24H - {sortType === SortType.VOLUME_ASC ? ( + {sortType === SortTypePoolList.VOLUME_ASC ? ( - ) : sortType === SortType.VOLUME_DESC ? ( + ) : sortType === SortTypePoolList.VOLUME_DESC ? ( ) : null} { - if (sortType === SortType.TVL_DESC) { - onSort?.(SortType.TVL_ASC) + if (sortType === SortTypePoolList.TVL_DESC) { + onSort?.(SortTypePoolList.TVL_ASC) } else { - onSort?.(SortType.TVL_DESC) + onSort?.(SortTypePoolList.TVL_DESC) } }}> TVL - {sortType === SortType.TVL_ASC ? ( + {sortType === SortTypePoolList.TVL_ASC ? ( - ) : sortType === SortType.TVL_DESC ? ( + ) : sortType === SortTypePoolList.TVL_DESC ? ( ) : null} diff --git a/src/components/Stats/PoolListItem/Stats.PoolListItem.stories.tsx b/src/components/Stats/PoolListItem/Stats.PoolListItem.stories.tsx index beceeb52..27f22e92 100644 --- a/src/components/Stats/PoolListItem/Stats.PoolListItem.stories.tsx +++ b/src/components/Stats/PoolListItem/Stats.PoolListItem.stories.tsx @@ -1,9 +1,10 @@ import type { Meta, StoryObj } from '@storybook/react' import { MemoryRouter } from 'react-router-dom' -import PoolListItem, { SortType } from './PoolListItem' +import PoolListItem from './PoolListItem' import { store } from '@store/index' import { Provider } from 'react-redux' import { fn } from '@storybook/test' +import { SortTypePoolList } from '@store/consts/static' const meta = { title: 'Stats/PoolListItem', @@ -28,7 +29,7 @@ export const Header: Story = { args: { displayType: 'header', onSort: fn(), - sortType: SortType.TVL_DESC + sortType: SortTypePoolList.TVL_DESC } } diff --git a/src/components/Stats/TokenListItem/Stats.TokenListItem.stories.tsx b/src/components/Stats/TokenListItem/Stats.TokenListItem.stories.tsx index 4221431c..e22d63af 100644 --- a/src/components/Stats/TokenListItem/Stats.TokenListItem.stories.tsx +++ b/src/components/Stats/TokenListItem/Stats.TokenListItem.stories.tsx @@ -1,9 +1,10 @@ import type { Meta, StoryObj } from '@storybook/react' import { MemoryRouter } from 'react-router-dom' -import TokenListItem, { SortType } from './TokenListItem' +import TokenListItem from './TokenListItem' import { store } from '@store/index' import { Provider } from 'react-redux' import { fn } from '@storybook/test' +import { SortTypeTokenList } from '@store/consts/static' const meta = { title: 'Stats/TokenListItem', @@ -28,7 +29,7 @@ export const Header: Story = { args: { displayType: 'header', onSort: fn(), - sortType: SortType.NAME_ASC + sortType: SortTypeTokenList.NAME_ASC } } diff --git a/src/components/Stats/TokenListItem/TokenListItem.tsx b/src/components/Stats/TokenListItem/TokenListItem.tsx index 80678262..ba3ff490 100644 --- a/src/components/Stats/TokenListItem/TokenListItem.tsx +++ b/src/components/Stats/TokenListItem/TokenListItem.tsx @@ -5,19 +5,7 @@ import ArrowDropUpIcon from '@mui/icons-material/ArrowDropUp' import { useStyles } from './style' import { Grid, Typography, useMediaQuery } from '@mui/material' import { formatNumbers, showPrefix } from '@utils/utils' - -enum SortType { - NAME_ASC, - NAME_DESC, - PRICE_ASC, - PRICE_DESC, - CHANGE_ASC, - CHANGE_DESC, - VOLUME_ASC, - VOLUME_DESC, - TVL_ASC, - TVL_DESC -} +import { SortTypeTokenList } from '@store/consts/static' interface IProps { displayType: string @@ -29,8 +17,8 @@ interface IProps { priceChange?: number volume?: number TVL?: number - sortType?: SortType - onSort?: (type: SortType) => void + sortType?: SortTypeTokenList + onSort?: (type: SortTypeTokenList) => void hideBottomLine?: boolean } @@ -91,32 +79,32 @@ const TokenListItem: React.FC = ({ { - if (sortType === SortType.NAME_ASC) { - onSort?.(SortType.NAME_DESC) + if (sortType === SortTypeTokenList.NAME_ASC) { + onSort?.(SortTypeTokenList.NAME_DESC) } else { - onSort?.(SortType.NAME_ASC) + onSort?.(SortTypeTokenList.NAME_ASC) } }}> Name - {sortType === SortType.NAME_ASC ? ( + {sortType === SortTypeTokenList.NAME_ASC ? ( - ) : sortType === SortType.NAME_DESC ? ( + ) : sortType === SortTypeTokenList.NAME_DESC ? ( ) : null} { - if (sortType === SortType.PRICE_ASC) { - onSort?.(SortType.PRICE_DESC) + if (sortType === SortTypeTokenList.PRICE_ASC) { + onSort?.(SortTypeTokenList.PRICE_DESC) } else { - onSort?.(SortType.PRICE_ASC) + onSort?.(SortTypeTokenList.PRICE_ASC) } }}> Price - {sortType === SortType.PRICE_ASC ? ( + {sortType === SortTypeTokenList.PRICE_ASC ? ( - ) : sortType === SortType.PRICE_DESC ? ( + ) : sortType === SortTypeTokenList.PRICE_DESC ? ( ) : null} @@ -124,16 +112,16 @@ const TokenListItem: React.FC = ({ { - if (sortType === SortType.CHANGE_ASC) { - onSort?.(SortType.CHANGE_DESC) + if (sortType === SortTypeTokenList.CHANGE_ASC) { + onSort?.(SortTypeTokenList.CHANGE_DESC) } else { - onSort?.(SortType.CHANGE_ASC) + onSort?.(SortTypeTokenList.CHANGE_ASC) } }}> Price change - {sortType === SortType.CHANGE_ASC ? ( + {sortType === SortTypeTokenList.CHANGE_ASC ? ( - ) : sortType === SortType.CHANGE_DESC ? ( + ) : sortType === SortTypeTokenList.CHANGE_DESC ? ( ) : null} @@ -141,32 +129,32 @@ const TokenListItem: React.FC = ({ { - if (sortType === SortType.VOLUME_DESC) { - onSort?.(SortType.VOLUME_ASC) + if (sortType === SortTypeTokenList.VOLUME_DESC) { + onSort?.(SortTypeTokenList.VOLUME_ASC) } else { - onSort?.(SortType.VOLUME_DESC) + onSort?.(SortTypeTokenList.VOLUME_DESC) } }}> Volume 24H - {sortType === SortType.VOLUME_ASC ? ( + {sortType === SortTypeTokenList.VOLUME_ASC ? ( - ) : sortType === SortType.VOLUME_DESC ? ( + ) : sortType === SortTypeTokenList.VOLUME_DESC ? ( ) : null} { - if (sortType === SortType.TVL_DESC) { - onSort?.(SortType.TVL_ASC) + if (sortType === SortTypeTokenList.TVL_DESC) { + onSort?.(SortTypeTokenList.TVL_ASC) } else { - onSort?.(SortType.TVL_DESC) + onSort?.(SortTypeTokenList.TVL_DESC) } }}> TVL - {sortType === SortType.TVL_ASC ? ( + {sortType === SortTypeTokenList.TVL_ASC ? ( - ) : sortType === SortType.TVL_DESC ? ( + ) : sortType === SortTypeTokenList.TVL_DESC ? ( ) : null} diff --git a/src/components/Stats/TokensList/TokensList.tsx b/src/components/Stats/TokensList/TokensList.tsx index a6b28f23..b283be25 100644 --- a/src/components/Stats/TokensList/TokensList.tsx +++ b/src/components/Stats/TokensList/TokensList.tsx @@ -1,9 +1,10 @@ -import TokenListItem, { SortType } from '../TokenListItem/TokenListItem' +import TokenListItem from '../TokenListItem/TokenListItem' import React, { useEffect, useMemo, useState } from 'react' import { theme } from '@static/theme' import useStyles from './style' import { Grid, useMediaQuery } from '@mui/material' import { PaginationList } from '@components/PaginationList/PaginationList' +import { SortTypeTokenList } from '@store/consts/static' export interface ITokensListData { icon: string @@ -22,39 +23,39 @@ export interface ITokensList { const TokensList: React.FC = ({ data }) => { const { classes } = useStyles() const [page, setPage] = useState(1) - const [sortType, setSortType] = React.useState(SortType.VOLUME_DESC) + const [sortType, setSortType] = React.useState(SortTypeTokenList.VOLUME_DESC) const isXsDown = useMediaQuery(theme.breakpoints.down('xs')) const sortedData = useMemo(() => { switch (sortType) { - case SortType.NAME_ASC: + case SortTypeTokenList.NAME_ASC: return data.sort((a, b) => isXsDown ? a.symbol.localeCompare(b.symbol) : `${a.name} (${a.symbol})`.localeCompare(`${b.name} (${b.symbol})`) ) - case SortType.NAME_DESC: + case SortTypeTokenList.NAME_DESC: return data.sort((a, b) => isXsDown ? b.symbol.localeCompare(a.symbol) : `${b.name} (${b.symbol})`.localeCompare(`${a.name} (${a.symbol})`) ) - case SortType.PRICE_ASC: + case SortTypeTokenList.PRICE_ASC: return data.sort((a, b) => a.price - b.price) - case SortType.PRICE_DESC: + case SortTypeTokenList.PRICE_DESC: return data.sort((a, b) => b.price - a.price) - case SortType.CHANGE_ASC: + case SortTypeTokenList.CHANGE_ASC: return data.sort((a, b) => a.priceChange - b.priceChange) - case SortType.CHANGE_DESC: + case SortTypeTokenList.CHANGE_DESC: return data.sort((a, b) => b.priceChange - a.priceChange) - case SortType.VOLUME_ASC: + case SortTypeTokenList.VOLUME_ASC: return data.sort((a, b) => (a.volume === b.volume ? a.TVL - b.TVL : a.volume - b.volume)) - case SortType.VOLUME_DESC: + case SortTypeTokenList.VOLUME_DESC: return data.sort((a, b) => (a.volume === b.volume ? b.TVL - a.TVL : b.volume - a.volume)) - case SortType.TVL_ASC: + case SortTypeTokenList.TVL_ASC: return data.sort((a, b) => (a.TVL === b.TVL ? a.volume - b.volume : a.TVL - b.TVL)) - case SortType.TVL_DESC: + case SortTypeTokenList.TVL_DESC: return data.sort((a, b) => (a.TVL === b.TVL ? b.volume - a.volume : b.TVL - a.TVL)) } }, [data, sortType, isXsDown]) diff --git a/src/store/consts/static.ts b/src/store/consts/static.ts index 74c442f4..f3e37850 100644 --- a/src/store/consts/static.ts +++ b/src/store/consts/static.ts @@ -296,3 +296,29 @@ export const CHAINS = [ { name: Chain.AlephZero, address: 'https://azero.invariant.app/swap' }, { name: Chain.Eclipse, address: 'https://eclipse.invariant.app/swap' } ] + +export const enum SortTypePoolList { + NAME_ASC, + NAME_DESC, + FEE_ASC, + FEE_DESC, + VOLUME_ASC, + VOLUME_DESC, + TVL_ASC, + TVL_DESC + // APY_ASC, + // APY_DESC +} + +export const enum SortTypeTokenList { + NAME_ASC, + NAME_DESC, + PRICE_ASC, + PRICE_DESC, + CHANGE_ASC, + CHANGE_DESC, + VOLUME_ASC, + VOLUME_DESC, + TVL_ASC, + TVL_DESC +}