From f257a6e5d40c3a1e21b014c156480410cd8d4147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dragi=C5=A1a=20Spasojevi=C4=87?= Date: Thu, 2 Feb 2023 15:52:53 +0100 Subject: [PATCH] refactor: use next.js routing (#560) --- packages/arb-token-bridge-ui/next.config.js | 4 +- packages/arb-token-bridge-ui/package.json | 3 +- .../src/components/App/App.tsx | 142 +++++------------- .../App/AppConnectionFallbackContainer.tsx | 38 +++++ .../src/components/App/WelcomeDialog.tsx | 6 - .../TransferPanel/TransferPanelMain.tsx | 6 +- packages/arb-token-bridge-ui/src/constants.ts | 2 + .../src/hooks/useArbQueryParams.tsx | 12 +- .../arb-token-bridge-ui/src/pages/404.tsx | 13 ++ .../arb-token-bridge-ui/src/pages/_app.tsx | 5 +- .../arb-token-bridge-ui/src/pages/index.tsx | 10 +- .../TermsOfService.tsx => pages/tos.tsx} | 121 +++++++-------- .../tests/support/index.ts | 4 + vercel.json | 4 +- yarn.lock | 113 ++------------ 15 files changed, 185 insertions(+), 298 deletions(-) create mode 100644 packages/arb-token-bridge-ui/src/components/App/AppConnectionFallbackContainer.tsx create mode 100644 packages/arb-token-bridge-ui/src/pages/404.tsx rename packages/arb-token-bridge-ui/src/{components/TermsOfService/TermsOfService.tsx => pages/tos.tsx} (92%) diff --git a/packages/arb-token-bridge-ui/next.config.js b/packages/arb-token-bridge-ui/next.config.js index 4cfb87fade..0677041453 100644 --- a/packages/arb-token-bridge-ui/next.config.js +++ b/packages/arb-token-bridge-ui/next.config.js @@ -7,5 +7,7 @@ module.exports = { }) return config - } + }, + // https://nextjs.org/docs/api-reference/next.config.js/exportPathMap#adding-a-trailing-slash + trailingSlash: true } diff --git a/packages/arb-token-bridge-ui/package.json b/packages/arb-token-bridge-ui/package.json index 451c07e86e..93fc77375b 100644 --- a/packages/arb-token-bridge-ui/package.json +++ b/packages/arb-token-bridge-ui/package.json @@ -20,13 +20,13 @@ "framer-motion": "^4.1.17", "lodash-es": "^4.17.21", "next": "^13.1.5", + "next-query-params": "^4.1.0", "overmind": "^28.0.1", "overmind-react": "^29.0.1", "query-string": "^7.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-loader-spinner": "^4.0.0", - "react-router-dom": "^5.2.0", "react-use": "^17.2.4", "react-virtualized": "^9.22.3", "tailwind-merge": "^0.9.0", @@ -69,7 +69,6 @@ "@types/node": "^16.6.1", "@types/react": "^17.0.18", "@types/react-dom": "^17.0.9", - "@types/react-router-dom": "^5.1.8", "@types/react-virtualized": "^9.21.20", "@typescript-eslint/eslint-plugin": "^5.44.0", "@typescript-eslint/parser": "^5.44.0", diff --git a/packages/arb-token-bridge-ui/src/components/App/App.tsx b/packages/arb-token-bridge-ui/src/components/App/App.tsx index e831a0b393..d922415de0 100644 --- a/packages/arb-token-bridge-ui/src/components/App/App.tsx +++ b/packages/arb-token-bridge-ui/src/components/App/App.tsx @@ -4,7 +4,6 @@ import { useWallet } from '@arbitrum/use-wallet' import axios from 'axios' import { createOvermind, Overmind } from 'overmind' import { Provider } from 'overmind-react' -import { Route, BrowserRouter as Router, Switch } from 'react-router-dom' import { useLocalStorage } from 'react-use' import { ConnectionState } from '../../util' import { TokenBridgeParams } from 'token-bridge-sdk' @@ -16,7 +15,6 @@ import { config, useActions, useAppState } from '../../state' import { modalProviderOpts } from '../../util/modelProviderOpts' import { Alert } from '../common/Alert' import { Button } from '../common/Button' -import { Layout } from '../common/Layout' import { MainContent } from '../MainContent/MainContent' import { ArbTokenBridgeStoreSync } from '../syncers/ArbTokenBridgeStoreSync' import { BalanceUpdater } from '../syncers/BalanceUpdater' @@ -24,7 +22,6 @@ import { PendingTransactionsUpdater } from '../syncers/PendingTransactionsUpdate import { PWLoadedUpdater } from '../syncers/PWLoadedUpdater' import { RetryableTxnsIncluder } from '../syncers/RetryableTxnsIncluder' import { TokenListSyncer } from '../syncers/TokenListSyncer' -import { TermsOfService, TOS_VERSION } from '../TermsOfService/TermsOfService' import { ExternalLink } from '../common/ExternalLink' import { useDialog } from '../common/Dialog' import { @@ -53,6 +50,8 @@ import { MainNetworkNotSupported } from '../common/MainNetworkNotSupported' import { HeaderNetworkNotSupported } from '../common/HeaderNetworkNotSupported' import { NetworkSelectionContainer } from '../common/NetworkSelectionContainer' import { isTestingEnvironment } from '../../util/CommonUtils' +import { TOS_VERSION } from '../../constants' +import { AppConnectionFallbackContainer } from './AppConnectionFallbackContainer' declare global { interface Window { @@ -223,63 +222,6 @@ const Injector = ({ children }: { children: React.ReactNode }): JSX.Element => { ) } -function Routes() { - const key = 'arbitrum:bridge:tos-v' + TOS_VERSION - const [tosAccepted, setTosAccepted] = useLocalStorage(key) - const [welcomeDialogProps, openWelcomeDialog] = useDialog() - - const isTosAccepted = tosAccepted !== undefined - - useEffect(() => { - if (!isTosAccepted) { - openWelcomeDialog() - } - }, [isTosAccepted, openWelcomeDialog]) - - function onClose(confirmed: boolean) { - // Only close after confirming (agreeing to terms) - if (confirmed) { - setTosAccepted('true') - welcomeDialogProps.onClose(confirmed) - } - } - - return ( - - - - - - - - - - - - {isTosAccepted && } - - - - - -
- 404 -

- Page not found in this solar system -

- Arbinaut fixing a spaceship -
-
-
-
-
- ) -} - function NetworkReady({ children }: { children: React.ReactNode }) { const [{ l2ChainId }] = useArbQueryParams() @@ -293,43 +235,6 @@ function NetworkReady({ children }: { children: React.ReactNode }) { ) } -function ConnectionFallbackContainer({ - layout = 'col', - imgProps = { - className: 'sm:w-[420px]', - src: '/images/three-arbinauts.webp', - alt: 'Three Arbinauts' - }, - children -}: { - layout?: 'row' | 'col' - imgProps?: { - className?: string - src?: string - alt?: string - } - children: React.ReactNode -}) { - return ( -
-
- {children} - - {imgProps.alt} - -
-
- ) -} - function ConnectionFallback(props: FallbackProps): JSX.Element { const { connect } = useWallet() @@ -349,11 +254,11 @@ function ConnectionFallback(props: FallbackProps): JSX.Element { - +
-
+ ) @@ -364,11 +269,11 @@ function ConnectionFallback(props: FallbackProps): JSX.Element { - + - + ) @@ -385,7 +290,7 @@ function ConnectionFallback(props: FallbackProps): JSX.Element { - - + ) } @@ -403,11 +308,36 @@ function ConnectionFallback(props: FallbackProps): JSX.Element { export default function App() { const [overmind] = useState>(createOvermind(config)) + const key = 'arbitrum:bridge:tos-v' + TOS_VERSION + const [tosAccepted, setTosAccepted] = useLocalStorage(key) + const [welcomeDialogProps, openWelcomeDialog] = useDialog() + + const isTosAccepted = tosAccepted !== undefined + + useEffect(() => { + if (!isTosAccepted) { + openWelcomeDialog() + } + }, [isTosAccepted, openWelcomeDialog]) + + function onClose(confirmed: boolean) { + // Only close after confirming (agreeing to terms) + if (confirmed) { + setTosAccepted('true') + welcomeDialogProps.onClose(confirmed) + } + } + return ( - - - + + + + + {isTosAccepted && } + + + ) } diff --git a/packages/arb-token-bridge-ui/src/components/App/AppConnectionFallbackContainer.tsx b/packages/arb-token-bridge-ui/src/components/App/AppConnectionFallbackContainer.tsx new file mode 100644 index 0000000000..c939ae34fb --- /dev/null +++ b/packages/arb-token-bridge-ui/src/components/App/AppConnectionFallbackContainer.tsx @@ -0,0 +1,38 @@ +import { ExternalLink } from '../common/ExternalLink' + +export function AppConnectionFallbackContainer({ + layout = 'col', + imgProps = { + className: 'sm:w-[420px]', + src: '/images/three-arbinauts.webp', + alt: 'Three Arbinauts' + }, + children +}: { + layout?: 'row' | 'col' + imgProps?: { + className?: string + src?: string + alt?: string + } + children: React.ReactNode +}) { + return ( +
+
+ {children} + + {imgProps.alt} + +
+
+ ) +} diff --git a/packages/arb-token-bridge-ui/src/components/App/WelcomeDialog.tsx b/packages/arb-token-bridge-ui/src/components/App/WelcomeDialog.tsx index b740c68dbd..25c83a28c7 100644 --- a/packages/arb-token-bridge-ui/src/components/App/WelcomeDialog.tsx +++ b/packages/arb-token-bridge-ui/src/components/App/WelcomeDialog.tsx @@ -1,6 +1,5 @@ import { useRef } from 'react' import { Dialog as HeadlessUIDialog } from '@headlessui/react' -import { useRouteMatch } from 'react-router-dom' import { Button } from '../common/Button' import { ExternalLink } from '../common/ExternalLink' @@ -8,11 +7,6 @@ import { Dialog, UseDialogProps } from '../common/Dialog' export function WelcomeDialog(props: UseDialogProps) { const confirmButtonRef = useRef(null) - const isTosRoute = useRouteMatch('/tos') - - if (isTosRoute) { - return null - } return ( diff --git a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanelMain.tsx b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanelMain.tsx index 2350d3251a..4341781417 100644 --- a/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanelMain.tsx +++ b/packages/arb-token-bridge-ui/src/components/TransferPanel/TransferPanelMain.tsx @@ -1,5 +1,4 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react' -import { useHistory } from 'react-router-dom' import { Listbox } from '@headlessui/react' import { ChevronDownIcon, @@ -334,7 +333,6 @@ export function TransferPanelMain({ React.SetStateAction > }) { - const history = useHistory() const actions = useActions() const { l1, l2, isConnectedToArbitrum, isSmartContractWallet } = @@ -384,7 +382,7 @@ export function TransferPanelMain({ // Keep the connected L2 chain id in search params, so it takes preference in any L1 => L2 actions setQueryParams({ l2ChainId }) - }, [isConnectedToArbitrum, externalFrom, externalTo, history, setQueryParams]) + }, [isConnectedToArbitrum, externalFrom, externalTo, setQueryParams]) // whenever the user changes the `amount` input, it should update the amount in browser query params as well useEffect(() => { @@ -717,7 +715,7 @@ export function TransferPanelMain({ } } } - }, [isDepositMode, isConnectedToArbitrum, l1.network, from, to, history]) + }, [isDepositMode, isConnectedToArbitrum, l1.network, from, to]) async function setMaxAmount() { const ethBalance = isDepositMode ? ethL1Balance : ethL2Balance diff --git a/packages/arb-token-bridge-ui/src/constants.ts b/packages/arb-token-bridge-ui/src/constants.ts index b94634019f..5d9ca08942 100644 --- a/packages/arb-token-bridge-ui/src/constants.ts +++ b/packages/arb-token-bridge-ui/src/constants.ts @@ -1,2 +1,4 @@ +export const TOS_VERSION = 1 + export const GET_HELP_LINK = 'https://support.arbitrum.io/hc/en-us/requests/new?&tf_subject=Issue%20with%20bridging&tf_description=1.%20Describe%20the%20issue%20in%20detail:%3Cbr%3E%3Cbr%3E2.%20Your%20browser%20(Chrome,%20Firefox,%20Brave,%20etc.)%3Cbr%3E%3Cbr%3E3.%20Are%20you%20moving%20funds%20to%20Mainnet%20or%20Arbitrum?%3Cbr%3E%3Cbr%3E4.%20(optional)%20Steps%20to%20reproduce:%3Cbr%3E5.%20(optional)%20What%20token%20are%20you%20transferring:&tf_1260832145490=You%20can%20find%20your%20TxID%20in%20your%20profile%20tab%20on%20the%20bridge&tf_1900010553864=true' diff --git a/packages/arb-token-bridge-ui/src/hooks/useArbQueryParams.tsx b/packages/arb-token-bridge-ui/src/hooks/useArbQueryParams.tsx index 3fb7e18100..dea6cc99f5 100644 --- a/packages/arb-token-bridge-ui/src/hooks/useArbQueryParams.tsx +++ b/packages/arb-token-bridge-ui/src/hooks/useArbQueryParams.tsx @@ -1,10 +1,10 @@ /* This hook is an abstraction over `useQueryParams` hooks' library - - It contains all the browser query params we use / intend to use in our application + - It contains all the browser query params we use / intend to use in our application - Provides methods to listen to, and update all these query params - If we introduce a new queryParam for our bridge in the future, define it here and it will be accessible throughout the app :) - + - Example - to get the value of `?amount=` in browser, simply use `const [{ amount }] = useArbQueryParams()` @@ -14,7 +14,7 @@ */ import React from 'react' -import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5' +import { NextAdapter } from 'next-query-params' import { parse, stringify } from 'query-string' import { NumberParam, @@ -30,10 +30,10 @@ export enum AmountQueryParamEnum { export const useArbQueryParams = () => { /* - returns [ + returns [ queryParams (getter for all query state variables), setQueryParams (setter for all query state variables) - ] + ] */ return useQueryParams({ @@ -101,7 +101,7 @@ export function ArbQueryParamProvider({ }) { return ( + 404 +

Page not found in this solar system

+ Arbinaut fixing a spaceship + + ) +} diff --git a/packages/arb-token-bridge-ui/src/pages/_app.tsx b/packages/arb-token-bridge-ui/src/pages/_app.tsx index 0148d64641..3297be0574 100644 --- a/packages/arb-token-bridge-ui/src/pages/_app.tsx +++ b/packages/arb-token-bridge-ui/src/pages/_app.tsx @@ -10,6 +10,7 @@ import 'tippy.js/themes/light.css' import Package from '../../package.json' import { registerLocalNetwork } from '../util/networks' +import { Layout } from '../components/common/Layout' import '../styles/tailwind.css' @@ -47,7 +48,9 @@ export default function App({ Component, pageProps }: AppProps) { Bridge to Arbitrum - + + + ) } diff --git a/packages/arb-token-bridge-ui/src/pages/index.tsx b/packages/arb-token-bridge-ui/src/pages/index.tsx index decef47430..30a4f10098 100644 --- a/packages/arb-token-bridge-ui/src/pages/index.tsx +++ b/packages/arb-token-bridge-ui/src/pages/index.tsx @@ -2,12 +2,16 @@ import React from 'react' import Loader from 'react-loader-spinner' import dynamic from 'next/dynamic' +import { AppConnectionFallbackContainer } from '../components/App/AppConnectionFallbackContainer' + const App = dynamic(() => import('../components/App/App'), { ssr: false, loading: () => ( -
- -
+ +
+ +
+
) }) diff --git a/packages/arb-token-bridge-ui/src/components/TermsOfService/TermsOfService.tsx b/packages/arb-token-bridge-ui/src/pages/tos.tsx similarity index 92% rename from packages/arb-token-bridge-ui/src/components/TermsOfService/TermsOfService.tsx rename to packages/arb-token-bridge-ui/src/pages/tos.tsx index 513b6bce49..6e26ae6fbc 100644 --- a/packages/arb-token-bridge-ui/src/components/TermsOfService/TermsOfService.tsx +++ b/packages/arb-token-bridge-ui/src/pages/tos.tsx @@ -1,6 +1,4 @@ -export const TOS_VERSION = 1 - -export function TermsOfService() { +export default function TermsOfService() { return (
@@ -137,67 +135,62 @@ export function TermsOfService() { violator to law enforcement authorities. You agree to not use the Service or Your Apps to:

-

-

    -
  1. - distribute any content that (i) infringes any intellectual - property or other proprietary rights of any party; (ii) you do not - have a right to upload under any law or under contractual or - fiduciary relationships; (iii) contains software viruses or any - other computer code, files or programs designed to interrupt, - destroy, or limit the functionality of any computer software or - hardware or telecommunications equipment; (iv) poses or creates a - privacy or security risk to any person; (v) constitutes - unsolicited or unauthorized advertising, promotional materials, - commercial activities and/or sales, “junk mail,” “spam,” “chain - letters,” “pyramid schemes,” “contests,” “sweepstakes,” or any - other form of solicitation; (vi) is unlawful, harmful, - threatening, abusive, harassing, tortious, excessively violent, - defamatory, vulgar, obscene, pornographic, libelous, invasive of - another’s privacy, hateful, discriminatory, or otherwise - objectionable; or (vii) in the sole judgment of Offchain Labs, is - objectionable or which restricts or inhibits any other person from - using or enjoying the Service, or which may expose Offchain Labs - or its users to any harm or liability of any type; -
  2. -
  3. - seek to interfere with or compromise the integrity, security, or - proper functioning of any computer, server, network, personal - device, or other information technology system, including the - deployment of viruses and denial of service attacks; -
  4. -
  5. - violate any applicable local, state, national, or international - law, or any regulations having the force of law, including any - laws or regulations concerning the integrity of trading markets - (e.g., manipulative tactics commonly known as spoofing and wash - trading) or trading of securities or derivatives; -
  6. -
  7. - engage in any activity that seeks to defraud us or any other - person or entity, including providing any false, inaccurate, or - misleading information in order to unlawfully obtain the property - of another; -
  8. -
  9. - impersonate any person or entity, or falsely state or otherwise - misrepresent your affiliation with a person or entity; -
  10. -
  11. - solicit personal information from anyone under the age of 18; -
  12. -
  13. - harvest or collect email addresses or other contact information of - other users from the Service by electronic or other means for the - purposes of sending unsolicited emails or other unsolicited - communications; or -
  14. -
  15. - further or promote any criminal activity or enterprise or provide - instructional information about illegal activities. -
  16. -
-

+
    +
  1. + distribute any content that (i) infringes any intellectual property + or other proprietary rights of any party; (ii) you do not have a + right to upload under any law or under contractual or fiduciary + relationships; (iii) contains software viruses or any other computer + code, files or programs designed to interrupt, destroy, or limit the + functionality of any computer software or hardware or + telecommunications equipment; (iv) poses or creates a privacy or + security risk to any person; (v) constitutes unsolicited or + unauthorized advertising, promotional materials, commercial + activities and/or sales, “junk mail,” “spam,” “chain letters,” + “pyramid schemes,” “contests,” “sweepstakes,” or any other form of + solicitation; (vi) is unlawful, harmful, threatening, abusive, + harassing, tortious, excessively violent, defamatory, vulgar, + obscene, pornographic, libelous, invasive of another’s privacy, + hateful, discriminatory, or otherwise objectionable; or (vii) in the + sole judgment of Offchain Labs, is objectionable or which restricts + or inhibits any other person from using or enjoying the Service, or + which may expose Offchain Labs or its users to any harm or liability + of any type; +
  2. +
  3. + seek to interfere with or compromise the integrity, security, or + proper functioning of any computer, server, network, personal + device, or other information technology system, including the + deployment of viruses and denial of service attacks; +
  4. +
  5. + violate any applicable local, state, national, or international law, + or any regulations having the force of law, including any laws or + regulations concerning the integrity of trading markets (e.g., + manipulative tactics commonly known as spoofing and wash trading) or + trading of securities or derivatives; +
  6. +
  7. + engage in any activity that seeks to defraud us or any other person + or entity, including providing any false, inaccurate, or misleading + information in order to unlawfully obtain the property of another; +
  8. +
  9. + impersonate any person or entity, or falsely state or otherwise + misrepresent your affiliation with a person or entity; +
  10. +
  11. solicit personal information from anyone under the age of 18;
  12. +
  13. + harvest or collect email addresses or other contact information of + other users from the Service by electronic or other means for the + purposes of sending unsolicited emails or other unsolicited + communications; or +
  14. +
  15. + further or promote any criminal activity or enterprise or provide + instructional information about illegal activities. +
  16. +

If you are blocked by Offchain Labs from accessing the Service (including by blocking your IP address), you agree not to implement diff --git a/packages/arb-token-bridge-ui/tests/support/index.ts b/packages/arb-token-bridge-ui/tests/support/index.ts index d58397930f..a8fc755877 100644 --- a/packages/arb-token-bridge-ui/tests/support/index.ts +++ b/packages/arb-token-bridge-ui/tests/support/index.ts @@ -2,6 +2,10 @@ import './commands' import '@synthetixio/synpress/support' import 'cypress-localstorage-commands' +Cypress.Keyboard.defaults({ + keystrokeDelay: 50 +}) + before(() => { cy.setupMetamask(Cypress.env('PRIVATE_KEY')) }) diff --git a/vercel.json b/vercel.json index a08d4bed76..298ef5d225 100644 --- a/vercel.json +++ b/vercel.json @@ -11,8 +11,6 @@ "Access-Control-Allow-Methods": "GET", "Referrer-Policy": "origin-when-cross-origin" } - }, - { "src": "/", "dest": "/" }, - { "src": "/tos", "dest": "/" } + } ] } diff --git a/yarn.lock b/yarn.lock index beca67a0d0..15b9934e3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1921,7 +1921,7 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== @@ -4434,11 +4434,6 @@ dependencies: "@types/node" "*" -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - "@types/html-minifier-terser@^5.0.0": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" @@ -4642,23 +4637,6 @@ dependencies: "@types/react" "*" -"@types/react-router-dom@^5.1.8": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.18" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3" - integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-virtualized@^9.21.20": version "9.21.20" resolved "https://registry.yarnpkg.com/@types/react-virtualized/-/react-virtualized-9.21.20.tgz#756c78b5512a2a1804fdaf749a5f5cff3d805e5b" @@ -11841,18 +11819,6 @@ highlightjs-solidity@^2.0.5: resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz#48b945f41886fa49af9f06023e6e87fffc243745" integrity sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg== -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -11862,7 +11828,7 @@ hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -14428,7 +14394,7 @@ longest@^1.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -14803,14 +14769,6 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -mini-create-react-context@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" - integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== - dependencies: - "@babel/runtime" "^7.12.1" - tiny-warning "^1.0.3" - mini-svg-data-uri@^1.2.3: version "1.4.4" resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" @@ -15026,6 +14984,13 @@ neo-async@^2.6.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +next-query-params@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/next-query-params/-/next-query-params-4.1.0.tgz#d69e0cb3f0ec1e746a7bb255cd5a07d9e03ba95d" + integrity sha512-jjoQByM9s2d4wCUBUazhgHNVztm18meCtVoDj6v45+LZIQfxAF5QYVFKCbDYarI3iXD4xcZprztqLtALiiV8nQ== + dependencies: + tslib "^2.0.3" + next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" @@ -15837,13 +15802,6 @@ path-to-regexp@2.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -16838,7 +16796,7 @@ react-frame-component@^5.2.1: resolved "https://registry.yarnpkg.com/react-frame-component/-/react-frame-component-5.2.1.tgz#6bd5ec73ef7d720f57ee8f259546ed926a941267" integrity sha512-nrSh1OZuHlX69eWqJPiUkPT9S6/wxc4PpJV+vOQ4pHQQ8XmIsIT+utWT+nX32ZfANHZuKONA7JsWMUGT36CqaQ== -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -16865,35 +16823,6 @@ react-loader-spinner@^4.0.0: dependencies: prop-types "^15.7.2" -react-router-dom@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" - integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.2.1" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" - integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - mini-create-react-context "^0.4.0" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - react-universal-interface@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/react-universal-interface/-/react-universal-interface-0.6.2.tgz#5e8d438a01729a4dbbcbeeceb0b86be146fe2b3b" @@ -17401,11 +17330,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - resolve.exports@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" @@ -19094,16 +19018,6 @@ tiny-glob@^0.2.8: globalyzer "0.1.0" globrex "^0.1.2" -tiny-invariant@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.0, tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - tippy.js@^6.3.1: version "6.3.7" resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" @@ -19764,11 +19678,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - varint@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4"