import { useState, useEffect, useCallback } from 'react' import { Link } from 'react-router-dom' import { listMarket, listCategories } from '../lib/api' import { MarketItem, RuntimeCategory } from '../types' export default function Market() { const [items, setItems] = useState([]) const [categories, setCategories] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [categoryId, setCategoryId] = useState(0) const [search, setSearch] = useState('') const [loading, setLoading] = useState(true) useEffect(() => { listCategories().then(setCategories).catch(() => {}) }, []) const fetchMarket = useCallback(async () => { setLoading(true) try { const res = await listMarket({ page, per_page: 20, category_id: categoryId || undefined, search: search || undefined, }) setItems(res.items) setTotal(res.total) } catch { setItems([]) } finally { setLoading(false) } }, [page, categoryId, search]) useEffect(() => { fetchMarket() }, [fetchMarket]) const totalPages = Math.ceil(total / 20) return (

脚本市场

浏览已发布的脚本,一键获取运行命令

{/* Search + Filter */}
{ setSearch(e.target.value); setPage(1) }} placeholder="搜索脚本..." className="flex-1 px-4 py-2.5 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:border-blue-500" />
{/* Results */} {loading ? (
加载中...
) : items.length === 0 ? (

暂无脚本

创建一个
) : (
{items.map((item) => (
{item.title} {item.category_icon} {item.category_label}
{item.description && (

{item.description}

)}
{item.id}
))}
)} {/* Pagination */} {totalPages > 1 && (
{page} / {totalPages} ({total} 个脚本)
)}
) }