From 2acf50e46f2b5346406be570f3610dddf962c418 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 27 Nov 2025 15:34:37 +0100 Subject: [PATCH] add trade validation to prevent accepting invalid trades and update UI accordingly --- src/components/Community.tsx | 13 ++- src/components/TradeDetail.tsx | 24 ++++- src/services/tradesService.ts | 20 ++++ .../20250127000001_add_trade_validation.sql | 101 ++++++++++++++++++ 4 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 supabase/migrations/20250127000001_add_trade_validation.sql diff --git a/src/components/Community.tsx b/src/components/Community.tsx index 4f72391..8625ac4 100644 --- a/src/components/Community.tsx +++ b/src/components/Community.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect, useRef, useCallback } from 'react'; -import { Search, Globe, Users, Eye, ArrowLeftRight, Loader2, Clock, History, UserPlus, UserMinus, Check, X, Send, Settings, Save, ChevronLeft, RefreshCw, Plus, Minus } from 'lucide-react'; +import { Search, Globe, Users, Eye, ArrowLeftRight, Loader2, Clock, History, UserPlus, UserMinus, Check, X, Send, Settings, Save, ChevronLeft, RefreshCw, Plus, Minus, AlertTriangle } from 'lucide-react'; import { useAuth } from '../contexts/AuthContext'; import { useToast } from '../contexts/ToastContext'; import { supabase } from '../lib/supabase'; @@ -1412,9 +1412,14 @@ export default function Community() { With: {otherUser?.username} - - {trade.status} - +
+ {trade.status === 'pending' && !trade.is_valid && ( + + )} + + {trade.status} + +
{/* Items */} diff --git a/src/components/TradeDetail.tsx b/src/components/TradeDetail.tsx index efb6b1c..cc7a26b 100644 --- a/src/components/TradeDetail.tsx +++ b/src/components/TradeDetail.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { X, Check, ArrowLeftRight, DollarSign, Loader2, Edit, RefreshCcw, History } from 'lucide-react'; +import { X, Check, ArrowLeftRight, DollarSign, Loader2, Edit, RefreshCcw, History, AlertTriangle } from 'lucide-react'; import { useAuth } from '../contexts/AuthContext'; import { useToast } from '../contexts/ToastContext'; import { Trade, TradeHistoryEntry, getTradeVersionHistory } from '../services/tradesService'; @@ -222,6 +222,18 @@ export default function TradeDetail({ ) : (
+ {/* Invalid Trade Warning */} + {trade.status === 'pending' && !trade.is_valid && ( +
+ +
+

Trade No Longer Valid

+

+ One or more cards in this trade are no longer available in the required quantities. This trade cannot be accepted until it is updated. +

+
+
+ )}
{/* Your Side */}
@@ -367,8 +379,9 @@ export default function TradeDetail({