You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.4 KiB
161 lines
4.4 KiB
import { useRouter } from 'next/router'; |
|
import { FC, useCallback, useEffect, useMemo } from 'react'; |
|
|
|
import api from '../lib/api'; |
|
import ContainedButton from './ContainedButton'; |
|
import handleAPIError from '../lib/handleAPIError'; |
|
import FlexBox from './FlexBox'; |
|
import getQueryParam from '../lib/getQueryParam'; |
|
import InputWithRef from './InputWithRef'; |
|
import MessageBox, { Message } from './MessageBox'; |
|
import NetworkInitForm from './NetworkInitForm'; |
|
import OutlinedInputWithLabel from './OutlinedInputWithLabel'; |
|
import { Panel, PanelHeader } from './Panels'; |
|
import Spinner from './Spinner'; |
|
import { HeaderText } from './Text'; |
|
import useProtect from '../hooks/useProtect'; |
|
import useProtectedState from '../hooks/useProtectedState'; |
|
|
|
const PrepareNetworkForm: FC<PrepareNetworkFormProps> = ({ |
|
expectUUID: isExpectExternalHostUUID = false, |
|
hostUUID, |
|
}) => { |
|
const { protect } = useProtect(); |
|
|
|
const { |
|
isReady, |
|
query: { host_uuid: queryHostUUID }, |
|
} = useRouter(); |
|
|
|
const [dataHostDetail, setDataHostDetail] = useProtectedState< |
|
APIHostDetail | undefined |
|
>(undefined, protect); |
|
const [fatalErrorMessage, setFatalErrorMessage] = useProtectedState< |
|
Message | undefined |
|
>(undefined, protect); |
|
const [isLoading, setIsLoading] = useProtectedState<boolean>(true, protect); |
|
const [previousHostUUID, setPreviousHostUUID] = useProtectedState< |
|
PrepareNetworkFormProps['hostUUID'] |
|
>(undefined, protect); |
|
|
|
const isDifferentHostUUID = useMemo( |
|
() => hostUUID !== previousHostUUID, |
|
[hostUUID, previousHostUUID], |
|
); |
|
const isReloadHostDetail = useMemo( |
|
() => Boolean(hostUUID) && isDifferentHostUUID, |
|
[hostUUID, isDifferentHostUUID], |
|
); |
|
|
|
const panelHeaderElement = useMemo( |
|
() => ( |
|
<PanelHeader> |
|
<HeaderText> |
|
Prepare network on {dataHostDetail?.shortHostName} |
|
</HeaderText> |
|
</PanelHeader> |
|
), |
|
[dataHostDetail], |
|
); |
|
const contentElement = useMemo(() => { |
|
let result; |
|
|
|
if (isLoading) { |
|
result = <Spinner mt={0} />; |
|
} else if (fatalErrorMessage) { |
|
result = <MessageBox {...fatalErrorMessage} />; |
|
} else { |
|
result = ( |
|
<> |
|
{panelHeaderElement} |
|
<FlexBox> |
|
<InputWithRef |
|
input={ |
|
<OutlinedInputWithLabel |
|
formControlProps={{ sx: { maxWidth: '20em' } }} |
|
id="prepare-network-host-name" |
|
label="Host name" |
|
value={dataHostDetail?.hostName} |
|
/> |
|
} |
|
required |
|
/> |
|
<NetworkInitForm hostDetail={dataHostDetail} /> |
|
<FlexBox row justifyContent="flex-end"> |
|
<ContainedButton>Prepare network</ContainedButton> |
|
</FlexBox> |
|
</FlexBox> |
|
</> |
|
); |
|
} |
|
|
|
return result; |
|
}, [dataHostDetail, fatalErrorMessage, isLoading, panelHeaderElement]); |
|
|
|
const getHostDetail = useCallback( |
|
(uuid: string) => { |
|
setIsLoading(true); |
|
|
|
if (isLoading) { |
|
api |
|
.get<APIHostDetail>(`/host/${uuid}`) |
|
.then(({ data }) => { |
|
setPreviousHostUUID(data.hostUUID); |
|
setDataHostDetail(data); |
|
}) |
|
.catch((error) => { |
|
const { children } = handleAPIError(error); |
|
|
|
setFatalErrorMessage({ |
|
children: `Failed to get target host information; cannot continue. ${children}`, |
|
type: 'error', |
|
}); |
|
}) |
|
.finally(() => { |
|
setIsLoading(false); |
|
}); |
|
} |
|
}, |
|
[ |
|
setIsLoading, |
|
isLoading, |
|
setPreviousHostUUID, |
|
setDataHostDetail, |
|
setFatalErrorMessage, |
|
], |
|
); |
|
|
|
useEffect(() => { |
|
if (isExpectExternalHostUUID) { |
|
if (isReloadHostDetail) { |
|
getHostDetail(hostUUID as string); |
|
} |
|
} else if (isReady && !fatalErrorMessage) { |
|
if (queryHostUUID) { |
|
getHostDetail(getQueryParam(queryHostUUID)); |
|
} else { |
|
setFatalErrorMessage({ |
|
children: `No host UUID provided; cannot continue.`, |
|
type: 'error', |
|
}); |
|
|
|
setIsLoading(false); |
|
} |
|
} |
|
}, [ |
|
fatalErrorMessage, |
|
getHostDetail, |
|
hostUUID, |
|
isExpectExternalHostUUID, |
|
isReady, |
|
queryHostUUID, |
|
setFatalErrorMessage, |
|
setDataHostDetail, |
|
setIsLoading, |
|
isReloadHostDetail, |
|
]); |
|
|
|
return <Panel>{contentElement}</Panel>; |
|
}; |
|
|
|
export default PrepareNetworkForm;
|
|
|