import { enabledBackendsAtom } from '@/atoms/backend'; import useTableFetch from '@/hooks/use-table-fetch'; import { SearchOutlined } from '@ant-design/icons'; import { IconFont, InfiniteScrollerProvider, NoResult, ThemeTag } from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; import { Input, Tooltip } from 'antd'; import { useAtom } from 'jotai'; import _ from 'lodash'; import React, { useEffect } from 'react'; import styled from 'styled-components'; import { INFERENCE_BACKEND_API, queryBackendsList } from '../apis'; import BackendCard from '../components/backend-card'; import BackendCardList from '../components/backend-list'; import { ListItem } from '../config/types'; const FilterBox = styled.div` position: sticky; top: 0; width: 100%; z-index: 100; margin-bottom: 16px; background-color: var(--ant-color-bg-container); `; const CommunityBackends: React.FC<{ onEnable: (checked: boolean, data: ListItem) => void; onClick: (data: ListItem) => void; }> = ({ onEnable, onClick }) => { const intl = useIntl(); const [enabledBackendAtom] = useAtom(enabledBackendsAtom); const [currentData, setCurrentData] = React.useState(null); const { dataSource, loadMore, queryParams, handleSearch, setDataSource, handleNameChange } = useTableFetch({ fetchAPI: queryBackendsList, API: INFERENCE_BACKEND_API, watch: false, isInfiniteScroll: true, contentForDelete: 'backends.title', defaultQueryParams: { perPage: 24, community: 1 } }); useEffect(() => { if (enabledBackendAtom) { setDataSource((prev) => { const newDataList = prev.dataList.map((item) => { if (item.id === enabledBackendAtom.id) { return { ...item, enabled: enabledBackendAtom.enabled }; } return item; }); return { ...prev, dataList: newDataList }; }); } }, [enabledBackendAtom]); const handleOnClickItem = (data: ListItem) => { onClick(data); setCurrentData(data); }; const handleOnEnable = async (checked: boolean, data: ListItem) => { await onEnable(checked, data); await handleSearch(); if (data.id === currentData?.id) { handleOnClickItem({ ...data, enabled: checked }); } }; const actionsRenderer = (data: ListItem) => { return ( <> {data.enabled && ( {intl.formatMessage({ id: 'common.status.enabled' })} )} ); }; useEffect(() => { if (dataSource.dataList.length > 0 && dataSource.loadend && !currentData) { handleOnClickItem(dataSource.dataList[0]); } }, [dataSource.dataList, dataSource.loadend]); const renderItem = (item: ListItem) => { return (
); }; return (
} placeholder={intl.formatMessage({ id: 'common.filter.name' })} style={{ width: '100%' }} allowClear onChange={handleNameChange} > } filters={_.omit(queryParams, ['sort_by'])} noFoundText={intl.formatMessage({ id: 'noresult.backend.nofound' })} >
); }; export default CommunityBackends;