import { TemplateList } from '@/components/templates/template-list'; import { ThemedText } from '@/components/themed-text'; import { ThemedView } from '@/components/themed-view'; import { useAuth } from '@/hooks/use-auth'; import { getTemplates } from '@/lib/api/templates'; import { Template } from '@/lib/types/template'; import { LinearGradient } from 'expo-linear-gradient'; import { Ionicons } from '@expo/vector-icons'; import { useCallback, useEffect, useRef, useState } from 'react'; import { Alert, Animated, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { LoginModal } from '@/components/auth/login-modal'; export default function HomeScreen() { const { isAuthenticated } = useAuth(); const [templates, setTemplates] = useState([]); const [loading, setLoading] = useState(false); const [refreshing, setRefreshing] = useState(false); const [isLoadingMore, setIsLoadingMore] = useState(false); const [currentPage, setCurrentPage] = useState(1); const [hasMore, setHasMore] = useState(true); const [error, setError] = useState(null); const [showLoginModal, setShowLoginModal] = useState(false); const pulseAnim = useRef(new Animated.Value(0)).current; const bounceAnim = useRef(new Animated.Value(0)).current; const fetchTemplates = useCallback(async (page: number = 1, isRefreshing = false, isLoadMore = false) => { if (!isAuthenticated) return; try { if (isRefreshing) { setRefreshing(true); } else if (isLoadMore) { setIsLoadingMore(true); } else { setLoading(true); } setError(null); const response = await getTemplates({ page, size: 10, status: 'RELEASE' }); if (isRefreshing || page === 1) { setTemplates(response.data); setCurrentPage(1); } else { setTemplates(prev => [...prev, ...response.data]); setCurrentPage(page); } setHasMore(response.pagination.page < response.pagination.totalPages); } catch (err: any) { console.error('获取模板列表失败:', err); setError(err.message || '获取模板列表失败'); } finally { setLoading(false); setRefreshing(false); setIsLoadingMore(false); } }, [isAuthenticated]); const loadMore = useCallback(() => { if (!isLoadingMore && hasMore && !refreshing) { fetchTemplates(currentPage + 1, false, true); } }, [currentPage, hasMore, isLoadingMore, refreshing, fetchTemplates]); useEffect(() => { if (isAuthenticated) { fetchTemplates(); setShowLoginModal(false); } Animated.loop( Animated.sequence([ Animated.timing(pulseAnim, { toValue: 1, duration: 2000, useNativeDriver: false, }), Animated.timing(pulseAnim, { toValue: 0, duration: 2000, useNativeDriver: false, }), ]) ).start(); Animated.loop( Animated.sequence([ Animated.timing(bounceAnim, { toValue: -10, duration: 600, useNativeDriver: true, }), Animated.timing(bounceAnim, { toValue: -5, duration: 200, useNativeDriver: true, }), Animated.timing(bounceAnim, { toValue: 0, duration: 600, useNativeDriver: true, }), Animated.timing(bounceAnim, { toValue: 0, duration: 200, useNativeDriver: true, }), ]) ).start(); }, [isAuthenticated, fetchTemplates, pulseAnim, bounceAnim]); const handleRefresh = useCallback(() => { fetchTemplates(1, true, false); }, [fetchTemplates]); const handleTemplatePress = (template: Template) => { Alert.alert('模板详情', `您选择了: ${template.title}`); }; const handleVideoChange = (template: Template, index: number) => { console.log('视频切换到:', template.title, '索引:', index); }; if (!isAuthenticated) { const scaleAnim = pulseAnim.interpolate({ inputRange: [0, 1], outputRange: [0.95, 1.05], }); return ( 欢迎使用模板中心 登录后即可浏览和使用海量精美模板 setShowLoginModal(true)} activeOpacity={0.8} > 立即登录 游客浏览 setShowLoginModal(false)} /> ); } const shadowOpacity = pulseAnim.interpolate({ inputRange: [0, 1], outputRange: [0.3, 0.4], }); return ( New User 50% Off Coupon : NEWUSER 🎁 setShowLoginModal(false)} /> ); } const styles = StyleSheet.create({ container: { flex: 1, }, welcomeContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', paddingHorizontal: 40, }, iconContainer: { width: 120, height: 120, borderRadius: 60, backgroundColor: 'rgba(0, 122, 255, 0.1)', justifyContent: 'center', alignItems: 'center', marginBottom: 24, }, welcomeTitle: { fontSize: 28, fontWeight: '700', marginBottom: 12, textAlign: 'center', }, welcomeSubtitle: { fontSize: 16, textAlign: 'center', opacity: 0.7, marginBottom: 48, lineHeight: 24, }, loginButton: { width: '100%', height: 56, borderRadius: 16, overflow: 'hidden', elevation: 8, shadowColor: '#007AFF', shadowOffset: { width: 0, height: 4 }, shadowRadius: 12, shadowOpacity: 0.3, }, loginButtonGradient: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', height: '100%', }, loginButtonIcon: { marginRight: 8, }, loginButtonText: { color: '#fff', fontSize: 17, fontWeight: '700', }, guestButton: { width: '100%', height: 56, borderRadius: 16, borderWidth: 1.5, borderColor: 'rgba(0, 122, 255, 0.3)', alignItems: 'center', justifyContent: 'center', marginTop: 12, }, guestButtonText: { color: '#007AFF', fontSize: 16, fontWeight: '600', }, headerBanner: { position: 'absolute', top: 16, left: '10%', right: '10%', zIndex: 1000, borderRadius: 20, shadowColor: '#ff6b6b', shadowOffset: { width: 0, height: 4 }, shadowRadius: 12, elevation: 8, overflow: 'hidden', }, gradientBanner: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingVertical: 4, paddingHorizontal: 16, position: 'relative', }, bannerText: { fontSize: 14, fontWeight: '600', color: '#fff', textAlign: 'center', }, couponText: { fontWeight: '800', fontSize: 14, color: '#fff', backgroundColor: 'rgba(255, 255, 255, 0.2)', paddingHorizontal: 8, paddingVertical: 2, borderRadius: 6, marginLeft: 6, borderWidth: 1, borderColor: 'rgba(255, 255, 255, 0.6)', borderStyle: 'dashed', }, giftIcon: { position: 'absolute', right: 8, fontSize: 16, }, });