Files
gpustack-ui/src/pages/llmodels/index.tsx
T

145 lines
4.3 KiB
TypeScript

import {
HeaderLeft,
usePageContentStyle
} from '@/pages/_components/page-box';
import { IconFont } from '@gpustack/core-ui';
import { useIntl } from '@umijs/max';
import { useMemoizedFn } from 'ahooks';
import { Segmented, Tabs } from 'antd';
import { useEffect, useMemo, useRef, useState } from 'react';
import { DeploymentsContext } from './config/deploments-context';
import ModelView from './deployments';
import useFormInitialValues from './hooks/use-form-initial-values';
import InstanceView from './instance-view';
const TabsValueMap = {
ModelView: 'modelView',
InstanceView: 'instanceView'
};
const LLModels: React.FC = () => {
const intl = useIntl();
const {
generateFormValues,
clusterList,
getClusterList,
getWorkerList,
workerList
} = useFormInitialValues();
const [activeKey, setActiveKey] = useState(TabsValueMap.ModelView);
const modelViewRef = useRef<any>(null);
const instanceViewRef = useRef<any>(null);
useEffect(() => {
const getData = async () => {
await Promise.all([getClusterList(), getWorkerList()]);
};
getData();
}, []);
const handleTabChange = useMemoizedFn((key: string) => {
if (key === TabsValueMap.ModelView) {
modelViewRef.current?.resumeRequestsOnPageActive();
instanceViewRef.current?.cancelRequestsOnPageInactive();
}
if (key === TabsValueMap.InstanceView) {
instanceViewRef.current?.resumeRequestsOnPageActive();
modelViewRef.current?.cancelRequestsOnPageInactive();
}
setActiveKey(key);
});
const title = useMemo(() => {
return (
<div className="flex items-center">
<span className="font-600 flex-center">
{intl.formatMessage({ id: 'menu.models.deployment' })}
</span>
<Segmented
shape="round"
style={{
backgroundColor: 'var(--ant-color-fill-secondary)',
fontSize: 13
}}
size="middle"
className="m-l-24 font-400"
options={[
{
label: intl.formatMessage({ id: 'models.table.modelView' }),
value: TabsValueMap.ModelView,
icon: <IconFont type={'icon-models'}></IconFont>
},
{
label: intl.formatMessage({ id: 'models.table.instanceView' }),
value: TabsValueMap.InstanceView,
icon: <IconFont type={'icon-instance-outline'}></IconFont>
}
]}
value={activeKey}
onChange={handleTabChange}
></Segmented>
</div>
);
}, [activeKey, intl]);
useEffect(() => {
const handleVisibilityChange = async () => {
if (document.visibilityState === 'visible') {
if (activeKey === TabsValueMap.ModelView) {
modelViewRef.current?.resumeRequestsOnPageActive();
}
if (activeKey === TabsValueMap.InstanceView) {
instanceViewRef.current?.resumeRequestsOnPageActive();
}
} else {
if (activeKey === TabsValueMap.ModelView) {
modelViewRef.current?.cancelRequestsOnPageInactive();
}
if (activeKey === TabsValueMap.InstanceView) {
instanceViewRef.current?.cancelRequestsOnPageInactive();
}
}
};
document.addEventListener('visibilitychange', handleVisibilityChange);
return () => {
document.removeEventListener('visibilitychange', handleVisibilityChange);
};
}, [activeKey]);
usePageContentStyle({ padding: 0 });
return (
<>
<HeaderLeft>{title}</HeaderLeft>
<DeploymentsContext.Provider
value={{
generateFormValues,
clusterList,
workerList
}}
>
<Tabs
renderTabBar={() => <></>}
items={[
{
key: TabsValueMap.ModelView,
label: intl.formatMessage({ id: 'models.table.modelView' }),
children: <ModelView ref={modelViewRef}></ModelView>
},
{
key: TabsValueMap.InstanceView,
label: intl.formatMessage({ id: 'models.table.instanceView' }),
children: <InstanceView ref={instanceViewRef}></InstanceView>
}
]}
activeKey={activeKey}
></Tabs>
</DeploymentsContext.Provider>
</>
);
};
export default LLModels;