'use client' import * as React from 'react' import Link from 'next/link' import { ArrowLeft, ExternalLink, GitFork, Code, List, Star, FileText } from 'lucide-react' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' import { useParams } from 'next/navigation' import { SlidingPanel, SlidingPanelMain, SlidingPanelSide } from '@/components/personal-list/sliding-panel' import { PersonalListEditor } from '@/components/personal-list/personal-list-editor' import { PushToListButton } from '@/components/personal-list/push-to-list-button' import { usePersonalListStore } from '@/lib/personal-list-store' interface Repository { id: number name: string url: string description: string | null stars: number | null forks: number | null language: string | null topics: string | null } interface AwesomeList { id: number name: string url: string description: string | null category: string | null stars: number | null } interface ListDetailResponse { list: AwesomeList repositories: { results: Repository[] total: number page: number pageSize: number totalPages: number } } export default function ListDetailPage() { const params = useParams() const listId = params.id as string const [data, setData] = React.useState(null) const [loading, setLoading] = React.useState(true) const [page, setPage] = React.useState(1) const { isEditorOpen, closeEditor, openEditor } = usePersonalListStore() React.useEffect(() => { setLoading(true) fetch(`/api/lists/${listId}?page=${page}`) .then(res => res.json()) .then(data => { setData(data) setLoading(false) }) .catch(err => { console.error('Failed to fetch list:', err) setLoading(false) }) }, [listId, page]) if (loading && !data) { return (
{[...Array(10)].map((_, i) => ( ))}
) } if (!data) { return (

List Not Found

The awesome list you're looking for doesn't exist.

) } const { list, repositories } = data return (
{/* Header */}

{list.name}

{list.description && (

{list.description}

)}
{list.category && ( {list.category} )}
Showing {repositories.results.length} of {repositories.total.toLocaleString()} repositories
{/* Repositories */}
{repositories.results.map((repo) => { const topics = repo.topics ? repo.topics.split(',') : [] return (

{repo.name}

{repo.stars !== null && (
{repo.stars.toLocaleString()}
)} {repo.forks !== null && (
{repo.forks.toLocaleString()}
)}
{repo.description && (

{repo.description}

)}
{repo.language && ( {repo.language} )} {topics.slice(0, 5).map((topic) => ( {topic.trim()} ))} {topics.length > 5 && ( +{topics.length - 5} more )}
) })}
{/* Pagination */} {repositories.totalPages > 1 && (
Page {repositories.page} of {repositories.totalPages}
)}
) }