diff --git a/demos/freelance-escrow/src/App.css b/demos/freelance-escrow/src/App.css
index 708e920..c58ede1 100644
--- a/demos/freelance-escrow/src/App.css
+++ b/demos/freelance-escrow/src/App.css
@@ -428,3 +428,16 @@
background: var(--bg);
color: var(--text);
}
+
+.wallet-button-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 0.5rem;
+}
+
+.wallet-error {
+ margin: 0;
+ font-size: 0.85rem;
+ color: #ef4444;
+}
diff --git a/demos/freelance-escrow/src/components/WalletButton.tsx b/demos/freelance-escrow/src/components/WalletButton.tsx
index be6f50f..8b7a78c 100644
--- a/demos/freelance-escrow/src/components/WalletButton.tsx
+++ b/demos/freelance-escrow/src/components/WalletButton.tsx
@@ -2,7 +2,7 @@ import { useWallet } from "../hooks/useWallet";
import { shortenAddress } from "../lib/wallet";
export function WalletButton() {
- const { wallet, connecting, connect } = useWallet();
+ const { wallet, connecting, error, connect } = useWallet();
if (wallet.status === "unavailable") {
return (
@@ -27,8 +27,11 @@ export function WalletButton() {
}
return (
-
+
+
+ {error &&
{error}
}
+
);
}
diff --git a/demos/freelance-escrow/src/hooks/useWallet.ts b/demos/freelance-escrow/src/hooks/useWallet.ts
index 72df683..b7df887 100644
--- a/demos/freelance-escrow/src/hooks/useWallet.ts
+++ b/demos/freelance-escrow/src/hooks/useWallet.ts
@@ -4,19 +4,28 @@ import { type WalletState, connectWallet, detectWallet } from "../lib/wallet";
export function useWallet() {
const [wallet, setWallet] = useState({ status: "disconnected" });
const [connecting, setConnecting] = useState(false);
+ const [error, setError] = useState(null);
useEffect(() => {
- detectWallet().then(setWallet);
+ detectWallet()
+ .then(setWallet)
+ .catch(() => {
+ setWallet({ status: "disconnected" });
+ });
}, []);
const connect = useCallback(async () => {
setConnecting(true);
+ setError(null);
try {
- setWallet(await connectWallet());
+ const state = await connectWallet();
+ setWallet(state);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : "Failed to connect wallet.");
} finally {
setConnecting(false);
}
}, []);
- return { wallet, connecting, connect };
+ return { wallet, connecting, error, connect };
}
diff --git a/demos/freelance-escrow/src/lib/wallet.ts b/demos/freelance-escrow/src/lib/wallet.ts
index c1197a3..f9ec266 100644
--- a/demos/freelance-escrow/src/lib/wallet.ts
+++ b/demos/freelance-escrow/src/lib/wallet.ts
@@ -23,13 +23,19 @@ export async function detectWallet(): Promise {
return { status: "disconnected" };
}
- return resolveConnectedState();
+ try {
+ return await resolveConnectedState();
+ } catch {
+ return { status: "disconnected" };
+ }
}
export async function connectWallet(): Promise {
const access = await requestAccess();
if (access.error) {
- return { status: "disconnected" };
+ throw new Error(
+ typeof access.error === "string" ? access.error : "Failed to connect wallet"
+ );
}
return resolveConnectedState();
}
@@ -41,7 +47,11 @@ async function resolveConnectedState(): Promise {
]);
if (addressResult.error || !addressResult.address) {
- return { status: "disconnected" };
+ throw new Error(
+ typeof addressResult.error === "string"
+ ? addressResult.error
+ : "Failed to retrieve wallet address"
+ );
}
return {