diff --git a/.github/workflows/cypress-explorer-e2e.yml b/.github/workflows/cypress-explorer-e2e.yml index f1c5081c3..43633f7a0 100644 --- a/.github/workflows/cypress-explorer-e2e.yml +++ b/.github/workflows/cypress-explorer-e2e.yml @@ -98,7 +98,7 @@ jobs: while read -r file; do mv "${file}" "$(echo ${file} | sed 's|:|-|g')" done< <(find /home/runner/.vegacapsule/testnet/logs -type f) - + - uses: actions/upload-artifact@v2 if: ${{ always() }} with: diff --git a/apps/trading-e2e/src/integration/market-info.cy.ts b/apps/trading-e2e/src/integration/market-info.cy.ts index 00ac31d66..b73a04ebb 100644 --- a/apps/trading-e2e/src/integration/market-info.cy.ts +++ b/apps/trading-e2e/src/integration/market-info.cy.ts @@ -183,12 +183,12 @@ describe('market info is displayed', { tags: '@smoke' }, () => { .first() .should('have.text', 'View governance proposal') .and('have.attr', 'href') - .and('contain', '/governance/market-0'); + .and('contain', '/proposals/market-0'); cy.getByTestId(externalLink) .eq(1) .should('have.text', 'Propose a change to market') .and('have.attr', 'href') - .and('contain', '/governance/propose/update-market'); + .and('contain', '/proposals/propose/update-market'); }); afterEach('close toggle', () => { diff --git a/apps/trading-e2e/src/integration/market-summary.cy.ts b/apps/trading-e2e/src/integration/market-summary.cy.ts index 165ae225c..f3c7bca86 100644 --- a/apps/trading-e2e/src/integration/market-summary.cy.ts +++ b/apps/trading-e2e/src/integration/market-summary.cy.ts @@ -49,7 +49,7 @@ describe('Market proposal notification', { tags: '@smoke' }, () => { cy.getByTestId('external-link').should( 'have.attr', 'href', - 'https://stagnet3.token.vega.xyz/governance/123' + 'https://stagnet3.token.vega.xyz/proposals/123' ); }); }); diff --git a/apps/trading-e2e/src/integration/markets.cy.ts b/apps/trading-e2e/src/integration/markets.cy.ts index c01038e16..0c53bff3c 100644 --- a/apps/trading-e2e/src/integration/markets.cy.ts +++ b/apps/trading-e2e/src/integration/markets.cy.ts @@ -106,7 +106,7 @@ describe('markets table', { tags: '@smoke' }, () => { .and( 'have.attr', 'href', - 'https://stagnet3.token.vega.xyz/governance/propose/new-market' + 'https://stagnet3.token.vega.xyz/proposals/propose/new-market' ); }); }); diff --git a/apps/trading/components/app-loader/index.tsx b/apps/trading/components/app-loader/index.tsx index 17844f4ad..ac41da35a 100644 --- a/apps/trading/components/app-loader/index.tsx +++ b/apps/trading/components/app-loader/index.tsx @@ -8,8 +8,7 @@ import { Web3Provider as Web3ProviderInternal, useWeb3ConnectStore, } from '@vegaprotocol/web3'; -import { AsyncRenderer, Splash } from '@vegaprotocol/ui-toolkit'; -import { t } from '@vegaprotocol/react-helpers'; +import { AsyncRenderer, Loader } from '@vegaprotocol/ui-toolkit'; interface AppLoaderProps { children: ReactNode; @@ -21,10 +20,7 @@ interface AppLoaderProps { */ export function AppLoader({ children }: AppLoaderProps) { return ( - {t('Loading...')}} - cache={cacheConfig} - > + } cache={cacheConfig}> {children} ); diff --git a/apps/trading/components/preloader/preloader.tsx b/apps/trading/components/preloader/preloader.tsx new file mode 100644 index 000000000..7ae503363 --- /dev/null +++ b/apps/trading/components/preloader/preloader.tsx @@ -0,0 +1,22 @@ +import { Loader } from '@vegaprotocol/ui-toolkit'; + +export const Preloader = () => { + return ( + <> + +
+ +
+ + ); +}; + +export default Preloader; diff --git a/apps/trading/pages/_app.page.tsx b/apps/trading/pages/_app.page.tsx index 82ea48e2c..59206bf2e 100644 --- a/apps/trading/pages/_app.page.tsx +++ b/apps/trading/pages/_app.page.tsx @@ -1,4 +1,5 @@ import Head from 'next/head'; +import dynamic from 'next/dynamic'; import type { AppProps } from 'next/app'; import { Navbar } from '../components/navbar'; import { t } from '@vegaprotocol/react-helpers'; @@ -22,6 +23,7 @@ import { } from '@vegaprotocol/environment'; import { AppLoader, Web3Provider } from '../components/app-loader'; import './styles.css'; +import './gen-styles.scss'; import { usePageTitleStore } from '../stores'; import { Footer } from '../components/footer'; import { useEffect, useMemo, useState } from 'react'; @@ -67,7 +69,7 @@ function AppBody({ Component }: AppProps) { const { VEGA_ENV } = useEnvironment(); return ( - <> +
{/* Cannot use meta tags in _document.page.tsx see https://nextjs.org/docs/messages/no-document-viewport-meta */} @@ -76,7 +78,7 @@ function AppBody({ Component }: AppProps) { -
+
@@ -92,10 +94,17 @@ function AppBody({ Component }: AppProps) { - +
); } +const DynamicLoader = dynamic( + () => import('../components/preloader/preloader'), + { + loading: () => <>Loading..., + } +); + function VegaTradingApp(props: AppProps) { const [mounted, setMounted] = useState(false); @@ -106,7 +115,9 @@ function VegaTradingApp(props: AppProps) { setMounted(true); }, []); - if (!mounted) return null; + if (!mounted) { + return ; + } return ( diff --git a/apps/trading/pages/gen-styles.scss b/apps/trading/pages/gen-styles.scss new file mode 100644 index 000000000..6737f9167 --- /dev/null +++ b/apps/trading/pages/gen-styles.scss @@ -0,0 +1,50 @@ +.pre-loader { + display: flex; + width: 100%; + min-height: 100vh; + justify-content: center; + align-items: center; + + @for $i from 0 through 16 { + .loader-item:nth-child(#{$i}) { + @if $i % 2 == 0 { + animation-delay: #{$i * 50 * random(5)}ms; + animation-direction: reverse; + } @else { + animation-delay: #{$i * -50 * random(5)}ms; + animation-direction: alternate; + } + } + } + .pre-loader-center { + align-items: center; + display: flex; + flex-direction: column; + } + .pre-loader-wrapper { + width: 50px; + height: 50px; + display: flex; + flex-wrap: wrap; + } + .loader-item { + width: 10px; + height: 10px; + background: black; + animation: flickering 0.4s steps(2, jump-none) alternate infinite; + } +} +@keyframes flickering { + 0% { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 100% { + opacity: 0; + } +} diff --git a/libs/accounts/src/lib/Accounts.graphql b/libs/accounts/src/lib/Accounts.graphql index d1a83ed0b..ca7bb9ba3 100644 --- a/libs/accounts/src/lib/Accounts.graphql +++ b/libs/accounts/src/lib/Accounts.graphql @@ -31,5 +31,6 @@ subscription AccountEvents($partyId: ID) { balance assetId marketId + partyId } } diff --git a/libs/accounts/src/lib/__generated__/Accounts.ts b/libs/accounts/src/lib/__generated__/Accounts.ts index 0f40e9e85..6246bb756 100644 --- a/libs/accounts/src/lib/__generated__/Accounts.ts +++ b/libs/accounts/src/lib/__generated__/Accounts.ts @@ -17,7 +17,7 @@ export type AccountEventsSubscriptionVariables = Types.Exact<{ }>; -export type AccountEventsSubscription = { __typename?: 'Subscription', accounts: Array<{ __typename?: 'AccountUpdate', type: Types.AccountType, balance: string, assetId: string, marketId?: string | null }> }; +export type AccountEventsSubscription = { __typename?: 'Subscription', accounts: Array<{ __typename?: 'AccountUpdate', type: Types.AccountType, balance: string, assetId: string, marketId?: string | null, partyId: string }> }; export const AccountFieldsFragmentDoc = gql` fragment AccountFields on AccountBalance { @@ -83,6 +83,7 @@ export const AccountEventsDocument = gql` balance assetId marketId + partyId } } `; diff --git a/libs/accounts/src/lib/accounts-data-provider.spec.ts b/libs/accounts/src/lib/accounts-data-provider.spec.ts index 3b695fddd..752cd2dbf 100644 --- a/libs/accounts/src/lib/accounts-data-provider.spec.ts +++ b/libs/accounts/src/lib/accounts-data-provider.spec.ts @@ -26,6 +26,7 @@ describe('getId', () => { balance: '1', assetId: 'assetId', marketId: '', + partyId: '', }) ); expect( @@ -41,6 +42,7 @@ describe('getId', () => { balance: '1', assetId: 'assetId', marketId: 'testId', + partyId: 'partyId', }) ); }); diff --git a/libs/accounts/src/lib/accounts-data-provider.ts b/libs/accounts/src/lib/accounts-data-provider.ts index e33c844ce..db126049a 100644 --- a/libs/accounts/src/lib/accounts-data-provider.ts +++ b/libs/accounts/src/lib/accounts-data-provider.ts @@ -66,6 +66,7 @@ const update = ( balance: delta.balance, market: delta.marketId ? { id: delta.marketId } : null, asset: { id: delta.assetId }, + party: { id: delta.partyId }, }); } }); @@ -182,6 +183,7 @@ export const accountsDataProvider = makeDerivedDataProvider( if (asset) { return { ...account, + partyId: account.party?.id, asset: { ...asset, }, diff --git a/libs/accounts/src/lib/accounts.mock.ts b/libs/accounts/src/lib/accounts.mock.ts index 6f205c399..15ab0891b 100644 --- a/libs/accounts/src/lib/accounts.mock.ts +++ b/libs/accounts/src/lib/accounts.mock.ts @@ -122,6 +122,7 @@ export const accountEventsSubscription = ( balance: '100000000', assetId: 'asset-id', marketId: null, + partyId: 'vega-0', }, ], }; diff --git a/libs/environment/src/hooks/use-links.ts b/libs/environment/src/hooks/use-links.ts index a2952fb75..1600de413 100644 --- a/libs/environment/src/hooks/use-links.ts +++ b/libs/environment/src/hooks/use-links.ts @@ -88,12 +88,12 @@ export const useEtherscanLink = () => { export const BLOG = 'https://blog.vega.xyz/'; // Token pages -export const TOKEN_NEW_MARKET_PROPOSAL = '/governance/propose/new-market'; +export const TOKEN_NEW_MARKET_PROPOSAL = '/proposals/propose/new-market'; export const TOKEN_NEW_NETWORK_PARAM_PROPOSAL = - '/governance/propose/network-parameter'; -export const TOKEN_GOVERNANCE = '/governance'; -export const TOKEN_PROPOSALS = '/governance'; -export const TOKEN_PROPOSAL = '/governance/:id'; + '/proposals/propose/network-parameter'; +export const TOKEN_GOVERNANCE = '/proposals'; +export const TOKEN_PROPOSALS = '/proposals'; +export const TOKEN_PROPOSAL = '/proposals/:id'; // Explorer pages export const EXPLORER_TX = '/txs/:hash'; diff --git a/libs/governance/src/lib/proposals-list/use-column-defs.tsx b/libs/governance/src/lib/proposals-list/use-column-defs.tsx index 88fce616f..9bcdfe9f6 100644 --- a/libs/governance/src/lib/proposals-list/use-column-defs.tsx +++ b/libs/governance/src/lib/proposals-list/use-column-defs.tsx @@ -55,7 +55,7 @@ export const useColumnDefs = () => { const { change } = data?.terms || {}; if (instrumentGuard(change) && VEGA_TOKEN_URL) { if (data?.id) { - const link = `${VEGA_TOKEN_URL}/governance/${data.id}`; + const link = `${VEGA_TOKEN_URL}/proposals/${data.id}`; return ( {change.instrument.code} diff --git a/libs/liquidity/src/lib/liquidity-table.tsx b/libs/liquidity/src/lib/liquidity-table.tsx index 3209c6b9f..b46952eb9 100644 --- a/libs/liquidity/src/lib/liquidity-table.tsx +++ b/libs/liquidity/src/lib/liquidity-table.tsx @@ -43,10 +43,10 @@ export const LiquidityTable = forwardRef( if (!value) return '-'; return `${addDecimalsFormatNumber(value, assetDecimalPlaces ?? 0, 5)}`; }; - const stakeToCcySiskasFormatter = ({ value }: ValueFormatterParams) => { + const stakeToCcyVolumeFormatter = ({ value }: ValueFormatterParams) => { if (!value) return '-'; const newValue = new BigNumber(value) - .times(stakeToCcySiskas ?? 1) + .times(Number(stakeToCcySiskas) || 1) .toString(); return `${addDecimalsFormatNumber(newValue, assetDecimalPlaces ?? 0, 5)}`; }; @@ -121,7 +121,7 @@ export const LiquidityTable = forwardRef( headerTooltip={t( `The liquidity provider's obligation to the market, calculated as the liquidity commitment amount multiplied by the value of the stake_to_ccy_siskas network parameter to convert into units of liquidity volume. The obligation can be met by a combination of LP orders and limit orders on the order book.` )} - valueFormatter={stakeToCcySiskasFormatter} + valueFormatter={stakeToCcyVolumeFormatter} /> ( )} field="balance" type="rightAligned" - valueFormatter={stakeToCcySiskasFormatter} + valueFormatter={stakeToCcyVolumeFormatter} /> { +export const Loader = ({ + size = 'large', + forceTheme, + preloader, +}: LoaderProps) => { const [, forceRender] = useState(false); useEffect(() => { - const interval = setInterval(() => { - forceRender((x) => !x); - }, 100); + const interval = preloader + ? undefined + : setInterval(() => { + forceRender((x) => !x); + }, 100); return () => clearInterval(interval); - }, []); + }, [preloader]); - const itemClasses = classNames({ + const itemClasses = classNames('loader-item', { 'dark:bg-white bg-black': !forceTheme, 'bg-white': forceTheme === 'dark', 'bg-black': forceTheme === 'light', @@ -29,8 +36,11 @@ export const Loader = ({ size = 'large', forceTheme }: LoaderProps) => { const items = size === 'small' ? 9 : 16; return ( -
-
+
+
{new Array(items).fill(null).map((_, i) => { return (