bw-expo-app/hooks/use-profile-data.ts

84 lines
2.2 KiB
TypeScript

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