Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 10x 10x 10x 10x 10x 10x 10x 10x 10x 10x 5x 2x 1x 1x 1x 10x 13x 13x | import update from 'immutability-helper' import { useReducer } from 'react' import { createQuestion, Question } from 'sqc-core-functions' export enum QuestionsActions { /** Add an empty question to the end of the list */ ADD = 'add', /** Remove the question at specified index */ REMOVE = 'remove', /** Update the question at specified index */ UPDATE = 'update', /** Replace the whole question list */ REPLACE = 'replace', } /** * Initial question list when first loading the page. * Containing an empty question */ export const initialQuestions = [createQuestion()] /** * Dispatch event for question store. * @see {@link QuestionsActions} */ export type QuestionDispatchAction = | { type: QuestionsActions.ADD } | { type: QuestionsActions.REMOVE index: number } | { type: QuestionsActions.UPDATE index: number question: Question } | { type: QuestionsActions.REPLACE questions: Question[] } const questionsReducer = (state: Question[], action: QuestionDispatchAction) => { switch (action.type) { case QuestionsActions.ADD: return update(state, { $push: [createQuestion()] }) case QuestionsActions.REMOVE: return update(state, { $splice: [[action.index, 1]] }) case QuestionsActions.UPDATE: return update(state, { [action.index]: { $set: action.question } }) case QuestionsActions.REPLACE: return update(state, { $set: action.questions }) } } /** * Hook returns current question store and a dispatcher */ export const useQuestionReducer = () => { const [questions, questionsDispatch] = useReducer(questionsReducer, initialQuestions) return { questions, questionsDispatch } } |