From e05428e01d86720ed450fc56ca8912dd605a0e41 Mon Sep 17 00:00:00 2001 From: Kristin Aoki Date: Thu, 5 Aug 2021 14:59:10 -0400 Subject: [PATCH] Add new flag and function for old urls --- src/courseware/CoursewareContainer.jsx | 49 +++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/src/courseware/CoursewareContainer.jsx b/src/courseware/CoursewareContainer.jsx index 28ef1333..7da50f18 100644 --- a/src/courseware/CoursewareContainer.jsx +++ b/src/courseware/CoursewareContainer.jsx @@ -17,6 +17,12 @@ import { TabPage } from '../tab-page'; import Course from './course'; import { handleNextSectionCelebration } from './course/celebration'; +const checkUrlLength = memoize((shortLinkFeatureFlag, courseStatus, courseId, sequence) => { + if (shortLinkFeatureFlag && courseStatus === 'loaded' && sequence) { + history.replace(`/c/${courseId}/${sequence.id}/${sequence.unitIds[sequence.activeUnitIndex]}`); + } +}); + const checkResumeRedirect = memoize((courseStatus, courseId, sequenceId, firstSequenceId) => { if (courseStatus === 'loaded' && !sequenceId) { // Note that getResumeBlock is just an API call, not a redux thunk. @@ -127,6 +133,7 @@ class CoursewareContainer extends Component { firstSequenceId, unitViaSequenceId, sectionViaSequenceId, + shortLinkFeatureFlag, match: { params: { courseId: routeCourseId, @@ -135,10 +142,15 @@ class CoursewareContainer extends Component { }, }, } = this.props; + // Load data whenever the course or sequence ID changes. this.checkFetchCourse(routeCourseId); this.checkFetchSequence(routeSequenceHash); + if (sequence && routeSequenceHash.includes('block')) { + checkUrlLength(shortLinkFeatureFlag, courseStatus, courseId, sequence); + } + // All courseware URLs should normalize to the format /course/:courseId/:sequenceId/:unitId // via the series of redirection rules below. // See docs/decisions/0008-liberal-courseware-path-handling.md for more context. @@ -211,7 +223,6 @@ class CoursewareContainer extends Component { sequence, sequenceId, } = this.props; - if (nextSequence !== null) { let nextUnitId = null; if (nextSequence.unitIds.length > 0) { @@ -247,6 +258,8 @@ class CoursewareContainer extends Component { courseStatus, courseId, sequenceId, + sequence, + shortLinkFeatureFlag, match: { params: { unitId: routeUnitId, @@ -254,18 +267,30 @@ class CoursewareContainer extends Component { }, } = this.props; + // This helps process old URLS that still use a blocks usage key in the URL. + let updatedSequenceId; + let updatedUnitId; + if (sequence) { + if (sequenceId.includes('block') && shortLinkFeatureFlag) { + updatedSequenceId = sequence.id; + } + if (routeUnitId.includes('block') && shortLinkFeatureFlag) { + updatedUnitId = sequence.unitIds[sequence.activeUnitIndex]; + } + } + return ( state.models.sequences || {}, (state) => state.courseware.sequenceId, - (sequencesById, sequenceId) => (sequencesById[sequenceId] ? sequencesById[sequenceId] : null), + (sequencesById, sequenceId) => { + if (!sequencesById[sequenceId] && Object.keys(sequencesById).length > 0) { + for (let i = 0; i < Object.values(sequencesById).length; i++) { + const sequence = Object.values(sequencesById)[i]; + if (sequence.decoded_id === sequenceId) { + return sequence; + } + } + return null; + } + return sequencesById[sequenceId]; + }, ); const sequenceIdsSelector = createSelector( @@ -430,6 +467,7 @@ const mapStateToProps = (state) => { sequenceStatus, specialExamsEnabledWaffleFlag, proctoredExamsEnabledWaffleFlag, + shortLinkFeatureFlag, } = state.courseware; return { @@ -439,6 +477,7 @@ const mapStateToProps = (state) => { sequenceStatus, specialExamsEnabledWaffleFlag, proctoredExamsEnabledWaffleFlag, + shortLinkFeatureFlag, course: currentCourseSelector(state), sequence: currentSequenceSelector(state), previousSequence: previousSequenceSelector(state),