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 }
}
|