WaniKani All Info Expander

Automatically click "Show All Information"

// ==UserScript==
// @name         WaniKani All Info Expander
// @namespace    http://www.wanikani.com
// @version      0.2.1
// @description  Automatically click "Show All Information"
// @author       polv
// @match        https://www.wanikani.com/*
// @match        https://preview.wanikani.com/*
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=wanikani.com
// @grant        none
// ==/UserScript==

// @ts-check
(function () {
  'use strict';

  /** @type {'meaning' | 'reading' | ''} question type */
  let qType = '';
  /** @type {'Vocabulary' | 'Radical' | 'Kanji' | ''} subject type  */
  let sType = '';

  const inputObserver = new MutationObserver((muts) => {
    // if (qType !== 'meaning') return;

    setTimeout(() => {
      for (const m of muts) {
        const target = /** @type {HTMLDivElement} */ (m.target);
        /**
         * @type {'true' | 'false'}
         * whether it is answered correctly. Must be non-empty string.
         */
        const attrCorrect = /** @type {'true' | 'false'} */ (
          target.getAttribute('correct')
        );

        if (attrCorrect) {
          const btn = document.querySelector(
            '.additional-content__item--item-info',
          );
          if (btn && !btn.className.includes('--open')) {
            // @ts-ignore
            btn.click();
          }
          return;
        }
      }
    }, 100);
  });

  /** @type {Element | null} */
  let inputContainer = null;

  window.addEventListener('willShowNextQuestion', (e) => {
    qType = '';

    if ('detail' in e) {
      const { subject, questionType } = /** @type {any} */ (e.detail);
      qType = questionType;
      sType = subject.type;
    }

    const newInput = document.querySelector('.quiz-input__input-container');
    if (newInput && newInput !== inputContainer) {
      inputContainer = newInput;
      inputObserver.observe(newInput, {
        attributes: true,
        attributeFilter: ['correct'],
      });
    }
  });
})();