import { useModel } from '@@/plugin-model'; import { InputNumber as CInputNumber, Select } from '@gpustack/core-ui'; import { Button, Flex, Form, message, Radio } from 'antd'; import { useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import { FormData as StorageFormData } from '../../storage/config/types'; import useCreateStorage from '../../storage/services/use-create-storage'; import useQueryStorage from '../../storage/services/use-query-storage'; import { StorageModeValueMap } from '../config'; import { FormData } from '../config/types'; import StorageOverlay from './storage-overlay'; const FieldBlock = styled.div` margin-bottom: 24px; `; type StorageHolderFields = { storage_mode?: string; storage_name?: string; local_storage_size_gb?: number; }; const StorageVolume = () => { const { initialState } = useModel('@@initialState'); const namespace = initialState?.currentUser?.org_name || 'default'; const form = Form.useFormInstance(); const storageMode = Form.useWatch('storage_mode', form) as string | undefined; const storageName = Form.useWatch('storage_name', form) as string | undefined; const localSize = Form.useWatch('local_storage_size_gb', form) as | number | undefined; const [overlayOpen, setOverlayOpen] = useState(false); const { fetchData: createStorage } = useCreateStorage(); const { detailData: storageData, fetchData: fetchStorage } = useQueryStorage(); useEffect(() => { fetchStorage({}); }, [fetchStorage]); const storageOptions = useMemo( () => (storageData?.items || []).map((item) => ({ label: `${item.metadata?.name} / ${item.spec?.capacity ?? '-'}`, value: item.metadata?.name })), [storageData] ); useEffect(() => { if (storageMode === StorageModeValueMap.Existing) { form.setFieldValue(['spec', 'volume'], { persistent: { name: storageName || '' } }); } else if (storageMode === StorageModeValueMap.Temporary) { form.setFieldValue(['spec', 'volume'], { ephemeral: { capacity: localSize ? `${localSize}Gi` : '' } }); } }, [form, storageMode, storageName, localSize]); const handleCreateStorage = async (values: StorageFormData) => { try { await createStorage({ data: values }); await fetchStorage({}); form.setFieldValue('storage_name', values.metadata.name); setOverlayOpen(false); message.success('操作成功'); } catch (error) { message.error('操作失败'); } }; return ( {storageMode === StorageModeValueMap.Existing && (