import React, { useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Badge } from '@/components/ui/badge'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { X, Clock, CheckCircle, AlertCircle } from 'lucide-react'; interface LimitOrder { id: string; type: 'buy' | 'sell'; fromToken: string; toToken: string; fromAmount: number; limitPrice: number; currentPrice: number; status: 'pending' | 'filled' | 'cancelled' | 'expired'; createdAt: number; expiresAt: number; } interface LimitOrdersProps { fromToken: string; toToken: string; currentPrice: number; onCreateOrder?: (order: Omit) => void; } export const LimitOrders: React.FC = ({ fromToken, toToken, currentPrice, onCreateOrder }) => { const [orderType, setOrderType] = useState<'buy' | 'sell'>('buy'); const [amount, setAmount] = useState(''); const [limitPrice, setLimitPrice] = useState(''); const [showCreateForm, setShowCreateForm] = useState(false); // Mock orders (in production, fetch from blockchain) const [orders, setOrders] = useState([ { id: '1', type: 'buy', fromToken: 'PEZ', toToken: 'HEZ', fromAmount: 100, limitPrice: 0.98, currentPrice: 1.02, status: 'pending', createdAt: Date.now() - 3600000, expiresAt: Date.now() + 82800000 }, { id: '2', type: 'sell', fromToken: 'HEZ', toToken: 'PEZ', fromAmount: 50, limitPrice: 1.05, currentPrice: 1.02, status: 'pending', createdAt: Date.now() - 7200000, expiresAt: Date.now() + 79200000 } ]); const handleCreateOrder = () => { const newOrder: Omit = { type: orderType, fromToken: orderType === 'buy' ? toToken : fromToken, toToken: orderType === 'buy' ? fromToken : toToken, fromAmount: parseFloat(amount), limitPrice: parseFloat(limitPrice), currentPrice }; console.log('Creating limit order:', newOrder); // Add to orders list (mock) const order: LimitOrder = { ...newOrder, id: Date.now().toString(), status: 'pending', createdAt: Date.now(), expiresAt: Date.now() + 86400000 // 24 hours }; setOrders([order, ...orders]); setShowCreateForm(false); setAmount(''); setLimitPrice(''); if (onCreateOrder) { onCreateOrder(newOrder); } }; const handleCancelOrder = (orderId: string) => { setOrders(orders.map(order => order.id === orderId ? { ...order, status: 'cancelled' as const } : order )); }; const getStatusBadge = (status: LimitOrder['status']) => { switch (status) { case 'pending': return Pending ; case 'filled': return Filled ; case 'cancelled': return Cancelled ; case 'expired': return Expired ; } }; const getPriceDistance = (order: LimitOrder) => { const distance = ((order.limitPrice - order.currentPrice) / order.currentPrice) * 100; return distance; }; return (
Limit Orders Set orders to execute at your target price
{showCreateForm && (
setOrderType(v as 'buy' | 'sell')}> Buy {fromToken} Sell {fromToken}
setAmount(e.target.value)} className="bg-gray-900 border-gray-700" />
setLimitPrice(e.target.value)} className="bg-gray-900 border-gray-700" />
Current market price: ${currentPrice.toFixed(4)}
You will {orderType} {amount || '0'} {orderType === 'buy' ? fromToken : toToken}
When price reaches ${limitPrice || '0'} per {fromToken}
Estimated total {((parseFloat(amount || '0') * parseFloat(limitPrice || '0'))).toFixed(2)} {orderType === 'buy' ? toToken : fromToken}
Order will expire in 24 hours if not filled
)} {/* Orders List */}
{orders.length === 0 ? (
No limit orders yet. Create one to get started!
) : ( orders.map(order => { const priceDistance = getPriceDistance(order); return (
{order.type.toUpperCase()} {order.fromToken} → {order.toToken}
{getStatusBadge(order.status)}
Amount
{order.fromAmount} {order.fromToken}
Limit Price
${order.limitPrice.toFixed(4)}
Current Price
${order.currentPrice.toFixed(4)}
Distance
0 ? 'text-green-400' : 'text-red-400'}> {priceDistance > 0 ? '+' : ''}{priceDistance.toFixed(2)}%
Created {new Date(order.createdAt).toLocaleString()} {order.status === 'pending' && ( )}
); }) )}
Note: Limit orders require blockchain integration to execute automatically
); };