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"