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 = 'Green Circle'; + } + + }, [url]); + + return
; +}; + +export default QRCodeGenerator; \ No newline at end of file diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 0c4855a..b6f1b8f 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -2,6 +2,7 @@ import type { AppProps } from "next/app"; import { NextUIProvider } from "@nextui-org/react"; import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { SessionProvider } from "next-auth/react"; import { fontSans, fontMono } from "@/config/fonts"; import { useRouter } from 'next/router'; import "@/styles/globals.css"; @@ -10,11 +11,13 @@ export default function App({ Component, pageProps }: AppProps) { const router = useRouter(); return ( - - - - - + + + + + + + ); } diff --git a/src/pages/api/auth/[...nextauth].ts b/src/pages/api/auth/[...nextauth].ts new file mode 100644 index 0000000..43b43b8 --- /dev/null +++ b/src/pages/api/auth/[...nextauth].ts @@ -0,0 +1,57 @@ +import NextAuth, { NextAuthOptions } from 'next-auth'; +import KeycloakProvider from 'next-auth/providers/keycloak'; + + +const { + KEYCLOAK_BASE_URL, + KEYCLOAK_CLIENT_ID, + KEYCLOAK_CLIENT_SECRET, + KEYCLOAK_REALM, +} = process.env; + +export const authOptions: NextAuthOptions = { + providers: [ + KeycloakProvider({ + issuer: `${KEYCLOAK_BASE_URL}/realms/${KEYCLOAK_REALM}`, + clientId: KEYCLOAK_CLIENT_ID, + clientSecret: KEYCLOAK_CLIENT_SECRET, + name: 'TheLab.ms', + }), + ], + theme: { + colorScheme: 'light', + }, + callbacks: { + async jwt({ token, user, profile }) { + // if (user && user.email && !token.picture) { + // const emailHash = md5(user.email, { encoding: 'binary' }); + // token.picture = `https://www.gravatar.com/avatar/${emailHash}?d=mp`; + // } + if (profile && profile.groups) { + token.groups = profile?.groups || []; + } + if (user) { + token.uid = user.id; + } + if (profile?.discord) { + token.discord = profile.discord; + } + + return token; + }, + async session({ session, token }) { + if (session?.user) { + session.user.id = token.uid as string; + } + if (!session.user.groups) { + session.user.groups = token.groups || []; + } + if (token.discord) { + session.user.discord = token.discord; + } + return session; + }, + }, +}; + +export default NextAuth(authOptions); \ No newline at end of file diff --git a/src/pages/sign_in.tsx b/src/pages/sign_in.tsx new file mode 100644 index 0000000..1775ddc --- /dev/null +++ b/src/pages/sign_in.tsx @@ -0,0 +1,136 @@ + +import React, { useEffect, useState, FormEvent } from 'react' +import styles from '@/styles/sign_in.module.css'; +import { signIn } from "next-auth/react"; + +import {Card, CardHeader, CardBody, CardFooter} from "@nextui-org/react"; +import {Button, ButtonGroup} from "@nextui-org/react"; +import {Input} from "@nextui-org/react"; +import Link from 'next/link'; +import Image from 'next/image'; +import QRCodeGenerator from './QRCodeGenerator'; + +import tapAnimation from '../../public/tapAnimation.gif'; + + +function validateEmail(email: string){ + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + // Test the email against the regex + return emailRegex.test(email); +} + +const signInPage = () => { + + + let url: string = "https://nextjs.org/docs/app/building-your-application/rendering/client-components"; + + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + const [emailInPutError, setEmailInputError] = useState(false); + const [passwordInPutError, setPasswordInputError] = useState(false); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + validate(); + }, [email, password]); + + async function handleSubmit() { + // alert(`${process.env.NEXT_PUBLIC_NEXTAUTH_URL}`); + + let res = await signIn("keycloak", { + email, + password, + callbackUrl: `${process.env.NEXT_PUBLIC_NEXTAUTH_URL}`, + redirect: false, + }); + + if (res?.ok) { + // toast success + console.log("success"); + return; + } else { + // Toast failed + setError("Failed! Check you input and try again."); + // return; + console.log("Failed", res); + } + return res; + } + + function validate() { + let emailIsValid = validateEmail(email); + + if (!emailIsValid) { + setEmailInputError(true); + return; + } + if (password.length < 6) { + setPasswordInputError(true); + } else { + setEmailInputError(false); + setPasswordInputError(false); + } + } + return ( +
+
+ + +

Sign in

+
+ +
+ + Forgot your password? +
+ + {/*
+

Email

+ +

Password

+
+ + Forgot your password? +
*/} +
+
+ +

Scan QR Code to Sign In

+ +
+ +
+ + +
+
+ + +
+
Scan your key here
+ + + +
+
+ Green Circle +
+
+
+
+ + ) +} +export default signInPage \ No newline at end of file diff --git a/src/pages/test.tsx b/src/pages/test.tsx index 937ff6f..e207267 100644 --- a/src/pages/test.tsx +++ b/src/pages/test.tsx @@ -1,10 +1,28 @@ -import React from "react"; +import React, { useState } from "react"; +import { NextApiRequest, NextApiResponse } from 'next'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '../pages/api/auth/[...nextauth]'; import { Card, CardBody, CardFooter, Image } from "@nextui-org/react"; import { useRouter } from 'next/router'; import DefaultLayout from "@/layouts/default"; import MenuCard from '@/components/MenuCard'; -export default function App() { +export default function App( + // req: NextApiRequest, + // res: NextApiResponse +) { + + // if (!req.method || (req.method !== 'POST' && req.method !== 'DELETE')) { + // res.status(405).json({ message: 'Method not allowed' }); + // return; + // } + + // const session = await getServerSession(req, res, authOptions); + // if (!session) { + // alert("2nd condition"); + // res.status(401).json({ message: 'Unauthorized' }); + // return; + // } const router = useRouter(); const list1 = [ { diff --git a/src/pages/ticket.tsx b/src/pages/ticket.tsx index 62fc340..2377bce 100644 --- a/src/pages/ticket.tsx +++ b/src/pages/ticket.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import styles from '@/styles/ticket.module.css'; import { Button, Input, Select, SelectItem, Spacer, Textarea } from '@nextui-org/react'; import DefaultLayout from '@/layouts/default'; - +import { useSession } from 'next-auth/react'; export const reasons = [ { label: 'Issue With Machine', @@ -37,6 +37,7 @@ export const reasons = [ ]; export default function SupportTicket() { + const session = useSession(); const [reason, setReason] = useState(''); const [message, setMessage] = useState(''); @@ -66,6 +67,7 @@ export default function SupportTicket() { onChange={(e) => setMessage(e.target.value)} required={false} className={styles.bigText} + hidden={!session} />