From 153749606fe7648a3696aafa3fe7530e683cbf8b Mon Sep 17 00:00:00 2001 From: Uncle Fatso Date: Wed, 8 Apr 2026 07:32:53 +0300 Subject: [PATCH] ghost connect button added Signed-off-by: Uncle Fatso --- package.json | 2 +- src/components/TopBar/GhostChainSelect.jsx | 52 ++++++++++++++++++++++ src/components/TopBar/TopBar.jsx | 10 ++++- src/hooks/ghost/UnstableProvider.jsx | 30 +++++++++++-- 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/components/TopBar/GhostChainSelect.jsx diff --git a/package.json b/package.json index d519e76..dfaee2f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ghost-dao-interface", "private": true, - "version": "0.7.7", + "version": "0.7.8", "type": "module", "scripts": { "dev": "vite", diff --git a/src/components/TopBar/GhostChainSelect.jsx b/src/components/TopBar/GhostChainSelect.jsx new file mode 100644 index 0000000..94f2aad --- /dev/null +++ b/src/components/TopBar/GhostChainSelect.jsx @@ -0,0 +1,52 @@ +import { Box, Typography, SvgIcon, useTheme } from "@mui/material"; + +import { parseKnownToken } from "../../components/Token/Token"; +import { useUnstableProvider } from "../../hooks/ghost"; +import { PrimaryButton } from "../Button" + +const GHOST_CONNECT = 'https://git.ghostchain.io/ghostchain/ghost-extension-wallet/releases'; + +function GhostChainSelect() { + const { providerDetail, isConnected } = useUnstableProvider(); + const theme = useTheme(); + + if (providerDetail) { + return ( + + + + + CASPER + + + + + ) + } + + return ( + window.open(GHOST_CONNECT, '_blank', 'noopener,noreferrer')} width="155px"> + Get GHOST Connect + + ) +} + +export default GhostChainSelect; diff --git a/src/components/TopBar/TopBar.jsx b/src/components/TopBar/TopBar.jsx index 6dbc30e..bc17a00 100644 --- a/src/components/TopBar/TopBar.jsx +++ b/src/components/TopBar/TopBar.jsx @@ -2,7 +2,7 @@ import { Box, Button, SvgIcon, useMediaQuery, useTheme } from "@mui/material"; import MenuIcon from "../../assets/icons/hamburger.svg?react"; import Wallet from "./Wallet" import SelectNetwork from "./SelectNetwork"; - +import GhostChainSelect from "./GhostChainSelect"; const PREFIX = "TopBar"; @@ -34,7 +34,13 @@ function TopBar({ marginRight={desktop ? "33px" : "0px"} > - + + { ); const [chainId, setChainId] = useState(DEFAULT_CHAIN_ID); + const [isConnected, setIsConnected] = useState(false); + const [reconnectTicket, setReconnectTicket] = useState(0); + + const reconnect = () => setReconnectTicket(prev => prev + 1); + const createConnectWithStatus = (originalConnect, onConnect) => { + return (observer) => { + onConnect(true); + return originalConnect(observer); + }; + }; const client = useMemo(() => { if (!provider || !chainId) return undefined; const chain = provider.getChains()[chainId]; if (!chain) return undefined; - return createClient(chain.connect); - }, [provider, chainId]); + const wrappedConnect = createConnectWithStatus(chain.connect, setIsConnected); + return createClient(wrappedConnect); + }, [provider, chainId, reconnectTicket]); const observableClient = useMemo(() => { return client ? getObservableClient(client) : undefined; @@ -36,9 +47,22 @@ export const UnstableProviderProvider = ({ children }) => { return observableClient ? observableClient.chainHead$() : undefined; }, [observableClient]); + useEffect(() => { + if (!chainHead$) return; + const sub = chainHead$.runtime$.subscribe({ + next: () => setIsConnected(true), + error: (err) => { + setIsConnected(false); + setTimeout(reconnect, 3000); + } + }); + return () => sub.unsubscribe(); + }, [chainHead$, reconnect]); + return (