diff --git a/modules.d.ts b/modules.d.ts
new file mode 100644
index 0000000..c142ff7
--- /dev/null
+++ b/modules.d.ts
@@ -0,0 +1,10 @@
+declare namespace NodeJS{
+ export interface ProcessEnv{
+ NEXT_PUBLIC_NEXTAUTH_URL : string;
+ NEXTAUTH_SECRET : string;
+ KEYCLOAK_BASE_URL : string;
+ KEYCLOAK_REALM : string;
+ KEYCLOAK_CLIENT_ID: string;
+ KEYCLOAK_CLIENT_SECRET: string;
+ }
+}
\ No newline at end of file
diff --git a/next-auth.d.ts b/next-auth.d.ts
new file mode 100644
index 0000000..4b2f8c1
--- /dev/null
+++ b/next-auth.d.ts
@@ -0,0 +1,31 @@
+import 'next-auth/jwt';
+
+// Read more at: https://next-auth.js.org/getting-started/typescript#module-augmentation
+
+declare module 'next-auth/jwt' {
+ interface JWT {
+ discord?: string;
+ username: string;
+ groups: string[];
+ }
+}
+
+declare module 'next-auth' {
+ export interface Session {
+ user: {
+ email: any;
+ name: any;
+ id: string;
+ discord: string;
+ username: string;
+ groups: string[];
+ image?: string;
+ };
+ }
+
+ export interface Profile {
+ discord?: string;
+ preferred_username: string;
+ groups: string[];
+ }
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 455229a..370278e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,8 +26,10 @@
"eslint-config-next": "13.4.19",
"framer-motion": "^10.16.4",
"next": "^14.0.3",
+ "next-auth": "^4.24.5",
"next-themes": "^0.2.1",
"postcss": "^8.4.31",
+ "qrcode-generator": "^1.4.4",
"react": "18.2.0",
"react-calendar": "^4.6.1",
"react-dom": "18.2.0",
@@ -1156,126 +1158,6 @@
"node": ">= 10"
}
},
- "node_modules/@next/swc-darwin-x64": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz",
- "integrity": "sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz",
- "integrity": "sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz",
- "integrity": "sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz",
- "integrity": "sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz",
- "integrity": "sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz",
- "integrity": "sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-ia32-msvc": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz",
- "integrity": "sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz",
- "integrity": "sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/@nextui-org/accordion": {
"version": "2.0.28",
"resolved": "https://registry.npmjs.org/@nextui-org/accordion/-/accordion-2.0.28.tgz",
@@ -2526,6 +2408,14 @@
"node": ">= 8"
}
},
+ "node_modules/@panva/hkdf": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz",
+ "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@@ -4481,6 +4371,14 @@
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
},
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/cosmiconfig": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@@ -6194,6 +6092,14 @@
"jiti": "bin/jiti.js"
}
},
+ "node_modules/jose": {
+ "version": "4.15.4",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz",
+ "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -6526,6 +6432,33 @@
}
}
},
+ "node_modules/next-auth": {
+ "version": "4.24.5",
+ "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz",
+ "integrity": "sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.13",
+ "@panva/hkdf": "^1.0.2",
+ "cookie": "^0.5.0",
+ "jose": "^4.11.4",
+ "oauth": "^0.9.15",
+ "openid-client": "^5.4.0",
+ "preact": "^10.6.3",
+ "preact-render-to-string": "^5.1.19",
+ "uuid": "^8.3.2"
+ },
+ "peerDependencies": {
+ "next": "^12.2.5 || ^13 || ^14",
+ "nodemailer": "^6.6.5",
+ "react": "^17.0.2 || ^18",
+ "react-dom": "^17.0.2 || ^18"
+ },
+ "peerDependenciesMeta": {
+ "nodemailer": {
+ "optional": true
+ }
+ }
+ },
"node_modules/next-themes": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz",
@@ -6624,6 +6557,11 @@
"node": ">=0.10.0"
}
},
+ "node_modules/oauth": {
+ "version": "0.9.15",
+ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
+ "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA=="
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6741,6 +6679,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/oidc-token-hash": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz",
+ "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==",
+ "engines": {
+ "node": "^10.13.0 || >=12.0.0"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -6749,6 +6695,28 @@
"wrappy": "1"
}
},
+ "node_modules/openid-client": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.1.tgz",
+ "integrity": "sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ==",
+ "dependencies": {
+ "jose": "^4.15.1",
+ "lru-cache": "^6.0.0",
+ "object-hash": "^2.2.0",
+ "oidc-token-hash": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/openid-client/node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
@@ -7045,6 +7013,17 @@
"url": "https://opencollective.com/preact"
}
},
+ "node_modules/preact-render-to-string": {
+ "version": "5.2.6",
+ "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz",
+ "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==",
+ "dependencies": {
+ "pretty-format": "^3.8.0"
+ },
+ "peerDependencies": {
+ "preact": ">=10"
+ }
+ },
"node_modules/prebuild-install": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
@@ -7078,6 +7057,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/pretty-format": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
+ "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -7110,6 +7094,11 @@
"node": ">=6"
}
},
+ "node_modules/qrcode-generator": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.4.4.tgz",
+ "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -8285,6 +8274,14 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/watchpack": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
diff --git a/package.json b/package.json
index dc8b164..959f3c6 100644
--- a/package.json
+++ b/package.json
@@ -27,12 +27,14 @@
"eslint-config-next": "13.4.19",
"framer-motion": "^10.16.4",
"next": "^14.0.3",
+ "next-auth": "^4.24.5",
"next-themes": "^0.2.1",
- "autoprefixer": "^10.4.16",
- "postcss": "^8.4.31",
+ "qrcode-generator": "^1.4.4",
"react": "18.2.0",
"react-calendar": "^4.6.1",
"react-dom": "18.2.0",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.31",
"tailwindcss": "^3.3.5",
"typescript": "5.2.2"
},
diff --git a/public/LabMSQRCode.svg b/public/LabMSQRCode.svg
new file mode 100644
index 0000000..ee351d2
--- /dev/null
+++ b/public/LabMSQRCode.svg
@@ -0,0 +1,348 @@
+
\ No newline at end of file
diff --git a/public/greenCircle.png b/public/greenCircle.png
new file mode 100644
index 0000000..acd2d21
Binary files /dev/null and b/public/greenCircle.png differ
diff --git a/public/tapAnimation.gif b/public/tapAnimation.gif
new file mode 100644
index 0000000..59617bb
Binary files /dev/null and b/public/tapAnimation.gif differ
diff --git a/src/components/footer.tsx b/src/components/footer.tsx
index ab98d40..b5adb7b 100644
--- a/src/components/footer.tsx
+++ b/src/components/footer.tsx
@@ -12,7 +12,7 @@ const buttons = [
},
{
title: "Member Already?",
- url: "/"
+ url: "/sign_in"
},
{
title: "Need Help?",
diff --git a/src/midware.ts b/src/midware.ts
new file mode 100644
index 0000000..96a3613
--- /dev/null
+++ b/src/midware.ts
@@ -0,0 +1,20 @@
+// import { withAuth } from 'next-auth/middleware';
+
+// export default withAuth({
+// callbacks: {
+// authorized({ req, token }) {
+// if (
+// req.nextUrl.pathname === '/test'
+// ) {
+// console.log('Admitting because the user is an approver');
+// return true;
+// }
+// console.log('No match');
+// return false;
+// },
+// },
+// });
+
+// export const config = {
+// matcher: ['/test'],
+// };
\ No newline at end of file
diff --git a/src/pages/QRCodeGenerator.tsx b/src/pages/QRCodeGenerator.tsx
new file mode 100644
index 0000000..e977ec2
--- /dev/null
+++ b/src/pages/QRCodeGenerator.tsx
@@ -0,0 +1,33 @@
+'use client'
+import { useEffect } from 'react';
+import QRCode from 'qrcode-generator';
+
+interface QRCodeGeneratorProps {
+ url: string; // Explicitly specify the type as string
+ }
+
+const QRCodeGenerator = ({ url }: QRCodeGeneratorProps) => {
+ useEffect(() => {
+ let qrContainer = document.getElementById('qrcode-container');
+ if (!qrContainer){
+ return;
+ }
+ if (url) {
+ // Generate QR code based on the provided URL
+ const qr = QRCode(0, 'H');
+ qr.addData(url);
+ qr.make();
+ const qrCodeImage = qr.createImgTag(5, 0);
+
+ // Display the QR code image
+ qrContainer.innerHTML = qrCodeImage;
+ } else {
+ qrContainer.innerHTML = '