import { useEffect, useState } from 'react'; import { useToast } from '../../hooks/use-toast'; import { httpGet } from '../../lib/http'; import { AIRoadmapAlert } from '../GenerateRoadmap/AIRoadmapAlert.tsx'; import { ExploreAISorting, type SortByValues } from './ExploreAISorting.tsx'; import { deleteUrlParam, getUrlParams, setUrlParams, } from '../../lib/browser.ts'; import { Pagination } from '../Pagination/Pagination.tsx'; import { LoadingRoadmaps } from './LoadingRoadmaps.tsx'; import { EmptyRoadmaps } from './EmptyRoadmaps.tsx'; import { AIRoadmapsList } from './AIRoadmapsList.tsx'; import { ExploreAISearch } from './ExploreAISearch.tsx'; export interface AIRoadmapDocument { _id?: string; term: string; title: string; data: string; viewCount: number; createdAt: Date; updatedAt: Date; } type ExploreRoadmapsResponse = { data: AIRoadmapDocument[]; totalCount: number; totalPages: number; currPage: number; perPage: number; }; type QueryParams = { q?: string; s?: SortByValues; p?: string; }; type PageState = { searchTerm: string; sortBy: SortByValues; currentPage: number; }; export function ExploreAIRoadmap() { const toast = useToast(); const [pageState, setPageState] = useState({ searchTerm: '', sortBy: 'createdAt', currentPage: 0, }); useEffect(() => { const queryParams = getUrlParams() as QueryParams; setPageState({ searchTerm: queryParams.q || '', sortBy: queryParams.s || 'createdAt', currentPage: +(queryParams.p || '1'), }); }, []); useEffect(() => { setIsLoading(true); if (!pageState.currentPage) { return; } // only set the URL params if the user modified anything if ( pageState.currentPage !== 1 || pageState.searchTerm !== '' || pageState.sortBy !== 'createdAt' ) { setUrlParams({ q: pageState.searchTerm, s: pageState.sortBy, p: String(pageState.currentPage), }); } else { deleteUrlParam('q'); deleteUrlParam('s'); deleteUrlParam('p'); } loadAIRoadmaps( pageState.currentPage, pageState.searchTerm, pageState.sortBy, ).finally(() => { setIsLoading(false); }); }, [pageState]); const [isLoading, setIsLoading] = useState(true); const [roadmapsResponse, setRoadmapsResponse] = useState(null); const loadAIRoadmaps = async ( currPage: number = 1, searchTerm: string = '', sortBy: SortByValues = 'createdAt', ) => { const { response, error } = await httpGet( `${import.meta.env.PUBLIC_API_URL}/v1-list-ai-roadmaps`, { currPage, ...(searchTerm && { term: searchTerm }), ...(sortBy && { sortBy }), }, ); if (error || !response) { toast.error(error?.message || 'Something went wrong'); return; } setRoadmapsResponse(response); }; const roadmaps = roadmapsResponse?.data || []; const loadingIndicator = isLoading && ; const emptyRoadmaps = !isLoading && roadmaps.length === 0 && ( ); const roadmapsList = !isLoading && roadmaps.length > 0 && ( <> { setPageState({ ...pageState, currentPage: page, }); }} /> ); return (
{ setPageState({ ...pageState, searchTerm: term, currentPage: 1, }); }} /> { setPageState({ ...pageState, sortBy, currentPage: 1, }); }} />
{loadingIndicator} {emptyRoadmaps} {roadmapsList}
); }