diff --git a/src/components/ProfileLevel.tsx b/src/components/ProfileLevel.tsx new file mode 100644 index 00000000..c0870d0c --- /dev/null +++ b/src/components/ProfileLevel.tsx @@ -0,0 +1,34 @@ +/* eslint-disable @next/next/no-img-element */ +import {User} from "@/interfaces/user"; +import {levelCalculator} from "@/resources/level"; +import clsx from "clsx"; + +interface Props { + user: User; + className?: string; +} + +export default function ProfileLevel({user, className}: Props) { + const levelResult = levelCalculator(user.experience); + + return ( +
+
+ Profile picture +
+
+ {levelResult.label} +
+
+ Lvl. {levelResult.currentLevel} + + Lvl. {levelResult.nextLevel} +
+ + {user.experience.toLocaleString("en")} / {levelResult.nextLevelExperience.toLocaleString("en")} + +
+
+
+ ); +} diff --git a/src/constants/levelLabel.json b/src/constants/levelLabel.json new file mode 100644 index 00000000..5ef99dd8 --- /dev/null +++ b/src/constants/levelLabel.json @@ -0,0 +1,13 @@ +{ + "1": "Newbie", + "5": "Novice", + "10": "Amateur", + "25": "Student", + "50": "", + "75": "", + "100": "", + "150": "", + "200": "Professional", + "250": "Expert", + "300": "Master" +} \ No newline at end of file diff --git a/src/interfaces/user.ts b/src/interfaces/user.ts new file mode 100644 index 00000000..cd43e2dd --- /dev/null +++ b/src/interfaces/user.ts @@ -0,0 +1,4 @@ +export interface User { + profilePicture: string; + experience: number; +} diff --git a/src/pages/exam.tsx b/src/pages/exam.tsx index a5e7057e..1a5ab579 100644 --- a/src/pages/exam.tsx +++ b/src/pages/exam.tsx @@ -8,6 +8,7 @@ import {Module} from "@/interfaces"; import clsx from "clsx"; import {useRouter} from "next/router"; import {errorButtonStyle, infoButtonStyle} from "@/constants/buttonStyles"; +import ProfileLevel from "@/components/ProfileLevel"; export default function Home() { const [selectedModules, setSelectedModules] = useState([]); @@ -30,26 +31,11 @@ export default function Home() {
-
-
- Profile picture -
-
- Professional -
-
- Lvl. 34 - - Lvl. 35 -
- 5 400 / 10 000 -
-
-
+ {/* //TODO: Change this section to work with the user account */} +
toggleModule("reading")} className={clsx( "flex flex-col gap-2 items-center justify-center", - "border-ielts-reading hover:bg-ielts-reading", + "border-ielts-reading hover:bg-ielts-reading text-white", "border-2 rounded-xl p-4 h-fit w-48 cursor-pointer", selectedModules.includes("reading") ? "bg-ielts-reading " : "bg-ielts-reading-transparent ", )}> @@ -71,7 +57,7 @@ export default function Home() { onClick={() => toggleModule("listening")} className={clsx( "flex flex-col gap-2 items-center justify-center", - "border-ielts-listening hover:bg-ielts-listening", + "border-ielts-listening hover:bg-ielts-listening text-white", "border-2 rounded-xl p-4 h-fit w-48 cursor-pointer", selectedModules.includes("listening") ? "bg-ielts-listening " : "bg-ielts-listening-transparent ", )}> @@ -84,7 +70,7 @@ export default function Home() { onClick={() => toggleModule("speaking")} className={clsx( "flex flex-col gap-2 items-center justify-center", - "border-ielts-speaking hover:bg-ielts-speaking", + "border-ielts-speaking hover:bg-ielts-speaking text-white", "border-2 rounded-xl p-4 h-fit w-48 cursor-pointer", selectedModules.includes("speaking") ? "bg-ielts-speaking " : "bg-ielts-speaking-transparent ", )}> @@ -97,7 +83,7 @@ export default function Home() { onClick={() => toggleModule("writing")} className={clsx( "flex flex-col gap-2 items-center justify-center", - "border-ielts-writing hover:bg-ielts-writing", + "border-ielts-writing hover:bg-ielts-writing text-white", "border-2 rounded-xl p-4 h-fit w-48 cursor-pointer", selectedModules.includes("writing") ? "bg-ielts-writing " : "bg-ielts-writing-transparent ", )}> diff --git a/src/resources/level.ts b/src/resources/level.ts new file mode 100644 index 00000000..805a7496 --- /dev/null +++ b/src/resources/level.ts @@ -0,0 +1,20 @@ +import JSON_LABELS from "@/constants/levelLabel.json"; + +const LABELS = JSON_LABELS as {[key: string]: string}; + +export const levelCalculator = (experience: number) => { + const sqrt = Math.sqrt(experience); + const labelLevel = + Object.keys(LABELS) + .reverse() + .filter((x) => parseInt(x) <= Math.floor(sqrt)) + .shift() || Object.keys(LABELS).reverse().shift()!; + + return { + currentLevel: Math.floor(sqrt), + nextLevel: Math.ceil(sqrt), + percentage: Math.floor((sqrt - Math.floor(sqrt)) * 100), + nextLevelExperience: Math.pow(Math.ceil(sqrt), 2), + label: LABELS[labelLevel], + }; +};