import { useEffect } from 'react' import { View, Text, StyleSheet, Pressable, StatusBar as RNStatusBar, ActivityIndicator, } from 'react-native' import { StatusBar } from 'expo-status-bar' import { SafeAreaView } from 'react-native-safe-area-context' import { useRouter, useLocalSearchParams } from 'expo-router' import { useTranslation } from 'react-i18next' import { LeftArrowIcon } from '@/components/icon' import SearchResultsGrid from '@/components/SearchResultsGrid' import { useTemplateDetail, useTemplateGenerations, type TemplateGeneration } from '@/hooks' const CARD_HEIGHTS = [214, 236, 200, 220, 210, 225] export default function TemplateDetailScreen() { const { t } = useTranslation() const router = useRouter() const params = useLocalSearchParams() const templateId = typeof params.id === 'string' ? params.id : undefined const { data: templateDetail, loading: templateLoading, error: templateError, execute: loadTemplateDetail } = useTemplateDetail() const { generations, loading: generationsLoading, execute: loadGenerations } = useTemplateGenerations() useEffect(() => { if (templateId) { loadTemplateDetail({ id: templateId }) loadGenerations({ templateId, page: 1, limit: 20 }) } }, [templateId, loadTemplateDetail, loadGenerations]) // 直接使用 TemplateGeneration 数据,只添加必要的 height 字段 const displayData = generations.map((generation, index) => ({ ...generation, height: CARD_HEIGHTS[index % CARD_HEIGHTS.length], title: generation.template?.title || generation.template?.titleEn || '', image: generation.resultUrl?.[0] || generation.originalUrl || '', })) if (templateLoading && !templateDetail) { return ( ) } if (templateError && !templateDetail) { return ( 加载失败,请返回重试 router.back()}> 返回 ) } return ( {/* 顶部导航栏 */} router.back()} style={styles.backButton} > {/* 标题区域 */} {templateDetail?.title || templateDetail?.titleEn || t('templateDetail.title')} {t('templateDetail.subtitle')} {/* 加载更多指示器 */} {generationsLoading && generations.length > 0 && ( 加载中... )} ) } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#090A0B', }, centerContainer: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 12, }, header: { flexDirection: 'row', alignItems: 'center', paddingTop: 12, paddingHorizontal: 12, paddingBottom: 24, }, backButton: { padding: 4, }, titleSection: { paddingHorizontal: 12, paddingBottom: 24, }, mainTitle: { color: '#F5F5F5', fontSize: 20, fontWeight: '500', marginBottom: 4, }, subTitle: { color: '#ABABAB', fontSize: 14, fontWeight: '400', }, errorText: { color: '#FFFFFF', fontSize: 14, textAlign: 'center', }, retryButton: { backgroundColor: '#FF6699', paddingHorizontal: 24, paddingVertical: 12, borderRadius: 8, }, retryButtonText: { color: '#FFFFFF', fontSize: 14, fontWeight: '600', }, loadingMoreContainer: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 8, paddingVertical: 16, }, loadingMoreText: { color: '#ABABAB', fontSize: 12, }, })