Skip to content

Commit 2973614

Browse files
authored
fix: loading unit page directly from link after logging in in Teak (#2246)
This is a simple version of the fix for Teak; on master it was fixed with #1867
1 parent bdc99fd commit 2973614

File tree

8 files changed

+47
-10
lines changed

8 files changed

+47
-10
lines changed

src/course-unit/CourseUnit.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const CourseUnit = ({ courseId }) => {
4141
courseUnit,
4242
isLoading,
4343
sequenceId,
44+
courseUnitLoadingStatus,
4445
unitTitle,
4546
unitCategory,
4647
errorMessage,
@@ -210,6 +211,7 @@ const CourseUnit = ({ courseId }) => {
210211
courseId={courseId}
211212
blockId={blockId}
212213
isUnitVerticalType={isUnitVerticalType}
214+
courseUnitLoadingStatus={courseUnitLoadingStatus}
213215
unitXBlockActions={unitXBlockActions}
214216
courseVerticalChildren={courseVerticalChildren.children}
215217
handleConfigureSubmit={handleConfigureSubmit}

src/course-unit/course-sequence/hooks.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,19 @@ export function useSequenceNavigationMetadata(courseId, currentSequenceId, curre
1212
const isLastUnit = !nextUrl;
1313
const sequenceIds = useSelector(getSequenceIds);
1414
const sequenceIndex = sequenceIds.indexOf(currentSequenceId);
15-
const unitIndex = sequence.unitIds.indexOf(currentUnitId);
15+
let unitIndex = sequence?.unitIds.indexOf(currentUnitId);
1616

1717
const nextSequenceId = sequenceIndex < sequenceIds.length - 1 ? sequenceIds[sequenceIndex + 1] : null;
1818
const previousSequenceId = sequenceIndex > 0 ? sequenceIds[sequenceIndex - 1] : null;
19-
19+
if (!unitIndex) {
20+
// Handle case where unitIndex is not found
21+
unitIndex = 0;
22+
}
2023
let nextLink;
2124
const nextIndex = unitIndex + 1;
2225

23-
if (nextIndex < sequence.unitIds.length) {
24-
const nextUnitId = sequence.unitIds[nextIndex];
26+
if (nextIndex < sequence?.unitIds.length) {
27+
const nextUnitId = sequence?.unitIds[nextIndex];
2528
nextLink = `/course/${courseId}/container/${nextUnitId}/${currentSequenceId}`;
2629
} else if (nextSequenceId) {
2730
const pathToNextUnit = decodeURIComponent(nextUrl);
@@ -32,7 +35,7 @@ export function useSequenceNavigationMetadata(courseId, currentSequenceId, curre
3235
const previousIndex = unitIndex - 1;
3336

3437
if (previousIndex >= 0) {
35-
const previousUnitId = sequence.unitIds[previousIndex];
38+
const previousUnitId = sequence?.unitIds[previousIndex];
3639
previousLink = `/course/${courseId}/container/${previousUnitId}/${currentSequenceId}`;
3740
} else if (previousSequenceId) {
3841
const pathToPreviousUnit = decodeURIComponent(prevUrl);

src/course-unit/course-sequence/sequence-navigation/SequenceNavigation.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ const SequenceNavigation = ({
3535

3636
const shouldDisplayNotificationTriggerInSequence = useWindowSize().width < breakpoints.small.minWidth;
3737
const renderUnitButtons = () => {
38-
if (sequence.unitIds?.length === 0 || unitId === null) {
38+
if (sequence?.unitIds?.length === 0 || unitId === null) {
3939
return (
4040
<div style={{ flexBasis: '100%', minWidth: 0, borderBottom: 'solid 1px #EAEAEA' }} />
4141
);
4242
}
4343

4444
return (
4545
<SequenceNavigationTabs
46-
unitIds={sequence.unitIds || []}
46+
unitIds={sequence?.unitIds || []}
4747
unitId={unitId}
4848
handleCreateNewCourseXBlock={handleCreateNewCourseXBlock}
4949
showPasteUnit={showPasteUnit}

src/course-unit/data/selectors.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const getCourseVerticalChildren = (state) => state.courseUnit.courseVerti
1616
export const getCourseOutlineInfo = (state) => state.courseUnit.courseOutlineInfo;
1717
export const getCourseOutlineInfoLoadingStatus = (state) => state.courseUnit.courseOutlineInfoLoadingStatus;
1818
export const getMovedXBlockParams = (state) => state.courseUnit.movedXBlockParams;
19-
const getLoadingStatuses = (state) => state.courseUnit.loadingStatus;
19+
export const getLoadingStatuses = (state) => state.courseUnit.loadingStatus;
2020
export const getIsLoading = createSelector(
2121
[getLoadingStatuses],
2222
loadingStatus => Object.values(loadingStatus)

src/course-unit/hooks.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
getSavingStatus,
3636
getSequenceStatus,
3737
getStaticFileNotices,
38+
getLoadingStatuses,
3839
} from './data/selectors';
3940
import {
4041
changeEditTitleFormOpen,
@@ -51,6 +52,7 @@ export const useCourseUnit = ({ courseId, blockId }) => {
5152
const [isMoveModalOpen, openMoveModal, closeMoveModal] = useToggle(false);
5253

5354
const courseUnit = useSelector(getCourseUnitData);
55+
const courseUnitLoadingStatus = useSelector(getLoadingStatuses);
5456
const savingStatus = useSelector(getSavingStatus);
5557
const isLoading = useSelector(getIsLoading);
5658
const errorMessage = useSelector(getErrorMessage);
@@ -218,6 +220,7 @@ export const useCourseUnit = ({ courseId, blockId }) => {
218220
return {
219221
sequenceId,
220222
courseUnit,
223+
courseUnitLoadingStatus,
221224
unitTitle,
222225
unitCategory,
223226
errorMessage,

src/course-unit/sidebar/utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,4 @@ export const getIconVariant = (visibilityState, published, hasChanges) => {
9999
* @param {string} id - The course unit ID.
100100
* @returns {string} The clear course unit ID extracted from the provided data.
101101
*/
102-
export const extractCourseUnitId = (id) => id.match(/block@(.+)$/)[1];
102+
export const extractCourseUnitId = (id) => id?.match(/block@(.+)$/)[1];

src/course-unit/xblock-container-iframe/index.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,16 @@ import { useIframeContent } from '../../generic/hooks/useIframeContent';
3737
import { useIframeMessages } from '../../generic/hooks/useIframeMessages';
3838
import VideoSelectorPage from '../../editors/VideoSelectorPage';
3939
import EditorPage from '../../editors/EditorPage';
40+
import { RequestStatus } from '../../data/constants';
4041

4142
const XBlockContainerIframe: FC<XBlockContainerIframeProps> = ({
42-
courseId, blockId, unitXBlockActions, courseVerticalChildren, handleConfigureSubmit, isUnitVerticalType,
43+
courseId,
44+
blockId,
45+
unitXBlockActions,
46+
courseVerticalChildren,
47+
handleConfigureSubmit,
48+
isUnitVerticalType,
49+
courseUnitLoadingStatus,
4350
}) => {
4451
const intl = useIntl();
4552
const dispatch = useDispatch();
@@ -70,6 +77,23 @@ const XBlockContainerIframe: FC<XBlockContainerIframeProps> = ({
7077
setIframeRef(iframeRef);
7178
}, [setIframeRef]);
7279

80+
useEffect(() => {
81+
const iframe = iframeRef?.current;
82+
if (!iframe) { return undefined; }
83+
84+
const handleIframeLoad = () => {
85+
if (courseUnitLoadingStatus.fetchUnitLoadingStatus === RequestStatus.FAILED) {
86+
window.location.reload();
87+
}
88+
};
89+
90+
iframe.addEventListener('load', handleIframeLoad);
91+
92+
return () => {
93+
iframe.removeEventListener('load', handleIframeLoad);
94+
};
95+
}, [iframeRef]);
96+
7397
const onXBlockSave = useCallback(/* istanbul ignore next */ () => {
7498
closeXBlockEditorModal();
7599
closeVideoSelectorModal();

src/course-unit/xblock-container-iframe/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ export interface XBlockContainerIframeProps {
4242
courseId: string;
4343
blockId: string;
4444
isUnitVerticalType: boolean,
45+
courseUnitLoadingStatus: {
46+
fetchUnitLoadingStatus: string;
47+
fetchVerticalChildrenLoadingStatus: string;
48+
fetchXBlockDataLoadingStatus: string;
49+
};
4550
unitXBlockActions: {
4651
handleDelete: (XBlockId: string | null) => void;
4752
handleDuplicate: (XBlockId: string | null) => void;

0 commit comments

Comments
 (0)