UNPKG

@instructure/quiz-taking

Version:
86 lines (75 loc) 3.6 kB
import {Map, List} from 'immutable' import {connect} from '@instructure/quiz-core/common/react-redux' import {fileUploading} from '@instructure/quiz-core/common/selectors/calls' import * as modalActions from '@instructure/quiz-core/common/actions/modal' import {nextQuestion, submitQuiz} from '@instructure/quiz-core/taking/api/taking' import {screenreaderNotification} from '@instructure/quiz-core/common/actions/alerts' import QuizSession from '@instructure/quiz-core/common/records/QuizSession' import {getActiveQuizId, getQuizById} from '@instructure/quiz-core/common/selectors/quizzes' import {OQAAT_NO_BACKTRACKING_NEXT_ITEM_FETCH_CALL} from '@instructure/quiz-common/constants' import {TakeButton as TakeButtonPresenter} from './presenter' export function mapStateToProps(state) { const currentSessionItemPosition = state.taking.get('currentSessionItemPosition', 1) const quizSessionId = state.quizSessions.get('activeQuizSessionId') const quizSession = QuizSession.create(state.quizSessions.get(quizSessionId)) const quizId = getActiveQuizId(state) const quiz = getQuizById(state, quizId) const submitFlag = state.taking.get('submitFlag') const response = state.taking .get('responses', List()) .find(resp => resp.get('position') === currentSessionItemPosition) const {userResponse} = (response && response.toJS()) || {} // Note: this returns a Map() so things don't 'splode on initial render and sessionItems aren't loaded yet // but it should never really be needed otherwise const sessionItem = (state.sessionItems ?? Map()) .filter(record => record.get('quizSessionId') === quizSessionId) .find(record => record.get('position') === currentSessionItemPosition) || Map() const isPassage = sessionItem.getIn(['stimulus', 'passage'], false) const itemId = sessionItem.getIn(['item', 'id']) const bolaPosition = sessionItem.get('bolaPosition') const sessionItemsCount = quizSession.get('sessionItemsCount') const allowBacktracking = quizSession.get('allowBacktracking') const isOneQuestionAtATime = quizSession.isOneQuestionAtATime() const failedToStart = quizSession.failedToStart() // I don't think this exists in the store yet const largeFormatResponse = null const isNextItemFetching = state.calls.getIn([OQAAT_NO_BACKTRACKING_NEXT_ITEM_FETCH_CALL, 'requestStatus']) === 'calling' const bolaSessionItemsCount = quizSession.get('bolaSessionItemsCount') const buildOnLastAttempt = quizSession.get('buildOnLastAttempt') const isLastBolaQuestion = (!allowBacktracking && bolaPosition === bolaSessionItemsCount) || (allowBacktracking && currentSessionItemPosition === bolaSessionItemsCount) const currentQuestionIsLast = (buildOnLastAttempt && isLastBolaQuestion) || (!buildOnLastAttempt && currentSessionItemPosition === sessionItemsCount) || sessionItemsCount === 0 const disabled = submitFlag || failedToStart || (isNextItemFetching && isOneQuestionAtATime) || fileUploading(state) return { allowBacktracking, currentQuestionIsLast, currentSessionItemPosition, disabled, isOneQuestionAtATime, itemId, largeFormatResponse, quizSessionId, userResponse, isPassage, isRequiredItem: sessionItem && sessionItem.get('required'), isSurvey: quiz.isSurvey(), } } export const mapDispatchToProps = { nextQuestion, screenreaderNotification, submitQuiz, withConfirm: modalActions.withConfirm, } export const TakeButton = connect(mapStateToProps, mapDispatchToProps)(TakeButtonPresenter) export default TakeButton