import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { maybeAxiosError } from '../../../../common/api/utils'; import Button from '../../../../common/components/buttons/Button'; import Info from '../../../../common/components/info/Info'; import Input from '../../../../common/components/input/input/Input'; import useServerPort from '../../../../common/hooks-query/useServerPort'; import { preventEscape } from '../../../../common/utils/keyEvent'; import { isOnlyNumbers } from '../../../../common/utils/regex'; import * as Panel from '../../panel-utils/PanelUtils'; interface ServerPortForm { serverPort: number; } export default function ServerPortSettings() { const { data, status, isError, refetch, mutateAsync } = useServerPort(); const { handleSubmit, register, reset, setError, clearErrors, formState: { isSubmitting, isDirty, isValid, errors }, } = useForm({ mode: 'onChange', defaultValues: { serverPort: 4001 }, }); useEffect(() => { reset({ serverPort: data.port }); }, [data.pendingRestart, data.port, reset]); const onSubmit = async (formData: ServerPortForm) => { if (formData.serverPort < 1024 || formData.serverPort > 65535) { setError('serverPort', { message: 'Port must be within range 1024 - 65535' }); return; } try { clearErrors('root'); await mutateAsync(formData.serverPort); } catch (error) { setError('root', { message: maybeAxiosError(error) }); } }; const onReset = async () => { clearErrors('root'); const result = await refetch(); if (result.isError) { setError('root', { message: 'Failed to load server port' }); return; } reset({ serverPort: result.data?.port ?? data.port }); }; const rootError = isError ? 'Failed to load server port' : errors.root?.message; return ( preventEscape(event, onReset)} id='server-port-settings' > Server port {rootError && {rootError}} {data.pendingRestart && ( A port change is pending and will happen on the next restart. )} ); }