import React, { useState, useMemo, useEffect } from 'react'; import { View, Text, StyleSheet, TouchableOpacity, Image, FlatList, Platform, StatusBar, Dimensions } from 'react-native'; import { Feather } from '@expo/vector-icons'; import { useRouter } from 'expo-router'; import { useAuth } from '../../context/AuthContext'; import { useAppTheme } from '../../context/ThemeContext'; import { useToast } from '../../context/ToastContext'; import { AppScreen } from '../../components/AppScreen'; import { AISectionHeader, AISkeleton, AIPressable } from '../../components/UI'; import { useTranslation } from '../../context/LanguageContext'; import { useAppConfig } from '../../context/ConfigContext'; import { MOCK_ARTICLES } from '../../constants/mocks'; import * as Haptics from 'expo-haptics'; const getQuickActions = (t: any) => { return [ { id: '1', name: t('account') || 'Account', icon: 'user', dark: true }, { id: '2', name: t('subscription') || 'Subscription', icon: 'credit-card', dark: false }, { id: '3', name: t('system') || 'System', icon: 'cpu', dark: true }, { id: '4', name: t('explore') || 'Explore', icon: 'compass', dark: false }, ]; }; const getCategories = (t: any) => [ { id: '1', name: t('all') || 'All' }, { id: '2', name: 'LLM' }, { id: '3', name: 'Robotics' }, { id: '4', name: 'Health' }, { id: '5', name: 'Coding' }, ]; // Mock data moved to constants/mocks.ts export default function Dashboard() { const { user } = useAuth(); const { colors, isDark } = useAppTheme(); const { showToast } = useToast(); const { t } = useTranslation(); const { config } = useAppConfig(); const router = useRouter(); const quickActions = useMemo(() => getQuickActions(t), [t]); const [loading, setLoading] = useState(true); const categories = useMemo(() => { if (config?.features?.dashboard_categories) { return config.features.dashboard_categories.split(',').map((name, index) => ({ id: String(index + 1), name: name.trim() })); } return getCategories(t); }, [config?.features?.dashboard_categories, t]); const [activeCategory, setActiveCategory] = useState(t('all') || 'All'); useEffect(() => { const timer = setTimeout(() => setLoading(false), 1500); return () => clearTimeout(timer); }, []); const handleAction = (name: string) => { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); showToast(`Opening ${name}`, 'info'); }; const filteredArticles = useMemo( () => MOCK_ARTICLES.filter(a => activeCategory === 'All' || a.category === activeCategory), [activeCategory] ); const cardBg = colors.surface; const cardBorder = colors.border; const subText = colors.textSecondary; const renderHeader = () => ( {/* ── Greeting row ── */} {t('halo') || 'Good morning'} 👋 {(user?.name || 'Alex').split(' ')[0]} router.push('/(tabs)/explore')}> {/* ── Highlight card ── */} handleAction(t('getHelp') || 'Support')} style={styles.highlightPressable}> {t('systemSupport') || 'System Support'} {t('instantHelp') || 'Instant Help 24/7'} {t('getHelp') || 'Get Help'} {/* ── Quick action grid ── */} {renderAction(quickActions[0], false)} {renderAction(quickActions[1], true)} {renderAction(quickActions[2], true)} {renderAction(quickActions[3], false)} {/* ── Categories ── */} item.id} renderItem={({ item }) => { const isActive = activeCategory === item.name; return ( { Haptics.selectionAsync(); setActiveCategory(item.name); }} style={[ styles.categoryPill, { backgroundColor: isActive ? (isDark ? colors.primary : '#1A1A1A') : (isDark ? '#2A2A2A' : '#FFFFFF'), borderColor: isActive ? 'transparent' : (isDark ? '#3A3A3C' : '#EEEEEE'), } ]} > {item.name} ); }} /> ); const renderAction = (item: any, isDarkCard: boolean) => { const bg = isDarkCard ? (isDark ? '#2A2A2A' : '#1A1A1A') : colors.primary; const iconColor = isDarkCard ? (isDark ? colors.primary : '#FFFFFF') : '#1A1A1A'; const textColor = isDarkCard ? '#FFFFFF' : '#1A1A1A'; return ( handleAction(item.name)} style={styles.actionCardWrapper} containerStyle={styles.actionCardInner} > {item.name} ); }; return ( {loading ? ( ) : ( item.id} ListHeaderComponent={renderHeader} showsVerticalScrollIndicator={false} contentContainerStyle={styles.scrollContent} renderItem={({ item }) => ( router.push({ pathname: '/detail/[id]' as any, params: { ...item, id: item.id } })} style={styles.feedPressable} > {item.category} {item.title} {item.author} )} ListFooterComponent={} /> )} ); } const styles = StyleSheet.create({ scrollContent: { paddingBottom: 20 }, headerContent: { paddingTop: 10 }, headerTop: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingHorizontal: 24, marginBottom: 20 }, greeting: { fontSize: 13, fontFamily: 'Outfit_400Regular' }, welcomeText: { fontSize: 32, fontFamily: 'Outfit_800ExtraBold', marginTop: 2 }, avatar: { width: 48, height: 48, borderRadius: 24, borderWidth: 2.5 }, highlightPressable: { marginHorizontal: 24, marginBottom: 24 }, highlightCard: { borderRadius: 24, padding: 22, flexDirection: 'row', alignItems: 'center', elevation: 8, shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.15, shadowRadius: 20 }, highlightLabel: { color: '#6B6B6B', fontFamily: 'Outfit_500Medium', fontSize: 11, textTransform: 'uppercase' }, highlightValue: { color: '#FFFFFF', fontFamily: 'Outfit_800ExtraBold', fontSize: 22, marginTop: 4, marginBottom: 16 }, limeBtn: { flexDirection: 'row', alignItems: 'center', alignSelf: 'flex-start', paddingHorizontal: 16, paddingVertical: 10, borderRadius: 12 }, limeBtnText: { color: '#1A1A1A', fontFamily: 'Outfit_700Bold', fontSize: 13 }, highlightIcon: { width: 68, height: 68, borderRadius: 20, alignItems: 'center', justifyContent: 'center', marginLeft: 16 }, quickGrid: { paddingHorizontal: 24, gap: 12 }, actionRow: { flexDirection: 'row', gap: 12, marginBottom: 12 }, actionCardWrapper: { flex: 1 }, actionCardInner: { flex: 1 }, innerContent: { height: 94, borderRadius: 20, borderWidth: 1, padding: 16, justifyContent: 'space-between' }, actionName: { fontSize: 14, fontFamily: 'Outfit_700Bold' }, categoryList: { paddingHorizontal: 24, paddingBottom: 4 }, categoryPill: { paddingHorizontal: 16, paddingVertical: 8, borderRadius: 12, marginRight: 10, borderWidth: 1 }, categoryText: { fontSize: 13, fontFamily: 'Outfit_600SemiBold' }, feedPressable: { marginHorizontal: 24, marginBottom: 10 }, feedCardInner: { flexDirection: 'row', padding: 12, alignItems: 'center', borderRadius: 20, borderWidth: 1 }, cardImg: { width: 70, height: 70, borderRadius: 14 }, cardCatWrap: { alignSelf: 'flex-start', paddingHorizontal: 8, paddingVertical: 3, borderRadius: 6, marginBottom: 6 }, cardCat: { fontSize: 9, fontFamily: 'Outfit_800ExtraBold', textTransform: 'uppercase' }, cardTitle: { fontSize: 14, fontFamily: 'Outfit_700Bold', lineHeight: 18 }, cardAuthor: { fontSize: 11, fontFamily: 'Outfit_400Regular', marginTop: 4 }, });