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,
},
})