import { useState, useEffect } from 'react' import { useNavigate, useParams } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' import { NamespaceHeader } from '@/features/namespace/namespace-header' import { SkillCard } from '@/features/skill/skill-card' import { SkeletonList } from '@/shared/components/skeleton-loader' import { EmptyState } from '@/shared/components/empty-state' import { Pagination } from '@/shared/components/pagination' import { useSearchSkills } from '@/shared/hooks/use-skill-queries' import { useNamespaceDetail } from '@/shared/hooks/use-namespace-queries' const PAGE_SIZE = 20 /** * Public namespace page showing namespace metadata and the skills currently discoverable inside it. */ export function NamespacePage() { const { t } = useTranslation() const navigate = useNavigate() const { namespace } = useParams({ from: '/space/$namespace' }) const [page, setPage] = useState(0) // Reset page when namespace changes useEffect(() => { setPage(0) }, [namespace]) const { data: namespaceData, isLoading: isLoadingNamespace } = useNamespaceDetail(namespace) const { data: skillsData, isLoading: isLoadingSkills } = useSearchSkills({ namespace, page, size: PAGE_SIZE, }) const totalPages = skillsData ? Math.max(Math.ceil(skillsData.total / skillsData.size), 1) : 1 const handleSkillClick = (slug: string) => { navigate({ to: `/space/${namespace}/${encodeURIComponent(slug)}` }) } if (isLoadingNamespace) { return (
) } if (!namespaceData) { return } return (

{t('namespace.skillList')}

{isLoadingSkills ? ( ) : skillsData && skillsData.items.length > 0 ? ( <>
{skillsData.items.map((skill, idx) => (
handleSkillClick(skill.slug)} />
))}
{skillsData.total > PAGE_SIZE ? ( ) : null} ) : ( )}
) }