Created
May 11, 2023 18:49
-
-
Save muslemomar/7730bff3115c75552336b5c6aa0aa3c1 to your computer and use it in GitHub Desktop.
A react hook to handle http requests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> | |
); | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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