feat(p2p): add Phase 3 dispute system components

- Add DisputeModal.tsx with reason selection, evidence upload, terms acceptance
- Add P2PDispute.tsx page with evidence gallery, status timeline, real-time updates
- Integrate dispute button in P2PTrade.tsx
- Add /p2p/dispute/:disputeId route to App.tsx
- Add P2P test suite with MockStore pattern (32 tests passing)
- Update P2P-BUILDING-PLAN.md with Phase 3 progress (70% complete)
- Fix lint errors in test files and components
This commit is contained in:
2025-12-11 09:10:04 +03:00
parent 8a602dc3fa
commit 7330b2e7a6
321 changed files with 5328 additions and 182 deletions
+12 -10
View File
@@ -1,4 +1,5 @@
import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import {
Dialog,
DialogContent,
@@ -15,7 +16,7 @@ import { Loader2, AlertTriangle, Clock } from 'lucide-react';
import { useAuth } from '@/contexts/AuthContext';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { toast } from 'sonner';
import { type P2PFiatOffer } from '@shared/lib/p2p-fiat';
import { acceptFiatOffer, type P2PFiatOffer } from '@shared/lib/p2p-fiat';
interface TradeModalProps {
offer: P2PFiatOffer;
@@ -23,6 +24,7 @@ interface TradeModalProps {
}
export function TradeModal({ offer, onClose }: TradeModalProps) {
const navigate = useNavigate();
const { user } = useAuth();
const { api, selectedAccount } = usePolkadot();
const [amount, setAmount] = useState('');
@@ -60,18 +62,18 @@ export function TradeModal({ offer, onClose }: TradeModalProps) {
setLoading(true);
try {
// const _tradeId = await acceptFiatOffer({
// api,
// account: selectedAccount,
// offerId: offer.id,
// amount: cryptoAmount
// });
const tradeId = await acceptFiatOffer({
api,
account: selectedAccount,
offerId: offer.id,
amount: cryptoAmount
});
toast.success('Trade initiated! Proceed to payment.');
onClose();
// TODO: Navigate to trade page
// navigate(`/p2p/trade/${tradeId}`);
// Navigate to trade page
navigate(`/p2p/trade/${tradeId}`);
} catch (error) {
if (import.meta.env.DEV) console.error('Accept offer error:', error);
// Error toast already shown in acceptFiatOffer