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 (