import React from 'react'; import { View, Text, Pressable, StyleSheet } from 'react-native'; import { useRouter } from 'expo-router'; import { LinearGradient } from 'expo-linear-gradient'; import { Colors, Fonts, FontSize, BorderRadius, Shadows, Spacing } from '@/constants/theme'; import { formatPrice, formatPercent, formatCurrency } from '@/utils/format'; import Sparkline from '@/components/Sparkline'; import AnimatedCard from '@/components/AnimatedCard'; import { useTradingData } from '@/providers/TradingDataProvider'; import { toPositionCards } from '@/lib/tradingViewModels'; export default function QuickPositions() { const router = useRouter(); const { botState } = useTradingData(); const preview = toPositionCards(botState?.positions || [], botState?.symbols).slice(0, 2); return ( ACTIVE POSITIONS router.push('/positions' as any)}> See All → {preview.map((pos, index) => { const isPositive = pos.unrealizedPnl >= 0; const color = isPositive ? Colors.accent.green : Colors.accent.red; return ( {pos.symbol} {pos.side === 'BUY' ? 'LONG' : 'SHORT'} {pos.profileName} {formatPrice(pos.currentPrice)} Entry {formatPrice(pos.entryPrice)} {formatCurrency(pos.unrealizedPnl)} ({formatPercent(pos.unrealizedPnlPercent)}) ); })} ); } const styles = StyleSheet.create({ container: { gap: 10, }, header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', marginBottom: 4, }, title: { fontFamily: Fonts.inter.black, fontSize: FontSize.micro, color: Colors.text.secondary, letterSpacing: 3, }, seeAll: { fontFamily: Fonts.inter.semiBold, fontSize: FontSize.bodySmall, color: Colors.accent.green, }, cardWrapper: { borderRadius: BorderRadius.large, }, card: { borderRadius: BorderRadius.large, padding: Spacing.cardPadding, borderWidth: 1, borderColor: Colors.border.default, overflow: 'hidden', }, accentLine: { position: 'absolute', top: 0, left: 0, right: 0, height: 2, opacity: 0.6, }, topRow: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 12, }, symbol: { fontFamily: Fonts.inter.black, fontSize: FontSize.subheading, color: Colors.text.primary, letterSpacing: -0.3, }, sideBadge: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 6, }, sideText: { fontFamily: Fonts.inter.black, fontSize: FontSize.micro, letterSpacing: 1, }, profileName: { fontFamily: Fonts.inter.medium, fontSize: FontSize.badge, color: Colors.text.secondary, marginLeft: 'auto', }, priceRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-end', marginBottom: 12, }, currentPrice: { fontFamily: Fonts.mono.bold, fontSize: FontSize.heading, color: Colors.text.primary, }, entryPrice: { fontFamily: Fonts.mono.regular, fontSize: FontSize.badge, color: Colors.text.secondary, marginTop: 2, }, pnlContainer: { alignItems: 'flex-end', }, pnl: { fontFamily: Fonts.mono.bold, fontSize: FontSize.bodyLarge, }, });