Skip to content

Commit b144a20

Browse files
committed
refactor: Use summary query in ImportStepperPage
1 parent 445d538 commit b144a20

4 files changed

Lines changed: 16 additions & 58 deletions

File tree

src/data/api.mocks.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,7 @@ mockGetMigrationStatus.migrationStatusInProgressData = {
181181
mockGetMigrationStatus.applyMock = () => jest.spyOn(api, 'getModulestoreMigrationStatus').mockImplementation(mockGetMigrationStatus);
182182

183183
export async function mockGetPreviewModulestoreMigration(
184-
// @ts-ignore-next-line
185-
libraryKey: string,
184+
_: string,
186185
sourceKey: string,
187186
): Promise<api.PreviewMigrationInfo> {
188187
switch (sourceKey) {

src/library-authoring/import-course/stepper/ImportStepperPage.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Loading from '@src/generic/Loading';
1313

1414
import Header from '@src/header';
1515
import SubHeader from '@src/generic/sub-header/SubHeader';
16-
import { useBulkModulestoreMigrate } from '@src/data/apiHooks';
16+
import { useBulkModulestoreMigrate, usePreviewMigration } from '@src/data/apiHooks';
1717
import { ToastContext } from '@src/generic/toast-context';
1818
import LoadingButton from '@src/generic/loading-button';
1919
import { useCourseDetails } from '@src/course-outline/data/apiHooks';
@@ -56,15 +56,21 @@ export const ImportStepperPage = () => {
5656
const navigate = useNavigate();
5757
const [currentStep, setCurrentStep] = useState<MigrationStep>('select-course');
5858
const [selectedCourseId, setSelectedCourseId] = useState<string>('');
59-
const [analysisCompleted, setAnalysisCompleted] = useState<boolean>(false);
60-
const [importIsBlocked, setImportIsBlocked] = useState<boolean>(false);
6159
const { data: courseData } = useCourseDetails(selectedCourseId);
6260
const { libraryId, libraryData, readOnly } = useLibraryContext();
6361
const { showToast } = useContext(ToastContext);
6462
// Using bulk migrate as it allows us to create collection automatically
6563
// TODO: Modify single migration API to allow create collection
6664
const migrate = useBulkModulestoreMigrate();
6765

66+
const {
67+
data: previewMigrationData,
68+
isPending: isPreviewMigrationPending,
69+
} = usePreviewMigration(libraryId, selectedCourseId);
70+
71+
const analysisCompleted = !isPreviewMigrationPending;
72+
const importIsBlocked = previewMigrationData?.state === 'block_limit_reached';
73+
6874
const handleImportCourse = async () => {
6975
// istanbul ignore if: this can never happen, just for satisfying type checker.
7076
if (!selectedCourseId) {
@@ -138,11 +144,7 @@ export const ImportStepperPage = () => {
138144
eventKey="review-details"
139145
title={intl.formatMessage(messages.importCourseReviewDetailsStep)}
140146
>
141-
<ReviewImportDetails
142-
markAnalysisComplete={setAnalysisCompleted}
143-
setImportIsBlocked={setImportIsBlocked}
144-
courseId={selectedCourseId}
145-
/>
147+
<ReviewImportDetails courseId={selectedCourseId} />
146148
</Stepper.Step>
147149
</Stepper>
148150
</div>

src/library-authoring/import-course/stepper/ReviewImportDetails.test.tsx

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import messages from '../messages';
1010
mockContentLibrary.applyMock();
1111
mockGetPreviewModulestoreMigration.applyMock();
1212
const { libraryId } = mockContentLibrary;
13-
const markAnalysisComplete = jest.fn();
14-
const setImportIsBlocked = jest.fn();
1513

1614
// Mock the useCourseDetails hook
1715
jest.mock('@src/course-outline/data/apiHooks', () => ({
@@ -45,15 +43,10 @@ describe('ReviewImportDetails', () => {
4543
});
4644

4745
it('renders loading spinner when isPending is true', async () => {
48-
render(<ReviewImportDetails
49-
markAnalysisComplete={markAnalysisComplete}
50-
courseId="test-course-id"
51-
setImportIsBlocked={setImportIsBlocked}
52-
/>);
46+
render(<ReviewImportDetails courseId="test-course-id" />);
5347

5448
const spinners = await screen.findAllByRole('status');
5549
spinners.every((spinner) => expect(spinner.textContent).toEqual('Loading...'));
56-
expect(markAnalysisComplete).toHaveBeenCalledWith(false);
5750
});
5851

5952
it('renders import progress status when isBlockDataPending or migrationInfoIsPending is true', async () => {
@@ -63,15 +56,10 @@ describe('ReviewImportDetails', () => {
6356
data: null,
6457
});
6558

66-
render(<ReviewImportDetails
67-
markAnalysisComplete={markAnalysisComplete}
68-
courseId="test-course-id"
69-
setImportIsBlocked={setImportIsBlocked}
70-
/>);
59+
render(<ReviewImportDetails courseId="test-course-id" />);
7160

7261
expect(await screen.findByRole('alert')).toBeInTheDocument();
7362
expect(await screen.findByText(/Import Analysis in Progress/i)).toBeInTheDocument();
74-
expect(markAnalysisComplete).toHaveBeenCalledWith(false);
7563
});
7664

7765
it('renders warning when reimport', async () => {
@@ -87,11 +75,7 @@ describe('ReviewImportDetails', () => {
8775
},
8876
});
8977

90-
render(<ReviewImportDetails
91-
markAnalysisComplete={markAnalysisComplete}
92-
courseId={courseKey}
93-
setImportIsBlocked={setImportIsBlocked}
94-
/>);
78+
render(<ReviewImportDetails courseId={courseKey} />);
9579

9680
expect(await screen.findByRole('alert')).toBeInTheDocument();
9781
expect(await screen.findByText(/Import Analysis Completed: Reimport/i)).toBeInTheDocument();
@@ -100,7 +84,6 @@ describe('ReviewImportDetails', () => {
10084
.replace('{courseName}', 'Test Course')
10185
.replace('{libraryName}', 'Library title'),
10286
)).toBeInTheDocument();
103-
expect(markAnalysisComplete).toHaveBeenCalledWith(true);
10487
});
10588

10689
it('renders warning when unsupportedBlockPercentage > 0', async () => {
@@ -111,9 +94,7 @@ describe('ReviewImportDetails', () => {
11194
});
11295

11396
render(<ReviewImportDetails
114-
markAnalysisComplete={markAnalysisComplete}
11597
courseId={mockGetPreviewModulestoreMigration.sourceKeyUnsupported}
116-
setImportIsBlocked={setImportIsBlocked}
11798
/>);
11899

119100
expect(await screen.findByRole('alert')).toBeInTheDocument();
@@ -131,7 +112,6 @@ describe('ReviewImportDetails', () => {
131112
expect(await screen.findByText('5')).toBeInTheDocument();
132113
expect(await screen.findByText('Components')).toBeInTheDocument();
133114
expect(await screen.findByText('5/10')).toBeInTheDocument();
134-
expect(markAnalysisComplete).toHaveBeenCalledWith(true);
135115
});
136116

137117
it('renders warning when components exceed the limit', async () => {
@@ -142,18 +122,14 @@ describe('ReviewImportDetails', () => {
142122
});
143123

144124
render(<ReviewImportDetails
145-
markAnalysisComplete={markAnalysisComplete}
146125
courseId={mockGetPreviewModulestoreMigration.sourceKeyBlockLimit}
147-
setImportIsBlocked={setImportIsBlocked}
148126
/>);
149127

150128
expect(await screen.findByRole('alert')).toBeInTheDocument();
151129
expect(await screen.findByText(/Import Blocked/i)).toBeInTheDocument();
152130
expect(await screen.findByText(
153131
/This import would exceed the Content Library limit of 1000 items/i,
154132
)).toBeInTheDocument();
155-
expect(markAnalysisComplete).toHaveBeenCalledWith(true);
156-
expect(setImportIsBlocked).toHaveBeenCalledWith(true);
157133
});
158134

159135
it('renders success alert when no unsupported blocks', async () => {
@@ -164,9 +140,7 @@ describe('ReviewImportDetails', () => {
164140
});
165141

166142
render(<ReviewImportDetails
167-
markAnalysisComplete={markAnalysisComplete}
168143
courseId={mockGetPreviewModulestoreMigration.sourceKeyGood}
169-
setImportIsBlocked={setImportIsBlocked}
170144
/>);
171145

172146
expect(await screen.findByRole('alert')).toBeInTheDocument();
@@ -184,6 +158,5 @@ describe('ReviewImportDetails', () => {
184158
expect(await screen.findByText('3')).toBeInTheDocument();
185159
expect(await screen.findByText('Components')).toBeInTheDocument();
186160
expect(await screen.findByText('5')).toBeInTheDocument();
187-
expect(markAnalysisComplete).toHaveBeenCalledWith(true);
188161
});
189162
});

src/library-authoring/import-course/stepper/ReviewImportDetails.tsx

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,14 @@ import { Alert, Stack } from '@openedx/paragon';
33
import { LoadingSpinner } from '@src/generic/Loading';
44
import { useCourseDetails } from '@src/course-outline/data/apiHooks';
55

6-
import { useEffect, useMemo } from 'react';
6+
import { useMemo } from 'react';
77
import { CheckCircle, Info, Warning } from '@openedx/paragon/icons';
88
import { useLibraryContext } from '@src/library-authoring/common/context/LibraryContext';
99
import { useMigrationInfo } from '@src/library-authoring/data/apiHooks';
1010
import { usePreviewMigration } from '@src/data/apiHooks';
1111
import { SummaryCard } from './SummaryCard';
1212
import messages from '../messages';
1313

14-
interface Props {
15-
courseId?: string;
16-
markAnalysisComplete: (analysisCompleted: boolean) => void;
17-
setImportIsBlocked: (importIsBlocked: boolean) => void;
18-
}
19-
2014
interface BannerProps {
2115
courseId?: string;
2216
isBlockDataPending?: boolean;
@@ -139,11 +133,7 @@ const Banner = ({
139133
);
140134
};
141135

142-
export const ReviewImportDetails = ({
143-
courseId,
144-
markAnalysisComplete,
145-
setImportIsBlocked,
146-
}: Props) => {
136+
export const ReviewImportDetails = ({ courseId }: { courseId: string }) => {
147137
const { libraryId } = useLibraryContext();
148138

149139
const {
@@ -156,12 +146,6 @@ export const ReviewImportDetails = ({
156146
const totalBlocks = (previewMigrationData?.totalBlocks || 0) - unssuportedBlocks;
157147
const totalComponents = (previewMigrationData?.totalComponents || 0) - unssuportedBlocks;
158148

159-
useEffect(() => {
160-
// Mark complete to inform parent component of analysis completion.
161-
markAnalysisComplete(!isPreviewMigrationPending);
162-
setImportIsBlocked(limitIsExceeded);
163-
}, [isPreviewMigrationPending, limitIsExceeded]);
164-
165149
return (
166150
<Stack gap={4}>
167151
<Banner

0 commit comments

Comments
 (0)