feat: add next top loader

This commit is contained in:
Stevan Freeborn
2023-09-11 20:20:52 -05:00
parent 889cd08207
commit 636cd96e8b
7 changed files with 74 additions and 10 deletions
+27
View File
@@ -28,6 +28,8 @@
"eslint-config-next": "13.4.19", "eslint-config-next": "13.4.19",
"next": "13.4.19", "next": "13.4.19",
"next-themes": "^0.2.1", "next-themes": "^0.2.1",
"nextjs-toploader": "^1.4.2",
"nprogress": "^0.2.0",
"postcss": "8.4.29", "postcss": "8.4.29",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
@@ -1448,6 +1450,11 @@
"form-data": "^3.0.0" "form-data": "^3.0.0"
} }
}, },
"node_modules/@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=="
},
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
@@ -5175,6 +5182,21 @@
"node": "^10 || ^12 || >=14" "node": "^10 || ^12 || >=14"
} }
}, },
"node_modules/nextjs-toploader": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/nextjs-toploader/-/nextjs-toploader-1.4.2.tgz",
"integrity": "sha512-FS5+zCdNHLq0YA+SijkbDifOMFNayKfxkCLTiM6TIrvSaf6kAzCGlNjwgVpoG3zpampVMQSVf5L/jrWFJgs23g==",
"dependencies": {
"@types/nprogress": "^0.2.0",
"nprogress": "^0.2.0",
"prop-types": "^15.8.1"
},
"peerDependencies": {
"next": ">= 6.0.0",
"react": ">= 16.0.0",
"react-dom": ">= 16.0.0"
}
},
"node_modules/no-case": { "node_modules/no-case": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -5210,6 +5232,11 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/nprogress": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
"integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
},
"node_modules/object-assign": { "node_modules/object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+4 -2
View File
@@ -24,10 +24,13 @@
"autoprefixer": "10.4.15", "autoprefixer": "10.4.15",
"codemirror": "^6.0.1", "codemirror": "^6.0.1",
"convex": "^1.2.1", "convex": "^1.2.1",
"encoding": "^0.1.13",
"eslint": "8.49.0", "eslint": "8.49.0",
"eslint-config-next": "13.4.19", "eslint-config-next": "13.4.19",
"next": "13.4.19", "next": "13.4.19",
"next-themes": "^0.2.1", "next-themes": "^0.2.1",
"nextjs-toploader": "^1.4.2",
"nprogress": "^0.2.0",
"postcss": "8.4.29", "postcss": "8.4.29",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
@@ -37,7 +40,6 @@
"remark-gfm": "^3.0.1", "remark-gfm": "^3.0.1",
"svix": "^1.11.0", "svix": "^1.11.0",
"tailwindcss": "3.3.3", "tailwindcss": "3.3.3",
"typescript": "5.2.2", "typescript": "5.2.2"
"encoding": "^0.1.13"
} }
} }
+5
View File
@@ -3,6 +3,7 @@ import { ConvexProvider, NextThemesProvider } from '@/providers';
import { ClerkProvider } from '@clerk/nextjs'; import { ClerkProvider } from '@clerk/nextjs';
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { Inter } from 'next/font/google'; import { Inter } from 'next/font/google';
import NextTopLoader from 'nextjs-toploader';
import './globals.css'; import './globals.css';
const inter = Inter({ subsets: ['latin'] }); const inter = Inter({ subsets: ['latin'] });
@@ -30,6 +31,10 @@ export default function RootLayout({
> >
<ConvexProvider> <ConvexProvider>
<NextThemesProvider> <NextThemesProvider>
<NextTopLoader
color='#3743e5'
showSpinner={false}
/>
<Navbar /> <Navbar />
<div className='p-4 w-full h-full flex flex-col'>{children}</div> <div className='p-4 w-full h-full flex flex-col'>{children}</div>
</NextThemesProvider> </NextThemesProvider>
+1 -2
View File
@@ -1,6 +1,6 @@
'use client'; 'use client';
import { useCodeMirror } from '@/hooks'; import { useCodeMirror, useRouter } from '@/hooks';
import { basicDark } from '@/lib/codemirror'; import { basicDark } from '@/lib/codemirror';
import { useUser } from '@clerk/nextjs'; import { useUser } from '@clerk/nextjs';
import { indentWithTab } from '@codemirror/commands'; import { indentWithTab } from '@codemirror/commands';
@@ -10,7 +10,6 @@ import { Compartment, EditorState, Text } from '@codemirror/state';
import { EditorView, keymap } from '@codemirror/view'; import { EditorView, keymap } from '@codemirror/view';
import { basicSetup } from 'codemirror'; import { basicSetup } from 'codemirror';
import { useMutation } from 'convex/react'; import { useMutation } from 'convex/react';
import { useRouter } from 'next/navigation';
import { FormEvent, useState } from 'react'; import { FormEvent, useState } from 'react';
import { api } from '../../convex/_generated/api'; import { api } from '../../convex/_generated/api';
import { Doc } from '../../convex/_generated/dataModel'; import { Doc } from '../../convex/_generated/dataModel';
+2 -2
View File
@@ -80,7 +80,7 @@
--color-fg-muted: #57606a; --color-fg-muted: #57606a;
--color-fg-subtle: #6e7781; --color-fg-subtle: #6e7781;
--color-canvas-default: #ffffff; --color-canvas-default: #ffffff;
--color-canvas-subtle: #f6f8fa; --color-canvas-subtle: #ffffff;
--color-border-default: #d0d7de; --color-border-default: #d0d7de;
--color-border-muted: hsla(210, 18%, 87%, 1); --color-border-muted: hsla(210, 18%, 87%, 1);
--color-neutral-muted: rgba(175, 184, 193, 0.2); --color-neutral-muted: rgba(175, 184, 193, 0.2);
@@ -827,7 +827,7 @@
.markdown-content .highlight pre, .markdown-content .highlight pre,
.markdown-content pre { .markdown-content pre {
padding: 0 16px; padding: 0;
overflow: auto; overflow: auto;
font-size: 85%; font-size: 85%;
line-height: 1.45; line-height: 1.45;
+2 -3
View File
@@ -1,12 +1,11 @@
'use client'; 'use client';
import { useMountedEffect } from '@/hooks'; import { useMountedEffect, useProgressEffect } from '@/hooks';
import { useTheme } from 'next-themes'; import { useTheme } from 'next-themes';
import { useEffect, useState } from 'react';
import { BsMoonStarsFill, BsSunFill } from 'react-icons/bs'; import { BsMoonStarsFill, BsSunFill } from 'react-icons/bs';
import { ImSpinner2 } from 'react-icons/im';
export default function ThemeButton() { export default function ThemeButton() {
useProgressEffect();
const { mounted, Loader } = useMountedEffect(); const { mounted, Loader } = useMountedEffect();
const { theme, setTheme } = useTheme(); const { theme, setTheme } = useTheme();
+32
View File
@@ -1,6 +1,12 @@
import SpinningLoader from '@/components/SpinningLoader'; import SpinningLoader from '@/components/SpinningLoader';
import { EditorState, Extension, Text } from '@codemirror/state'; import { EditorState, Extension, Text } from '@codemirror/state';
import { EditorView } from '@codemirror/view'; import { EditorView } from '@codemirror/view';
import {
useRouter as useNextRouter,
usePathname,
useSearchParams,
} from 'next/navigation';
import NProgress from 'nprogress';
import { useEffect, useRef, useState } from 'react'; import { useEffect, useRef, useState } from 'react';
export function useCodeMirror({ export function useCodeMirror({
@@ -43,3 +49,29 @@ export function useMountedEffect() {
return { mounted, Loader: SpinningLoader }; return { mounted, Loader: SpinningLoader };
} }
export function useRouter() {
const router = useNextRouter();
const { push, back } = router;
router.push = (href, options) => {
NProgress.start();
push(href, options);
};
router.back = () => {
NProgress.start();
back();
};
return router;
}
export function useProgressEffect() {
const pathname = usePathname();
const searchParams = useSearchParams();
useEffect(() => {
NProgress.done();
}, [pathname, searchParams]);
}