added a timer with custom end alarm sounf
This commit is contained in:
parent
47e1204be7
commit
f0665d8e42
|
@ -10,12 +10,14 @@ interface data {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function Page({ params }: { params: { id: string } }) {
|
export default async function Page({ params }: { params: { id: string } }) {
|
||||||
const grades = await Prisma.grade.findMany({ where: { testId: parseInt(params.id) } });
|
const teacherGrade = await Prisma.grade.findFirst({ where: { testId: parseInt(params.id), user: { isTeacher: true } } });
|
||||||
|
|
||||||
|
const grades = await Prisma.grade.findMany({where: {testId: parseInt(params.id), user: {isTeacher: false}}});
|
||||||
|
|
||||||
const allGrades = ['1', '1.5', '2', '2.5', '3', '3.5', '4', '4.5', '5', '5.5', '6'];
|
const allGrades = ['1', '1.5', '2', '2.5', '3', '3.5', '4', '4.5', '5', '5.5', '6'];
|
||||||
let gradeOccurences = new Array(allGrades.length).fill(0);
|
let gradeOccurences = new Array(allGrades.length).fill(0);
|
||||||
const gradeList = grades.map((grade) => grade.grade);
|
const gradeList = grades.map((grade) => grade.grade);
|
||||||
|
|
||||||
const teacherGrade = await Prisma.grade.findFirst({ where: { testId: parseInt(params.id), user: { isTeacher: true } } });
|
|
||||||
|
|
||||||
for (let i = 0; i < gradeList.length; i++) {
|
for (let i = 0; i < gradeList.length; i++) {
|
||||||
gradeOccurences[allGrades.indexOf(gradeList[i].toString())]++;
|
gradeOccurences[allGrades.indexOf(gradeList[i].toString())]++;
|
||||||
|
@ -31,13 +33,13 @@ export default async function Page({ params }: { params: { id: string } }) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={'p-4 md:p-12 w-full h-screen bg-black flex flex-col justify-between gap-y-4'}>
|
<div className={'p-4 md:p-12 w-full h-screen bg-black flex flex-col justify-between gap-y-4'}>
|
||||||
|
<Image src={logo} alt={'Logo'} width={100} height={200} className={'mx-auto w-full md:w-[400px]'} />
|
||||||
{teacherGrade && (
|
{teacherGrade && (
|
||||||
<div className={'flex flex-col gap-y-2'}>
|
<div className={'flex flex-col gap-y-2'}>
|
||||||
<p className="text-white">Mme Tixhon :</p>
|
<p className="text-white">Mme Tixhon :</p>
|
||||||
<h2 className={'text-4xl font-bold text-white'}>{teacherGrade.grade}</h2>
|
<h2 className={'text-4xl font-bold text-white'}>{teacherGrade.grade}</h2>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<Image src={logo} alt={'Logo'} width={100} height={200} className={'mx-auto w-full md:w-[400px]'} />
|
|
||||||
<Chart data={data} />
|
<Chart data={data} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,43 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import { useTimer } from 'react-timer-hook';
|
||||||
|
|
||||||
|
import { Button } from "@components/ui/button";
|
||||||
|
import { PauseIcon, Play} from "lucide-react";
|
||||||
|
|
||||||
|
interface MyTimerProps {
|
||||||
|
expiryTimestamp: Date;
|
||||||
|
onEnd?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function MyTimer({ expiryTimestamp, onEnd } : MyTimerProps) {
|
||||||
|
const {
|
||||||
|
seconds,
|
||||||
|
minutes,
|
||||||
|
isRunning,
|
||||||
|
pause,
|
||||||
|
resume,
|
||||||
|
} = useTimer({
|
||||||
|
expiryTimestamp,
|
||||||
|
onExpire: () => onEnd && onEnd()
|
||||||
|
})
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={"text-white text-center flex flex-col"}>
|
||||||
|
<div className={"font-bold text-8xl"}>
|
||||||
|
<span>{String(minutes).padStart(2, "0")}</span>:
|
||||||
|
<span>{String(seconds).padStart(2, "0")}</span>
|
||||||
|
</div>
|
||||||
|
<p>{isRunning ? 'Running' : 'Not running'}</p>
|
||||||
|
<div className={"self-center flex gap-4"}>
|
||||||
|
<Button onClick={pause} disabled={!isRunning}>
|
||||||
|
<PauseIcon/>
|
||||||
|
</Button>
|
||||||
|
<Button onClick={resume} disabled={isRunning}>
|
||||||
|
<Play/>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
|
@ -23,6 +23,7 @@
|
||||||
"react": "^18",
|
"react": "^18",
|
||||||
"react-chartjs-2": "^5.2.0",
|
"react-chartjs-2": "^5.2.0",
|
||||||
"react-dom": "^18",
|
"react-dom": "^18",
|
||||||
|
"react-timer-hook": "^3.0.7",
|
||||||
"socket.io": "^4.7.2",
|
"socket.io": "^4.7.2",
|
||||||
"socket.io-client": "^4.7.2",
|
"socket.io-client": "^4.7.2",
|
||||||
"swr": "^2.2.4",
|
"swr": "^2.2.4",
|
||||||
|
@ -4435,6 +4436,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-timer-hook": {
|
||||||
|
"version": "3.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-timer-hook/-/react-timer-hook-3.0.7.tgz",
|
||||||
|
"integrity": "sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">=16.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/read-cache": {
|
"node_modules/read-cache": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
"react": "^18",
|
"react": "^18",
|
||||||
"react-chartjs-2": "^5.2.0",
|
"react-chartjs-2": "^5.2.0",
|
||||||
"react-dom": "^18",
|
"react-dom": "^18",
|
||||||
|
"react-timer-hook": "^3.0.7",
|
||||||
"socket.io": "^4.7.2",
|
"socket.io": "^4.7.2",
|
||||||
"socket.io-client": "^4.7.2",
|
"socket.io-client": "^4.7.2",
|
||||||
"swr": "^2.2.4",
|
"swr": "^2.2.4",
|
||||||
|
|
|
@ -25,8 +25,9 @@
|
||||||
"@styles/*": ["/styles/*"],
|
"@styles/*": ["/styles/*"],
|
||||||
"@santa/*": ["./images/santa/*"],
|
"@santa/*": ["./images/santa/*"],
|
||||||
"@images/*": ["./images/*"],
|
"@images/*": ["./images/*"],
|
||||||
|
"@assets/*": ["./assets/*"],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "**/*.d.ts"],
|
||||||
"exclude": ["node_modules"]
|
"exclude": ["node_modules"]
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
declare module '*.mp3' {
|
||||||
|
const content: string;
|
||||||
|
export default content;
|
||||||
|
}
|
Loading…
Reference in New Issue