@instructure/quiz-taking
Version:
86 lines (75 loc) • 3.6 kB
JavaScript
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