Skip to content

Instantly share code, notes, and snippets.

@muslemomar
Created May 11, 2023 18:49
Show Gist options
  • Save muslemomar/7730bff3115c75552336b5c6aa0aa3c1 to your computer and use it in GitHub Desktop.
Save muslemomar/7730bff3115c75552336b5c6aa0aa3c1 to your computer and use it in GitHub Desktop.
A react hook to handle http requests
import { useState } from 'react';
import Router from 'next/router';
import useRequest from '../../hooks/use-request';
export default () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const { doRequest, errors } = useRequest({
url: '/api/users/signin',
method: 'post',
body: {
email,
password
},
onSuccess: () => Router.push('/')
});
const onSubmit = async event => {
event.preventDefault();
await doRequest();
};
return (
<form onSubmit={onSubmit}>
<h1>Sign In</h1>
<div className="form-group">
<label>Email Address</label>
<input
value={email}
onChange={e => setEmail(e.target.value)}
className="form-control"
/>
</div>
<div className="form-group">
<label>Password</label>
<input
value={password}
onChange={e => setPassword(e.target.value)}
type="password"
className="form-control"
/>
</div>
{errors}
<button className="btn btn-primary">Sign In</button>
</form>
);
};
import axios from 'axios';
import { useState } from 'react';
export default ({ url, method, body, onSuccess }) => {
const [errors, setErrors] = useState(null);
const doRequest = async (props = {}) => {
try {
setErrors(null);
const response = await axios[method](url,
{ ...body, ...props }
);
if (onSuccess) {
onSuccess(response.data);
}
return response.data;
} catch (err) {
setErrors(
<div className="alert alert-danger">
<h4>Ooops....</h4>
<ul className="my-0">
{err.response.data.errors.map(err => (
<li key={err.message}>{err.message}</li>
))}
</ul>
</div>
);
}
};
return { doRequest, errors };
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment