Skip to content

Instantly share code, notes, and snippets.

@iaurg
Created March 11, 2020 15:26
Show Gist options
  • Save iaurg/dfbafd2b55278cc66e984959ac32d962 to your computer and use it in GitHub Desktop.
Save iaurg/dfbafd2b55278cc66e984959ac32d962 to your computer and use it in GitHub Desktop.
Loader NProgress in Next.js component build with hooks.
import { useEffect } from 'react';
import NProgress from 'nprogress';
import Router from 'next/router';
import PropTypes from 'prop-types';
export default function NextNProgress({
color = '#29D',
startPosition = 0.3,
stopDelayMs = 200,
height = 3,
options,
}) {
let timer = null;
function routeChangeStart() {
NProgress.set(startPosition);
NProgress.start();
}
function routeChangeEnd() {
clearTimeout(timer);
timer = setTimeout(() => {
NProgress.done(true);
}, stopDelayMs);
}
useEffect(() => {
if (options) {
NProgress.configure(options);
}
Router.events.on('routeChangeStart', routeChangeStart);
Router.events.on('routeChangeComplete', routeChangeEnd);
Router.events.on('routeChangeError', routeChangeEnd);
});
return (
<style jsx global>{`
#nprogress {
pointer-events: none;
}
#nprogress .bar {
background: ${color};
position: fixed;
z-index: 1031;
top: 0;
left: 0;
width: 100%;
height: ${height}px;
}
#nprogress .peg {
display: block;
position: absolute;
right: 0px;
width: 100px;
height: 100%;
box-shadow: 0 0 10px ${color}, 0 0 5px ${color};
opacity: 1;
-webkit-transform: rotate(3deg) translate(0px, -4px);
-ms-transform: rotate(3deg) translate(0px, -4px);
transform: rotate(3deg) translate(0px, -4px);
}
#nprogress .spinner {
display: 'block';
position: fixed;
z-index: 1031;
top: 15px;
right: 15px;
}
#nprogress .spinner-icon {
width: 18px;
height: 18px;
box-sizing: border-box;
border: solid 2px transparent;
border-top-color: ${color};
border-left-color: ${color};
border-radius: 50%;
-webkit-animation: nprogresss-spinner 400ms linear infinite;
animation: nprogress-spinner 400ms linear infinite;
}
.nprogress-custom-parent {
overflow: hidden;
position: relative;
}
.nprogress-custom-parent #nprogress .spinner,
.nprogress-custom-parent #nprogress .bar {
position: absolute;
}
@-webkit-keyframes nprogress-spinner {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
}
}
@keyframes nprogress-spinner {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
`}</style>
);
}
NextNProgress.propTypes = {
color: PropTypes.string,
height: PropTypes.string,
startPosition: PropTypes.number,
stopDelayMs: PropTypes.number,
options: PropTypes.objectOf(PropTypes.object),
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment