aura-web/src/pages/MarketplacePage/MarketplacePageLogic.ts

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>;