60 lines
1.4 KiB
TypeScript
60 lines
1.4 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { App as AntApp } from 'antd';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import { MarketplaceAPI, MarketplaceAgent } from '../../api';
|
|
|
|
export function useMarketplacePageLogic() {
|
|
const [list, setList] = useState<MarketplaceAgent[]>([]);
|
|
const [loading, setLoading] = useState(false);
|
|
const [q, setQ] = useState('');
|
|
const navigate = useNavigate();
|
|
const { message } = AntApp.useApp();
|
|
|
|
const load = async () => {
|
|
setLoading(true);
|
|
try {
|
|
setList(await MarketplaceAPI.list());
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
load();
|
|
}, []);
|
|
|
|
const filtered = q
|
|
? list.filter(
|
|
(a) =>
|
|
a.name.includes(q) ||
|
|
a.description?.includes(q) ||
|
|
(a.ownerName || '').includes(q)
|
|
)
|
|
: list;
|
|
|
|
const handleFork = async (a: MarketplaceAgent) => {
|
|
try {
|
|
const r = await MarketplaceAPI.fork(a.id);
|
|
message.success(`已复制到「${r.name}」`);
|
|
navigate(`/agents/${r.id}`);
|
|
} catch (e: any) {
|
|
message.error(e?.response?.data?.error ?? e?.message ?? '复制失败');
|
|
}
|
|
};
|
|
|
|
const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/');
|
|
|
|
return {
|
|
list,
|
|
loading,
|
|
q,
|
|
filtered,
|
|
setQ,
|
|
load,
|
|
handleFork,
|
|
isImageUrl,
|
|
};
|
|
}
|
|
|
|
export type MarketplacePageLogicOutput = ReturnType<typeof useMarketplacePageLogic>;
|