@instructure/quiz-taking
Version:
77 lines (76 loc) • 4.14 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) {
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;