diff --git a/.gitignore b/.gitignore index 5aa91d5b..1547eac0 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ next-env.d.ts .env .yarn/* -.history* \ No newline at end of file +.history* +__ENV.js \ No newline at end of file diff --git a/package.json b/package.json index 5b53fc0a..0b92e7ff 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "prepare": "husky install" }, "dependencies": { + "@beam-australia/react-env": "^3.1.1", "@headlessui/react": "^1.7.13", "@mdi/js": "^7.1.96", "@mdi/react": "^1.6.1", @@ -82,6 +83,7 @@ "autoprefixer": "^10.4.13", "husky": "^8.0.3", "postcss": "^8.4.21", - "tailwindcss": "^3.2.4" + "tailwindcss": "^3.2.4", + "types/": "paypal/react-paypal-js" } } diff --git a/src/lib/session.ts b/src/lib/session.ts index ce071a1d..d94572ec 100644 --- a/src/lib/session.ts +++ b/src/lib/session.ts @@ -14,5 +14,6 @@ export const sessionOptions: IronSessionOptions = { declare module "iron-session" { interface IronSessionData { user?: User | null; + envVariables?: {[key: string]: string}; } } diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index e6ea6b0e..f87a73b9 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -10,7 +10,6 @@ import {useRouter} from "next/router"; import {useEffect} from "react"; import useExamStore from "@/stores/examStore"; import usePreferencesStore from "@/stores/preferencesStore"; -import {PayPalScriptProvider} from "@paypal/react-paypal-js"; export default function App({Component, pageProps}: AppProps) { const reset = useExamStore((state) => state.reset); @@ -32,10 +31,5 @@ export default function App({Component, pageProps}: AppProps) { } }, [setIsSidebarMinimized]); - return ( - - - - ); + return ; } diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index 54e8bf3e..59b21ed6 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -1,13 +1,14 @@ -import { Html, Head, Main, NextScript } from 'next/document' +/* eslint-disable @next/next/no-sync-scripts */ +import {Html, Head, Main, NextScript} from "next/document"; export default function Document() { - return ( - - - -
- - - - ) + return ( + + + +
+ + + + ); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index a8d131b3..39b35039 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -29,10 +29,18 @@ import TeacherDashboard from "@/dashboards/Teacher"; import AgentDashboard from "@/dashboards/Agent"; import PaymentDue from "./(status)/PaymentDue"; import {useRouter} from "next/router"; +import {PayPalScriptProvider} from "@paypal/react-paypal-js"; export const getServerSideProps = withIronSessionSsr(({req, res}) => { const user = req.session.user; + const envVariables: {[key: string]: string} = {}; + Object.keys(process.env) + .filter((x) => x.startsWith("NEXT_PUBLIC")) + .forEach((x: string) => { + envVariables[x] = process.env[x]!; + }); + if (!user || !user.isVerified) { res.setHeader("location", "/login"); res.statusCode = 302; @@ -40,16 +48,17 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => { return { props: { user: null, + envVariables, }, }; } return { - props: {user: req.session.user}, + props: {user: req.session.user, envVariables}, }; }, sessionOptions); -export default function Home() { +export default function Home({envVariables}: {envVariables: {[key: string]: string}}) { const [showDiagnostics, setShowDiagnostics] = useState(false); const [showDemographicInput, setShowDemographicInput] = useState(false); const {user, mutateUser} = useUser({redirectTo: "/login"}); @@ -92,7 +101,18 @@ export default function Home() { )} - {(user.status === "paymentDue" || checkIfUserExpired()) && } + {(user.status === "paymentDue" || checkIfUserExpired()) && ( + + + + )} ); } diff --git a/src/pages/payment.tsx b/src/pages/payment.tsx index a0a6945a..66e9791d 100644 --- a/src/pages/payment.tsx +++ b/src/pages/payment.tsx @@ -1,38 +1,22 @@ /* eslint-disable @next/next/no-img-element */ import Head from "next/head"; -import Navbar from "@/components/Navbar"; -import {BsFileEarmarkText, BsPencil, BsStar, BsBook, BsHeadphones, BsPen, BsMegaphone} from "react-icons/bs"; import {withIronSessionSsr} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; -import {useEffect, useState} from "react"; -import useStats from "@/hooks/useStats"; -import {averageScore, groupBySession, totalExams} from "@/utils/stats"; import useUser from "@/hooks/useUser"; -import Sidebar from "@/components/Sidebar"; -import Diagnostic from "@/components/Diagnostic"; -import {ToastContainer} from "react-toastify"; -import {capitalize} from "lodash"; -import {Module} from "@/interfaces"; -import ProgressBar from "@/components/Low/ProgressBar"; -import Layout from "@/components/High/Layout"; -import {calculateAverageLevel} from "@/utils/score"; -import axios from "axios"; -import DemographicInformationInput from "@/components/DemographicInformationInput"; -import moment from "moment"; -import Link from "next/link"; -import {MODULE_ARRAY} from "@/utils/moduleUtils"; -import ProfileSummary from "@/components/ProfileSummary"; -import StudentDashboard from "@/dashboards/Student"; -import AdminDashboard from "@/dashboards/Admin"; -import CorporateDashboard from "@/dashboards/Corporate"; -import TeacherDashboard from "@/dashboards/Teacher"; -import AgentDashboard from "@/dashboards/Agent"; import PaymentDue from "./(status)/PaymentDue"; import {useRouter} from "next/router"; +import {PayPalScriptProvider} from "@paypal/react-paypal-js"; export const getServerSideProps = withIronSessionSsr(({req, res}) => { const user = req.session.user; + const envVariables: {[key: string]: string} = {}; + Object.keys(process.env) + .filter((x) => x.startsWith("NEXT_PUBLIC")) + .forEach((x: string) => { + envVariables[x] = process.env[x]!; + }); + if (!user || !user.isVerified) { res.setHeader("location", "/login"); res.statusCode = 302; @@ -40,16 +24,17 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => { return { props: { user: null, + envVariables, }, }; } return { - props: {user: req.session.user}, + props: {user: req.session.user, envVariables}, }; }, sessionOptions); -export default function Home() { +export default function Home({envVariables}: {envVariables: {[key: string]: string}}) { const {user, mutateUser} = useUser({redirectTo: "/login"}); const router = useRouter(); @@ -64,7 +49,18 @@ export default function Home() { - {user && } + {user && ( + + + + )} ); } diff --git a/src/utils/index.ts b/src/utils/index.ts index 9bdf3dee..c63966f9 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -8,3 +8,7 @@ export function dateSorter(a: any, b: any, direction: "asc" | "desc", key: strin if (moment(b[key]).isAfter(a[key])) return direction === "asc" ? 1 : -1; return 0; } + +export function env(key: string) { + return (window as any).__ENV[key]; +} diff --git a/yarn.lock b/yarn.lock index d7ba109c..4d9d4192 100644 --- a/yarn.lock +++ b/yarn.lock @@ -64,6 +64,16 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@beam-australia/react-env@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@beam-australia/react-env/-/react-env-3.1.1.tgz#63cb8316861b8fbdb4b9c550a62139cd90675e40" + integrity sha512-LdWzgqmu116t9+sOvONyB21bBmI8dm8g8s3KhnJVzCcK93GrdSisuIOtOkQPMYgenmVGTWQwWnbLAgoka/jAFw== + dependencies: + cross-spawn "^6.0.5" + dotenv "^8.0.0" + dotenv-expand "^5.1.0" + minimist "^1.2.0" + "@emotion/babel-plugin@^11.11.0": version "11.11.0" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" @@ -1922,6 +1932,17 @@ country-flag-icons@^1.5.4: resolved "https://registry.yarnpkg.com/country-flag-icons/-/country-flag-icons-1.5.7.tgz#f1f2ddf14f3cbf01cba6746374aeba94db35d4b4" integrity sha512-AdvXhMcmSp7nBSkpGfW4qR/luAdRUutJqya9PuwRbsBzuoknThfultbv7Ib6fWsHXC43Es/4QJ8gzQQdBNm75A== +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -2099,6 +2120,16 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^8.0.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + duplexify@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" @@ -3963,6 +3994,11 @@ next@13.1.6: "@next/swc-win32-ia32-msvc" "13.1.6" "@next/swc-win32-x64-msvc" "13.1.6" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" @@ -4183,6 +4219,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" @@ -4771,6 +4812,11 @@ seedrandom@^3.0.5: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.0.0: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -4800,6 +4846,13 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -4807,6 +4860,11 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" @@ -5238,6 +5296,13 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +types/@paypal/react-paypal-js: + version "8.1.3" + resolved "https://codeload.github.com/paypal/react-paypal-js/tar.gz/21bf270c7ce356616a9184dae7042f7ab3473e25" + dependencies: + "@paypal/paypal-js" "^7.0.0" + "@paypal/sdk-constants" "^1.0.122" + typescript@4.9.5: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" @@ -5403,6 +5468,13 @@ which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"