diff --git a/apps/trading/components/app-loader/index.tsx b/apps/trading/components/app-loader/index.tsx new file mode 100644 index 000000000..cb6f2d013 --- /dev/null +++ b/apps/trading/components/app-loader/index.tsx @@ -0,0 +1,17 @@ +import { useEagerConnect } from '../../hooks/use-vega-wallet-eager-connect'; +import { ReactNode } from 'react'; + +interface AppLoaderProps { + children: ReactNode; +} + +/** + * Component to handle any app initialization, startup querys and other things + * that must happen for it can be used + */ +export function AppLoader({ children }: AppLoaderProps) { + // Get keys from vega wallet immediately + useEagerConnect(); + + return <>{children}; +} diff --git a/apps/trading/components/vega-wallet-connect-button/index.tsx b/apps/trading/components/vega-wallet-connect-button/index.tsx new file mode 100644 index 000000000..bb7a23854 --- /dev/null +++ b/apps/trading/components/vega-wallet-connect-button/index.tsx @@ -0,0 +1,26 @@ +import { useVegaWallet } from '@vegaprotocol/react-helpers'; + +interface VegaWalletButtonProps { + setConnectDialog: (isOpen: boolean) => void; +} + +export const VegaWalletButton = ({ + setConnectDialog, +}: VegaWalletButtonProps) => { + const { disconnect, keypairs } = useVegaWallet(); + const isConnected = keypairs !== null; + + const handleClick = () => { + if (isConnected) { + disconnect(); + } else { + setConnectDialog(true); + } + }; + + return ( + + ); +}; diff --git a/apps/trading/hooks/use-theme-switcher.ts b/apps/trading/hooks/use-theme-switcher.ts new file mode 100644 index 000000000..833906ff8 --- /dev/null +++ b/apps/trading/hooks/use-theme-switcher.ts @@ -0,0 +1,23 @@ +import { useEffect } from 'react'; + +export function useThemeSwitcher() { + useEffect(() => { + if ( + localStorage.theme === 'dark' || + (!('theme' in localStorage) && + window.matchMedia('(prefers-color-scheme: dark)').matches) + ) { + document.documentElement.classList.add('dark'); + } else { + document.documentElement.classList.remove('dark'); + } + }, []); + + const setTheme = () => { + localStorage.theme = document.documentElement.classList.toggle('dark') + ? 'dark' + : undefined; + }; + + return setTheme; +} diff --git a/apps/trading/hooks/use-vega-wallet-eager-connect.ts b/apps/trading/hooks/use-vega-wallet-eager-connect.ts new file mode 100644 index 000000000..4893ca394 --- /dev/null +++ b/apps/trading/hooks/use-vega-wallet-eager-connect.ts @@ -0,0 +1,29 @@ +import { useVegaWallet, WALLET_CONFIG } from '@vegaprotocol/react-helpers'; +import { useEffect } from 'react'; +import { LocalStorage } from '@vegaprotocol/storage'; +import { Connectors } from '../lib/connectors'; + +export function useEagerConnect() { + const { connect } = useVegaWallet(); + + useEffect(() => { + const cfg = LocalStorage.getItem(WALLET_CONFIG); + const cfgObj = JSON.parse(cfg); + + // No stored config, user has never connected or manually cleared storage + if (!cfgObj || !cfgObj.connector) { + return; + } + + // Use the connector string in local storage to find the right connector to auto + // connect to + const connector = Connectors[cfgObj.connector]; + + // Developer hasn't provided this connector + if (!connector) { + throw new Error(`Connector ${cfgObj?.connector} not configured`); + } + + connect(Connectors[cfgObj.connector]); + }, [connect]); +} diff --git a/apps/trading/pages/_app.page.tsx b/apps/trading/pages/_app.page.tsx index 6d6d3ba20..ef5e75164 100644 --- a/apps/trading/pages/_app.page.tsx +++ b/apps/trading/pages/_app.page.tsx @@ -2,23 +2,24 @@ import { AppProps } from 'next/app'; import Head from 'next/head'; import { Navbar } from '../components/navbar'; import { - useVegaWallet, VegaConnectDialog, VegaWalletProvider, - WALLET_CONFIG, } from '@vegaprotocol/react-helpers'; import { Connectors } from '../lib/connectors'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { LocalStorage } from '@vegaprotocol/storage'; +import { useCallback, useMemo, useState } from 'react'; import { createClient } from '../lib/apollo-client'; import { ThemeSwitcher } from '@vegaprotocol/ui-toolkit'; import './styles.css'; import { ApolloProvider } from '@apollo/client'; import './styles.css'; +import { AppLoader } from '../components/app-loader'; +import { VegaWalletButton } from '../components/vega-wallet-connect-button'; +import { useThemeSwitcher } from '../hooks/use-theme-switcher'; function VegaTradingApp({ Component, pageProps }: AppProps) { const client = useMemo(() => createClient(process.env['NX_VEGA_URL']), []); const [dialogOpen, setDialogOpen] = useState(false); + const setTheme = useThemeSwitcher(); const setConnectDialog = useCallback((isOpen?: boolean) => { setDialogOpen((curr) => { @@ -27,114 +28,39 @@ function VegaTradingApp({ Component, pageProps }: AppProps) { }); }, []); - useCallback(() => { - if ( - localStorage.theme === 'dark' || - (!('theme' in localStorage) && - window.matchMedia('(prefers-color-scheme: dark)').matches) - ) { - document.documentElement.classList.add('dark'); - } else { - document.documentElement.classList.remove('dark'); - } - }, []); - const setTheme = () => { - localStorage.theme = document.documentElement.classList.toggle('dark') - ? 'dark' - : undefined; - }; return ( - - Welcome to trading! - - -
-
- -
- - + + + Welcome to trading! + + +
+
+ +
+ + +
+
+ +
+
-
- -
- -
- + ); } -interface VegaWalletButtonProps { - setConnectDialog: (isOpen: boolean) => void; -} - -const VegaWalletButton = ({ setConnectDialog }: VegaWalletButtonProps) => { - const { disconnect, keypairs } = useVegaWallet(); - const isConnected = keypairs !== null; - - const handleClick = () => { - if (isConnected) { - disconnect(); - } else { - setConnectDialog(true); - } - }; - - return ( - - ); -}; - export default VegaTradingApp; - -/** - * Wrapper to interact with the vega wallet out side of the provider itself. - */ -function VegaWalletManager() { - // Get keys from vega wallet immediately - useEagerConnect(); - - // Do other global stuff with vega wallet here - - return null; -} - -function useEagerConnect() { - const { connect } = useVegaWallet(); - - useEffect(() => { - const cfg = LocalStorage.getItem(WALLET_CONFIG); - const cfgObj = JSON.parse(cfg); - - // No stored config, user has never connected or manually cleared storage - if (!cfgObj || !cfgObj.connector) { - return; - } - - // Use the connector string in local storage to find the right connector to auto - // connect to - const connector = Connectors[cfgObj.connector]; - - // Developer hasn't provided this connector - if (!connector) { - throw new Error(`Connector ${cfgObj?.connector} not configured`); - } - - connect(Connectors[cfgObj.connector]); - }, [connect]); -}