From 793f2b0e6a74c9d501bd72b5dd68fedd9d8e4a92 Mon Sep 17 00:00:00 2001 From: Sakura Knoll Date: Sun, 9 Jan 2022 20:17:54 +0900 Subject: [PATCH] Implement loading bar --- package-lock.json | 11 +++++ package.json | 2 + public/assets/nprogress.css | 81 +++++++++++++++++++++++++++++++++++++ src/pages/_app.tsx | 24 +++++++++++ 4 files changed, 118 insertions(+) create mode 100644 public/assets/nprogress.css diff --git a/package-lock.json b/package-lock.json index 94e2c7cf..9ce3766c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -794,6 +794,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" }, + "@types/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -3171,6 +3177,11 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", diff --git a/package.json b/package.json index 51bb0035..ae70dbf3 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "date-fns": "^2.27.0", "next": "^12.0.7", "next-i18next": "^10.1.0", + "nprogress": "^0.2.0", "open-color": "^1.9.1", "ramda": "^0.27.1", "react": "^17.0.2", @@ -17,6 +18,7 @@ "theme-ui": "^0.12.1" }, "devDependencies": { + "@types/nprogress": "^0.2.0", "@types/ramda": "^0.27.60", "@types/react": "^17.0.37", "eslint": "8.5.0", diff --git a/public/assets/nprogress.css b/public/assets/nprogress.css new file mode 100644 index 00000000..d41aa4ce --- /dev/null +++ b/public/assets/nprogress.css @@ -0,0 +1,81 @@ +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: #29d; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #29d, 0 0 5px #29d; + opacity: 1; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + bottom: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 50%; + + -webkit-animation: nprogress-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); + } +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 62fc12c5..8a2fa619 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,9 +1,33 @@ import type { AppProps } from 'next/app' +import { useEffect } from 'react' import { appWithTranslation } from 'next-i18next' import { ThemeProvider } from 'theme-ui' import { theme } from '../lib/theme' +import NProgress from 'nprogress' +import { useRouter } from 'next/router' +import '../../public/assets/nprogress.css' function MyApp({ Component, pageProps }: AppProps) { + const router = useRouter() + useEffect(() => { + const handleStart = () => { + NProgress.start() + } + const handleStop = () => { + NProgress.done() + } + + router.events.on('routeChangeStart', handleStart) + router.events.on('routeChangeComplete', handleStop) + router.events.on('routeChangeError', handleStop) + + return () => { + router.events.off('routeChangeStart', handleStart) + router.events.off('routeChangeComplete', handleStop) + router.events.off('routeChangeError', handleStop) + } + }, [router]) + return (