/** * StatsView Component * Zoomer statistics and earnings dashboard */ import React from 'react'; import { View, Text, StyleSheet, ScrollView, Animated, } from 'react-native'; import Icon from 'react-native-vector-icons/MaterialIcons'; export default function StatsView({ stats }) { const fadeAnim = new Animated.Value(0); React.useEffect(() => { Animated.timing(fadeAnim, { toValue: 1, duration: 600, useNativeDriver: true, }).start(); }, []); const renderStatCard = (icon, title, value, subtitle, color) => ( {value} {title} {subtitle && {subtitle}} ); const renderLevelProgress = () => { const levels = ['Supplementary', 'Active', 'Professional']; const currentLevelIndex = levels.indexOf(stats.level); const nextLevel = levels[currentLevelIndex + 1]; const progress = stats.level_progress || 0; return ( Zoomer Level {stats.level} {progress}% to {nextLevel || 'Max'} Requirements for {nextLevel}: {getLevelRequirements(nextLevel).map((req, index) => ( {req.text} ))} ); }; const getLevelColor = (level) => { const colors = { 'Supplementary': '#8E8E93', 'Active': '#007AFF', 'Professional': '#34C759', }; return colors[level] || '#8E8E93'; }; const getLevelRequirements = (level) => { const requirements = { 'Active': [ { text: 'Complete 10 missions', completed: (stats.completed_missions || 0) >= 10 }, { text: 'Earn $500 total', completed: (stats.total_earnings || 0) >= 500 }, { text: '95% approval rate', completed: (stats.approval_rate || 0) >= 95 }, ], 'Professional': [ { text: 'Complete 50 missions', completed: (stats.completed_missions || 0) >= 50 }, { text: 'Earn $5,000 total', completed: (stats.total_earnings || 0) >= 5000 }, { text: '98% approval rate', completed: (stats.approval_rate || 0) >= 98 }, { text: '5+ countries', completed: (stats.countries || 0) >= 5 }, ], }; return requirements[level] || []; }; return ( {/* Header */} Your Stats Last 30 days {/* Earnings Card */} Total Earnings ${(stats.total_earnings || 0).toFixed(2)} +{(stats.earnings_growth || 0).toFixed(1)}% this month {/* Stats Grid */} {renderStatCard('camera-alt', 'Observations', stats.total_observations || 0, `${stats.approved_observations || 0} approved`, '#007AFF')} {renderStatCard('check-circle', 'Missions', stats.completed_missions || 0, `${stats.active_missions || 0} active`, '#34C759')} {renderStatCard('star', 'Rating', `${stats.rating || 0}/5.0`, `${stats.reviews || 0} reviews`, '#FF9500')} {renderStatCard('schedule', 'Response Time', `${stats.avg_response_time || 0}h`, 'Average', '#5856D6')} {/* Level Progress */} {renderLevelProgress()} {/* Recent Activity */} Recent Activity {(stats.recent_activity || []).map((activity, index) => ( {activity.text} {activity.time} {activity.amount && ( 0 ? '#34C759' : '#FF3B30' }]}> {activity.amount > 0 ? '+' : ''}${Math.abs(activity.amount).toFixed(2)} )} ))} ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#000', }, scrollView: { flex: 1, padding: 16, }, header: { marginBottom: 20, }, headerTitle: { fontSize: 28, fontWeight: '700', color: '#fff', }, headerSubtitle: { fontSize: 14, color: '#8E8E93', marginTop: 4, }, earningsCard: { backgroundColor: '#1C1C1E', borderRadius: 16, padding: 20, marginBottom: 16, alignItems: 'center', }, earningsLabel: { fontSize: 14, color: '#8E8E93', marginBottom: 8, }, earningsValue: { fontSize: 48, fontWeight: '700', color: '#34C759', }, earningsTrend: { flexDirection: 'row', alignItems: 'center', marginTop: 8, }, earningsTrendText: { fontSize: 14, color: '#34C759', marginLeft: 4, }, statsGrid: { flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'space-between', marginBottom: 16, }, statCard: { width: '48%', backgroundColor: '#1C1C1E', borderRadius: 12, padding: 16, marginBottom: 12, borderLeftWidth: 3, flexDirection: 'row', alignItems: 'center', }, statIconContainer: { width: 40, height: 40, borderRadius: 10, backgroundColor: 'rgba(255,255,255,0.05)', justifyContent: 'center', alignItems: 'center', marginRight: 12, }, statContent: { flex: 1, }, statValue: { fontSize: 24, fontWeight: '700', color: '#fff', }, statTitle: { fontSize: 12, color: '#8E8E93', marginTop: 2, }, statSubtitle: { fontSize: 11, color: '#34C759', marginTop: 2, }, levelCard: { backgroundColor: '#1C1C1E', borderRadius: 16, padding: 20, marginBottom: 16, }, levelHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12, }, levelTitle: { fontSize: 16, fontWeight: '600', color: '#fff', }, levelBadge: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 8, }, levelBadgeText: { color: '#fff', fontSize: 12, fontWeight: '700', }, levelProgressContainer: { marginBottom: 16, }, levelProgressBar: { height: 8, backgroundColor: '#2C2C2E', borderRadius: 4, marginBottom: 8, }, levelProgressFill: { height: '100%', backgroundColor: '#34C759', borderRadius: 4, }, levelProgressText: { fontSize: 12, color: '#8E8E93', textAlign: 'right', }, levelRequirements: { borderTopWidth: 1, borderTopColor: '#2C2C2E', paddingTop: 12, }, levelRequirementsTitle: { fontSize: 14, fontWeight: '600', color: '#fff', marginBottom: 8, }, requirementRow: { flexDirection: 'row', alignItems: 'center', marginBottom: 8, }, requirementText: { fontSize: 13, color: '#8E8E93', marginLeft: 8, }, requirementCompleted: { color: '#34C759', textDecorationLine: 'line-through', }, activityCard: { backgroundColor: '#1C1C1E', borderRadius: 16, padding: 20, marginBottom: 16, }, activityTitle: { fontSize: 16, fontWeight: '600', color: '#fff', marginBottom: 12, }, activityRow: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10, borderBottomWidth: 1, borderBottomColor: '#2C2C2E', }, activityIcon: { width: 32, height: 32, borderRadius: 8, justifyContent: 'center', alignItems: 'center', marginRight: 12, }, activityContent: { flex: 1, }, activityText: { fontSize: 14, color: '#fff', }, activityTime: { fontSize: 12, color: '#8E8E93', marginTop: 2, }, activityAmount: { fontSize: 14, fontWeight: '600', }, });