update xlsx and react-router

This commit is contained in:
dmsanhrProject 2025-11-04 22:47:48 +07:00
parent ea871e5ea7
commit 6dadfb71ed
5 changed files with 235 additions and 147 deletions

221
package-lock.json generated
View File

@ -16,8 +16,9 @@
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-redux": "^9.2.0",
"react-router-dom": "^6.30.1",
"xlsx-js-style": "^1.2.0"
"react-router-dom": "^7.9.5",
"stream-browserify": "^3.0.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@eslint/js": "^9.36.0",
@ -913,15 +914,6 @@
}
}
},
"node_modules/@remix-run/router": {
"version": "1.23.0",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
"integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@rolldown/pluginutils": {
"version": "1.0.0-beta.43",
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz",
@ -1790,17 +1782,10 @@
}
},
"node_modules/adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
"license": "Apache-2.0",
"dependencies": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
},
"bin": {
"adler32": "bin/adler32.njs"
},
"engines": {
"node": ">=0.8"
}
@ -1916,15 +1901,6 @@
"node": ">=0.8"
}
},
"node_modules/cfb/node_modules/adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@ -1943,27 +1919,14 @@
}
},
"node_modules/codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==",
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
"license": "Apache-2.0",
"dependencies": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"bin": {
"codepage": "bin/codepage.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/codepage/node_modules/commander": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
"license": "MIT"
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -1996,12 +1959,6 @@
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
"license": "MIT"
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -2009,6 +1966,15 @@
"dev": true,
"license": "MIT"
},
"node_modules/cookie": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
"integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
@ -2389,15 +2355,6 @@
"node": ">=0.10.0"
}
},
"node_modules/exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.8"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@ -2436,12 +2393,6 @@
}
}
},
"node_modules/fflate": {
"version": "0.3.11",
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz",
"integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==",
"license": "MIT"
},
"node_modules/file-entry-cache": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
@ -2738,6 +2689,12 @@
"node": ">=0.8.19"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@ -3351,18 +3308,6 @@
"node": ">= 0.8.0"
}
},
"node_modules/printj": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==",
"license": "Apache-2.0",
"bin": {
"printj": "bin/printj.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@ -3424,35 +3369,55 @@
}
},
"node_modules/react-router": {
"version": "6.30.1",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz",
"integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==",
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.5.tgz",
"integrity": "sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.0"
"cookie": "^1.0.1",
"set-cookie-parser": "^2.6.0"
},
"engines": {
"node": ">=14.0.0"
"node": ">=20.0.0"
},
"peerDependencies": {
"react": ">=16.8"
"react": ">=18",
"react-dom": ">=18"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
}
}
},
"node_modules/react-router-dom": {
"version": "6.30.1",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz",
"integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==",
"version": "7.9.5",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.5.tgz",
"integrity": "sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw==",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.23.0",
"react-router": "6.30.1"
"react-router": "7.9.5"
},
"engines": {
"node": ">=14.0.0"
"node": ">=20.0.0"
},
"peerDependencies": {
"react": ">=16.8",
"react-dom": ">=16.8"
"react": ">=18",
"react-dom": ">=18"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/redux": {
@ -3527,12 +3492,38 @@
"fsevents": "~2.3.2"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
"node_modules/set-cookie-parser": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@ -3577,6 +3568,25 @@
"node": ">=0.8"
}
},
"node_modules/stream-browserify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
"integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
"license": "MIT",
"dependencies": {
"inherits": "~2.0.4",
"readable-stream": "^3.5.0"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@ -3670,6 +3680,12 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/vite": {
"version": "7.1.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz",
@ -3788,19 +3804,16 @@
"node": ">=0.10.0"
}
},
"node_modules/xlsx-js-style": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/xlsx-js-style/-/xlsx-js-style-1.2.0.tgz",
"integrity": "sha512-DDT4FXFSWfT4DXMSok/m3TvmP1gvO3dn0Eu/c+eXHW5Kzmp7IczNkxg/iEPnImbG9X0Vb8QhROda5eatSR/97Q==",
"node_modules/xlsx": {
"version": "0.18.5",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz",
"integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
"license": "Apache-2.0",
"dependencies": {
"adler-32": "~1.2.0",
"cfb": "^1.1.4",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"fflate": "^0.3.8",
"adler-32": "~1.3.0",
"cfb": "~1.2.1",
"codepage": "~1.15.0",
"crc-32": "~1.2.1",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"

View File

@ -18,8 +18,9 @@
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-redux": "^9.2.0",
"react-router-dom": "^6.30.1",
"xlsx-js-style": "^1.2.0"
"react-router-dom": "^7.9.5",
"stream-browserify": "^3.0.0",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@eslint/js": "^9.36.0",

View File

@ -9,7 +9,7 @@ pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
import.meta.url
).toString();
import * as XLSX from 'xlsx-js-style';
import * as XLSX from 'xlsx';
// pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;
@ -47,6 +47,9 @@ export function useUploadController() {
}
}
else if (ext === "xlsx" || ext === "xls") {
// const data = await f.arrayBuffer();
// const workbook = XLSX.read(data, { type: 'array' });
// const sheetNames = workbook.SheetNames;
const data = await f.arrayBuffer();
const workbook = XLSX.read(data, { type: 'array' });
const sheetNames = workbook.SheetNames;
@ -66,7 +69,6 @@ export function useUploadController() {
try {
const res = await uploadFile(file, selectedPages, selectedSheet);
dispatch(setResult(res));
console.log('gtw',res);
if (res.file_type !== ".pdf" || (res.file_type === ".pdf" && !res.tables)) {
navigate("/admin/upload/validate");

View File

@ -1,31 +1,79 @@
// // import { BrowserRouter, Routes, Route } from "react-router-dom";
// // import GuestRoute from "./GuestRoute";
// // import ProtectedRoute from "./ProtectedRoute";
// // import ViewsLanding from "../pages/landing/views_landing";
// // import ViewsAuthLogin from "../pages/auth/views_auth_login";
// // import ViewsAdminHome from "../pages/admin/home/views_admin_home";
// // import ViewsAdminUpload from "../pages/admin/upload/views_admin_upload";
// // import ViewsAdminUploadValidate from "../pages/admin/upload/views_admin_upload_validate";
// // import ViewsAdminUploadSuccess from "../pages/admin/upload/views_admin_upload_success";
// // import ViewsAdminPublikasi from "../pages/admin/publikasi/views_admin_publikasi";
// // export default function AppRouter() {
// // return (
// // <BrowserRouter>
// // <Routes>
// // {/* Guest Routes */}
// // <Route path="/" element={<GuestRoute><ViewsLanding /></GuestRoute>} />
// // <Route path="/login" element={<GuestRoute><ViewsAuthLogin /></GuestRoute>} />
// // {/* Protected (Admin) Routes */}
// // <Route path="/admin/home" element={<ProtectedRoute><ViewsAdminHome /></ProtectedRoute>} />
// // <Route path="/admin/publikasi" element={<ProtectedRoute><ViewsAdminPublikasi /></ProtectedRoute>} />
// // <Route path="/admin/upload" element={<ProtectedRoute><ViewsAdminUpload /></ProtectedRoute>} />
// // <Route path="/admin/upload/validate" element={<ProtectedRoute><ViewsAdminUploadValidate /></ProtectedRoute>} />
// // <Route path="/admin/upload/success" element={<ProtectedRoute><ViewsAdminUploadSuccess /></ProtectedRoute>} />
// // </Routes>
// // </BrowserRouter>
// // );
// // }
// import { BrowserRouter, Routes, Route } from "react-router-dom";
// import GuestRoute from "./GuestRoute";
// import ProtectedRoute from "./ProtectedRoute";
// import ViewsLanding from "../pages/landing/views_landing";
// import ViewsAuthLogin from "../pages/auth/views_auth_login";
// import AdminLayout from "../layouts/AdminLayout";
// import ViewsAdminHome from "../pages/admin/home/views_admin_home";
// import ViewsAdminUpload from "../pages/admin/upload/views_admin_upload";
// import ViewsAdminUploadValidate from "../pages/admin/upload/views_admin_upload_validate";
// import ViewsAdminUploadSuccess from "../pages/admin/upload/views_admin_upload_success";
// import ViewsAdminUploadStep1 from "../pages/admin/upload/views_admin_upload";
// import ViewsAdminUploadValidate from "../pages/admin/upload/views_admin_validate_upload";
// import ViewsAdminUploadSuccess from "../pages/admin/upload/views_admin_success_upload";
// import ViewsAdminPublikasi from "../pages/admin/publikasi/views_admin_publikasi";
// import ViewsAdminUploadRules from "../pages/admin/upload/rules/views_admin_rules_upload";
// export default function AppRouter() {
// return (
// <BrowserRouter>
// <Routes>
// {/* Guest Routes */}
// {/* Guest */}
// <Route path="/" element={<GuestRoute><ViewsLanding /></GuestRoute>} />
// <Route path="/login" element={<GuestRoute><ViewsAuthLogin /></GuestRoute>} />
// {/* Protected (Admin) Routes */}
// <Route path="/admin/home" element={<ProtectedRoute><ViewsAdminHome /></ProtectedRoute>} />
// <Route path="/admin/publikasi" element={<ProtectedRoute><ViewsAdminPublikasi /></ProtectedRoute>} />
// <Route path="/admin/upload" element={<ProtectedRoute><ViewsAdminUpload /></ProtectedRoute>} />
// <Route path="/admin/upload/validate" element={<ProtectedRoute><ViewsAdminUploadValidate /></ProtectedRoute>} />
// <Route path="/admin/upload/success" element={<ProtectedRoute><ViewsAdminUploadSuccess /></ProtectedRoute>} />
// {/* Protected Admin Layout */}
// <Route
// path="/admin"
// element={
// <ProtectedRoute>
// <AdminLayout />
// </ProtectedRoute>
// }
// >
// <Route path="home" element={<ViewsAdminHome />} />
// <Route path="upload" element={<ViewsAdminUploadStep1 />} />
// <Route path="upload/validate" element={<ViewsAdminUploadValidate />} />
// <Route path="upload/success" element={<ViewsAdminUploadSuccess />} />
// <Route path="upload/rules" element={<ViewsAdminUploadRules />} />
// <Route path="publikasi" element={<ViewsAdminPublikasi />} />
// </Route>
// </Routes>
// </BrowserRouter>
// );
@ -35,7 +83,15 @@
import { BrowserRouter, Routes, Route } from "react-router-dom";
// src/routes/AppRouter.jsx
import {
createBrowserRouter,
RouterProvider,
Outlet,
} from "react-router-dom";
import GuestRoute from "./GuestRoute";
import ProtectedRoute from "./ProtectedRoute";
@ -50,31 +106,42 @@ import ViewsAdminUploadSuccess from "../pages/admin/upload/views_admin_success_u
import ViewsAdminPublikasi from "../pages/admin/publikasi/views_admin_publikasi";
import ViewsAdminUploadRules from "../pages/admin/upload/rules/views_admin_rules_upload";
export default function AppRouter() {
return (
<BrowserRouter>
<Routes>
{/* Guest */}
<Route path="/" element={<GuestRoute><ViewsLanding /></GuestRoute>} />
<Route path="/login" element={<GuestRoute><ViewsAuthLogin /></GuestRoute>} />
{/* Protected Admin Layout */}
<Route
path="/admin"
element={
const router = createBrowserRouter(
[
{
path: "/",
element: <GuestRoute><ViewsLanding /></GuestRoute>,
},
{
path: "/login",
element: <GuestRoute><ViewsAuthLogin /></GuestRoute>,
},
{
path: "/admin",
element: (
<ProtectedRoute>
<AdminLayout />
</ProtectedRoute>
),
children: [
{ path: "home", element: <ViewsAdminHome /> },
{ path: "upload", element: <ViewsAdminUploadStep1 /> },
{ path: "upload/validate", element: <ViewsAdminUploadValidate /> },
{ path: "upload/success", element: <ViewsAdminUploadSuccess /> },
{ path: "upload/rules", element: <ViewsAdminUploadRules /> },
{ path: "publikasi", element: <ViewsAdminPublikasi /> },
],
},
],
{
// 🧩 Di sinilah kamu bisa menambahkan future flags
future: {
v7_startTransition: true,
v7_relativeSplatPath: true,
},
}
>
<Route path="home" element={<ViewsAdminHome />} />
<Route path="upload" element={<ViewsAdminUploadStep1 />} />
<Route path="upload/validate" element={<ViewsAdminUploadValidate />} />
<Route path="upload/success" element={<ViewsAdminUploadSuccess />} />
<Route path="upload/rules" element={<ViewsAdminUploadRules />} />
<Route path="publikasi" element={<ViewsAdminPublikasi />} />
</Route>
</Routes>
</BrowserRouter>
);
export default function AppRouter() {
return <RouterProvider router={router} />;
}

View File

@ -8,4 +8,9 @@ export default defineConfig({
react(),
tailwindcss(),
],
resolve: {
alias: {
stream: 'stream-browserify',
},
},
})