✨ feat: 完整应用重构 - 优化界面架构与用户体验
主要变更: - 重构应用界面:优化首页、登录、认证流程 - 新增用户档案模块:包含完整的档案管理组件 - 优化路由结构:重新组织页面布局和导航 - 改进API集成:新增活动、内容分类等API模块 - 删除冗余组件:清理不必要的文件和依赖 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
83
hooks/use-profile-data.ts
Normal file
83
hooks/use-profile-data.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import type { TemplateGeneration } from '@/lib/api/template-generations';
|
||||
import { getTemplateGenerations } from '@/lib/api/template-generations';
|
||||
|
||||
type TabKey = 'all' | 'image' | 'video';
|
||||
|
||||
export function useProfileData(activeTab: TabKey) {
|
||||
const [generations, setGenerations] = useState<TemplateGeneration[]>([]);
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [isRefreshing, setIsRefreshing] = useState(false);
|
||||
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
||||
const [hasMore, setHasMore] = useState(true);
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
|
||||
useEffect(() => {
|
||||
setGenerations([]);
|
||||
setCurrentPage(1);
|
||||
setHasMore(true);
|
||||
loadGenerations(1, true);
|
||||
}, [activeTab]);
|
||||
|
||||
const loadGenerations = async (page = 1, isRefresh = false) => {
|
||||
try {
|
||||
if (isRefresh) {
|
||||
setIsRefreshing(true);
|
||||
} else if (page === 1) {
|
||||
setIsLoading(true);
|
||||
} else {
|
||||
setIsLoadingMore(true);
|
||||
}
|
||||
setError(null);
|
||||
|
||||
const response = await getTemplateGenerations({
|
||||
page,
|
||||
limit: 20,
|
||||
type: activeTab === 'all' ? undefined : activeTab === 'image' ? 'IMAGE' : 'VIDEO'
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
const newGenerations = response.data.generations;
|
||||
const totalPages = Math.ceil(response.data.total / response.data.limit);
|
||||
|
||||
if (isRefresh || page === 1) {
|
||||
setGenerations(newGenerations);
|
||||
} else {
|
||||
setGenerations(prev => [...prev, ...newGenerations]);
|
||||
}
|
||||
|
||||
setHasMore(page < totalPages);
|
||||
setCurrentPage(page);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to load generations:', err);
|
||||
setError('Failed to load content');
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
setIsRefreshing(false);
|
||||
setIsLoadingMore(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleRefresh = () => {
|
||||
loadGenerations(1, true);
|
||||
};
|
||||
|
||||
const handleLoadMore = () => {
|
||||
if (!isLoadingMore && hasMore) {
|
||||
loadGenerations(currentPage + 1, false);
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
generations,
|
||||
isLoading,
|
||||
error,
|
||||
isRefreshing,
|
||||
isLoadingMore,
|
||||
hasMore,
|
||||
handleRefresh,
|
||||
handleLoadMore,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user