UNPKG

@instructure/quiz-taking

Version:
77 lines (76 loc) 4.14 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) { var currentSessionItemPosition = state.taking.get('currentSessionItemPosition', 1); var quizSessionId = state.quizSessions.get('activeQuizSessionId'); var quizSession = QuizSession.create(state.quizSessions.get(quizSessionId)); var quizId = getActiveQuizId(state); var quiz = getQuizById(state, quizId); var submitFlag = state.taking.get('submitFlag'); var response = state.taking.get('responses', List()).find(function(resp) { return resp.get('position') === currentSessionItemPosition; }); var userResponse = (response && response.toJS() || {}).userResponse; var _state_sessionItems; // 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 var sessionItem = ((_state_sessionItems = state.sessionItems) !== null && _state_sessionItems !== void 0 ? _state_sessionItems : Map()).filter(function(record) { return record.get('quizSessionId') === quizSessionId; }).find(function(record) { return record.get('position') === currentSessionItemPosition; }) || Map(); var isPassage = sessionItem.getIn([ 'stimulus', 'passage' ], false); var itemId = sessionItem.getIn([ 'item', 'id' ]); var bolaPosition = sessionItem.get('bolaPosition'); var sessionItemsCount = quizSession.get('sessionItemsCount'); var allowBacktracking = quizSession.get('allowBacktracking'); var isOneQuestionAtATime = quizSession.isOneQuestionAtATime(); var failedToStart = quizSession.failedToStart(); // I don't think this exists in the store yet var largeFormatResponse = null; var isNextItemFetching = state.calls.getIn([ OQAAT_NO_BACKTRACKING_NEXT_ITEM_FETCH_CALL, 'requestStatus' ]) === 'calling'; var bolaSessionItemsCount = quizSession.get('bolaSessionItemsCount'); var buildOnLastAttempt = quizSession.get('buildOnLastAttempt'); var isLastBolaQuestion = !allowBacktracking && bolaPosition === bolaSessionItemsCount || allowBacktracking && currentSessionItemPosition === bolaSessionItemsCount; var currentQuestionIsLast = buildOnLastAttempt && isLastBolaQuestion || !buildOnLastAttempt && currentSessionItemPosition === sessionItemsCount || sessionItemsCount === 0; var disabled = submitFlag || failedToStart || isNextItemFetching && isOneQuestionAtATime || fileUploading(state); return { allowBacktracking: allowBacktracking, currentQuestionIsLast: currentQuestionIsLast, currentSessionItemPosition: currentSessionItemPosition, disabled: disabled, isOneQuestionAtATime: isOneQuestionAtATime, itemId: itemId, largeFormatResponse: largeFormatResponse, quizSessionId: quizSessionId, userResponse: userResponse, isPassage: isPassage, isRequiredItem: sessionItem && sessionItem.get('required'), isSurvey: quiz.isSurvey() }; } export var mapDispatchToProps = { nextQuestion: nextQuestion, screenreaderNotification: screenreaderNotification, submitQuiz: submitQuiz, withConfirm: modalActions.withConfirm }; export var TakeButton = connect(mapStateToProps, mapDispatchToProps)(TakeButtonPresenter); export default TakeButton;