📄 WordStudy.js
/home/palash/git/site/node_modules/new_site/src/components/study/word-study/WordStudy.js
Language: js • Lines: 125
// WordStudy.js
import { Button, Container, Row, Col, Form } from "react-bootstrap";
import WordQuiz from "./WordQuiz";
import SUPPORTED_LANGUAGES from "./vocab";
import { useP2P } from "../P2PContext";

export default function WordStudy() {
  const { quizState, sendStateUpdate } = useP2P();

  const screen = quizState.wordScreen;
  const words = quizState.words;
  const selectedLangs = quizState.selectedLangs;

  const handleLanguageChange = (langName, isChecked) => {
    const updatedLangs = { ...selectedLangs, [langName]: isChecked };

    let defaultWords = [];
    Object.keys(updatedLangs).forEach((lang) => {
      if (updatedLangs[lang]) {
        defaultWords = [
          ...defaultWords,
          ...SUPPORTED_LANGUAGES[lang].vocabs.map((word) => ({
            text: word,
            langCode: SUPPORTED_LANGUAGES[lang].code
          }))
        ];
      }
    });

    sendStateUpdate({
      selectedLangs: updatedLangs,
      words: defaultWords
    });
  };

  const startQuizEngine = () => {
    // Completely shuffle the words right here when hitting start
    const shuffledWords = [...words].sort(() => 0.5 - Math.random());

    sendStateUpdate({
      wordScreen: 2,
      words: shuffledWords,
      currentWordIndex: 0,
      score: 0,
      total: 0,
      correct: 0,
      wrong: 0,
      quizEnded: false,
      status: 'In Progress',
      answer: ''
    });
  };

  if (screen === 2) {
    return <WordQuiz />;
  }

  return (
    <Container className="py-4">
      <Row>
        <Col>
          <h2>Word Quiz Setup</h2>
        </Col>
      </Row>

      {/* Language Selection Checkboxes */}
      <Row className="mt-3">
        <Col>
          <h5>Select Practice Languages:</h5>
          <div className="d-flex gap-3 my-2">
            {Object.keys(SUPPORTED_LANGUAGES).map((langName) => (
              <Form.Check
                type="checkbox"
                id={`lang-${langName}`}
                key={langName}
                label={langName}
                checked={!!selectedLangs[langName]}
                onChange={(e) => handleLanguageChange(langName, e.target.checked)}
              />
            ))}
          </div>
          <small className="text-muted">Checking a language adds its core characters to your test pool.</small>
        </Col>
      </Row>

      <Row className="mt-4">
        <Col>
          <h4>Target Test Pool ({words.length} items):</h4>
          <div className="border p-2 rounded bg-transparent" style={{ maxHeight: '150px', overflowY: 'auto' }}>
            {words.length === 0 ? <span className="text-muted">No items added yet.</span> : (
              <div className="d-flex flex-wrap gap-2">
                {words.map((word, i) => (
                  <span key={i} className="badge border bg-dark text-light p-8 d-flex align-items-center gap-1">
                    {word.text}
                    <button
                      type="button"
                      className="btn-close btn-close-white ms-1"
                      style={{ fontSize: '0.6rem' }}
                      onClick={() => sendStateUpdate({
                        words: words.filter((_, idx) => idx !== i)
                      })}
                    ></button>
                  </span>
                ))}
              </div>
            )}
          </div>
        </Col>
      </Row>

      <Row className="mt-4">
        <Col>
          <Button
            variant="success"
            size="lg"
            onClick={startQuizEngine}
            disabled={words.length === 0}
          >
            Start Quiz
          </Button>
        </Col>
      </Row>
    </Container>
  );
}