@instructure/quiz-taking
Version:
62 lines (53 loc) • 2.46 kB
JavaScript
import {bindActionCreators} from 'redux'
import {List, Map} from 'immutable'
import {connect} from '@instructure/quiz-core/common/react-redux'
import {
getBacktrackingIsAllowed,
isOneQuestionAtATime,
getActiveQuizSession,
} from '@instructure/quiz-core/common/selectors/quizSessions'
import {toggleSidebar as toggleSidebarAction} from '@instructure/quiz-core/common/actions/sidebar'
import {scrollToItem as scrollToItemAction} from '@instructure/quiz-core/common/actions/scrolling'
import {screenreaderNotification as screenreaderNotificationAction} from '@instructure/quiz-core/common/actions/alerts'
import {
setCurrentSessionItemPosition,
setFocusTitleAndInstructions as setFocusTitleAndInstructionsAction,
} from '@instructure/quiz-core/common/actions/taking'
import {TakingSidebar as Sidebar} from './presenter'
export const getPinnedItems = (state, quizSession) => {
if ((state.sessionItems ?? Map()).size === 0) {
return List()
}
return quizSession.getIn(['takingData', 'pins'], List()).map(pinPosition => {
const si = state.sessionItems.find(sessionItem => sessionItem.get('position') === pinPosition)
return {position: pinPosition, sessionItemId: si.get('id')}
})
}
export const mapStateToProps = (state, props) => {
const quizSession = getActiveQuizSession(state)
const pinnedItems = getPinnedItems(state, quizSession)
return {
allowBacktracking: getBacktrackingIsAllowed(state),
isOneQuestionAtATime: isOneQuestionAtATime(state),
pinnedItems,
quizTitle: quizSession.getQuiz().title,
sessionItems: quizSession.getSessionItems(),
sessionNotLoaded: quizSession.id === '0',
sidebarOpen: props.sidebarOpen || state.sidebar.get('isOpen'),
}
}
export const mapDispatchToProps = (dispatch, props) => {
return {
scrollToItem: props.scrollToItem || bindActionCreators(scrollToItemAction, dispatch),
toggleSidebar: props.toggleSidebar || bindActionCreators(toggleSidebarAction, dispatch),
screenreaderNotification: bindActionCreators(screenreaderNotificationAction, dispatch),
goToItem: sessionItemPosition => {
return bindActionCreators(setCurrentSessionItemPosition, dispatch)(sessionItemPosition)
},
setFocusTitleAndInstructions: bool => {
return bindActionCreators(setFocusTitleAndInstructionsAction, dispatch)(bool)
},
}
}
export const TakingSidebar = connect(mapStateToProps, mapDispatchToProps)(Sidebar)
export default TakingSidebar