diff --git a/frontend/src/components/AdminPanel.test.tsx b/frontend/src/components/AdminPanel.test.tsx index cffc3c35..3abbf3d5 100644 --- a/frontend/src/components/AdminPanel.test.tsx +++ b/frontend/src/components/AdminPanel.test.tsx @@ -19,6 +19,10 @@ vi.mock('../hooks/useTransaction', () => ({ useTransaction: vi.fn(), })) +vi.mock('../context/NetworkContext', () => ({ + useNetwork: () => ({ network: 'testnet', mismatch: { isMismatch: false } }), +})) + const mockAddToast = vi.fn() const mockUpdateFees = vi.fn() const mockExecute = vi.fn() diff --git a/frontend/src/components/AdminPanel.tsx b/frontend/src/components/AdminPanel.tsx index f6fa184d..33714698 100644 --- a/frontend/src/components/AdminPanel.tsx +++ b/frontend/src/components/AdminPanel.tsx @@ -5,6 +5,7 @@ import { useStellarContext } from '../context/StellarContext' import { useToast } from '../context/ToastContext' import { useFactoryState } from '../hooks/useFactoryState' import { useTransaction } from '../hooks/useTransaction' +import { useNetworkGuard } from '../hooks/useNetworkGuard' // Stroops → display XLM (7 decimals) function stroopsToDisplay(stroops: string): string { @@ -26,6 +27,7 @@ export const AdminPanel: React.FC = () => { const { stellarService } = useStellarContext() const { addToast } = useToast() const { state, isLoading: stateLoading, refetch } = useFactoryState() + const { blocked: networkBlocked, reason: networkReason } = useNetworkGuard() const [baseFee, setBaseFee] = useState('') const [metadataFee, setMetadataFee] = useState('') @@ -149,11 +151,17 @@ export const AdminPanel: React.FC = () => { type="submit" variant="primary" loading={isPending} - disabled={isPending} + disabled={isPending || networkBlocked} className="w-full" > {isPending ? 'Submitting…' : 'Submit Changes'} + + {networkBlocked && networkReason && ( +

+ {networkReason} +

+ )} ({ })) vi.mock('../context/NetworkContext', () => ({ - useNetwork: () => ({ network: 'testnet' }), + useNetwork: () => ({ network: 'testnet', mismatch: { isMismatch: false } }), })) vi.mock('../hooks/useFactoryState', () => ({ diff --git a/frontend/src/components/MetadataForm.tsx b/frontend/src/components/MetadataForm.tsx index 139e757e..3ef92869 100644 --- a/frontend/src/components/MetadataForm.tsx +++ b/frontend/src/components/MetadataForm.tsx @@ -7,6 +7,7 @@ import { useToast } from '../context/ToastContext' import { useStellarContext } from '../context/StellarContext' import { useBalanceCheck } from '../hooks/useBalanceCheck' import { useNetwork } from '../context/NetworkContext' +import { useNetworkGuard } from '../hooks/useNetworkGuard' import { useTos } from '../context/TosContext' import { isIpfsConfigured } from '../config/env' import { ExplorerLink } from './ExplorerLink' @@ -26,6 +27,7 @@ export const MetadataForm: React.FC = ({ initialTokenAddress const { ipfsService, stellarService } = useStellarContext() const { addToast } = useToast() const { network } = useNetwork() + const { blocked: networkBlocked, reason: networkReason } = useNetworkGuard() const { requireTos } = useTos() const { state: factoryState } = useFactoryState() @@ -349,11 +351,17 @@ export const MetadataForm: React.FC = ({ initialTokenAddress + + {networkBlocked && networkReason && ( +

+ {networkReason} +

+ )} = ({ const [pending, setPending] = useState(false) const { addToast } = useToast() const ipfsReady = isIpfsConfigured() + const { blocked: networkBlocked, reason: networkReason } = useNetworkGuard() const { hasSufficientBalance, shortfall, isTestnet } = useBalanceCheck(ESTIMATED_FEE_XLM) const handleSubmit = (e: React.FormEvent) => { @@ -79,10 +81,18 @@ export const SetMetadataForm: React.FC = ({ disabled={!ipfsReady} />
-
+ {networkBlocked && networkReason && ( +

+ {networkReason} +

+ )} {!hasSufficientBalance && ( )}