437 lines
21 KiB
Plaintext
437 lines
21 KiB
Plaintext
---
|
||
import Layout from "../../layouts/Layout.astro";
|
||
---
|
||
<Layout title="">
|
||
<!-- bg-[url('/assets/customBG.jpg')] bg-cover bg-center -->
|
||
<main>
|
||
<div class="">
|
||
<section class="bg-white bg-center bg-no-repeat bg-cover h-screen">
|
||
<div class="shadow-md">
|
||
<div class="container mx-auto px-4 flex flex-row place-content-between pt-6">
|
||
<div>
|
||
<img src="/assets/top_logo.svg" alt="" draggable="false" class="select-none">
|
||
</div>
|
||
<div class="flex flex-row space-x-1 pb-2">
|
||
<button><img src="/assets/svg/mute.svg" alt=""></button>
|
||
<button><img src="/assets/svg/reset.svg" alt=""></button>
|
||
<button onclick="saveUserData();"><img src="/assets/svg/tick2.svg" alt=""></button>
|
||
<button><img src="/assets/svg/cancel.svg" alt=""></button>
|
||
</div>
|
||
</div>
|
||
<!-- <input onclick="saveUserData();" class="bg-blue-700 px-8 py-2 rounded-lg shadow-lg font-bold text-white cursor-pointer" type="submit" value="Submit"> -->
|
||
</div>
|
||
<div class="container mx-auto px-4">
|
||
<div class="flex flex-col">
|
||
<p class="sm:text-2xl md:text-3xl lg:text-4xl text-center font-[600] text-[#60C6CB] my-4 select-none" id="gameDescription"></p>
|
||
<!-- <p id="LearningSubArea"></p> -->
|
||
</div>
|
||
<div class="flex flex-col justify-center place-items-center">
|
||
<img class="md:w-[80%] lg:w-[35%]" draggable="false" id="descImage" src="" alt="" />
|
||
<p class="text-2xl lg:text-4xl text-center font-[600] text-[#7c4c23] mb-0 select-none " id="gameLabel"></p>
|
||
</div>
|
||
<form id="contactForm" class="">
|
||
<div id="itemForm" class="">
|
||
<div class="flex flex-row gap-x-4 place-content-between">
|
||
<div class="flex flex-col">
|
||
<label for="a1" class="round-checkbox-label">
|
||
<div class="flex flex-col items-center justify-center">
|
||
<img id="image1" src="" alt="" draggable="false" class="select-none" />
|
||
<p id="label1"></p>
|
||
<input onclick="checkResult2('image1');" type="checkbox" id="a1" class="round-checkbox-input myCheckbox largerCheckbox" value="a1"/>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
<div class="flex flex-col">
|
||
<label for="a2" class="round-checkbox-label">
|
||
<div class="flex flex-col items-center justify-center">
|
||
<img id="image2" src="" alt="" draggable="false" class="select-none" />
|
||
<p id="label2"></p>
|
||
<input onclick="checkResult2('image2');" type="checkbox" id="a2" class="round-checkbox-input myCheckbox largerCheckbox" value="a2"/>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
<div class="flex flex-col">
|
||
<label for="a3" class="round-checkbox-label">
|
||
<div class="flex flex-col items-center justify-center">
|
||
<img id="image3" src="" alt="" draggable="false" class="select-none" />
|
||
<p id="label3"></p>
|
||
<input onclick="checkResult2('image3');" type="checkbox" id="a3" class="round-checkbox-input myCheckbox largerCheckbox" value="a3"/>
|
||
</div>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="flex flex-col place-items-center justify-center pt-4">
|
||
<p class="text-[20px] font-[600] text-[#FFFFFF] bg-[#004aad] px-[20px] py-[10px]" style="display: none;" id="savedMessage"></p>
|
||
<!-- <input onclick="saveUserData();" class="bg-blue-700 px-8 py-2 rounded-lg shadow-lg font-bold text-white cursor-pointer" type="submit" value="Submit"> -->
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div class="absolute inset-0" style="display: none;" id="allParentDiv">
|
||
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16">
|
||
</div>
|
||
</div>
|
||
<div id="scoreBoard" class=" w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||
<div class="flex flex-row space-x-4 items-center justify-center">
|
||
<div id="star-container"></div>
|
||
</div>
|
||
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||
<img class="z-10" src="/assets/clip-art.svg" alt="" />
|
||
<p id="starFeedbackMessage" class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);"></p>
|
||
</div>
|
||
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||
<button class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="clip-art-container absolute bottom-0 right-0 hidden">
|
||
<img src="/assets/svg/clip-art2.svg" alt="Clip Art" class="clip-art">
|
||
</div>
|
||
</div>
|
||
</main>
|
||
</Layout>
|
||
<script is:inline>
|
||
const params = new URLSearchParams(window.location.search);
|
||
const gameId = params.get('id');
|
||
const userId = params.get('userId');
|
||
const gameName = params.get('gameName');
|
||
let startTime = Date.now();
|
||
let gameData = null;
|
||
let starValue;
|
||
let url = window.location.href;
|
||
let urlSplit = url.split('/');
|
||
// let gameName = urlSplit[3] + '-' + urlSplit[4].split('?')[0];
|
||
let totalPoints = 0;
|
||
let maxStarValue = 5;
|
||
let progress = 0;
|
||
const progressBar = document.createElement('div');
|
||
|
||
function showClipArt() {
|
||
const clipArtContainer = document.querySelector('.clip-art-container');
|
||
|
||
clipArtContainer.classList.remove('hidden');
|
||
clipArtContainer.classList.add('slide-in');
|
||
}
|
||
|
||
function addStarScalingStyles() {
|
||
const style = document.createElement('style');
|
||
style.innerHTML = `
|
||
@keyframes scaleUp {
|
||
0% {
|
||
transform: scale(1.5);
|
||
}
|
||
100% {
|
||
transform: scale(1);
|
||
}
|
||
}
|
||
.star {
|
||
display: inline-block;
|
||
transform-origin: center;
|
||
transform: scale(0); /* Initial state before animation */
|
||
opacity: 0; /* Initial opacity */
|
||
animation: scaleUp 0.5s ease forwards;
|
||
}
|
||
`;
|
||
document.head.appendChild(style);
|
||
}
|
||
function progressIncrement() {
|
||
const interval = setInterval(() => {
|
||
if (progress >= 100) {
|
||
clearInterval(interval);
|
||
} else {
|
||
progress += 10;
|
||
progressBar.style.width = `${progress}%`;
|
||
}
|
||
}, 100);
|
||
}
|
||
|
||
fetch(`https://game-du.teachertrainingkolkata.in/items/game_tick_v3_phonics/${encodeURIComponent(gameId)}?filter[status][_eq]=published`)
|
||
.then(res => res.json())
|
||
.then(data => {
|
||
gameData = data.data;
|
||
// console.log(gameData)
|
||
document.getElementById("gameLabel").innerHTML = gameData.label;
|
||
document.getElementById("gameDescription").innerHTML = gameData.description;
|
||
if(gameData.label1, gameData.label2, gameData.label3){
|
||
document.getElementById("label1").innerHTML = gameData.label1;
|
||
document.getElementById("label2").innerHTML = gameData.label2;
|
||
document.getElementById("label3").innerHTML = gameData.label3;
|
||
}
|
||
const assetsURL = 'https://game-du.teachertrainingkolkata.in/assets/';
|
||
document.getElementById('descImage').src = assetsURL + gameData.descript_img;
|
||
for (let i = 1; i <= 3; i++) {
|
||
const imageId = `image${i}`;
|
||
if(gameData[imageId]){
|
||
document.getElementById(imageId).src = assetsURL + gameData[imageId];
|
||
}
|
||
}
|
||
});
|
||
|
||
function checkResult2(id) {
|
||
const checkbox = document.getElementById('a' + id.slice(-1));
|
||
const element = document.getElementById(id);
|
||
|
||
if (checkbox.checked) {
|
||
if (gameData[id.replace('image', 'a')] === true) {
|
||
element.classList.add('greenBorder');
|
||
} else {
|
||
element.classList.add('redBorder');
|
||
}
|
||
} else {
|
||
wrongCount -= 1;
|
||
element.classList.remove('greenBorder', 'redBorder');
|
||
}
|
||
}
|
||
|
||
function saveUserData() {
|
||
document.getElementById('allParentDiv').style.display = 'block';
|
||
const endTime = Date.now();
|
||
const timeDifference = endTime - startTime;
|
||
const timeDifferenceInSeconds = timeDifference / 1000;
|
||
|
||
// Get checkbox values and corresponding elements
|
||
const checkboxes = ['a1', 'a2', 'a3'];
|
||
const checkboxValues = checkboxes.map(id => {
|
||
const checkbox = document.getElementById(id);
|
||
const element = document.getElementById('image' + id.slice(-1));
|
||
return {
|
||
id: id,
|
||
checked: checkbox.checked,
|
||
element: element
|
||
};
|
||
});
|
||
|
||
// Count points based on checkbox values and "greenBorder" class
|
||
checkboxValues.forEach(checkbox => {
|
||
if (checkbox.checked && checkbox.element.classList.contains('greenBorder')) {
|
||
totalPoints += 1;
|
||
}
|
||
});
|
||
totalPoints === 1 ? starValue = 5 : starValue = 3;
|
||
let feedbackMessage; starValue === 5 ? feedbackMessage = `Fantastic! You earned ${starValue} stars! <br> Keep up the amazing work – you're a superstar!` : starValue === 4 ? feedbackMessage = `Great job! ${starValue} stars – you're so close to <br> perfection! ` : starValue === 3 ? feedbackMessage = `Well done! ${starValue} stars for your effort! <br> Keep pushing, you’ve got this!` : '';
|
||
let userData = {
|
||
'gameName': gameName,
|
||
'gameID': gameId,
|
||
'userId': userId,
|
||
'gameTime': timeDifferenceInSeconds,
|
||
'score': totalPoints,
|
||
'gameStar': starValue
|
||
};
|
||
// console.log(userData);
|
||
progressIncrement();
|
||
addStarScalingStyles();
|
||
showClipArt();
|
||
const blankStar = `<svg width="61" height="58" viewBox="0 0 61 58" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M60.0193 21.917C59.8274 21.3224 59.4648 20.7975 58.9767 20.4076C58.4885 20.0177 57.8964 19.7801 57.2741 19.7244L39.9564 18.1518L33.1086 2.12366C32.6035 0.949062 31.4537 0.188965 30.176 0.188965C28.8984 0.188965 27.7484 0.94918 27.2436 2.12659L20.3957 18.1519L3.07528 19.7244C2.45372 19.7813 1.86254 20.0194 1.37503 20.4092C0.887526 20.799 0.525135 21.3232 0.332789 21.917C-0.0622597 23.132 0.302554 24.4646 1.26527 25.3046L14.3555 36.7846L10.4954 53.7878C10.213 55.038 10.6982 56.3304 11.7355 57.0801C12.293 57.483 12.9454 57.6881 13.6032 57.6881C14.1704 57.6881 14.7329 57.5352 15.238 57.2331L30.176 48.305L45.1087 57.2331C46.2014 57.8905 47.5788 57.8304 48.6139 57.0801C49.1206 56.7134 49.5083 56.2057 49.7288 55.6204C49.9492 55.035 49.9928 54.3977 49.854 53.7878L45.9941 36.7846L59.0841 25.307C59.555 24.8957 59.8947 24.3552 60.0609 23.7525C60.2272 23.1498 60.2127 22.5115 60.0193 21.917Z" fill="#E3E3E3"/></svg>`
|
||
|
||
const starSVG = `<svg width="61" height="58" viewBox="0 0 61 58" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M60.0193 21.917C59.8274 21.3224 59.4648 20.7975 58.9767 20.4076C58.4885 20.0177 57.8964 19.7801 57.2741 19.7244L39.9564 18.1518L33.1086 2.12366C32.6035 0.949062 31.4537 0.188965 30.176 0.188965C28.8984 0.188965 27.7484 0.94918 27.2436 2.12659L20.3957 18.1519L3.07528 19.7244C2.45372 19.7813 1.86254 20.0194 1.37503 20.4092C0.887526 20.799 0.525135 21.3232 0.332789 21.917C-0.0622597 23.132 0.302554 24.4646 1.26527 25.3046L14.3555 36.7846L10.4954 53.7878C10.213 55.038 10.6982 56.3304 11.7355 57.0801C12.293 57.483 12.9454 57.6881 13.6032 57.6881C14.1704 57.6881 14.7329 57.5352 15.238 57.2331L30.176 48.305L45.1087 57.2331C46.2014 57.8905 47.5788 57.8304 48.6139 57.0801C49.1206 56.7134 49.5083 56.2057 49.7288 55.6204C49.9492 55.035 49.9928 54.3977 49.854 53.7878L45.9941 36.7846L59.0841 25.307C59.555 24.8957 59.8947 24.3552 60.0609 23.7525C60.2272 23.1498 60.2127 22.5115 60.0193 21.917Z" fill="#FECE00"/></svg>`;
|
||
const starContainer = document.getElementById('star-container');
|
||
let scoreBoard = document.getElementById('scoreBoard');
|
||
let loadingMainContainer = document.getElementById('loadingMainContainer');
|
||
loadingMainContainer.style.display = 'flex';
|
||
|
||
const loadingDiv = document.getElementById('loadingState');
|
||
loadingDiv.style.display = 'flex';
|
||
|
||
const containerDiv = document.createElement('div');
|
||
containerDiv.classList.add('w-full');
|
||
containerDiv.style.display = 'flex';
|
||
containerDiv.style.flexDirection = 'column';
|
||
containerDiv.style.justifyContent = 'center';
|
||
containerDiv.style.alignItems = 'center';
|
||
|
||
const paragraph = document.createElement('p');
|
||
paragraph.textContent = 'HOLD ON.';
|
||
paragraph.style.fontSize = '16px';
|
||
paragraph.style.fontWeight = '600';
|
||
paragraph.style.color = 'rgba(0, 0, 0, 0.38)';
|
||
containerDiv.appendChild(paragraph);
|
||
|
||
const progressBarContainer = document.createElement('div');
|
||
progressBarContainer.style.position = 'relative';
|
||
progressBarContainer.style.display = 'flex';
|
||
progressBarContainer.style.alignItems = 'center';
|
||
progressBarContainer.style.border = '1px solid #AFB8E6';
|
||
progressBarContainer.style.height = '10px';
|
||
progressBarContainer.style.width = '100%';
|
||
progressBarContainer.style.marginTop = '30px';
|
||
progressBarContainer.style.marginBottom = '30px';
|
||
containerDiv.appendChild(progressBarContainer);
|
||
|
||
|
||
progressBar.style.height = '10px';
|
||
progressBar.style.backgroundColor = '#D7DCF2';
|
||
progressBar.style.width = '0%';
|
||
progressBarContainer.appendChild(progressBar);
|
||
|
||
loadingDiv.appendChild(containerDiv);
|
||
|
||
const calculationText = document.createElement('p');
|
||
calculationText.textContent = 'Your stars are being calculated...';
|
||
calculationText.style.fontSize = '14px';
|
||
calculationText.style.fontWeight = '600';
|
||
calculationText.style.color = 'rgba(0, 0, 0, 0.38)';
|
||
containerDiv.appendChild(calculationText);
|
||
fetch(`https://api.teachertrainingkolkata.in/api/saveGameScore`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify(userData)
|
||
})
|
||
.then(response => {
|
||
if (response.ok) {
|
||
setTimeout(() => {
|
||
if (response.ok) {
|
||
if (response.status == 200) {
|
||
loadingMainContainer.style.display = 'none';
|
||
loadingDiv.style.display = 'none';
|
||
starContainer.style.display = 'flex';
|
||
starContainer.style.flexDirection = 'row';
|
||
document.getElementById('starFeedbackMessage').innerHTML = feedbackMessage;
|
||
for (let i = 0; i < starValue; i++) {
|
||
const starDiv = document.createElement('div');
|
||
starDiv.innerHTML = starSVG;
|
||
starDiv.classList.add('star');
|
||
starContainer.appendChild(starDiv);
|
||
setTimeout(() => {
|
||
starDiv.style.opacity = '1';
|
||
starDiv.style.animationDelay = `${i * 0.5}s`;
|
||
}, i * 500);
|
||
}
|
||
for (let i = 0; i < maxStarValue - starValue; i++) {
|
||
const starDiv = document.createElement('div');
|
||
starDiv.innerHTML = blankStar;
|
||
starContainer.appendChild(starDiv);
|
||
}
|
||
scoreBoard.style.display = 'flex';
|
||
}
|
||
} else {
|
||
console.log('Something went wrong', response);
|
||
}
|
||
}, 100);
|
||
} else {
|
||
// console.log('Something Wrong', response);
|
||
}
|
||
})
|
||
.catch(error => {
|
||
console.error('An error occurred', error);
|
||
});
|
||
}
|
||
|
||
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
const contactForm = document.getElementById('contactForm');
|
||
contactForm.addEventListener('submit', async function (event) {
|
||
event.preventDefault();
|
||
});
|
||
});
|
||
</script>
|
||
<style>
|
||
@import url('https://fonts.googleapis.com/css2?family=Lobster&family=Quicksand:wght@500;700&display=swap');
|
||
body{
|
||
font-family: Quicksand;
|
||
}
|
||
input.largerCheckbox {
|
||
/* width: 40px; */
|
||
height: 40px;
|
||
cursor: pointer;
|
||
}
|
||
.greenBorder{
|
||
border: 4px solid #008000;
|
||
border-radius: 10%;
|
||
transition: border 0.5s, border-color 0.3s, transform 6s;
|
||
}
|
||
.redBorder{
|
||
border: 4px solid red;
|
||
border-radius: 10%;
|
||
transition: border 0.5s, border-color 0.3s, transform 6s;
|
||
}
|
||
#image1, #image2, #image3, #image4, #image5, #image6{
|
||
width: 240px;
|
||
}
|
||
#label1, #label2, #label3, #label4, #label5, #label6{
|
||
text-align: center;
|
||
font-weight: bold;
|
||
color: #7C4C23;
|
||
font-size: 20px;
|
||
padding-top: 10px;
|
||
}
|
||
#LearningArea, #LearningSubArea{
|
||
font-size: 20px;
|
||
color: #7C4C23;
|
||
font-weight: bold;
|
||
}
|
||
.round-checkbox-label {
|
||
display: inline-block;
|
||
cursor: pointer;
|
||
position: relative;
|
||
transition: background-color 0.3s, border-color 0.3s, transform 0.3s;
|
||
}
|
||
.round-checkbox-input:checked + .round-checkbox-label {
|
||
border-radius: 30%;
|
||
}
|
||
.round-checkbox-input:checked + .round-checkbox-label::after {
|
||
position: absolute;
|
||
top: 50%;
|
||
left: 50%;
|
||
transform: translate(-50%, -50%);
|
||
font-size: 40px;
|
||
display: block;
|
||
}
|
||
input[type="checkbox"] {
|
||
appearance: none;
|
||
-webkit-appearance: none;
|
||
-moz-appearance: none;
|
||
width: 40px;
|
||
height: 40px;
|
||
margin: 0;
|
||
cursor: pointer;
|
||
border: 2px solid #60C6CB;
|
||
background-color: #E6FDFE;
|
||
border-radius: 4px;
|
||
background-color: #E6FDFE;
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
input[type="checkbox"]:checked {
|
||
border: 2px solid #60C6CB;
|
||
background-color: #E6FDFE;
|
||
}
|
||
|
||
input[type="checkbox"]:checked::before {
|
||
content: "\2713";
|
||
color: #49B76E;
|
||
font-size: 30px;
|
||
font-weight: bolder;
|
||
display: block;
|
||
text-align: center;
|
||
line-height: 40px;
|
||
}
|
||
|
||
.hidden {
|
||
display: none;
|
||
transform: translateX(100%);
|
||
}
|
||
|
||
.slide-in {
|
||
display: block;
|
||
animation: slideIn 0.5s forwards;
|
||
}
|
||
|
||
@keyframes slideIn {
|
||
0% {
|
||
transform: translateX(100%);
|
||
opacity: 0;
|
||
}
|
||
100% {
|
||
transform: translateX(0);
|
||
opacity: 1;
|
||
}
|
||
}
|
||
</style>
|