Sum of points with react Custom Rolette and Context API

Viewed 362

enter image description here

When the user spins the roulette wheel (Rolette.js) it shows the number of points the user will receive if they get the question right (Quiz.js).

How to make the points count if the user gets the question right or wrong. (If the question is correct, the points of the roulette must be added, if the roulette gives -30, 30 points must be withdrawn, if the user has no points, it must return zero).

- -> DEMO CODE LINK <- -

Play.js -> File Context API

export default function PlayProvider({ children }) {
  const [prizeNumber, setPrizeNumber] = useState(0);
  const data = [];
  return (
    <PlayContext.Provider value={{ prizeNumber, setPrizeNumber, data }}>
      {children}
    </PlayContext.Provider>
  );
}

export function usePlay() {
  const context = useContext(PlayContext);
  const { prizeNumber, setPrizeNumber } = context;
  const data = [
    { id: 1, option: 10 },
    { id: 2, option: -30 },
    { id: 3, option: 50 },
    { id: 4, option: 30 },
    { id: 5, option: 40 },
    { id: 6, option: 20 }
  ];

  return { prizeNumber, setPrizeNumber, data };
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Rolette.js

import React, { useState } from "react";
import { Wheel } from "react-custom-roulette";
import { Link } from "react-router-dom";
import { usePlay } from "./Play";

export default () => {
  const [mustSpin, setMustSpin] = useState(false);
  const { prizeNumber, setPrizeNumber, data } = usePlay();

  const handleSpinClick = () => {
    const newPrizeNumber = Math.floor(Math.random() * data.length);
    setPrizeNumber(newPrizeNumber);
    setMustSpin(true);
  };

  return (
    <>
      <div align="center">
        <h1 align="center">Roulette Game</h1>
        <hr />
        <Wheel
          mustStartSpinning={mustSpin}
          prizeNumber={prizeNumber}
          data={data}
          outerBorderColor={["#f2f2f2"]}
          outerBorderWidth={[25]}
          innerBorderColor={["#f2f2f2"]}
          radiusLineColor={["#dedede"]}
          radiusLineWidth={[10]}
          textColors={["#ffffff"]}
          fontSize={[50]}
          perpendicularText={[true]}
          backgroundColors={[
            "#F22B35",
            "#F99533",
            "#24CA69",
            "#514E50",
            "#46AEFF",
            "#9145B7"
          ]}
          onStopSpinning={() => {
            setMustSpin(false);
          }}
        />
        <button className="button2" onClick={handleSpinClick}>
          SPIN
        </button>
        <br />
        {!mustSpin ? data[prizeNumber].option : "0"}
        <hr />
        <div align="center">
          <Link to="/quiz">
            <button className="btn2" disabled={mustSpin}>
              Answer
            </button>
          </Link>

          <button className="btn2" disabled>
            Finish
          </button>
        </div>
      </div>
    </>
  );
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Quiz.js -> Questions

import React, { useState } from "react";
import { Link } from "react-router-dom";
import { usePlay } from "./Play";

const dat = {
  question: "Dummy Question?",
  answers: ["A", "B", "C", "D"],
  correctAnswer: "B"
};

function Quiz(props) {
  // Context API
  const { prizeNumber } = usePlay();
  const { data } = usePlay();

  const [selectedAnswer, setSelectedAnswer] = useState("");
  const [isSubmitted, setIsSubmitted] = useState(false);
  const [isError, setIsError] = useState(false);

  console.log(selectedAnswer);
  const onSelectAnswer = (answer) => {
    if (isSubmitted) return;

    setIsSubmitted(true);
    setSelectedAnswer(answer);
    setIsError(dat.correctAnswer !== answer);
  };

  const getAnswerClass = (answer) => {
    if (!isSubmitted) {
      return "";
    } else if (dat.correctAnswer === answer) {
      return "correct";
    }
    return isError ? "incorrect" : "";
  };

  return (
    <div>
      <h1 align="center">Questions</h1>
      <hr />
      <div className="question">
        <h3>{dat.question}</h3>
        {dat.answers.map((answer) => (
          <p
            key={answer}
            className={getAnswerClass(answer)}
            onClick={() => {
              onSelectAnswer(answer);
            }}
          >
            {answer}
          </p>
        ))}
        <br />
        <span align="center" disabled={!isSubmitted}>
          {data[prizeNumber].option}/300
        </span>
      </div>
      <hr />
      <div align="center">
        <Link to="/r2">
          <button className="btn2" disabled={!isSubmitted}>
            Answer
          </button>
        </Link>
        <button className="btn2" disabled>
          Finish
        </button>
      </div>
    </div>
  );
}

export default Quiz;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

0 Answers
Related