import { nanoid } from 'nanoid'; import { TemplateOptions } from './types'; import {FormattedTextTemplate} from './TextTypeTemplate'; import AnswerIcon from './AnswerIconTemplate'; import { state } from '.'; import { ParagraphStyle } from '../constants'; import { MultipleChoiceQuestion, TextChoice } from 'gift-pegjs'; type MultipleChoiceAnswerOptions = TemplateOptions & Pick; type AnswerFeedbackOptions = TemplateOptions & Pick; interface AnswerWeightOptions extends TemplateOptions { weight: TextChoice['weight']; } // careful -- this template is re-used by True/False questions! export default function MultipleChoiceAnswersTemplate({ choices }: MultipleChoiceAnswerOptions) { const id = `id${nanoid(8)}`; const hasManyCorrectChoices = choices.filter(({ isCorrect }) => isCorrect === true).length > 1; const prompt = `Choisir une réponse${ hasManyCorrectChoices ? ` ou plusieurs` : `` }:`; const result = choices .map(({ weight, isCorrect, formattedText, formattedFeedback }) => { const CustomLabel = ` display: inline-block; padding: 0.2em 0 0.2em 0; `; const inputId = `id${nanoid(6)}`; const isPositiveWeight = (weight != undefined) && (weight > 0); const isCorrectOption = hasManyCorrectChoices ? isPositiveWeight || isCorrect : isCorrect; return `
${AnswerWeight({ weight: weight })} ${AnswerIcon({ correct: isCorrectOption })} ${AnswerFeedback({ formattedFeedback: formattedFeedback })}
`; }) .join(''); return `${prompt}${result}`; } function AnswerWeight({ weight }: AnswerWeightOptions): string { return weight ? `${weight}%` : ``; } function AnswerFeedback({ formattedFeedback }: AnswerFeedbackOptions): string { return formattedFeedback ? `` : ``; }