From 197813222a73e78ccef289a3910ea733a55c5931 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 21 Aug 2024 09:50:24 +0200 Subject: [PATCH 01/16] Add launch.json to debug on vs code --- .gitignore | 3 ++- .vscode/launch.json | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 .vscode/launch.json diff --git a/.gitignore b/.gitignore index a38f3252..42ab9816 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,8 @@ yarn-error.log* # local env files .env*.local - +.env.* +.env # vercel .vercel diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..3d95fb8c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,32 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: debug server-side", + "type": "node-terminal", + "request": "launch", + "command": "npm run dev" + }, + { + "name": "Next.js: debug client-side", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000" + }, + { + "name": "Next.js: debug full stack", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/node_modules/.bin/next", + "runtimeArgs": ["--inspect"], + "skipFiles": ["/**"], + "serverReadyAction": { + "action": "debugWithChrome", + "killOnServerStop": true, + "pattern": "- Local:.+(https?://.+)", + "uriFormat": "%s", + "webRoot": "${workspaceFolder}" + } + } + ] +} \ No newline at end of file From 4f2d61ff6b6a4d044f1c17803a3e9fb21701229e Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 21 Aug 2024 09:53:26 +0200 Subject: [PATCH 02/16] Add loading UI in group route (home) --- src/app/(authed)/(home)/loading.tsx | 5 +++++ src/app/(authed)/(home)/new/page.tsx | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/app/(authed)/(home)/loading.tsx diff --git a/src/app/(authed)/(home)/loading.tsx b/src/app/(authed)/(home)/loading.tsx new file mode 100644 index 00000000..27527f36 --- /dev/null +++ b/src/app/(authed)/(home)/loading.tsx @@ -0,0 +1,5 @@ +import LoadingIndicator from "@/common/ui/LoadingIndicator"; + +export default function Loading() { + return +} \ No newline at end of file diff --git a/src/app/(authed)/(home)/new/page.tsx b/src/app/(authed)/(home)/new/page.tsx index c8359ee3..7bc8d5a3 100644 --- a/src/app/(authed)/(home)/new/page.tsx +++ b/src/app/(authed)/(home)/new/page.tsx @@ -1,10 +1,12 @@ import { Box, Typography } from "@mui/material" -import NewProjectSteps from "@/features/new-project/view/NewProjectSteps" import { env, splitOwnerAndRepository } from "@/common" import MessageLinkFooter from "@/common/ui/MessageLinkFooter" +import dynamic from 'next/dynamic' const HELP_URL = env.get("FRAMNA_DOCS_HELP_URL") +const NewProjectSteps = dynamic(() => import("@/features/new-project/view/NewProjectSteps")) + const Page = () => { const repositoryNameSuffix = env.getOrThrow("REPOSITORY_NAME_SUFFIX") const templateName = env.get("NEW_PROJECT_TEMPLATE_REPOSITORY") From 5e1cf6696836b1910aa453e523ce063df6392a90 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Thu, 29 Aug 2024 12:26:47 +0200 Subject: [PATCH 03/16] Add NextTopLoader to project routing --- package-lock.json | 590 ++++++++++++--------------------------------- package.json | 1 + src/app/layout.tsx | 6 +- 3 files changed, 154 insertions(+), 443 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35861fc7..0546979a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "mobx": "^6.13.1", "next": "^14.2.5", "next-auth": "^5.0.0-beta.20", + "nextjs-toploader": "^1.6.12", "nodemailer": "^6.9.14", "npm": "^10.8.3", "octokit": "^4.0.2", @@ -668,15 +669,6 @@ "react-dom": ">=18" } }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emotion/babel-plugin": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", @@ -1072,27 +1064,6 @@ "@img/sharp-libvips-darwin-arm64": "1.0.4" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", @@ -1108,291 +1079,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", @@ -2577,126 +2263,6 @@ "node": ">= 10" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", - "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", - "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5473,9 +5039,9 @@ } }, "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -13207,6 +12773,23 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/nextjs-toploader": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/nextjs-toploader/-/nextjs-toploader-1.6.12.tgz", + "integrity": "sha512-nbun5lvVjlKnxLQlahzZ55nELVEduqoEXT03KCHnsEYJnFpI/3BaIzpMyq/v8C7UGU2NfxQmjq6ldZ310rsDqA==", + "dependencies": { + "nprogress": "^0.2.0", + "prop-types": "^15.8.1" + }, + "funding": { + "url": "https://github.com/sponsors/TheSGJ" + }, + "peerDependencies": { + "next": ">= 6.0.0", + "react": ">= 16.0.0", + "react-dom": ">= 16.0.0" + } + }, "node_modules/node-abi": { "version": "3.65.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", @@ -15689,6 +15272,11 @@ "inBundle": true, "license": "ISC" }, + "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/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -19605,9 +19193,9 @@ } }, "node_modules/undici-types": { - "version": "6.19.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz", - "integrity": "sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unified": { "version": "9.2.2", @@ -20531,6 +20119,126 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } } diff --git a/package.json b/package.json index 32a6889b..e6c78788 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "mobx": "^6.13.1", "next": "^14.2.5", "next-auth": "^5.0.0-beta.20", + "nextjs-toploader": "^1.6.12", "nodemailer": "^6.9.14", "npm": "^10.8.3", "octokit": "^4.0.2", diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9769fd6b..91be30df 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,6 +5,7 @@ import { CssBaseline } from "@mui/material" import ThemeRegistry from "@/common/theme/ThemeRegistry" import "@fortawesome/fontawesome-svg-core/styles.css" import { env } from "@/common" +import NextTopLoader from 'nextjs-toploader' fontAwesomeConfig.autoAddCss = false @@ -17,9 +18,10 @@ export default function RootLayout({ children }: { children: React.ReactNode }) return ( - + - {children} + + {children} From 7aee17f396a4acbc33c2627604dba389ea086462 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 4 Sep 2024 11:20:22 +0200 Subject: [PATCH 04/16] Create SecondaryHeaderPlaceholder component --- .../view/SecondarySplitHeaderPlaceholder.tsx | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx diff --git a/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx b/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx new file mode 100644 index 00000000..df4e7838 --- /dev/null +++ b/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx @@ -0,0 +1,49 @@ +import { Box, Stack, Divider, Skeleton, Typography } from "@mui/material"; +import React from "react"; + +export const HEIGHT_HEADER = 80; + +const SecondaryHeaderPlaceholder = () => { + const skeletonCount = 4; + + return ( + + + + + {Array.from({ length: skeletonCount }, (_, index) => ( + + + {index < skeletonCount - 1 && ( + + / + + )} + + ))} + + + + + + ); +}; + +export default SecondaryHeaderPlaceholder; From 092d767f492aaa4fddaaff06e0ef8f22dfe3f081 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 4 Sep 2024 11:29:04 +0200 Subject: [PATCH 05/16] Rearrange files in /app/(authed) route group --- src/app/(authed)/(home)/new/layout.tsx | 2 +- src/app/(authed)/(home)/{ => new}/loading.tsx | 0 .../{(home) => (project-doc)}/[...slug]/layout.tsx | 10 +++++++++- .../{(home) => (project-doc)}/[...slug]/page.tsx | 0 4 files changed, 10 insertions(+), 2 deletions(-) rename src/app/(authed)/(home)/{ => new}/loading.tsx (100%) rename src/app/(authed)/{(home) => (project-doc)}/[...slug]/layout.tsx (79%) rename src/app/(authed)/{(home) => (project-doc)}/[...slug]/page.tsx (100%) diff --git a/src/app/(authed)/(home)/new/layout.tsx b/src/app/(authed)/(home)/new/layout.tsx index d4114d0c..6eb8fd93 100644 --- a/src/app/(authed)/(home)/new/layout.tsx +++ b/src/app/(authed)/(home)/new/layout.tsx @@ -1,5 +1,5 @@ -import { Box, Stack } from "@mui/material" import SecondarySplitHeader from "@/features/sidebar/view/SecondarySplitHeader" +import { Box, Stack } from "@mui/material" export default function Page({ children }: { children: React.ReactNode }) { return ( diff --git a/src/app/(authed)/(home)/loading.tsx b/src/app/(authed)/(home)/new/loading.tsx similarity index 100% rename from src/app/(authed)/(home)/loading.tsx rename to src/app/(authed)/(home)/new/loading.tsx diff --git a/src/app/(authed)/(home)/[...slug]/layout.tsx b/src/app/(authed)/(project-doc)/[...slug]/layout.tsx similarity index 79% rename from src/app/(authed)/(home)/[...slug]/layout.tsx rename to src/app/(authed)/(project-doc)/[...slug]/layout.tsx index 9a46405e..62f1ab7e 100644 --- a/src/app/(authed)/(home)/[...slug]/layout.tsx +++ b/src/app/(authed)/(project-doc)/[...slug]/layout.tsx @@ -2,11 +2,19 @@ import { Box, Stack } from "@mui/material" import { useTheme } from "@mui/material/styles" -import SecondarySplitHeader from "@/features/sidebar/view/SecondarySplitHeader" import TrailingToolbarItem from "@/features/projects/view/toolbar/TrailingToolbarItem" import MobileToolbar from "@/features/projects/view/toolbar/MobileToolbar" import { useProjectSelection } from "@/features/projects/data" import NotFound from "@/features/projects/view/NotFound" +import dynamic from "next/dynamic" +import SecondaryHeaderPlaceholder from "@/features/sidebar/view/SecondarySplitHeaderPlaceholder" + +const SecondarySplitHeader = dynamic(() => import("@/features/sidebar/view/SecondarySplitHeader"), + { + loading: () => , + ssr: false, + } +) export default function Page({ children }: { children: React.ReactNode }) { const { project } = useProjectSelection() diff --git a/src/app/(authed)/(home)/[...slug]/page.tsx b/src/app/(authed)/(project-doc)/[...slug]/page.tsx similarity index 100% rename from src/app/(authed)/(home)/[...slug]/page.tsx rename to src/app/(authed)/(project-doc)/[...slug]/page.tsx From 8c315b29f56509273088aeda3e51c41d5c6e9b25 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 4 Sep 2024 14:36:10 +0200 Subject: [PATCH 06/16] Fix Top Loader Manager in router.push() navigation --- package-lock.json | 248 +++++++++--------- package.json | 2 + .../projects/domain/ProjectNavigator.ts | 3 + 3 files changed, 133 insertions(+), 120 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0546979a..6d558226 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "nextjs-toploader": "^1.6.12", "nodemailer": "^6.9.14", "npm": "^10.8.3", + "nprogress": "^0.2.0", "octokit": "^4.0.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -51,6 +52,7 @@ "@types/jest": "^29.5.12", "@types/node": "^22.5.4", "@types/nodemailer": "^6.4.15", + "@types/nprogress": "^0.2.3", "@types/pg": "^8.11.6", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", @@ -2263,6 +2265,126 @@ "node": ">= 10" } }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4328,6 +4450,12 @@ "@types/node": "*" } }, + "node_modules/@types/nprogress": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.3.tgz", + "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -20119,126 +20247,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", - "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", - "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", - "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", - "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", - "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", - "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", - "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", - "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } diff --git a/package.json b/package.json index e6c78788..b5035df6 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "nextjs-toploader": "^1.6.12", "nodemailer": "^6.9.14", "npm": "^10.8.3", + "nprogress": "^0.2.0", "octokit": "^4.0.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -58,6 +59,7 @@ "@types/jest": "^29.5.12", "@types/node": "^22.5.4", "@types/nodemailer": "^6.4.15", + "@types/nprogress": "^0.2.3", "@types/pg": "^8.11.6", "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", diff --git a/src/features/projects/domain/ProjectNavigator.ts b/src/features/projects/domain/ProjectNavigator.ts index aa87c239..5546babf 100644 --- a/src/features/projects/domain/ProjectNavigator.ts +++ b/src/features/projects/domain/ProjectNavigator.ts @@ -1,4 +1,5 @@ import Project from "./Project" +import * as NProgress from "nprogress" interface IPathnameReader { readonly pathname: string @@ -33,6 +34,7 @@ export default class ProjectNavigator { const candidateSpecification = newVersion.specifications.find(e => { return e.name == preferredSpecificationName }) + NProgress.start() if (candidateSpecification) { this.router.push(`/${project.owner}/${project.name}/${newVersion.id}/${candidateSpecification.id}`) } else { @@ -47,6 +49,7 @@ export default class ProjectNavigator { versionId: string, specificationId: string ) { + NProgress.start() this.router.push(`/${projectOwner}/${projectName}/${versionId}/${specificationId}`) } From 45f075090ecc0a554db785e1ea5a94ea432b1f42 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 4 Sep 2024 14:50:55 +0200 Subject: [PATCH 07/16] Change file name context to ProjectsContext --- src/common/{contexts.ts => context/ProjectsContext.ts} | 0 src/common/index.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/common/{contexts.ts => context/ProjectsContext.ts} (100%) diff --git a/src/common/contexts.ts b/src/common/context/ProjectsContext.ts similarity index 100% rename from src/common/contexts.ts rename to src/common/context/ProjectsContext.ts diff --git a/src/common/index.ts b/src/common/index.ts index 83b57c0c..d0d4d9e1 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,4 +1,4 @@ -export * from "./contexts" +export * from "./context/ProjectsContext" export * from "./db" export * from "./errors" export * from "./github" From 845b954e7cd1e8d1708d90c748c108fb9593c0ec Mon Sep 17 00:00:00 2001 From: mpabarca Date: Thu, 5 Sep 2024 11:17:39 +0200 Subject: [PATCH 08/16] Fix Top Loader Manager on async components --- src/app/(authed)/(home)/new/layout.tsx | 2 +- src/app/layout.tsx | 4 ++-- src/features/projects/domain/ProjectNavigator.ts | 2 +- src/features/sidebar/view/internal/sidebar/Header.tsx | 2 ++ .../sidebar/view/internal/sidebar/NewProjectButton.tsx | 2 ++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/app/(authed)/(home)/new/layout.tsx b/src/app/(authed)/(home)/new/layout.tsx index 6eb8fd93..d4114d0c 100644 --- a/src/app/(authed)/(home)/new/layout.tsx +++ b/src/app/(authed)/(home)/new/layout.tsx @@ -1,5 +1,5 @@ -import SecondarySplitHeader from "@/features/sidebar/view/SecondarySplitHeader" import { Box, Stack } from "@mui/material" +import SecondarySplitHeader from "@/features/sidebar/view/SecondarySplitHeader" export default function Page({ children }: { children: React.ReactNode }) { return ( diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 91be30df..73daefdf 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -19,8 +19,8 @@ export default function RootLayout({ children }: { children: React.ReactNode }) - - + + {children} diff --git a/src/features/projects/domain/ProjectNavigator.ts b/src/features/projects/domain/ProjectNavigator.ts index 5546babf..7f7d7e26 100644 --- a/src/features/projects/domain/ProjectNavigator.ts +++ b/src/features/projects/domain/ProjectNavigator.ts @@ -1,5 +1,5 @@ -import Project from "./Project" import * as NProgress from "nprogress" +import Project from "./Project" interface IPathnameReader { readonly pathname: string diff --git a/src/features/sidebar/view/internal/sidebar/Header.tsx b/src/features/sidebar/view/internal/sidebar/Header.tsx index 59c425a7..3c17d48c 100644 --- a/src/features/sidebar/view/internal/sidebar/Header.tsx +++ b/src/features/sidebar/view/internal/sidebar/Header.tsx @@ -3,6 +3,7 @@ import Image from "next/image" import { Box, Button, Typography } from "@mui/material" import { useRouter } from "next/navigation" +import * as NProgress from "nprogress" import { useCloseSidebarOnSelection } from "@/features/sidebar/data" const Header = ({ siteName }: { siteName?: string }) => { @@ -29,6 +30,7 @@ const Header = ({ siteName }: { siteName?: string }) => { }} onClick={() => { closeSidebarIfNeeded() + NProgress.start() router.push("/") }} > diff --git a/src/features/sidebar/view/internal/sidebar/NewProjectButton.tsx b/src/features/sidebar/view/internal/sidebar/NewProjectButton.tsx index dbfd01a9..09fd5369 100644 --- a/src/features/sidebar/view/internal/sidebar/NewProjectButton.tsx +++ b/src/features/sidebar/view/internal/sidebar/NewProjectButton.tsx @@ -4,6 +4,7 @@ import { useRouter, usePathname } from "next/navigation" import { Stack, List } from "@mui/material" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" import { faPlus } from "@fortawesome/free-solid-svg-icons" +import * as NProgress from "nprogress" import { Template as ProjectListItemTemplate } from "./projects/ProjectListItem" import { Squircle as ProjectAvatarSquircle } from "./projects/ProjectAvatar" import useCloseSidebarOnSelection from "@/features/sidebar/data/useCloseSidebarOnSelection" @@ -30,6 +31,7 @@ const NewProjectButton = () => { } onSelect={() => { closeSidebarIfNeeded() + NProgress.start() router.push("/new") }} /> From 16d3a75c3812757de838a4f35f1d341faf96ced2 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Thu, 5 Sep 2024 11:45:10 +0200 Subject: [PATCH 09/16] Fix test on ProjectNavigator --- src/features/projects/data/useProjectSelection.ts | 4 ++++ src/features/projects/domain/ProjectNavigator.ts | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/features/projects/data/useProjectSelection.ts b/src/features/projects/data/useProjectSelection.ts index 190b673e..2ff26e96 100644 --- a/src/features/projects/data/useProjectSelection.ts +++ b/src/features/projects/data/useProjectSelection.ts @@ -1,5 +1,6 @@ "use client" +import NProgress from "nprogress" import { useRouter, usePathname } from "next/navigation" import { useContext } from "react" import { ProjectsContext } from "@/common" @@ -29,6 +30,7 @@ export default function useProjectSelection() { selectProject: (project: Project) => { const version = project.versions[0] const specification = version.specifications[0] + NProgress.start() projectNavigator.navigate( project.owner, project.name, @@ -37,6 +39,7 @@ export default function useProjectSelection() { ) }, selectVersion: (versionId: string) => { + NProgress.start() projectNavigator.navigateToVersion( selection.project!, versionId, @@ -44,6 +47,7 @@ export default function useProjectSelection() { ) }, selectSpecification: (specificationId: string) => { + NProgress.start() projectNavigator.navigate( selection.project!.owner, selection.project!.name, diff --git a/src/features/projects/domain/ProjectNavigator.ts b/src/features/projects/domain/ProjectNavigator.ts index 7f7d7e26..aa87c239 100644 --- a/src/features/projects/domain/ProjectNavigator.ts +++ b/src/features/projects/domain/ProjectNavigator.ts @@ -1,4 +1,3 @@ -import * as NProgress from "nprogress" import Project from "./Project" interface IPathnameReader { @@ -34,7 +33,6 @@ export default class ProjectNavigator { const candidateSpecification = newVersion.specifications.find(e => { return e.name == preferredSpecificationName }) - NProgress.start() if (candidateSpecification) { this.router.push(`/${project.owner}/${project.name}/${newVersion.id}/${candidateSpecification.id}`) } else { @@ -49,7 +47,6 @@ export default class ProjectNavigator { versionId: string, specificationId: string ) { - NProgress.start() this.router.push(`/${projectOwner}/${projectName}/${versionId}/${specificationId}`) } From 7d79a454a83ff203d111f992cd4015bf19fec094 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Thu, 5 Sep 2024 13:13:53 +0200 Subject: [PATCH 10/16] Fix height on SecondaryHeaderPlaceholder --- src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx b/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx index df4e7838..f85b4c41 100644 --- a/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx +++ b/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx @@ -1,8 +1,6 @@ import { Box, Stack, Divider, Skeleton, Typography } from "@mui/material"; import React from "react"; -export const HEIGHT_HEADER = 80; - const SecondaryHeaderPlaceholder = () => { const skeletonCount = 4; @@ -16,7 +14,7 @@ const SecondaryHeaderPlaceholder = () => { paddingLeft: { xs: 4, md: 2 }, maxWidth: "1460px", margin: "auto", - height: HEIGHT_HEADER, + height: 60, }} > Date: Thu, 5 Sep 2024 13:14:55 +0200 Subject: [PATCH 11/16] Add delay and debounce to loader on Swagger Viewer --- src/features/docs/view/Swagger.tsx | 32 +++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/features/docs/view/Swagger.tsx b/src/features/docs/view/Swagger.tsx index 9aca9125..bd07b709 100644 --- a/src/features/docs/view/Swagger.tsx +++ b/src/features/docs/view/Swagger.tsx @@ -1,4 +1,4 @@ -import { useState } from "react" +import { useState, useEffect, useRef } from "react" import SwaggerUI from "swagger-ui-react" import "swagger-ui-react/swagger-ui.css" import { Box } from "@mui/material" @@ -6,13 +6,39 @@ import LoadingWrapper from "./LoadingWrapper" const Swagger = ({ url }: { url: string }) => { const [isLoading, setLoading] = useState(true) + const debounceTimeout = useRef(null) + + const handleComplete = () => { + // Clear any existing debounce timeout + if (debounceTimeout.current) { + clearTimeout(debounceTimeout.current) + } + // Set a debounce delay to wait before updating the loading state + debounceTimeout.current = setTimeout(() => { + setLoading(false) + }, 1200) + } + // Cleanup timeout on unmount + useEffect(() => { + return () => { + if (debounceTimeout.current) { + clearTimeout(debounceTimeout.current) + } + } + }, []) + return ( - setLoading(false)} deepLinking persistAuthorization /> + ) } -export default Swagger +export default Swagger \ No newline at end of file From e3adc462cca501b4f096eaa64b375203cff026d3 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Thu, 5 Sep 2024 14:50:22 +0200 Subject: [PATCH 12/16] Revert "Add delay and debounce to loader on Swagger Viewer" This reverts commit 12a4dd9e36cb7282ddcdee41167520b655b53957. --- src/features/docs/view/Swagger.tsx | 32 +++--------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/features/docs/view/Swagger.tsx b/src/features/docs/view/Swagger.tsx index bd07b709..9aca9125 100644 --- a/src/features/docs/view/Swagger.tsx +++ b/src/features/docs/view/Swagger.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef } from "react" +import { useState } from "react" import SwaggerUI from "swagger-ui-react" import "swagger-ui-react/swagger-ui.css" import { Box } from "@mui/material" @@ -6,39 +6,13 @@ import LoadingWrapper from "./LoadingWrapper" const Swagger = ({ url }: { url: string }) => { const [isLoading, setLoading] = useState(true) - const debounceTimeout = useRef(null) - - const handleComplete = () => { - // Clear any existing debounce timeout - if (debounceTimeout.current) { - clearTimeout(debounceTimeout.current) - } - // Set a debounce delay to wait before updating the loading state - debounceTimeout.current = setTimeout(() => { - setLoading(false) - }, 1200) - } - // Cleanup timeout on unmount - useEffect(() => { - return () => { - if (debounceTimeout.current) { - clearTimeout(debounceTimeout.current) - } - } - }, []) - return ( - + setLoading(false)} deepLinking persistAuthorization /> ) } -export default Swagger \ No newline at end of file +export default Swagger From f40cbcb7990b378599963e7f86944932933fb23d Mon Sep 17 00:00:00 2001 From: mpabarca Date: Mon, 9 Sep 2024 14:16:36 +0200 Subject: [PATCH 13/16] Create CustomTopLoader & Add it to RaisedMainContent --- src/app/(authed)/layout.tsx | 28 +---- src/app/layout.tsx | 6 +- src/common/ui/CustomTopLoader/index.tsx | 115 ++++++++++++++++++ .../sidebar/view/internal/ClientSplitView.tsx | 9 +- .../view/internal/secondary/Container.tsx | 51 +++++--- 5 files changed, 162 insertions(+), 47 deletions(-) create mode 100644 src/common/ui/CustomTopLoader/index.tsx diff --git a/src/app/(authed)/layout.tsx b/src/app/(authed)/layout.tsx index 72f56799..4f004aa8 100644 --- a/src/app/(authed)/layout.tsx +++ b/src/app/(authed)/layout.tsx @@ -1,7 +1,6 @@ import { redirect } from "next/navigation" import { SessionProvider } from "next-auth/react" import { session, projectRepository } from "@/composition" -import { Box } from "@mui/material" import ErrorHandler from "@/common/ui/ErrorHandler" import SessionBarrier from "@/features/auth/view/SessionBarrier" import ProjectsContextProvider from "@/features/projects/view/ProjectsContextProvider" @@ -20,9 +19,7 @@ export default async function Layout({ children }: { children: React.ReactNode } - - {children} - + {children} @@ -31,26 +28,3 @@ export default async function Layout({ children }: { children: React.ReactNode } ) } - -const RaisedMainContent = ({ children }: { children?: React.ReactNode }) => { - return ( -
- - - {children} - - -
- ) -} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 73daefdf..26a9d612 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,7 +5,6 @@ import { CssBaseline } from "@mui/material" import ThemeRegistry from "@/common/theme/ThemeRegistry" import "@fortawesome/fontawesome-svg-core/styles.css" import { env } from "@/common" -import NextTopLoader from 'nextjs-toploader' fontAwesomeConfig.autoAddCss = false @@ -19,9 +18,8 @@ export default function RootLayout({ children }: { children: React.ReactNode }) - - - {children} + + {children} diff --git a/src/common/ui/CustomTopLoader/index.tsx b/src/common/ui/CustomTopLoader/index.tsx new file mode 100644 index 00000000..c310c1c7 --- /dev/null +++ b/src/common/ui/CustomTopLoader/index.tsx @@ -0,0 +1,115 @@ +'use client' + +import { useRouter as useNextRouter, usePathname } from 'next/navigation'; +import Router from 'next/router'; +import 'node_modules/nprogress/nprogress.css'; +import NProgress from 'nprogress'; +import { useEffect } from 'react'; + +type CustomTopLoaderProps = { + color?: string; + initialPosition?: number; + crawlSpeed?: number; + height?: number; + crawl?: boolean; + showSpinner?: boolean; + easing?: string; + speed?: number; + shadow?: string | false; + template?: string; + zIndex?: number; + parentSelector?: string; +}; + +const CustomTopLoader: React.FC = ({ + color = '#000', + showSpinner = false, + crawl = true, + crawlSpeed = 600, + easing = 'ease', + speed = 600, + template = '
', + zIndex = 100000000, + parentSelector = 'body', +}) => { + const router = useNextRouter(); + const pathname = usePathname(); + + useEffect(() => { + const initNProgress = () => { + // Ensure the parent exists before configuring NProgress + const parentElement = document.querySelector(parentSelector); + if (!parentElement) { + return; + } + + NProgress.configure({ + parent: parentSelector, + showSpinner, + trickle: crawl, + trickleSpeed: crawlSpeed, + easing, + speed, + template, + }); + + const handleStart = () => { + if (document.querySelector(parentSelector)) { + NProgress.start(); + } + }; + const handleComplete = () => NProgress.done(); + + Router.events.on('routeChangeStart', handleStart); + Router.events.on('routeChangeComplete', handleComplete); + Router.events.on('routeChangeError', handleComplete); + + return () => { + Router.events.off('routeChangeStart', handleStart); + Router.events.off('routeChangeComplete', handleComplete); + Router.events.off('routeChangeError', handleComplete); + NProgress.remove(); // Ensure NProgress cleans up + }; + }; + + // Wait until the parent element appears before initializing NProgress + const waitForParent = setInterval(() => { + if (document.querySelector(parentSelector)) { + clearInterval(waitForParent); + initNProgress(); + } + }, 100); // Checks every 100ms + + return () => clearInterval(waitForParent); + }, [ + router, + parentSelector, + showSpinner, + crawl, + crawlSpeed, + easing, + speed, + template, + ]); + + // Re-run when the pathname changes to ensure progress bar finishes loading + useEffect(() => { + NProgress.done(); + }, [pathname]); + + return ( + + ) +}; + +export default CustomTopLoader; \ No newline at end of file diff --git a/src/features/sidebar/view/internal/ClientSplitView.tsx b/src/features/sidebar/view/internal/ClientSplitView.tsx index 209e5800..38c6735f 100644 --- a/src/features/sidebar/view/internal/ClientSplitView.tsx +++ b/src/features/sidebar/view/internal/ClientSplitView.tsx @@ -1,7 +1,7 @@ "use client" import { useEffect, useContext } from "react" -import { Stack } from "@mui/material" +import { Stack, useMediaQuery, useTheme } from "@mui/material" import { isMac, useKeyboardShortcut, SidebarTogglableContext } from "@/common" import { useSidebarOpen } from "../../data" import PrimaryContainer from "./primary/Container" @@ -16,6 +16,10 @@ const ClientSplitView = ({ }) => { const [isSidebarOpen, setSidebarOpen] = useSidebarOpen() const isSidebarTogglable = useContext(SidebarTogglableContext) + const theme = useTheme() + // Determine if the screen size is small or larger + const isSM = useMediaQuery(theme.breakpoints.up("sm")) + useEffect(() => { if (!isSidebarTogglable && !isSidebarOpen) { setSidebarOpen(true) @@ -31,6 +35,7 @@ const ClientSplitView = ({ } }, [isSidebarTogglable, setSidebarOpen]) const sidebarWidth = 320 + return ( {sidebar} - + {children} diff --git a/src/features/sidebar/view/internal/secondary/Container.tsx b/src/features/sidebar/view/internal/secondary/Container.tsx index 7de24922..999b61a6 100644 --- a/src/features/sidebar/view/internal/secondary/Container.tsx +++ b/src/features/sidebar/view/internal/secondary/Container.tsx @@ -1,30 +1,26 @@ import { SxProps } from "@mui/system" -import { Stack } from "@mui/material" +import { Box, Stack } from "@mui/material" import { styled } from "@mui/material/styles" +import CustomTopLoader from "@/common/ui/CustomTopLoader" const SecondaryContainer = ({ sidebarWidth, offsetContent, - children + children, + isSM, }: { sidebarWidth: number offsetContent: boolean - children?: React.ReactNode + children?: React.ReactNode, + isSM: boolean, }) => { const sx = { overflow: "hidden" } return ( <> <_SecondaryContainer - sidebarWidth={0} - isSidebarOpen={false} - sx={{ ...sx, display: { xs: "flex", sm: "none" } }} - > - {children} - - <_SecondaryContainer - sidebarWidth={sidebarWidth} - isSidebarOpen={offsetContent} - sx={{ ...sx, display: { xs: "none", sm: "flex" } }} + sidebarWidth={isSM ? sidebarWidth : 0} + isSidebarOpen={isSM ? offsetContent: false} + sx={{ ...sx }} > {children} @@ -74,8 +70,35 @@ const _SecondaryContainer = ({ sidebarWidth={sidebarWidth} isSidebarOpen={isSidebarOpen} sx={{ ...sx, width: "100%", overflowY: "auto" }} + > - {children} + + {children} + ) } + +const RaisedMainContent = ({ children }: { children?: React.ReactNode }) => { + return ( +
+ + + + {children} + + +
+ ) +} From bebb033932226bd5d89e6d7b77cc3ed0774b7276 Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 11 Sep 2024 10:48:00 +0200 Subject: [PATCH 14/16] Change style SecondaryHeaderPlaceholder to new redesing --- .../view/SecondarySplitHeaderPlaceholder.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx b/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx index f85b4c41..be78957e 100644 --- a/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx +++ b/src/features/sidebar/view/SecondarySplitHeaderPlaceholder.tsx @@ -14,7 +14,7 @@ const SecondaryHeaderPlaceholder = () => { paddingLeft: { xs: 4, md: 2 }, maxWidth: "1460px", margin: "auto", - height: 60, + height: 64, }} > { display: "flex", flexGrow: 1, justifyContent: "end", - paddingRight: "30px", }} > - + {Array.from({ length: skeletonCount }, (_, index) => ( - + {index < skeletonCount - 1 && ( - + / )} ))} + +
- + ); }; From 8de0f254101f004edc358836d6dd2e4b125f2ffe Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 11 Sep 2024 16:48:05 +0200 Subject: [PATCH 15/16] Remove .env.* to .gitignore file --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 42ab9816..401002d6 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,6 @@ yarn-error.log* # local env files .env*.local -.env.* .env # vercel .vercel From c29f1d1e1ea4e970fb199f3a86073238fd38c55e Mon Sep 17 00:00:00 2001 From: mpabarca Date: Wed, 11 Sep 2024 17:20:18 +0200 Subject: [PATCH 16/16] Uninstall nextjs-toploader library --- package-lock.json | 18 ------------------ package.json | 1 - 2 files changed, 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d558226..38e7900f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,6 @@ "mobx": "^6.13.1", "next": "^14.2.5", "next-auth": "^5.0.0-beta.20", - "nextjs-toploader": "^1.6.12", "nodemailer": "^6.9.14", "npm": "^10.8.3", "nprogress": "^0.2.0", @@ -12901,23 +12900,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/nextjs-toploader": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/nextjs-toploader/-/nextjs-toploader-1.6.12.tgz", - "integrity": "sha512-nbun5lvVjlKnxLQlahzZ55nELVEduqoEXT03KCHnsEYJnFpI/3BaIzpMyq/v8C7UGU2NfxQmjq6ldZ310rsDqA==", - "dependencies": { - "nprogress": "^0.2.0", - "prop-types": "^15.8.1" - }, - "funding": { - "url": "https://github.com/sponsors/TheSGJ" - }, - "peerDependencies": { - "next": ">= 6.0.0", - "react": ">= 16.0.0", - "react-dom": ">= 16.0.0" - } - }, "node_modules/node-abi": { "version": "3.65.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", diff --git a/package.json b/package.json index b5035df6..2e24a19a 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "mobx": "^6.13.1", "next": "^14.2.5", "next-auth": "^5.0.0-beta.20", - "nextjs-toploader": "^1.6.12", "nodemailer": "^6.9.14", "npm": "^10.8.3", "nprogress": "^0.2.0",