diff --git a/web-ui/Providers.tsx b/web-ui/Providers.tsx
index 5fcf513d..e0716d1e 100644
--- a/web-ui/Providers.tsx
+++ b/web-ui/Providers.tsx
@@ -2,11 +2,14 @@
import { RainbowProvider } from "./src/shared/providers/RainbowProvider";
import { BrokerProvider } from "./src/shared/providers/BrokerProvider";
+import { DepositGuardProvider } from "./src/shared/providers/DepositGuardProvider";
export function Providers({ children }: { children: React.ReactNode }) {
return (
- {children}
+
+ {children}
+
);
}
diff --git a/web-ui/src/app/inference/chat/components/OptimizedChatPage.tsx b/web-ui/src/app/inference/chat/components/OptimizedChatPage.tsx
index e82a1f09..3793dcae 100644
--- a/web-ui/src/app/inference/chat/components/OptimizedChatPage.tsx
+++ b/web-ui/src/app/inference/chat/components/OptimizedChatPage.tsx
@@ -3,7 +3,9 @@
import * as React from "react";
import { useState, useEffect, useRef, useCallback } from "react";
import { useAccount } from "wagmi";
+import { useConnectModal } from "@rainbow-me/rainbowkit";
import { useBroker } from "@/shared/providers/BrokerProvider";
+import { useDepositGuard } from "@/shared/providers/DepositGuardProvider";
import { useChatHistory } from "../../../../shared/hooks/useChatHistory";
import { useProviderSearch } from "../../hooks/useProviderSearch";
import { useStreamingState } from "../../../../shared/hooks/useStreamingState";
@@ -27,23 +29,14 @@ import {
AlertDialogHeader,
AlertDialogTitle,
} from "@/components/ui/alert-dialog";
-import type { Provider } from "../../../../shared/types/broker";
-
-
-
-interface Message {
- role: "system" | "user" | "assistant";
- content: string;
- timestamp?: number;
- chatId?: string;
- isVerified?: boolean | null;
- isVerifying?: boolean;
-}
+import type { Provider, Message } from "../../../../shared/types/broker";
export function OptimizedChatPage() {
const { isConnected, address } = useAccount();
- const { broker, isInitializing, ledgerInfo, refreshLedgerInfo } = useBroker();
+ const { broker, readOnlyBroker, isInitializing, ledgerInfo, refreshLedgerInfo } = useBroker();
+ const { openConnectModal } = useConnectModal();
+ const { requestDeposit } = useDepositGuard();
const { toast } = useToast();
// Use toast for non-blocking errors
@@ -67,7 +60,7 @@ export function OptimizedChatPage() {
providerPendingRefund,
setSelectedProvider,
refreshProviderBalance,
- } = useProviderManagement(broker);
+ } = useProviderManagement(broker, readOnlyBroker);
// Provider dropdown state (UI only)
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
@@ -171,6 +164,8 @@ export function OptimizedChatPage() {
setErrorWithTimeout,
isUserScrollingRef,
messagesEndRef,
+ openConnectModal,
+ requestDeposit,
});
// Handle editing a user message - truncates conversation and resends
@@ -445,38 +440,6 @@ export function OptimizedChatPage() {
// Note: handleDeposit is now handled globally in LayoutContent
- if (!isConnected) {
- return (
-
-
-
-
- Wallet Not Connected
-
-
- Please connect your wallet to access AI inference features.
-
-
-
- );
- }
-
return (
@@ -564,7 +527,10 @@ export function OptimizedChatPage() {
providerBalanceNeuron={providerBalanceNeuron}
providerPendingRefund={providerPendingRefund}
onAddFunds={() => {
- // Use the existing top-up modal logic
+ if (!broker) {
+ openConnectModal?.();
+ return;
+ }
setShowTopUpModal(true);
}}
/>
diff --git a/web-ui/src/app/inference/chat/components/ProviderSelector.tsx b/web-ui/src/app/inference/chat/components/ProviderSelector.tsx
index 384d859e..7e54e70e 100644
--- a/web-ui/src/app/inference/chat/components/ProviderSelector.tsx
+++ b/web-ui/src/app/inference/chat/components/ProviderSelector.tsx
@@ -1,6 +1,7 @@
'use client'
import React, { useState, useEffect, useMemo } from 'react'
+import { useAccount } from 'wagmi'
import type { Provider } from '../../../../shared/types/broker'
import { OFFICIAL_PROVIDERS } from '../../constants/providers'
import { copyToClipboard } from '@/lib/utils'
@@ -17,6 +18,7 @@ import {
getModelHealthStatus,
getHealthStatusColor,
getHealthStatusText,
+ type ProviderHealthStatus,
} from '@/shared/hooks/useProviderHealth'
import { formatNumber } from '@/shared/utils/formatNumber'
@@ -78,7 +80,7 @@ function MobileProviderCard({
isSelected: boolean
isRecentlyUsed: boolean
onSelect: () => void
- healthData: Map
+ healthData: Map
isLoadingHealth: boolean
}) {
const isTeeVerified =
@@ -217,16 +219,14 @@ export function ProviderSelector({
onAddFunds,
}: ProviderSelectorProps) {
const isMobile = useIsMobile()
+ const { isConnected } = useAccount()
const [mobileSearchQuery, setMobileSearchQuery] = useState('')
// Get health data using SWR hook (automatically cached across components)
const { healthData, isLoading: isLoadingHealth } = useProviderHealth()
// Recently used providers set for quick lookup
- const recentlyUsedSet = useMemo(() => {
- const used = getRecentlyUsedProviders()
- return new Set(used)
- }, [])
+ const recentlyUsedSet = new Set(getRecentlyUsedProviders())
// Filter out unverified providers - only show verified providers that can be used
const verifiedProviders = useMemo(() => {
@@ -715,7 +715,13 @@ export function ProviderSelector({
)}
{/* Right Section: Balance and Add Funds */}
-
+ Wallet not connected
+
+ ) : (
+ <>
+
Add Funds
+ >
+ )}
)}
diff --git a/web-ui/src/app/inference/chat/components/TopUpModal.tsx b/web-ui/src/app/inference/chat/components/TopUpModal.tsx
index cc27199f..88e780f1 100644
--- a/web-ui/src/app/inference/chat/components/TopUpModal.tsx
+++ b/web-ui/src/app/inference/chat/components/TopUpModal.tsx
@@ -2,6 +2,7 @@
import * as React from "react";
import { useState } from "react";
+import type { ZGComputeNetworkBroker } from '@0glabs/0g-serving-broker';
import { a0giToNeuron } from "../../../../shared/utils/currency";
import { formatNumber } from "../../../../shared/utils/formatNumber";
import {
@@ -44,7 +45,7 @@ interface LedgerInfo {
interface TopUpModalProps {
isOpen: boolean;
onClose: () => void;
- broker: any; // TODO: Replace with proper broker type when available
+ broker: ZGComputeNetworkBroker | null;
selectedProvider: Provider | null;
topUpAmount: string;
setTopUpAmount: (amount: string) => void;
@@ -53,7 +54,7 @@ interface TopUpModalProps {
providerBalance: number | null;
providerPendingRefund: number | null;
ledgerInfo: LedgerInfo | null;
- refreshLedgerInfo: () => Promise
;
+ refreshLedgerInfo: () => Promise;
refreshProviderBalance: () => Promise;
setErrorWithTimeout: (error: string | null) => void;
}
@@ -275,6 +276,8 @@ export function TopUpModal({