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.
145 lines
3.8 KiB
145 lines
3.8 KiB
import { FC, useCallback, useMemo, useRef, useState } from 'react'; |
|
import { Grid } from '@mui/material'; |
|
|
|
import ActionGroup from '../ActionGroup'; |
|
import api from '../../lib/api'; |
|
import handleAPIError from '../../lib/handleAPIError'; |
|
import MessageGroup, { MessageGroupForwardedRefContent } from '../MessageGroup'; |
|
import OutlinedInputWithLabel from '../OutlinedInputWithLabel'; |
|
import UncontrolledInput from '../UncontrolledInput'; |
|
import useFormikUtils from '../../hooks/useFormikUtils'; |
|
import Spinner from '../Spinner'; |
|
import schema from './testAccessSchema'; |
|
|
|
const TestAccessForm: FC<TestAccessFormProps> = (props) => { |
|
const { setResponse } = props; |
|
|
|
const messageGroupRef = useRef<MessageGroupForwardedRefContent>(null); |
|
|
|
const [loadingInquiry, setLoadingInquiry] = useState<boolean>(false); |
|
|
|
const setApiMessage = useCallback( |
|
(message?: Message) => |
|
messageGroupRef?.current?.setMessage?.call(null, 'api', message), |
|
[], |
|
); |
|
|
|
const { disabledSubmit, formik, formikErrors, handleChange } = |
|
useFormikUtils<TestAccessFormikValues>({ |
|
initialValues: { |
|
ip: '', |
|
password: '', |
|
}, |
|
onSubmit: (values, { setSubmitting }) => { |
|
setLoadingInquiry(true); |
|
setResponse(undefined); |
|
|
|
const { ip, password } = values; |
|
|
|
api |
|
.put<APICommandInquireHostResponseBody>('/command/inquire-host', { |
|
ipAddress: ip, |
|
password, |
|
}) |
|
.then(({ data }) => { |
|
setResponse({ |
|
...data, |
|
hostIpAddress: ip, |
|
hostPassword: password, |
|
}); |
|
|
|
setApiMessage(); |
|
}) |
|
.catch((error) => { |
|
const emsg = handleAPIError(error); |
|
|
|
emsg.children = ( |
|
<> |
|
Failed to access {ip}. {emsg.children} |
|
</> |
|
); |
|
|
|
setApiMessage(emsg); |
|
}) |
|
.finally(() => { |
|
setSubmitting(false); |
|
setLoadingInquiry(false); |
|
}); |
|
}, |
|
validationSchema: schema, |
|
}); |
|
|
|
const ipChain = useMemo<string>(() => 'ip', []); |
|
const passwordChain = useMemo<string>(() => 'password', []); |
|
|
|
return ( |
|
<Grid |
|
component="form" |
|
container |
|
columns={{ xs: 1, sm: 2 }} |
|
onSubmit={(event) => { |
|
event.preventDefault(); |
|
|
|
formik.submitForm(); |
|
}} |
|
spacing="1em" |
|
> |
|
<Grid item xs={1}> |
|
<UncontrolledInput |
|
input={ |
|
<OutlinedInputWithLabel |
|
disableAutofill |
|
id={ipChain} |
|
label="IP address" |
|
name={ipChain} |
|
onChange={handleChange} |
|
required |
|
value={formik.values.ip} |
|
/> |
|
} |
|
/> |
|
</Grid> |
|
<Grid item xs={1}> |
|
<UncontrolledInput |
|
input={ |
|
<OutlinedInputWithLabel |
|
disableAutofill |
|
id={passwordChain} |
|
label="Password" |
|
name={passwordChain} |
|
onChange={handleChange} |
|
required |
|
type="password" |
|
value={formik.values.password} |
|
/> |
|
} |
|
/> |
|
</Grid> |
|
{loadingInquiry ? ( |
|
<Grid item width="100%"> |
|
<Spinner /> |
|
</Grid> |
|
) : ( |
|
<> |
|
<Grid item width="100%"> |
|
<MessageGroup count={1} messages={formikErrors} /> |
|
</Grid> |
|
<Grid item width="100%"> |
|
<ActionGroup |
|
actions={[ |
|
{ |
|
background: 'blue', |
|
children: 'Test access', |
|
disabled: disabledSubmit, |
|
type: 'submit', |
|
}, |
|
]} |
|
/> |
|
</Grid> |
|
</> |
|
)} |
|
</Grid> |
|
); |
|
}; |
|
|
|
export default TestAccessForm;
|
|
|