import { currentClusterAtom } from '@/atoms/gpuservice'; import { getCurrentOrgNamespace } from '@/atoms/user'; import { PageAction } from '@/config'; import { Input as CInput, InputNumber as CInputNumber, LabelInfo, Select, useAppUtils } from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; import { Button, Flex, Form, Radio } from 'antd'; import { useAtomValue } from 'jotai'; 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; `; const DEFAULT_TEMP_CAPACITY_GB = 50; const StorageVolume = ({ disabled, action }: { disabled?: boolean; action: PageActionType; }) => { const intl = useIntl(); const { getRuleMessage } = useAppUtils(); const { fetchData: createStorage } = useCreateStorage(); const { detailData: storageData, fetchData: fetchStorage } = useQueryStorage(); const [overlayOpen, setOverlayOpen] = useState(false); const [storageMode, setStorageMode] = useState( StorageModeValueMap.Temporary ); const form = Form.useFormInstance(); const currentCluster = useAtomValue(currentClusterAtom); const namespace = getCurrentOrgNamespace(currentCluster?.owner_principal_id); useEffect(() => { fetchStorage({}); }, []); const storageOptions = useMemo( () => (storageData?.items || []).map((item) => ({ label: `${item.metadata?.name} / ${item.spec?.capacity ?? '-'}`, value: item.metadata?.name })), [storageData] ); const handleModeChange = (mode: string) => { console.log('selected storage mode', mode); if (mode === StorageModeValueMap.Existing) { form.setFieldValue(['spec', 'volume'], { persistent: { name: '' } }); } else { form.setFieldValue(['spec', 'volume'], { ephemeral: { capacity: `${DEFAULT_TEMP_CAPACITY_GB}Gi` } }); } setStorageMode(mode); }; const handleCreateStorage = async (values: StorageFormData) => { try { await createStorage({ data: values }); await fetchStorage({}); form.setFieldValue(['spec', 'volume'], { persistent: { name: values.metadata.name } }); setOverlayOpen(false); } catch (error) { // ignore } }; return ( handleModeChange(e.target.value)} options={[ { label: ( {intl.formatMessage({ id: 'gpuservice.storage.temporary' })} } /> ), value: StorageModeValueMap.Temporary }, { label: ( {intl.formatMessage({ id: 'gpuservice.storage.persistentVolume' })} } /> ), value: StorageModeValueMap.Existing } ]} /> {action === PageAction.CREATE && storageMode === StorageModeValueMap.Existing && ( )}
{storageMode === StorageModeValueMap.Existing && (