Merge pull request #598 from Ross-Gargett/bugfix/negative-timeout

Fixes Bug #597 : Timeout field validation
This commit is contained in:
Anoop M D 2023-10-18 22:56:58 +05:30 committed by GitHub
commit 3f7ace8bdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 76 additions and 46 deletions

View File

@ -1,67 +1,96 @@
import React, { useState } from 'react'; import React from 'react';
import { useFormik } from 'formik';
import { useSelector, useDispatch } from 'react-redux'; import { useSelector, useDispatch } from 'react-redux';
import { savePreferences } from 'providers/ReduxStore/slices/app'; import { savePreferences } from 'providers/ReduxStore/slices/app';
import StyledWrapper from './StyledWrapper'; import StyledWrapper from './StyledWrapper';
import * as Yup from 'yup';
import toast from 'react-hot-toast';
const General = ({ close }) => { const General = ({ close }) => {
const preferences = useSelector((state) => state.app.preferences); const preferences = useSelector((state) => state.app.preferences);
const dispatch = useDispatch(); const dispatch = useDispatch();
const [sslVerification, setSslVerification] = useState(preferences.request.sslVerification); const preferencesSchema = Yup.object().shape({
const [timeout, setTimeout] = useState(preferences.request.timeout); sslVerification: Yup.boolean(),
timeout: Yup.number('Request Timeout must be a number')
.positive('Request Timeout must be a positive number')
.typeError('Request Timeout must be a number')
.optional()
});
const handleSave = () => { const formik = useFormik({
initialValues: {
sslVerification: preferences.request.sslVerification,
timeout: preferences.request.timeout
},
validationSchema: preferencesSchema,
onSubmit: async (values) => {
try {
const newPreferences = await proxySchema.validate(values, { abortEarly: true });
handleSave(newPreferences);
} catch (error) {
console.error('Preferences validation error:', error.message);
}
}
});
const handleSave = (newPreferences) => {
dispatch( dispatch(
savePreferences({ savePreferences({
...preferences, ...preferences,
request: { request: {
sslVerification, sslVerification: newPreferences.sslVerification,
timeout timeout: newPreferences.timeout
} }
}) })
).then(() => { )
close(); .then(() => {
}); close();
}; })
.catch((err) => console.log(err) && toast.error('Failed to update preferences'));
const handleTimeoutChange = (value) => {
const validTimeout = isNaN(Number(value)) ? timeout : Number(value);
setTimeout(validTimeout);
}; };
return ( return (
<StyledWrapper> <StyledWrapper>
<div className="flex items-center mt-2"> <form className="bruno-form" onSubmit={formik.handleSubmit}>
<label className="mr-2 select-none" style={{ minWidth: 200 }} htmlFor="ssl-cert-verification"> <div className="flex items-center mt-2">
SSL/TLS Certificate Verification <label className="block font-medium mr-2 select-none" style={{ minWidth: 200 }} htmlFor="sslVerification">
</label> SSL/TLS Certificate Verification
<input </label>
id="ssl-cert-verification" <input
type="checkbox" id="ssl-cert-verification"
checked={sslVerification} type="checkbox"
onChange={() => setSslVerification(!sslVerification)} name="sslVerification"
className="mousetrap mr-0" checked={formik.values.sslVerification}
/> onChange={formik.handleChange}
</div> className="mousetrap mr-0"
<div className="flex flex-col mt-6"> />
<label className="block font-medium select-none">Request Timeout (in ms)</label> </div>
<input <div className="flex flex-col mt-6">
type="text" <label className="block font-medium select-none" htmlFor="timeout">
className="block textbox mt-2 w-1/4" Request Timeout (in ms)
autoComplete="off" </label>
autoCorrect="off" <input
autoCapitalize="off" type="text"
spellCheck="false" name="timeout"
onChange={(e) => handleTimeoutChange(e.target.value)} className="block textbox mt-2 w-16"
defaultValue={timeout === 0 ? '' : timeout} autoComplete="off"
/> autoCorrect="off"
</div> autoCapitalize="off"
spellCheck="false"
<div className="mt-10"> onChange={formik.handleChange}
<button type="submit" className="submit btn btn-sm btn-secondary" onClick={handleSave}> value={formik.values.timeout}
Save />
</button> </div>
</div> {formik.touched.timeout && formik.errors.timeout ? (
<div className="text-red-500">{formik.errors.timeout}</div>
) : null}
<div className="mt-10">
<button type="submit" className="submit btn btn-sm btn-secondary">
Save
</button>
</div>
</form>
</StyledWrapper> </StyledWrapper>
); );
}; };

View File

@ -9,7 +9,8 @@ const initialState = {
showHomePage: false, showHomePage: false,
preferences: { preferences: {
request: { request: {
sslVerification: true sslVerification: true,
timeout: 0
}, },
font: { font: {
codeFont: 'default' codeFont: 'default'